agentic-qe 3.13.12 → 3.14.1
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/helpers/brain-checkpoint.cjs +2 -1
- package/.claude/helpers/validate-v3-config.sh +6 -5
- package/.claude/hooks/aqe-hook.cjs +14 -14
- package/.claude/skills/qe-browser/evals/qe-browser.yaml +30 -41
- package/.claude/skills/qe-browser/fixtures/serve-skills.js +37 -0
- package/.claude/skills/qe-browser/scripts/lib/vibium.js +1 -1
- package/.claude/skills/qe-browser/scripts/smoke-test.sh +56 -25
- package/.claude/skills/qe-browser/scripts/visual-diff.js +24 -15
- package/.claude/skills/qe-court/SKILL.md +4 -4
- package/.claude/skills/qe-court/config-schema.json +38 -0
- package/.claude/skills/qe-court/evals/qe-court.yaml +8 -8
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +130 -0
- package/assets/skills/qe-browser/evals/qe-browser.yaml +30 -41
- package/assets/skills/qe-browser/fixtures/serve-skills.js +37 -0
- package/assets/skills/qe-browser/scripts/lib/vibium.js +1 -1
- package/assets/skills/qe-browser/scripts/smoke-test.sh +56 -25
- package/assets/skills/qe-browser/scripts/visual-diff.js +24 -15
- package/assets/skills/qe-court/SKILL.md +4 -4
- package/assets/skills/qe-court/config-schema.json +38 -0
- package/assets/skills/qe-court/evals/qe-court.yaml +8 -8
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/brain-commands.d.ts +1 -0
- package/dist/cli/brain-commands.js +1 -0
- package/dist/cli/bundle.js +7 -7
- package/dist/cli/chunks/adapter-I2N7PEKG.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-7I7LZFNC.js → agent-booster-wasm-OY5Y2CUM.js} +2 -2
- package/dist/cli/chunks/{agent-handler-QZZT52BH.js → agent-handler-TUOH55LD.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-MLQS5Y26.js → agent-memory-branch-XM3IYKT3.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-U4ALUH6A.js +2 -0
- package/dist/cli/chunks/{arena-WRIY37EJ.js → arena-DOCLIEBL.js} +4 -4
- package/dist/cli/chunks/{arena-IM4CP6LP.js → arena-UMFJZKG7.js} +2 -2
- package/dist/cli/chunks/{audit-BSAQ4EFN.js → audit-KZLU5VLW.js} +3 -3
- package/dist/cli/chunks/base-RCYIBNHM.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-X2XZUXWZ.js → better-sqlite3-MIEZBNUI.js} +2 -2
- package/dist/cli/chunks/brain-handler-6PZN46B7.js +90 -0
- package/dist/cli/chunks/{branch-enumerator-NI4Q7DSJ.js → branch-enumerator-XCETHA4F.js} +2 -2
- package/dist/cli/chunks/{browser-PXBLORUZ.js → browser-UEXISDCJ.js} +2 -2
- package/dist/cli/chunks/browser-workflow-L6TDB5O5.js +2 -0
- package/dist/cli/chunks/{chunk-5PNQNBDZ.js → chunk-3AYNHOWS.js} +1 -1
- package/dist/cli/chunks/{chunk-NL2SCAGJ.js → chunk-3BRR2FLH.js} +3 -3
- package/dist/cli/chunks/chunk-3FFMUB3B.js +14 -0
- package/dist/cli/chunks/{chunk-GJJWXRAD.js → chunk-3JMSXOU4.js} +2 -2
- package/dist/cli/chunks/{chunk-MB2KLJ6Q.js → chunk-3TMUCJNJ.js} +1 -1
- package/dist/cli/chunks/{chunk-JVFZAJ5N.js → chunk-3WSH4HD2.js} +2 -2
- package/dist/cli/chunks/{chunk-SCQNISGS.js → chunk-3XRXUVUI.js} +1 -1
- package/dist/cli/chunks/{chunk-Z56BBX77.js → chunk-45S5553E.js} +2 -2
- package/dist/cli/chunks/{chunk-6BSZHNOC.js → chunk-4MT62HKK.js} +1 -1
- package/dist/cli/chunks/{chunk-PVINNJ4P.js → chunk-4ZLFUO4I.js} +2 -2
- package/dist/cli/chunks/{chunk-MYVKTG55.js → chunk-5F5V4QYU.js} +3 -3
- package/dist/cli/chunks/{chunk-2W3D5A4R.js → chunk-5KP62DC3.js} +2 -2
- package/dist/cli/chunks/{chunk-BODFJ3DC.js → chunk-5NSSJUWW.js} +2 -2
- package/dist/cli/chunks/{chunk-KXSUDN46.js → chunk-5T6PAUZD.js} +1 -1
- package/dist/cli/chunks/{chunk-7ZVO7I4Q.js → chunk-5TYGSQOL.js} +1 -1
- package/dist/cli/chunks/{chunk-M7CPJW53.js → chunk-5Y2QFSVZ.js} +2 -2
- package/dist/cli/chunks/{chunk-VQD2ELNL.js → chunk-6B77GPWL.js} +2 -2
- package/dist/cli/chunks/{chunk-GJUGG6UR.js → chunk-6DDMHZWH.js} +2 -2
- package/dist/cli/chunks/{chunk-IPZEBALY.js → chunk-6HMNN2Y2.js} +54 -54
- package/dist/cli/chunks/{chunk-M73KM3AZ.js → chunk-6YIMLUH6.js} +160 -26
- package/dist/cli/chunks/{chunk-UBOGJHWC.js → chunk-6Z6Y3YBX.js} +1 -1
- package/dist/cli/chunks/{chunk-M3354CE4.js → chunk-75SC3GEX.js} +2 -2
- package/dist/cli/chunks/{chunk-TJVTV3HP.js → chunk-7AF55H2D.js} +2 -2
- package/dist/cli/chunks/{chunk-3XVZHJQT.js → chunk-7AYTM426.js} +1 -1
- package/dist/cli/chunks/{chunk-U5G6OC2C.js → chunk-7GF6IRSU.js} +2 -2
- package/dist/cli/chunks/{chunk-LRO74LPA.js → chunk-7XL2D56F.js} +4 -4
- package/dist/cli/chunks/{chunk-MGKH4LCM.js → chunk-A6RB34Y6.js} +1 -1
- package/dist/cli/chunks/{chunk-X2SZCVDA.js → chunk-AESYVAPH.js} +8 -7
- package/dist/cli/chunks/{chunk-3ASVQILY.js → chunk-AZUC7E5S.js} +2 -2
- package/dist/cli/chunks/{chunk-R7LGVJMZ.js → chunk-B6Y6AF4M.js} +2 -2
- package/dist/cli/chunks/chunk-C3XNFIOM.js +2 -0
- package/dist/cli/chunks/{chunk-ZSAGRDXA.js → chunk-CBWF42ET.js} +2 -2
- package/dist/cli/chunks/{chunk-VNODKACB.js → chunk-CCZZZBAO.js} +2 -2
- package/dist/cli/chunks/{chunk-5E76HULA.js → chunk-CGDW47WP.js} +2 -2
- package/dist/cli/chunks/chunk-CGZ7LTUK.js +2 -0
- package/dist/cli/chunks/{chunk-6KI6LAAZ.js → chunk-D6RCRTTR.js} +2 -2
- package/dist/cli/chunks/{chunk-TB2N3CAK.js → chunk-DFXQLHQM.js} +2 -2
- package/dist/cli/chunks/chunk-DKSLJZVA.js +2 -0
- package/dist/cli/chunks/{chunk-JTYCOFTD.js → chunk-DKUKGBJE.js} +1 -1
- package/dist/cli/chunks/{chunk-AN5CGTTJ.js → chunk-DKXSJDII.js} +2 -2
- package/dist/cli/chunks/chunk-EEJP3WTQ.js +4 -0
- package/dist/cli/chunks/{chunk-ZMYV4R32.js → chunk-EHW62JL2.js} +1 -1
- package/dist/cli/chunks/{chunk-WYFAPA2G.js → chunk-EPBWFTHH.js} +2 -2
- package/dist/cli/chunks/{chunk-P6EFKHNI.js → chunk-ERTGGFXZ.js} +2 -2
- package/dist/cli/chunks/{chunk-G45AOQDZ.js → chunk-F7TRO2OM.js} +1 -1
- package/dist/cli/chunks/{chunk-XT473WPO.js → chunk-FFRKTZYP.js} +2 -2
- package/dist/cli/chunks/{chunk-5VSS2RBD.js → chunk-FH7SCX2I.js} +2 -2
- package/dist/cli/chunks/{chunk-44NPKZGI.js → chunk-FHBGALBG.js} +2 -2
- package/dist/cli/chunks/{chunk-NTALX2YC.js → chunk-FOAFRC2W.js} +2 -2
- package/dist/cli/chunks/{chunk-7LATB5IR.js → chunk-FPBQ7BXU.js} +2 -2
- package/dist/cli/chunks/{chunk-AKUDUB3O.js → chunk-FRRRDCXY.js} +2 -2
- package/dist/cli/chunks/{chunk-NG6A7LCG.js → chunk-FZ47ZCRL.js} +1 -1
- package/dist/cli/chunks/{chunk-VD53LBF7.js → chunk-GH3NJOTC.js} +3 -3
- package/dist/cli/chunks/{chunk-NDRZZSD5.js → chunk-GO66DCIZ.js} +2 -2
- package/dist/cli/chunks/{chunk-Z6DSYLAG.js → chunk-GRVR3Y6I.js} +1 -1
- package/dist/cli/chunks/chunk-GYTWUOKU.js +65 -0
- package/dist/cli/chunks/{chunk-6KKVMPPR.js → chunk-H2DX36SC.js} +2 -2
- package/dist/cli/chunks/{chunk-NJ3QXJ54.js → chunk-H5LSXVWY.js} +2 -2
- package/dist/cli/chunks/{chunk-HQWFZQMJ.js → chunk-HBAQVJDP.js} +2 -2
- package/dist/cli/chunks/{chunk-33YZGOT6.js → chunk-HCCILQGN.js} +2 -2
- package/dist/cli/chunks/{chunk-KRZYWVS3.js → chunk-HJD52N32.js} +2 -2
- package/dist/cli/chunks/{chunk-IPDM3CAK.js → chunk-HKU5PPS7.js} +1 -1
- package/dist/cli/chunks/{chunk-7RVLVIAI.js → chunk-HPQU6XZH.js} +1 -1
- package/dist/cli/chunks/{chunk-TWUWLSGQ.js → chunk-HRUQWABO.js} +10 -10
- package/dist/cli/chunks/{chunk-HAJG44BD.js → chunk-IGRTQ6VT.js} +2 -2
- package/dist/cli/chunks/{chunk-WXU7FAEB.js → chunk-IIBXGHZT.js} +2 -2
- package/dist/cli/chunks/{chunk-QG5L2JM5.js → chunk-IYB3GRXF.js} +10 -10
- package/dist/cli/chunks/{chunk-NNLZAVFH.js → chunk-IYIMLLUV.js} +1 -1
- package/dist/cli/chunks/{chunk-SXFSJJZF.js → chunk-J2VF7ZO7.js} +2 -2
- package/dist/cli/chunks/{chunk-4FVOJBEU.js → chunk-J33LKXVH.js} +1 -1
- package/dist/cli/chunks/{chunk-IOJ34SXJ.js → chunk-J7VAD4RG.js} +2 -2
- package/dist/cli/chunks/{chunk-VQCLSX7T.js → chunk-JJ4GUO4K.js} +1 -1
- package/dist/cli/chunks/{chunk-QM4Z7TQH.js → chunk-JMULRLD4.js} +1 -1
- package/dist/cli/chunks/{chunk-LXVT6JXO.js → chunk-JNSTKE3K.js} +2 -2
- package/dist/cli/chunks/{chunk-SOS37ECY.js → chunk-JZUWPDVS.js} +1 -1
- package/dist/cli/chunks/chunk-KHUO4NCW.js +11 -0
- package/dist/cli/chunks/chunk-KXMW7XTJ.js +2 -0
- package/dist/cli/chunks/{chunk-4AITMWFZ.js → chunk-KXTN3FR4.js} +2 -2
- package/dist/cli/chunks/{chunk-4Z4X2ND4.js → chunk-L4WATX6B.js} +2 -2
- package/dist/cli/chunks/{chunk-GMLRIZ4E.js → chunk-L66BWYQH.js} +1 -1
- package/dist/cli/chunks/{chunk-52VGZJSD.js → chunk-LJ63HPPN.js} +1 -1
- package/dist/cli/chunks/{chunk-WE3VKDMK.js → chunk-LMPK63PO.js} +3 -3
- package/dist/cli/chunks/{chunk-S6WHYOWV.js → chunk-LQDFWLKK.js} +27 -25
- package/dist/cli/chunks/{chunk-EG73WYAW.js → chunk-LSXQPMPI.js} +2 -2
- package/dist/cli/chunks/{chunk-NJ4YVAG7.js → chunk-MDLLEUFN.js} +3 -3
- package/dist/cli/chunks/{chunk-YQOQVSYU.js → chunk-MFAN5W27.js} +1 -1
- package/dist/cli/chunks/{chunk-A5RWLPVT.js → chunk-MZ2PJUN6.js} +2 -2
- package/dist/cli/chunks/{chunk-HRTSYT4N.js → chunk-N22LMACN.js} +2 -2
- package/dist/cli/chunks/{chunk-L3GBNX7B.js → chunk-NAJCQJSK.js} +2 -2
- package/dist/cli/chunks/{chunk-XM5I7J5S.js → chunk-ND6JBUVH.js} +2 -2
- package/dist/cli/chunks/{chunk-YL2GOJF6.js → chunk-NEEZ6M4W.js} +2 -2
- package/dist/cli/chunks/{chunk-DGFINXUE.js → chunk-NNJ63W77.js} +1 -1
- package/dist/cli/chunks/{chunk-G6FJHDUG.js → chunk-O7KF3GBV.js} +1 -1
- package/dist/cli/chunks/{chunk-RP2BRRLX.js → chunk-OBKMLOHU.js} +2 -2
- package/dist/cli/chunks/{chunk-AOOCV56W.js → chunk-OBLHI4HA.js} +1 -1
- package/dist/cli/chunks/{chunk-OZ53BIY5.js → chunk-ODNLKYOM.js} +1 -1
- package/dist/cli/chunks/{chunk-VBHA4SDU.js → chunk-PMREFRPP.js} +2 -2
- package/dist/cli/chunks/{chunk-ASWWBNX2.js → chunk-PMUF7WU6.js} +2 -2
- package/dist/cli/chunks/{chunk-I5SXLV7D.js → chunk-PS5NIMWJ.js} +2 -2
- package/dist/cli/chunks/chunk-PS6Y662P.js +13 -0
- package/dist/cli/chunks/{chunk-N4OQ4D4V.js → chunk-PYAH4K2U.js} +2 -2
- package/dist/cli/chunks/{chunk-H3GAR4SV.js → chunk-PZZX57ZA.js} +2 -2
- package/dist/cli/chunks/chunk-QAE4BOIV.js +2 -0
- package/dist/cli/chunks/{chunk-7A4WTRWI.js → chunk-QIY43XQJ.js} +1 -1
- package/dist/cli/chunks/{chunk-MLXLGBQZ.js → chunk-QM6EJHP5.js} +1 -1
- package/dist/cli/chunks/{chunk-4ANJV6I4.js → chunk-QMTBWHGR.js} +3 -3
- package/dist/cli/chunks/{chunk-IT5QIUUA.js → chunk-RCHDSUVU.js} +2 -2
- package/dist/cli/chunks/{chunk-AYH3DMW2.js → chunk-RUEHSOE6.js} +1 -1
- package/dist/cli/chunks/{chunk-DCVFHVPR.js → chunk-RVCMZUSJ.js} +2 -2
- package/dist/cli/chunks/{chunk-2JAC57JE.js → chunk-RXHI6CKK.js} +1 -1
- package/dist/cli/chunks/{chunk-QXO35J6F.js → chunk-RXPHQ4ZE.js} +2 -2
- package/dist/cli/chunks/{chunk-FI6J3UHJ.js → chunk-RYHCYTFE.js} +1 -1
- package/dist/cli/chunks/{chunk-DFLASG3B.js → chunk-S4WIAKPL.js} +1 -1
- package/dist/cli/chunks/{chunk-2VY7FL6A.js → chunk-S53ZUAVI.js} +2 -2
- package/dist/cli/chunks/{chunk-4M7YZ2X7.js → chunk-SEKOMKNG.js} +1 -1
- package/dist/cli/chunks/{chunk-UC4EIULB.js → chunk-SZRDEPUY.js} +19 -19
- package/dist/cli/chunks/chunk-T7XYQX5G.js +24 -0
- package/dist/cli/chunks/{chunk-OG3DBHIV.js → chunk-TF33GKWA.js} +2 -2
- package/dist/cli/chunks/{chunk-2VTX4SYW.js → chunk-TGFJUL6M.js} +2 -2
- package/dist/cli/chunks/{chunk-4THFPRFM.js → chunk-TLD727EF.js} +2 -2
- package/dist/cli/chunks/{chunk-7PCIN7UN.js → chunk-TQ2JZVZ3.js} +2 -2
- package/dist/cli/chunks/{chunk-UWZYXI3R.js → chunk-TT7DF2GX.js} +2 -2
- package/dist/cli/chunks/{chunk-X3JNFQW2.js → chunk-UCJEAK7D.js} +2 -2
- package/dist/cli/chunks/{chunk-AM42ROKZ.js → chunk-UN7EHLRV.js} +1 -1
- package/dist/cli/chunks/{chunk-42AS3HPO.js → chunk-UUE5CBZQ.js} +2 -2
- package/dist/cli/chunks/{chunk-E67ZXRG6.js → chunk-UWRMPRY5.js} +1 -1
- package/dist/cli/chunks/{chunk-4YFXF5AQ.js → chunk-VEWYUEVY.js} +5 -5
- package/dist/cli/chunks/{chunk-UJUK6T4V.js → chunk-VUXHJPUS.js} +2 -2
- package/dist/cli/chunks/{chunk-VA2ORJB5.js → chunk-VVP2ROXD.js} +2 -2
- package/dist/cli/chunks/{chunk-BZIPYXSW.js → chunk-WFJKLM6Z.js} +3 -3
- package/dist/cli/chunks/{chunk-MLFELTJX.js → chunk-X5G3UDWP.js} +2 -2
- package/dist/cli/chunks/{chunk-IQH2RDN3.js → chunk-Y63V33M6.js} +5 -5
- package/dist/cli/chunks/{chunk-XIKYUBIV.js → chunk-YXN47QOI.js} +2 -2
- package/dist/cli/chunks/{chunk-RP5VFZJO.js → chunk-Z5YU2TDS.js} +2 -2
- package/dist/cli/chunks/{chunk-KYJBJ56M.js → chunk-ZAHCVRR7.js} +2 -2
- package/dist/cli/chunks/{chunk-66OQ7AB3.js → chunk-ZC3HC6FO.js} +1 -1
- package/dist/cli/chunks/{ci-QAUD62WH.js → ci-Q2VX75PS.js} +2 -2
- package/dist/cli/chunks/{ci-output-TZDVTNE7.js → ci-output-MD5GTVR2.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-ZWPHJ7YJ.js → circuit-breaker-JMRLG2XI.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-SCB4EURN.js → claude-flow-setup-IMXYALBU.js} +2 -2
- package/dist/cli/chunks/client-L4PIXCGV.js +2 -0
- package/dist/cli/chunks/{cline-installer-EHZLMLXF.js → cline-installer-HWFASEGE.js} +2 -2
- package/dist/cli/chunks/{code-3N6PBJMK.js → code-3V37TCAD.js} +2 -2
- package/dist/cli/chunks/{code-index-extractor-6DIKHNRI.js → code-index-extractor-5V54WGFL.js} +2 -2
- package/dist/cli/chunks/codex-installer-UCA5AVE6.js +14 -0
- package/dist/cli/chunks/{completions-5MKWWCCE.js → completions-2DMRCQU6.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-TPM4IPEK.js → complexity-analyzer-MMQRXBTD.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-VXODKGVX.js → continuedev-installer-FAARXP3S.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-PVD5O56P.js → copilot-installer-AKQALMB5.js} +2 -2
- package/dist/cli/chunks/core-handlers-KROSXP4V.js +2 -0
- package/dist/cli/chunks/{cost-tracker-JOMZEQF3.js → cost-tracker-AXWHDND5.js} +2 -2
- package/dist/cli/chunks/{coverage-HTXLEV3B.js → coverage-ZLSKKCG5.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-WMTYBOON.js +2 -0
- package/dist/cli/chunks/{cursor-installer-SHKDTDDZ.js → cursor-installer-UALCQKVD.js} +2 -2
- package/dist/cli/chunks/{daemon-FCFEWVVJ.js → daemon-4LNOPJGN.js} +3 -3
- package/dist/cli/chunks/{daemon-PN4FEPLE.js → daemon-K3DFGCXC.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-PLOHU5SR.js → dag-attention-scheduler-LCQ7MYKC.js} +2 -2
- package/dist/cli/chunks/{detect-F3H4ZEZY.js → detect-P7PEN3MZ.js} +2 -2
- package/dist/cli/chunks/{dist-node-5TC665N6.js → dist-node-I72BJC2D.js} +2 -2
- package/dist/cli/chunks/{domain-handler-ZIWVFXCU.js → domain-handler-LROF6KWN.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-7Q5JYMYR.js → domain-transfer-M2ZSSTPV.js} +2 -2
- package/dist/cli/chunks/dream-AV63YQ2Y.js +2 -0
- package/dist/cli/chunks/embed-and-insert-pattern-MTBPUGO4.js +3 -0
- package/dist/cli/chunks/{eval-E2K2T75A.js → eval-O24ALB3W.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-Z5SE2O53.js → experience-capture-middleware-7JXEOGRE.js} +3 -3
- package/dist/cli/chunks/{fast-paths-3H52RSUK.js → fast-paths-4CFYJV4U.js} +2 -2
- package/dist/cli/chunks/{feature-flags-ONIKUZVK.js → feature-flags-CHPUA7IM.js} +2 -2
- package/dist/cli/chunks/{feature-flags-LUHSMHPS.js → feature-flags-E6PIM6ZB.js} +2 -2
- package/dist/cli/chunks/{file-discovery-FLYSYSS4.js → file-discovery-2ANIAUCP.js} +2 -2
- package/dist/cli/chunks/{fleet-6OJUAAKV.js → fleet-2MQ3OGCP.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-PUL6B7KZ.js → gnn-wrapper-P7JW3622.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-HGHHDUDY.js → heartbeat-handler-WWWZSA7V.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-5IZUGMC2.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-NV2NNBJL.js +2 -0
- package/dist/cli/chunks/hnsw-index-GRJ3KA2O.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-NDZSNMYX.js → hnsw-legacy-bridge-W634ZOTV.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-PISLKSO2.js → hnswlib-node-SLZDLMKM.js} +2 -2
- package/dist/cli/chunks/{hooks-WYG54MRI.js → hooks-3BFAZGG7.js} +10 -10
- package/dist/cli/chunks/{hypergraph-engine-EDHKHZZ2.js → hypergraph-engine-XJSGXP2J.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-OCHZAPPL.js → hypergraph-handler-RVUWZMOX.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-YM4QUWVH.js +2 -0
- package/dist/cli/chunks/{init-handler-5TCJ672H.js → init-handler-FYOZNNNO.js} +9 -8
- package/dist/cli/chunks/init-wizard-YESXGIK6.js +2 -0
- package/dist/cli/chunks/kernel-VH5SKESU.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-SWUQRCTZ.js → kilocode-installer-MAAKFVSB.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-L22EBAM5.js → kiro-installer-GX3TLZC5.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-F3NL4WJV.js +2 -0
- package/dist/cli/chunks/learning-T4QZ6C26.js +122 -0
- package/dist/cli/chunks/{llm-router-F2L4LFT2.js → llm-router-N2M4WXOC.js} +14 -14
- package/dist/cli/chunks/llm-router-service-HQYCJMPK.js +2 -0
- package/dist/cli/chunks/{load-A4ZF2KHC.js → load-6RU3G4P2.js} +2 -2
- package/dist/cli/chunks/load-test-GWRGKWMN.js +2 -0
- package/dist/cli/chunks/{mcp-T2Z46NNK.js → mcp-EFBO7BAU.js} +2 -2
- package/dist/cli/chunks/{memory-PUC3J6XC.js → memory-AXU2M3DN.js} +5 -5
- package/dist/cli/chunks/memory-backend-7A2PFKPV.js +2 -0
- package/dist/cli/chunks/memory-handlers-65CXN76C.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-U5L4FI4O.js → multi-model-executor-W7AFGVNH.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-UWI6KHYH.js → opencode-installer-KJE2RLCH.js} +2 -2
- package/dist/cli/chunks/{orchestrator-3BEI7R5D.js → orchestrator-CL6MLGVU.js} +22 -24
- package/dist/cli/chunks/pattern-null-store-K2WPRYCP.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-EGWUI5LU.js → pattern-usage-recorder-7SNSJ7K2.js} +2 -2
- package/dist/cli/chunks/{pipeline-JG6M4RHD.js → pipeline-3UU6ON3F.js} +2 -2
- package/dist/cli/chunks/platform-SNMPIDIT.js +2 -0
- package/dist/cli/chunks/{plugin-EEGN3PMK.js → plugin-65IIUUCU.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-7KZAINFT.js → prime-radiant-advanced-wasm-WWWJRLRP.js} +2 -2
- package/dist/cli/chunks/protocol-executor-TJDLEHND.js +2 -0
- package/dist/cli/chunks/{protocol-handler-UCEHYK2R.js → protocol-handler-SEBHCLLJ.js} +2 -2
- package/dist/cli/chunks/{prove-JSNG75VD.js → prove-N4X7CCJ4.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-CGRMFPDM.js +2 -0
- package/dist/cli/chunks/{quality-7SRM2HBM.js → quality-LBCJWXMU.js} +2 -2
- package/dist/cli/chunks/quality-gate-KZIQI7QT.js +7 -0
- package/dist/cli/chunks/queen-coordinator-FKP6QZAQ.js +2 -0
- package/dist/cli/chunks/real-embeddings-XCZFHFME.js +2 -0
- package/dist/cli/chunks/{roocode-installer-UYQK64BZ.js → roocode-installer-P3O6B7PT.js} +2 -2
- package/dist/cli/chunks/router-KZ5BISAM.js +2 -0
- package/dist/cli/chunks/routing-feedback-O4Y5TTR6.js +2 -0
- package/dist/cli/chunks/{routing-handler-PY3KPDTH.js → routing-handler-OXZ4DOV4.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-GCAOUTYS.js → ruvector-commands-PSY5IDSL.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-NG3UF3D5.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-PUHVTKQY.js +2 -0
- package/dist/cli/chunks/rvf-migration-coordinator-4SUT7GTJ.js +2 -0
- package/dist/cli/chunks/rvf-native-adapter-ODXFKZ6G.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-HNDKOM4L.js → rvf-store-integrity-TCKC22FH.js} +2 -2
- package/dist/cli/chunks/safe-db-BUQDNH2R.js +2 -0
- package/dist/cli/chunks/schedule-ZXNDZNNB.js +2 -0
- package/dist/cli/chunks/scheduler-YUQQWWW3.js +2 -0
- package/dist/cli/chunks/{security-MQ2VB7PY.js → security-RQGUQGSI.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-TAZEU6QK.js → shared-rvf-adapter-ZJFN52C2.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-B7N6AOCY.js → shared-rvf-dual-writer-V2R37HWV.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-HVSX46C7.js +2 -0
- package/dist/cli/chunks/{status-handler-NZP7DFHE.js → status-handler-XEKWNVDR.js} +2 -2
- package/dist/cli/chunks/{structural-health-ALLUQ4X6.js → structural-health-QMIW6WUN.js} +2 -2
- package/dist/cli/chunks/{sync-WJJG5J6V.js → sync-GDYJ2ULT.js} +2 -2
- package/dist/cli/chunks/{sync-MM7OCUYD.js → sync-H5SXWXPP.js} +2 -2
- package/dist/cli/chunks/{task-handler-CAQUEEB4.js → task-handler-EPLKCQHY.js} +2 -2
- package/dist/cli/chunks/{task-handlers-25BJ7D3W.js → task-handlers-22NTLWTC.js} +3 -3
- package/dist/cli/chunks/{test-HW7GVGVN.js → test-WHJFRZ3F.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-HTMFJMSP.js → test-scheduling-KZVFZOQN.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-BW5WA6PY.js +2 -0
- package/dist/cli/chunks/{token-usage-RJZDMBDP.js → token-usage-4A4O57R6.js} +2 -2
- package/dist/cli/chunks/{transformers-3YFW3EUO.js → transformers-FYTBRV46.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-U3PQPIK7.js → tree-sitter-wasm-parser-TZIJPLF3.js} +2 -2
- package/dist/cli/chunks/{types-7Q762WDO.js → types-B2L6LKFA.js} +2 -2
- package/dist/cli/chunks/unified-memory-AHN4RVBP.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-XB7JPF74.js +2 -0
- package/dist/cli/chunks/unified-persistence-53KWNFQJ.js +2 -0
- package/dist/cli/chunks/{upgrade-F7MKJWBQ.js → upgrade-O6U7EA7V.js} +2 -2
- package/dist/cli/chunks/{validate-B27AVRA6.js → validate-FHNZ5XL3.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-GYZR3GNL.js → validate-swarm-YOLLUEHE.js} +2 -2
- package/dist/cli/chunks/{vibium-W4XQMPJP.js → vibium-UXRPEIXB.js} +2 -2
- package/dist/cli/chunks/visual-security-CRPYS7L7.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-I7CDCFJU.js → web-tree-sitter-JJ5UIYFD.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-UYLHFDHU.js → windsurf-installer-I4QMQPIL.js} +2 -2
- package/dist/cli/chunks/witness-chain-5WCR2CAS.js +2 -0
- package/dist/cli/chunks/{witness-chain-B66SYZKU.js → witness-chain-BIJ7WDGS.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-U4JPAHVW.js → witness-key-manager-3SMMLJLP.js} +2 -2
- package/dist/cli/chunks/{workflow-DYMO47FF.js → workflow-33PUXXJV.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-RZWCLTT5.js +2 -0
- package/dist/cli/chunks/{wrappers-7S6DQTEA.js → wrappers-ASAU36VK.js} +2 -2
- package/dist/cli/commands/learning.js +44 -0
- package/dist/cli/commands/llm-router.js +27 -21
- package/dist/cli/commands/platform.d.ts +1 -0
- package/dist/cli/commands/platform.js +28 -6
- package/dist/cli/commands/quality-gate.js +25 -3
- package/dist/cli/handlers/brain-handler.js +2 -0
- package/dist/cli/handlers/init-handler.d.ts +5 -0
- package/dist/cli/handlers/init-handler.js +6 -0
- package/dist/cli/index.js +4 -1
- package/dist/context/compaction/index.d.ts +1 -0
- package/dist/context/compaction/index.js +3 -0
- package/dist/context/compaction/instruction-provenance.d.ts +20 -0
- package/dist/context/compaction/instruction-provenance.js +18 -0
- package/dist/context/compaction/tier2-session-summary.d.ts +8 -0
- package/dist/context/compaction/tier2-session-summary.js +20 -0
- package/dist/context/compaction/tier3-llm-compact.d.ts +4 -0
- package/dist/context/compaction/tier3-llm-compact.js +32 -4
- package/dist/contracts/verdicts.d.ts +625 -0
- package/dist/contracts/verdicts.js +202 -14
- package/dist/coordination/handlers/coverage-handlers.js +8 -1
- package/dist/domains/chaos-resilience/diagnosis/corpus.d.ts +5 -0
- package/dist/domains/chaos-resilience/diagnosis/corpus.js +141 -0
- package/dist/domains/chaos-resilience/diagnosis/detectors.d.ts +11 -0
- package/dist/domains/chaos-resilience/diagnosis/detectors.js +109 -0
- package/dist/domains/chaos-resilience/diagnosis/index.d.ts +5 -0
- package/dist/domains/chaos-resilience/diagnosis/index.js +5 -0
- package/dist/domains/chaos-resilience/diagnosis/scorer.d.ts +8 -0
- package/dist/domains/chaos-resilience/diagnosis/scorer.js +128 -0
- package/dist/domains/chaos-resilience/diagnosis/types.d.ts +171 -0
- package/dist/domains/chaos-resilience/diagnosis/types.js +3 -0
- package/dist/domains/chaos-resilience/index.d.ts +1 -0
- package/dist/domains/chaos-resilience/index.js +1 -0
- package/dist/domains/index.d.ts +1 -0
- package/dist/domains/index.js +1 -0
- package/dist/early-exit/early-exit-controller.d.ts +4 -2
- package/dist/early-exit/early-exit-controller.js +95 -7
- package/dist/early-exit/index.d.ts +1 -1
- package/dist/early-exit/speculative-executor.js +3 -0
- package/dist/early-exit/types.d.ts +51 -0
- package/dist/early-exit/types.js +3 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +2 -1
- package/dist/init/browser-engine-installer.d.ts +11 -0
- package/dist/init/browser-engine-installer.js +35 -5
- package/dist/init/codex-installer.d.ts +11 -1
- package/dist/init/codex-installer.js +90 -24
- package/dist/init/init-wizard-hooks.js +11 -11
- package/dist/init/orchestrator.js +2 -0
- package/dist/init/phases/07-hooks.d.ts +3 -3
- package/dist/init/phases/07-hooks.js +19 -21
- package/dist/init/phases/09-assets.d.ts +4 -0
- package/dist/init/phases/09-assets.js +13 -10
- package/dist/init/phases/phase-interface.d.ts +2 -0
- package/dist/init/types.d.ts +4 -0
- package/dist/integrations/embeddings/base/EmbeddingGenerator.js +4 -2
- package/dist/integrations/ruvector/brain-exporter.d.ts +1 -1
- package/dist/integrations/ruvector/brain-exporter.js +15 -3
- package/dist/integrations/ruvector/brain-rvf-exporter.d.ts +4 -0
- package/dist/integrations/ruvector/brain-rvf-exporter.js +118 -37
- package/dist/integrations/ruvector/brain-search.d.ts +1 -1
- package/dist/integrations/ruvector/brain-search.js +1 -1
- package/dist/integrations/ruvector/brain-shared.d.ts +4 -2
- package/dist/integrations/ruvector/brain-shared.js +11 -4
- package/dist/integrations/ruvector/brain-table-ddl.d.ts +2 -2
- package/dist/integrations/ruvector/brain-table-ddl.js +20 -8
- package/dist/integrations/ruvector/cognitive-container.js +1 -1
- package/dist/integrations/ruvector/rvf-dual-writer.d.ts +4 -0
- package/dist/integrations/ruvector/rvf-dual-writer.js +57 -9
- package/dist/integrations/ruvector/rvf-store-integrity.js +1 -1
- package/dist/kernel/unified-memory-schemas.d.ts +4 -3
- package/dist/kernel/unified-memory-schemas.js +19 -9
- package/dist/kernel/unified-memory.d.ts +2 -0
- package/dist/kernel/unified-memory.js +19 -0
- package/dist/learning/embed-and-insert-pattern.js +6 -3
- package/dist/learning/embedding-space.d.ts +50 -0
- package/dist/learning/embedding-space.js +128 -0
- package/dist/learning/evidence-admission-store.d.ts +15 -0
- package/dist/learning/evidence-admission-store.js +68 -0
- package/dist/learning/index.d.ts +7 -0
- package/dist/learning/index.js +4 -0
- package/dist/learning/learning-evidence-admission.d.ts +44 -0
- package/dist/learning/learning-evidence-admission.js +97 -0
- package/dist/learning/pattern-mutation-error.d.ts +9 -0
- package/dist/learning/pattern-mutation-error.js +14 -0
- package/dist/learning/pattern-store.d.ts +5 -0
- package/dist/learning/pattern-store.js +60 -9
- package/dist/learning/qe-flywheel/coupled-anchor.d.ts +8 -0
- package/dist/learning/qe-flywheel/coupled-anchor.js +46 -3
- package/dist/learning/qe-reasoning-bank.js +28 -5
- package/dist/learning/real-embeddings.d.ts +3 -0
- package/dist/learning/real-embeddings.js +40 -3
- package/dist/learning/real-qe-reasoning-bank.js +7 -3
- package/dist/learning/rvf-pattern-migration.d.ts +2 -0
- package/dist/learning/rvf-pattern-migration.js +5 -3
- package/dist/learning/rvf-pattern-store.d.ts +3 -0
- package/dist/learning/rvf-pattern-store.js +44 -6
- package/dist/learning/sqlite-persistence.d.ts +7 -2
- package/dist/learning/sqlite-persistence.js +58 -21
- package/dist/learning/structural-retrieval/corpus.d.ts +5 -0
- package/dist/learning/structural-retrieval/corpus.js +97 -0
- package/dist/learning/structural-retrieval/evaluate.d.ts +7 -0
- package/dist/learning/structural-retrieval/evaluate.js +124 -0
- package/dist/learning/structural-retrieval/index.d.ts +6 -0
- package/dist/learning/structural-retrieval/index.js +4 -0
- package/dist/learning/structural-retrieval/receipt.d.ts +14 -0
- package/dist/learning/structural-retrieval/receipt.js +36 -0
- package/dist/learning/structural-retrieval/types.d.ts +83 -0
- package/dist/learning/structural-retrieval/types.js +2 -0
- package/dist/mcp/bundle.js +589 -433
- package/dist/mcp/handlers/memory-handlers.js +6 -2
- package/dist/mcp/services/session-resume.d.ts +15 -19
- package/dist/mcp/services/session-resume.js +204 -194
- package/dist/mcp/tools/quality-assessment/gate.d.ts +8 -5
- package/dist/mcp/tools/quality-assessment/gate.js +9 -4
- package/dist/migrations/20260830_add_learning_evidence_tables.d.ts +7 -0
- package/dist/migrations/20260830_add_learning_evidence_tables.js +173 -0
- package/dist/persistence/rvf-migration-adapter.d.ts +2 -0
- package/dist/persistence/rvf-migration-adapter.js +56 -12
- package/dist/shared/llm/llm-router-service.d.ts +8 -0
- package/dist/shared/llm/llm-router-service.js +21 -3
- package/dist/shared/sql-safety.js +4 -0
- package/dist/skills/qe-court/cli.d.ts +3 -0
- package/dist/skills/qe-court/cli.js +54 -0
- package/dist/validation/quality-gate-runner.d.ts +27 -4
- package/dist/validation/quality-gate-runner.js +33 -4
- package/dist/validation/verification-reach.d.ts +90 -0
- package/dist/validation/verification-reach.js +187 -0
- package/dist/verification/adversarial-verify/calibrate.d.ts +46 -2
- package/dist/verification/adversarial-verify/calibrate.js +104 -2
- package/dist/verification/adversarial-verify/index.d.ts +2 -2
- package/dist/verification/adversarial-verify/index.js +1 -1
- package/dist/verification/adversarial-verify/measurement-receipt.d.ts +13 -0
- package/dist/verification/adversarial-verify/measurement-receipt.js +136 -0
- package/dist/verification/adversarial-verify/synthesize.js +7 -10
- package/dist/verification/adversarial-verify/types.d.ts +35 -0
- package/dist/verification/adversarial-verify/verify.js +6 -1
- package/package.json +14 -6
- package/schemas/coverage-gap.schema.json +41 -0
- package/schemas/finding-verdict.schema.json +470 -0
- package/schemas/risk-decision.schema.json +41 -0
- package/dist/cli/chunks/adapter-FUV6LBJT.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-QNFNA3J4.js +0 -2
- package/dist/cli/chunks/base-37W2XIXC.js +0 -2
- package/dist/cli/chunks/brain-handler-TVTTWZGP.js +0 -89
- package/dist/cli/chunks/browser-workflow-PDIUEK7B.js +0 -2
- package/dist/cli/chunks/chunk-5PI75QYP.js +0 -4
- package/dist/cli/chunks/chunk-EDRPTLAX.js +0 -2
- package/dist/cli/chunks/chunk-GEQWCK4F.js +0 -2
- package/dist/cli/chunks/chunk-GQLJYTXN.js +0 -2
- package/dist/cli/chunks/chunk-NLZUGANH.js +0 -11
- package/dist/cli/chunks/chunk-O4BWESH5.js +0 -2
- package/dist/cli/chunks/chunk-PGFCKE4G.js +0 -12
- package/dist/cli/chunks/chunk-RACWX2ZX.js +0 -9
- package/dist/cli/chunks/chunk-SNC73DWF.js +0 -2
- package/dist/cli/chunks/chunk-TDVMILKO.js +0 -2
- package/dist/cli/chunks/chunk-TK5XLF3Z.js +0 -65
- package/dist/cli/chunks/chunk-UQ4UCHO7.js +0 -2
- package/dist/cli/chunks/chunk-VZGP77YU.js +0 -12
- package/dist/cli/chunks/chunk-WA6CSEOX.js +0 -2
- package/dist/cli/chunks/chunk-WYIXNHPF.js +0 -2
- package/dist/cli/chunks/client-4W3KWTAU.js +0 -2
- package/dist/cli/chunks/codex-installer-P7DPQMYL.js +0 -15
- package/dist/cli/chunks/core-handlers-BDU2XBLO.js +0 -2
- package/dist/cli/chunks/cross-domain-router-BPB6IHN4.js +0 -2
- package/dist/cli/chunks/dream-WFCZGFDY.js +0 -2
- package/dist/cli/chunks/embed-and-insert-pattern-VESJQSYD.js +0 -3
- package/dist/cli/chunks/heartbeat-scheduler-HWS4SHRM.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-7QOBHKRB.js +0 -2
- package/dist/cli/chunks/hnsw-index-6WUKYJH7.js +0 -2
- package/dist/cli/chunks/hybrid-router-525JTRA5.js +0 -2
- package/dist/cli/chunks/impact-analyzer-GG6CJEOK.js +0 -2
- package/dist/cli/chunks/init-wizard-4VFAOK4Y.js +0 -2
- package/dist/cli/chunks/kernel-N3FQGOST.js +0 -2
- package/dist/cli/chunks/knowledge-graph-I5QIHB4G.js +0 -2
- package/dist/cli/chunks/learning-TQOGG3CR.js +0 -119
- package/dist/cli/chunks/llm-router-service-NCJZYJLG.js +0 -2
- package/dist/cli/chunks/load-test-DCJEYIXD.js +0 -2
- package/dist/cli/chunks/memory-backend-O6KO2KTX.js +0 -2
- package/dist/cli/chunks/memory-handlers-4Z43WEKD.js +0 -2
- package/dist/cli/chunks/pattern-null-store-5WIJKX2K.js +0 -2
- package/dist/cli/chunks/platform-F76G6RUI.js +0 -2
- package/dist/cli/chunks/protocol-executor-5TPNAZTB.js +0 -2
- package/dist/cli/chunks/provider-manager-3VMOZ6HV.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-BATV4NTT.js +0 -2
- package/dist/cli/chunks/quality-gate-A5MPWHST.js +0 -7
- package/dist/cli/chunks/queen-coordinator-EIHGYBUO.js +0 -2
- package/dist/cli/chunks/real-embeddings-ZBF5EQOG.js +0 -2
- package/dist/cli/chunks/router-EMVGY4HU.js +0 -2
- package/dist/cli/chunks/routing-feedback-JUP4OFB2.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-BUNP4SKD.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-VSOAPLMB.js +0 -2
- package/dist/cli/chunks/rvf-migration-coordinator-LSWEHAWX.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-LOC42TQ6.js +0 -2
- package/dist/cli/chunks/safe-db-WQ62IQKV.js +0 -2
- package/dist/cli/chunks/schedule-XJRP57TE.js +0 -2
- package/dist/cli/chunks/scheduler-EZH5SDIM.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-HPEVCTIB.js +0 -2
- package/dist/cli/chunks/token-bootstrap-F2DCLWGW.js +0 -2
- package/dist/cli/chunks/unified-memory-ATILROKR.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-XJXAX7DW.js +0 -2
- package/dist/cli/chunks/unified-persistence-3TN5PBWE.js +0 -2
- package/dist/cli/chunks/visual-security-VFWRBCNA.js +0 -2
- package/dist/cli/chunks/witness-chain-JC5LEXRV.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-TKQUF2KN.js +0 -2
|
@@ -75,12 +75,16 @@ export async function handleMemoryStore(params) {
|
|
|
75
75
|
}
|
|
76
76
|
catch {
|
|
77
77
|
// Non-critical — KV store succeeded, vector indexing is best-effort
|
|
78
|
-
|
|
78
|
+
const vectorUnavailableMessage = 'Semantic vector indexing is unavailable for this entry. Configure AQE_EMBEDDER_ENDPOINT ' +
|
|
79
|
+
'for the recommended remote backend. The compatible local @huggingface/transformers@4.2.0 ' +
|
|
80
|
+
'dependency chain currently has unresolved HIGH advisories ' +
|
|
81
|
+
'GHSA-xcpc-8h2w-3j85 and GHSA-f88m-g3jw-g9cj.';
|
|
82
|
+
console.warn(`[MemoryHandler] VECTOR_INDEX_UNAVAILABLE: ${vectorUnavailableMessage}`);
|
|
79
83
|
vectorIndex = {
|
|
80
84
|
status: 'failed',
|
|
81
85
|
error: {
|
|
82
86
|
code: 'VECTOR_INDEX_UNAVAILABLE',
|
|
83
|
-
message:
|
|
87
|
+
message: vectorUnavailableMessage,
|
|
84
88
|
},
|
|
85
89
|
};
|
|
86
90
|
}
|
|
@@ -1,29 +1,25 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agentic QE v3 - Session Resume Service
|
|
3
|
-
*
|
|
4
|
-
* IMP-04: Transcript-First Session Durability
|
|
5
|
-
* Reads an existing JSONL session file by sampling the head (first 4KB)
|
|
6
|
-
* and tail (last 64KB) to reconstruct metadata and recent entries
|
|
7
|
-
* without reading the entire file.
|
|
8
|
-
*
|
|
9
|
-
* @module mcp/services/session-resume
|
|
10
|
-
*/
|
|
11
1
|
import type { SessionEntry, SessionMetadata } from './session-store';
|
|
2
|
+
export type SessionRecoveryDisposition = 'MISSING' | 'EMPTY' | 'LEGACY_UNVERIFIED' | 'INVALID' | 'UNTRUSTED' | 'RESOURCE_LIMIT';
|
|
3
|
+
export interface SessionResumeOptions {
|
|
4
|
+
/** Canonical directory that must contain the session file. */
|
|
5
|
+
sessionRoot: string;
|
|
6
|
+
/** Explicit compatibility opt-in; legacy JSONL has no commit proof. */
|
|
7
|
+
allowLegacyUnverified?: boolean;
|
|
8
|
+
maxFileBytes?: number;
|
|
9
|
+
maxRecordBytes?: number;
|
|
10
|
+
maxRecords?: number;
|
|
11
|
+
}
|
|
12
12
|
export interface SessionResumeResult {
|
|
13
13
|
metadata: SessionMetadata;
|
|
14
14
|
recentEntries: SessionEntry[];
|
|
15
15
|
lastState: 'idle' | 'running' | 'requires_action';
|
|
16
16
|
canResume: boolean;
|
|
17
|
+
disposition: SessionRecoveryDisposition;
|
|
18
|
+
diagnostics: string[];
|
|
17
19
|
}
|
|
18
20
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* Reads the first 4KB (head) to extract session start metadata and
|
|
22
|
-
* the last 64KB (tail) to get recent entries. Parses JSONL lines,
|
|
23
|
-
* reconstructs the parentUuid linked list, and returns metadata +
|
|
24
|
-
* recent entries + resume capability.
|
|
25
|
-
*
|
|
26
|
-
* Corrupt or incomplete lines are skipped gracefully.
|
|
21
|
+
* Inspect a legacy transcript through one no-follow descriptor. Automatic
|
|
22
|
+
* resume requires an explicit opt-in because this format has no commit marker.
|
|
27
23
|
*/
|
|
28
|
-
export declare function resumeSession(filePath: string): SessionResumeResult;
|
|
24
|
+
export declare function resumeSession(filePath: string, options: SessionResumeOptions): SessionResumeResult;
|
|
29
25
|
//# sourceMappingURL=session-resume.d.ts.map
|
|
@@ -1,221 +1,231 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agentic QE v3 - Session Resume Service
|
|
3
|
-
*
|
|
4
|
-
* IMP-04: Transcript-First Session Durability
|
|
5
|
-
* Reads an existing JSONL session file by sampling the head (first 4KB)
|
|
6
|
-
* and tail (last 64KB) to reconstruct metadata and recent entries
|
|
7
|
-
* without reading the entire file.
|
|
8
|
-
*
|
|
9
|
-
* @module mcp/services/session-resume
|
|
10
|
-
*/
|
|
1
|
+
/** Bounded, fail-closed recovery for legacy JSONL session transcripts. */
|
|
11
2
|
import * as fs from 'fs';
|
|
12
3
|
import * as path from 'path';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
* Reads the first 4KB (head) to extract session start metadata and
|
|
25
|
-
* the last 64KB (tail) to get recent entries. Parses JSONL lines,
|
|
26
|
-
* reconstructs the parentUuid linked list, and returns metadata +
|
|
27
|
-
* recent entries + resume capability.
|
|
28
|
-
*
|
|
29
|
-
* Corrupt or incomplete lines are skipped gracefully.
|
|
30
|
-
*/
|
|
31
|
-
export function resumeSession(filePath) {
|
|
32
|
-
// If file doesn't exist, return non-resumable result
|
|
33
|
-
if (!fs.existsSync(filePath)) {
|
|
34
|
-
return {
|
|
35
|
-
metadata: {
|
|
36
|
-
sessionId: extractSessionId(filePath),
|
|
37
|
-
createdAt: 0,
|
|
38
|
-
lastActivityAt: 0,
|
|
39
|
-
entryCount: 0,
|
|
40
|
-
state: 'idle',
|
|
41
|
-
},
|
|
42
|
-
recentEntries: [],
|
|
43
|
-
lastState: 'idle',
|
|
44
|
-
canResume: false,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
const stat = fs.statSync(filePath);
|
|
48
|
-
const fileSize = stat.size;
|
|
49
|
-
if (fileSize === 0) {
|
|
50
|
-
return {
|
|
51
|
-
metadata: {
|
|
52
|
-
sessionId: extractSessionId(filePath),
|
|
53
|
-
createdAt: 0,
|
|
54
|
-
lastActivityAt: 0,
|
|
55
|
-
entryCount: 0,
|
|
56
|
-
state: 'idle',
|
|
57
|
-
},
|
|
58
|
-
recentEntries: [],
|
|
59
|
-
lastState: 'idle',
|
|
60
|
-
canResume: false,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
// Read head (first 4KB)
|
|
64
|
-
const headEntries = readHead(filePath, fileSize);
|
|
65
|
-
// Read tail (last 64KB)
|
|
66
|
-
const tailEntries = readTail(filePath, fileSize);
|
|
67
|
-
// Merge and deduplicate: use a Map keyed by uuid to ensure uniqueness
|
|
68
|
-
const entryMap = new Map();
|
|
69
|
-
for (const entry of headEntries) {
|
|
70
|
-
entryMap.set(entry.uuid, entry);
|
|
71
|
-
}
|
|
72
|
-
for (const entry of tailEntries) {
|
|
73
|
-
entryMap.set(entry.uuid, entry);
|
|
74
|
-
}
|
|
75
|
-
const allEntries = Array.from(entryMap.values());
|
|
76
|
-
allEntries.sort((a, b) => a.timestamp - b.timestamp);
|
|
77
|
-
// Reconstruct metadata from available entries
|
|
78
|
-
const firstEntry = headEntries[0] ?? allEntries[0];
|
|
79
|
-
const lastEntry = tailEntries[tailEntries.length - 1] ?? allEntries[allEntries.length - 1];
|
|
80
|
-
// For entry count: if file is small enough that head+tail overlap,
|
|
81
|
-
// allEntries.length is accurate. Otherwise, count total lines.
|
|
82
|
-
let entryCount;
|
|
83
|
-
if (fileSize <= HEAD_BYTES + TAIL_BYTES) {
|
|
84
|
-
entryCount = allEntries.length;
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
entryCount = countLines(filePath);
|
|
88
|
-
}
|
|
89
|
-
const lastState = lastEntry?.state ?? 'idle';
|
|
90
|
-
const metadata = {
|
|
91
|
-
sessionId: extractSessionId(filePath),
|
|
92
|
-
createdAt: firstEntry?.timestamp ?? 0,
|
|
93
|
-
lastActivityAt: lastEntry?.timestamp ?? 0,
|
|
94
|
-
entryCount,
|
|
95
|
-
state: lastState,
|
|
96
|
-
};
|
|
4
|
+
const DEFAULT_MAX_FILE_BYTES = 16 * 1024 * 1024;
|
|
5
|
+
const DEFAULT_MAX_RECORD_BYTES = 1024 * 1024;
|
|
6
|
+
const DEFAULT_MAX_RECORDS = 100_000;
|
|
7
|
+
const RECENT_ENTRY_LIMIT = 256;
|
|
8
|
+
const ENTRY_TYPES = new Set(['tool_call', 'tool_result', 'state_change', 'error']);
|
|
9
|
+
const ENTRY_STATES = new Set(['idle', 'running', 'requires_action']);
|
|
10
|
+
const ENTRY_KEYS = new Set([
|
|
11
|
+
'uuid', 'parentUuid', 'timestamp', 'type', 'toolName', 'params', 'result', 'state', 'tokenEstimate',
|
|
12
|
+
]);
|
|
13
|
+
const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
14
|
+
function emptyResult(filePath, disposition, diagnostics = []) {
|
|
97
15
|
return {
|
|
98
|
-
metadata
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
16
|
+
metadata: {
|
|
17
|
+
sessionId: path.basename(filePath, '.jsonl'), createdAt: 0, lastActivityAt: 0,
|
|
18
|
+
entryCount: 0, state: 'idle',
|
|
19
|
+
},
|
|
20
|
+
recentEntries: [], lastState: 'idle', canResume: false, disposition, diagnostics,
|
|
102
21
|
};
|
|
103
22
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Extract session ID from file path (filename without extension).
|
|
109
|
-
*/
|
|
110
|
-
function extractSessionId(filePath) {
|
|
111
|
-
return path.basename(filePath, '.jsonl');
|
|
23
|
+
function isWithin(root, candidate) {
|
|
24
|
+
const relative = path.relative(root, candidate);
|
|
25
|
+
return relative === '' || (!relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative));
|
|
112
26
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
27
|
+
function isValidEntry(value) {
|
|
28
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
29
|
+
return false;
|
|
30
|
+
const entry = value;
|
|
31
|
+
if (Object.keys(entry).some(key => !ENTRY_KEYS.has(key)))
|
|
32
|
+
return false;
|
|
33
|
+
const params = entry.params;
|
|
34
|
+
return typeof entry.uuid === 'string' && UUID_PATTERN.test(entry.uuid)
|
|
35
|
+
&& (entry.parentUuid === null
|
|
36
|
+
|| (typeof entry.parentUuid === 'string' && UUID_PATTERN.test(entry.parentUuid)))
|
|
37
|
+
&& typeof entry.timestamp === 'number' && Number.isSafeInteger(entry.timestamp) && entry.timestamp >= 0
|
|
38
|
+
&& typeof entry.type === 'string' && ENTRY_TYPES.has(entry.type)
|
|
39
|
+
&& typeof entry.state === 'string' && ENTRY_STATES.has(entry.state)
|
|
40
|
+
&& (entry.toolName === undefined || (typeof entry.toolName === 'string' && entry.toolName.length > 0))
|
|
41
|
+
&& (params === undefined || (typeof params === 'object' && params !== null && !Array.isArray(params)))
|
|
42
|
+
&& (entry.tokenEstimate === undefined || (typeof entry.tokenEstimate === 'number'
|
|
43
|
+
&& Number.isSafeInteger(entry.tokenEstimate)
|
|
44
|
+
&& entry.tokenEstimate >= 0));
|
|
45
|
+
}
|
|
46
|
+
function resolveLimit(value, defaultValue) {
|
|
47
|
+
const limit = value ?? defaultValue;
|
|
48
|
+
return Number.isSafeInteger(limit) && limit > 0 && limit <= defaultValue ? limit : undefined;
|
|
49
|
+
}
|
|
50
|
+
function sameFile(left, right) {
|
|
51
|
+
return left.dev === right.dev && left.ino === right.ino;
|
|
52
|
+
}
|
|
53
|
+
function validateOpenedPath(fd, candidate, root, openedStat) {
|
|
119
54
|
try {
|
|
120
|
-
const
|
|
121
|
-
fs.
|
|
122
|
-
|
|
123
|
-
|
|
55
|
+
const canonicalTarget = fs.realpathSync(candidate);
|
|
56
|
+
const currentStat = fs.lstatSync(candidate);
|
|
57
|
+
if (!isWithin(root, canonicalTarget) || currentStat.isSymbolicLink() || !sameFile(openedStat, currentStat)) {
|
|
58
|
+
return 'session path changed or escaped the configured root';
|
|
59
|
+
}
|
|
60
|
+
// Linux exposes the descriptor target directly. This closes intermediate
|
|
61
|
+
// component substitution without relying only on the current pathname.
|
|
62
|
+
if (process.platform === 'linux') {
|
|
63
|
+
const descriptorTarget = fs.realpathSync(`/proc/self/fd/${fd}`);
|
|
64
|
+
if (!isWithin(root, descriptorTarget))
|
|
65
|
+
return 'opened session descriptor escapes the configured root';
|
|
66
|
+
}
|
|
124
67
|
}
|
|
125
|
-
|
|
126
|
-
|
|
68
|
+
catch {
|
|
69
|
+
return 'opened session path cannot be verified';
|
|
127
70
|
}
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
function readExactly(fd, fileSize) {
|
|
74
|
+
const buffer = Buffer.alloc(fileSize);
|
|
75
|
+
let offset = 0;
|
|
76
|
+
while (offset < fileSize) {
|
|
77
|
+
const count = fs.readSync(fd, buffer, offset, fileSize - offset, offset);
|
|
78
|
+
if (count === 0)
|
|
79
|
+
throw new Error('unexpected EOF while reading session transcript');
|
|
80
|
+
offset += count;
|
|
81
|
+
}
|
|
82
|
+
return buffer;
|
|
128
83
|
}
|
|
129
84
|
/**
|
|
130
|
-
*
|
|
85
|
+
* Inspect a legacy transcript through one no-follow descriptor. Automatic
|
|
86
|
+
* resume requires an explicit opt-in because this format has no commit marker.
|
|
131
87
|
*/
|
|
132
|
-
function
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
88
|
+
export function resumeSession(filePath, options) {
|
|
89
|
+
if (!options || typeof options.sessionRoot !== 'string' || options.sessionRoot.trim().length === 0) {
|
|
90
|
+
return emptyResult(filePath, 'UNTRUSTED', ['a non-empty session root is required']);
|
|
91
|
+
}
|
|
92
|
+
const maxFileBytes = resolveLimit(options.maxFileBytes, DEFAULT_MAX_FILE_BYTES);
|
|
93
|
+
const maxRecordBytes = resolveLimit(options.maxRecordBytes, DEFAULT_MAX_RECORD_BYTES);
|
|
94
|
+
const maxRecords = resolveLimit(options.maxRecords, DEFAULT_MAX_RECORDS);
|
|
95
|
+
if (maxFileBytes === undefined || maxRecordBytes === undefined || maxRecords === undefined) {
|
|
96
|
+
return emptyResult(filePath, 'RESOURCE_LIMIT', ['recovery limits must be finite positive integers within hard ceilings']);
|
|
97
|
+
}
|
|
98
|
+
const candidate = path.resolve(filePath);
|
|
99
|
+
let root;
|
|
100
|
+
let parent;
|
|
136
101
|
try {
|
|
137
|
-
|
|
138
|
-
fs.
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
// the first line is complete -- don't skip it.
|
|
142
|
-
const isMidFileRead = offset > 0;
|
|
143
|
-
return parseJsonlLines(text, /* isHead */ false, isMidFileRead);
|
|
102
|
+
root = fs.realpathSync(options.sessionRoot);
|
|
103
|
+
parent = fs.realpathSync(path.dirname(candidate));
|
|
104
|
+
if (!fs.statSync(root).isDirectory())
|
|
105
|
+
throw new Error('session root is not a directory');
|
|
144
106
|
}
|
|
145
|
-
|
|
146
|
-
|
|
107
|
+
catch {
|
|
108
|
+
return emptyResult(filePath, 'UNTRUSTED', ['session root or parent cannot be resolved']);
|
|
147
109
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
110
|
+
if (!isWithin(root, parent)) {
|
|
111
|
+
return emptyResult(filePath, 'UNTRUSTED', ['session path escapes the configured root']);
|
|
112
|
+
}
|
|
113
|
+
let linkStat;
|
|
114
|
+
try {
|
|
115
|
+
linkStat = fs.lstatSync(candidate);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
const code = error.code;
|
|
119
|
+
return emptyResult(filePath, code === 'ENOENT' ? 'MISSING' : 'UNTRUSTED', [`lstat failed: ${code ?? 'UNKNOWN'}`]);
|
|
120
|
+
}
|
|
121
|
+
if (linkStat.isSymbolicLink() || !linkStat.isFile()) {
|
|
122
|
+
return emptyResult(filePath, 'UNTRUSTED', ['session path is not a regular, non-symlink file']);
|
|
123
|
+
}
|
|
124
|
+
let fd;
|
|
125
|
+
try {
|
|
126
|
+
fd = fs.openSync(candidate, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0));
|
|
127
|
+
const stat = fs.fstatSync(fd);
|
|
128
|
+
if (!sameFile(linkStat, stat)) {
|
|
129
|
+
return emptyResult(filePath, 'UNTRUSTED', ['session path changed before secure open']);
|
|
130
|
+
}
|
|
131
|
+
if (!stat.isFile() || stat.nlink !== 1) {
|
|
132
|
+
return emptyResult(filePath, 'UNTRUSTED', ['opened session is not an exclusive regular file']);
|
|
133
|
+
}
|
|
134
|
+
if (stat.size === 0)
|
|
135
|
+
return emptyResult(filePath, 'EMPTY');
|
|
136
|
+
if (stat.size > maxFileBytes) {
|
|
137
|
+
return emptyResult(filePath, 'RESOURCE_LIMIT', [`file exceeds ${maxFileBytes} bytes`]);
|
|
138
|
+
}
|
|
139
|
+
const pathError = validateOpenedPath(fd, candidate, root, stat);
|
|
140
|
+
if (pathError)
|
|
141
|
+
return emptyResult(filePath, 'UNTRUSTED', [pathError]);
|
|
142
|
+
const bytes = readExactly(fd, stat.size);
|
|
143
|
+
const finalStat = fs.fstatSync(fd);
|
|
144
|
+
const finalPathError = validateOpenedPath(fd, candidate, root, finalStat);
|
|
145
|
+
if (finalPathError || !sameFile(stat, finalStat) || stat.size !== finalStat.size
|
|
146
|
+
|| stat.mtimeMs !== finalStat.mtimeMs || stat.ctimeMs !== finalStat.ctimeMs) {
|
|
147
|
+
return emptyResult(filePath, 'UNTRUSTED', [finalPathError ?? 'session changed while it was being inspected']);
|
|
148
|
+
}
|
|
149
|
+
const hasTornTail = bytes[bytes.length - 1] !== 0x0a;
|
|
150
|
+
let committedBytes = bytes;
|
|
151
|
+
if (hasTornTail) {
|
|
152
|
+
const finalLineBreak = bytes.lastIndexOf(0x0a);
|
|
153
|
+
const tornTailStart = finalLineBreak + 1;
|
|
154
|
+
const tornTailBytes = bytes.length - tornTailStart;
|
|
155
|
+
if (tornTailBytes > maxRecordBytes) {
|
|
156
|
+
return emptyResult(filePath, 'RESOURCE_LIMIT', [`record exceeds ${maxRecordBytes} bytes`]);
|
|
179
157
|
}
|
|
158
|
+
committedBytes = bytes.subarray(0, tornTailStart);
|
|
159
|
+
}
|
|
160
|
+
let text;
|
|
161
|
+
try {
|
|
162
|
+
text = new TextDecoder('utf-8', { fatal: true }).decode(committedBytes);
|
|
180
163
|
}
|
|
181
164
|
catch {
|
|
182
|
-
|
|
183
|
-
continue;
|
|
165
|
+
return emptyResult(filePath, 'INVALID', ['transcript is not valid UTF-8']);
|
|
184
166
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* Count total lines in a file (for large files where head+tail don't overlap).
|
|
202
|
-
* Only counts non-empty lines that parse as valid JSON.
|
|
203
|
-
*/
|
|
204
|
-
function countLines(filePath) {
|
|
205
|
-
const content = fs.readFileSync(filePath, 'utf-8');
|
|
206
|
-
let count = 0;
|
|
207
|
-
for (const line of content.split('\n')) {
|
|
208
|
-
const trimmed = line.trim();
|
|
209
|
-
if (trimmed) {
|
|
167
|
+
const lines = text.split('\n');
|
|
168
|
+
const entries = [];
|
|
169
|
+
const seen = new Set();
|
|
170
|
+
let previous;
|
|
171
|
+
for (const rawLine of lines) {
|
|
172
|
+
if (!rawLine.trim())
|
|
173
|
+
continue;
|
|
174
|
+
if (Buffer.byteLength(rawLine, 'utf8') > maxRecordBytes) {
|
|
175
|
+
return emptyResult(filePath, 'RESOURCE_LIMIT', [`record exceeds ${maxRecordBytes} bytes`]);
|
|
176
|
+
}
|
|
177
|
+
if (entries.length >= maxRecords) {
|
|
178
|
+
return emptyResult(filePath, 'RESOURCE_LIMIT', [`record count exceeds ${maxRecords}`]);
|
|
179
|
+
}
|
|
180
|
+
let parsed;
|
|
210
181
|
try {
|
|
211
|
-
JSON.parse(
|
|
212
|
-
count++;
|
|
182
|
+
parsed = JSON.parse(rawLine);
|
|
213
183
|
}
|
|
214
184
|
catch {
|
|
215
|
-
|
|
185
|
+
return emptyResult(filePath, 'INVALID', ['corrupt JSON occurs before the final torn record']);
|
|
186
|
+
}
|
|
187
|
+
if (!isValidEntry(parsed))
|
|
188
|
+
return emptyResult(filePath, 'INVALID', ['entry fails the session schema']);
|
|
189
|
+
if (seen.has(parsed.uuid))
|
|
190
|
+
return emptyResult(filePath, 'INVALID', ['duplicate entry UUID']);
|
|
191
|
+
if (previous) {
|
|
192
|
+
if (parsed.parentUuid !== previous.uuid)
|
|
193
|
+
return emptyResult(filePath, 'INVALID', ['broken parentUuid lineage']);
|
|
194
|
+
if (parsed.timestamp < previous.timestamp)
|
|
195
|
+
return emptyResult(filePath, 'INVALID', ['timestamps are not monotonic']);
|
|
216
196
|
}
|
|
197
|
+
else if (parsed.parentUuid !== null) {
|
|
198
|
+
return emptyResult(filePath, 'INVALID', ['first entry has a forged parentUuid']);
|
|
199
|
+
}
|
|
200
|
+
seen.add(parsed.uuid);
|
|
201
|
+
entries.push(parsed);
|
|
202
|
+
previous = parsed;
|
|
203
|
+
}
|
|
204
|
+
if (entries.length === 0) {
|
|
205
|
+
return emptyResult(filePath, hasTornTail ? 'INVALID' : 'EMPTY', hasTornTail ? ['only record is torn'] : []);
|
|
217
206
|
}
|
|
207
|
+
const lastEntry = entries[entries.length - 1];
|
|
208
|
+
const diagnostics = [
|
|
209
|
+
'legacy JSONL has no durable commit marker',
|
|
210
|
+
...(hasTornTail ? ['discarded an incomplete final record'] : []),
|
|
211
|
+
];
|
|
212
|
+
return {
|
|
213
|
+
metadata: {
|
|
214
|
+
sessionId: path.basename(filePath, '.jsonl'), createdAt: entries[0].timestamp,
|
|
215
|
+
lastActivityAt: lastEntry.timestamp, entryCount: entries.length, state: lastEntry.state,
|
|
216
|
+
},
|
|
217
|
+
recentEntries: entries.slice(-RECENT_ENTRY_LIMIT), lastState: lastEntry.state,
|
|
218
|
+
canResume: options.allowLegacyUnverified === true,
|
|
219
|
+
disposition: 'LEGACY_UNVERIFIED', diagnostics,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
const code = error.code;
|
|
224
|
+
return emptyResult(filePath, 'UNTRUSTED', [`secure open/read failed: ${code ?? 'UNKNOWN'}`]);
|
|
225
|
+
}
|
|
226
|
+
finally {
|
|
227
|
+
if (fd !== undefined)
|
|
228
|
+
fs.closeSync(fd);
|
|
218
229
|
}
|
|
219
|
-
return count;
|
|
220
230
|
}
|
|
221
231
|
//# sourceMappingURL=session-resume.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Agentic QE v3 - Quality Gate MCP Tool (ADR-119)
|
|
3
3
|
*
|
|
4
|
-
* qe/quality/gate -
|
|
5
|
-
* ADR-117 checklist. Calls the SAME `runQualityGate` orchestrator as the
|
|
4
|
+
* qe/quality/gate - fail-closed quality and verification-reach verdict against
|
|
5
|
+
* a pinned ADR-117 checklist. Calls the SAME `runQualityGate` orchestrator as the
|
|
6
6
|
* `aqe quality-gate` CLI subcommand so CLI and MCP stay in exact parity.
|
|
7
7
|
*
|
|
8
8
|
* The frontier judge is built from the forwarded HybridRouter
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { MCPToolBase, MCPToolConfig, MCPToolContext } from '../base';
|
|
13
13
|
import { ToolResult } from '../../types';
|
|
14
|
-
import type
|
|
14
|
+
import { type ReachAwareQualityGateResult } from '../../../validation/quality-gate-runner.js';
|
|
15
|
+
import type { VerificationReachManifest } from '../../../validation/verification-reach.js';
|
|
15
16
|
export interface QualityGateParams {
|
|
16
17
|
/** Pinned anchor checklist id (e.g. "A1-inRange"). */
|
|
17
18
|
checklistId: string;
|
|
@@ -27,12 +28,14 @@ export interface QualityGateParams {
|
|
|
27
28
|
} | null;
|
|
28
29
|
/** Override the frozen anchor path (ADR-117). */
|
|
29
30
|
anchorPath?: string;
|
|
31
|
+
/** Revision-bound evidence proving which failure modes the checks can observe. */
|
|
32
|
+
verificationManifest?: VerificationReachManifest;
|
|
30
33
|
/** Frontier judge model id (ADR-111: always frontier-tier). */
|
|
31
34
|
model?: string;
|
|
32
35
|
[key: string]: unknown;
|
|
33
36
|
}
|
|
34
|
-
export declare class QualityGateTool extends MCPToolBase<QualityGateParams,
|
|
37
|
+
export declare class QualityGateTool extends MCPToolBase<QualityGateParams, ReachAwareQualityGateResult> {
|
|
35
38
|
readonly config: MCPToolConfig;
|
|
36
|
-
execute(params: QualityGateParams, context: MCPToolContext): Promise<ToolResult<
|
|
39
|
+
execute(params: QualityGateParams, context: MCPToolContext): Promise<ToolResult<ReachAwareQualityGateResult>>;
|
|
37
40
|
}
|
|
38
41
|
//# sourceMappingURL=gate.d.ts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Agentic QE v3 - Quality Gate MCP Tool (ADR-119)
|
|
3
3
|
*
|
|
4
|
-
* qe/quality/gate -
|
|
5
|
-
* ADR-117 checklist. Calls the SAME `runQualityGate` orchestrator as the
|
|
4
|
+
* qe/quality/gate - fail-closed quality and verification-reach verdict against
|
|
5
|
+
* a pinned ADR-117 checklist. Calls the SAME `runQualityGate` orchestrator as the
|
|
6
6
|
* `aqe quality-gate` CLI subcommand so CLI and MCP stay in exact parity.
|
|
7
7
|
*
|
|
8
8
|
* The frontier judge is built from the forwarded HybridRouter
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
import { MCPToolBase } from '../base.js';
|
|
13
13
|
import { toErrorMessage } from '../../../shared/error-utils.js';
|
|
14
14
|
import { getLLMRouter } from '../base.js';
|
|
15
|
-
import { runQualityGate } from '../../../validation/quality-gate-runner.js';
|
|
15
|
+
import { runQualityGate, } from '../../../validation/quality-gate-runner.js';
|
|
16
16
|
import { createRouterFrontierJudge, createUnavailableJudge, } from '../../../validation/frontier-judge.js';
|
|
17
17
|
export class QualityGateTool extends MCPToolBase {
|
|
18
18
|
config = {
|
|
19
19
|
name: 'qe/quality/gate',
|
|
20
20
|
description: 'Two-gate, three-valued quality verdict (ADR-119): mechanical oracle gate plus a frontier '
|
|
21
|
-
+ 'judge grading
|
|
21
|
+
+ 'judge grading plus failure-mode verification reach. Returns pass|fail|inconclusive.',
|
|
22
22
|
domain: 'quality-assessment',
|
|
23
23
|
schema: QUALITY_GATE_SCHEMA,
|
|
24
24
|
streaming: false,
|
|
@@ -48,6 +48,7 @@ export class QualityGateTool extends MCPToolBase {
|
|
|
48
48
|
checklistId: params.checklistId,
|
|
49
49
|
judge,
|
|
50
50
|
anchorPath: params.anchorPath,
|
|
51
|
+
verificationManifest: params.verificationManifest,
|
|
51
52
|
});
|
|
52
53
|
return { success: true, data: result };
|
|
53
54
|
}
|
|
@@ -79,6 +80,10 @@ const QUALITY_GATE_SCHEMA = {
|
|
|
79
80
|
type: 'string',
|
|
80
81
|
description: 'Override the frozen anchor path (ADR-117)',
|
|
81
82
|
},
|
|
83
|
+
verificationManifest: {
|
|
84
|
+
type: 'object',
|
|
85
|
+
description: 'Hashed, revision-bound failure-mode verification reach manifest (#651)',
|
|
86
|
+
},
|
|
82
87
|
model: {
|
|
83
88
|
type: 'string',
|
|
84
89
|
description: 'Frontier judge model id (ADR-111: always frontier-tier)',
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Database as DatabaseType } from 'better-sqlite3';
|
|
2
|
+
export declare const MIGRATION_VERSION = "20260830_add_learning_evidence_tables";
|
|
3
|
+
export declare const LEARNING_EVIDENCE_SCHEMA = "\n CREATE TABLE IF NOT EXISTS learning_evidence_manifests (\n id TEXT PRIMARY KEY,\n trajectory_id TEXT,\n trajectory_hash TEXT,\n manifest_hash TEXT NOT NULL UNIQUE,\n task_family TEXT NOT NULL,\n task_identity TEXT,\n run_identity TEXT,\n correlation_group TEXT,\n dedupe_fingerprint TEXT,\n revision TEXT,\n environment TEXT,\n outcome TEXT NOT NULL CHECK (outcome IN ('verified-success','verified-failure','unknown')),\n oracle_refs_json TEXT NOT NULL DEFAULT '[]',\n source_kind TEXT NOT NULL CHECK (source_kind IN ('executed','static','human-reviewed','inferred')),\n process_signals_json TEXT NOT NULL DEFAULT '{}',\n manifest_version INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n\n CREATE TABLE IF NOT EXISTS learning_evidence_segments (\n id TEXT NOT NULL,\n manifest_id TEXT NOT NULL REFERENCES learning_evidence_manifests(id) ON DELETE RESTRICT,\n segment_order INTEGER NOT NULL,\n kind TEXT NOT NULL CHECK (kind IN ('observe','decide','act','verify','recover','other')),\n contribution TEXT NOT NULL CHECK (contribution IN ('causal','supporting','irrelevant','harmful','unknown')),\n evidence_refs_json TEXT NOT NULL DEFAULT '[]',\n admit_for_learning INTEGER NOT NULL CHECK (admit_for_learning IN (0,1)),\n reasons_json TEXT NOT NULL DEFAULT '[]',\n content_hash TEXT,\n PRIMARY KEY (manifest_id, id),\n UNIQUE (manifest_id, segment_order)\n );\n\n CREATE TABLE IF NOT EXISTS learning_segment_edges (\n manifest_id TEXT NOT NULL,\n parent_segment_id TEXT NOT NULL,\n child_segment_id TEXT NOT NULL,\n edge_kind TEXT NOT NULL DEFAULT 'depends-on',\n PRIMARY KEY (manifest_id, parent_segment_id, child_segment_id, edge_kind),\n FOREIGN KEY (manifest_id, parent_segment_id)\n REFERENCES learning_evidence_segments(manifest_id, id) ON DELETE RESTRICT,\n FOREIGN KEY (manifest_id, child_segment_id)\n REFERENCES learning_evidence_segments(manifest_id, id) ON DELETE RESTRICT,\n CHECK (parent_segment_id <> child_segment_id)\n );\n\n CREATE TABLE IF NOT EXISTS learning_evidence_admissions (\n id TEXT PRIMARY KEY,\n manifest_id TEXT NOT NULL REFERENCES learning_evidence_manifests(id) ON DELETE RESTRICT,\n decision_seq INTEGER NOT NULL CHECK (decision_seq > 0),\n disposition TEXT NOT NULL CHECK (disposition IN ('admitted','rejected','review-required','legacy-unknown')),\n reason_codes_json TEXT NOT NULL DEFAULT '[]',\n assessor_kind TEXT NOT NULL CHECK (assessor_kind IN ('executed','static','human-reviewed','inferred')),\n evidence_class TEXT NOT NULL CHECK (evidence_class IN ('EXECUTED','STATIC','INFERRED','CONJECTURE')),\n policy_version TEXT,\n policy_hash TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n UNIQUE (manifest_id, decision_seq)\n );\n\n CREATE TABLE IF NOT EXISTS pattern_manifest_lineage (\n pattern_id TEXT NOT NULL REFERENCES qe_patterns(id) ON DELETE RESTRICT,\n manifest_id TEXT NOT NULL REFERENCES learning_evidence_manifests(id) ON DELETE RESTRICT,\n pattern_version_id TEXT,\n use_kind TEXT NOT NULL CHECK (use_kind IN ('candidate-source','promotion-support','rejection','rollback','legacy-context')),\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (pattern_id, manifest_id, use_kind)\n );\n\n CREATE TABLE IF NOT EXISTS pattern_segment_lineage (\n pattern_id TEXT NOT NULL REFERENCES qe_patterns(id) ON DELETE RESTRICT,\n manifest_id TEXT NOT NULL,\n segment_id TEXT NOT NULL,\n pattern_version_id TEXT,\n use_kind TEXT NOT NULL CHECK (use_kind IN ('candidate-source','promotion-support','rejection','rollback')),\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (pattern_id, manifest_id, segment_id, use_kind),\n FOREIGN KEY (manifest_id, segment_id)\n REFERENCES learning_evidence_segments(manifest_id, id) ON DELETE RESTRICT\n );\n\n CREATE INDEX IF NOT EXISTS idx_learning_manifest_trajectory ON learning_evidence_manifests(trajectory_id);\n CREATE INDEX IF NOT EXISTS idx_learning_manifest_task ON learning_evidence_manifests(task_family);\n CREATE INDEX IF NOT EXISTS idx_learning_manifest_dedupe ON learning_evidence_manifests(dedupe_fingerprint);\n CREATE INDEX IF NOT EXISTS idx_learning_manifest_correlation ON learning_evidence_manifests(correlation_group);\n CREATE INDEX IF NOT EXISTS idx_learning_manifest_outcome ON learning_evidence_manifests(outcome, source_kind);\n CREATE INDEX IF NOT EXISTS idx_learning_admission_manifest ON learning_evidence_admissions(manifest_id, decision_seq DESC);\n CREATE INDEX IF NOT EXISTS idx_pattern_manifest_lineage_manifest ON pattern_manifest_lineage(manifest_id);\n CREATE INDEX IF NOT EXISTS idx_pattern_segment_lineage_manifest ON pattern_segment_lineage(manifest_id, segment_id);\n\n CREATE TRIGGER IF NOT EXISTS learning_manifests_no_update BEFORE UPDATE ON learning_evidence_manifests\n BEGIN SELECT RAISE(ABORT, 'learning evidence manifests are append-only'); END;\n CREATE TRIGGER IF NOT EXISTS learning_manifests_no_delete BEFORE DELETE ON learning_evidence_manifests\n BEGIN SELECT RAISE(ABORT, 'learning evidence manifests are append-only'); END;\n CREATE TRIGGER IF NOT EXISTS learning_segments_no_update BEFORE UPDATE ON learning_evidence_segments\n BEGIN SELECT RAISE(ABORT, 'learning evidence segments are append-only'); END;\n CREATE TRIGGER IF NOT EXISTS learning_segments_no_delete BEFORE DELETE ON learning_evidence_segments\n BEGIN SELECT RAISE(ABORT, 'learning evidence segments are append-only'); END;\n CREATE TRIGGER IF NOT EXISTS learning_edges_no_update BEFORE UPDATE ON learning_segment_edges\n BEGIN SELECT RAISE(ABORT, 'learning evidence edges are append-only'); END;\n CREATE TRIGGER IF NOT EXISTS learning_edges_no_delete BEFORE DELETE ON learning_segment_edges\n BEGIN SELECT RAISE(ABORT, 'learning evidence edges are append-only'); END;\n CREATE TRIGGER IF NOT EXISTS learning_admissions_no_update BEFORE UPDATE ON learning_evidence_admissions\n BEGIN SELECT RAISE(ABORT, 'learning evidence admissions are append-only'); END;\n CREATE TRIGGER IF NOT EXISTS learning_admissions_no_delete BEFORE DELETE ON learning_evidence_admissions\n BEGIN SELECT RAISE(ABORT, 'learning evidence admissions are append-only'); END;\n";
|
|
4
|
+
export declare function applyMigration(db: DatabaseType): void;
|
|
5
|
+
export declare function isMigrationApplied(db: DatabaseType): boolean;
|
|
6
|
+
export declare function rollbackMigration(db: DatabaseType): void;
|
|
7
|
+
//# sourceMappingURL=20260830_add_learning_evidence_tables.d.ts.map
|