agentic-qe 3.15.3 → 3.15.5
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 +139 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/bridge/captured-experience-bridge.js +7 -9
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-EGIPTX5H.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-CYG3PKHH.js → agent-booster-wasm-CCTTGCQS.js} +2 -2
- package/dist/cli/chunks/{agent-handler-WTFYFZKL.js → agent-handler-DHYUF3NX.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-G6WE3ZXU.js → agent-memory-branch-642W7CYX.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-WP4GCBDT.js +2 -0
- package/dist/cli/chunks/{arena-S72QW44C.js → arena-MUCC7UUN.js} +4 -4
- package/dist/cli/chunks/{arena-ZFXQEVUQ.js → arena-NW2JVAFY.js} +2 -2
- package/dist/cli/chunks/{audit-KPYIEQJ3.js → audit-VKQTZJAA.js} +3 -3
- package/dist/cli/chunks/base-6ORFD62I.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-L2M3TI5D.js → better-sqlite3-7ZUFVWLQ.js} +2 -2
- package/dist/cli/chunks/{brain-handler-FHKLQTB4.js → brain-handler-7LKAWSBI.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-3BSHOPOK.js → branch-enumerator-HUNXJKM4.js} +2 -2
- package/dist/cli/chunks/{browser-JUIJPL6Y.js → browser-ZSZEYUDP.js} +2 -2
- package/dist/cli/chunks/browser-workflow-PIXGERWP.js +2 -0
- package/dist/cli/chunks/{chunk-VHBZADYK.js → chunk-2KWI3MT3.js} +2 -2
- package/dist/cli/chunks/{chunk-35VDOH4Y.js → chunk-2WFTZSRT.js} +1 -1
- package/dist/cli/chunks/{chunk-UTALYUMW.js → chunk-2XYTS2WY.js} +2 -2
- package/dist/cli/chunks/{chunk-OTTTHNIT.js → chunk-35MDATQE.js} +1 -1
- package/dist/cli/chunks/{chunk-Z7UGEQ4G.js → chunk-3AYYGR6W.js} +1 -1
- package/dist/cli/chunks/{chunk-LPZAB3N2.js → chunk-3DTEQHFB.js} +3 -3
- package/dist/cli/chunks/{chunk-YHZGFWJE.js → chunk-3OAQPN2N.js} +2 -2
- package/dist/cli/chunks/{chunk-PUPEKA2J.js → chunk-3QD7U3FY.js} +2 -2
- package/dist/cli/chunks/{chunk-3Y4GX5FL.js → chunk-3SH23PS3.js} +2 -2
- package/dist/cli/chunks/{chunk-NT6FYFJA.js → chunk-3YASZPLO.js} +2 -2
- package/dist/cli/chunks/{chunk-QVNMTMDJ.js → chunk-3YNP33GB.js} +2 -2
- package/dist/cli/chunks/{chunk-AQTQ24SK.js → chunk-47GEI2LT.js} +3 -3
- package/dist/cli/chunks/{chunk-JJBTM4JO.js → chunk-4AZP7ZCW.js} +2 -2
- package/dist/cli/chunks/{chunk-6W6GZHQA.js → chunk-4PT5KNXL.js} +4 -4
- package/dist/cli/chunks/{chunk-EQGT4VLC.js → chunk-4UXPDV7E.js} +1 -1
- package/dist/cli/chunks/{chunk-SP2JO53K.js → chunk-4XSCZVON.js} +2 -2
- package/dist/cli/chunks/{chunk-DWG4TN6A.js → chunk-5BOZCMXZ.js} +1 -1
- package/dist/cli/chunks/{chunk-PBUWNMZ2.js → chunk-644DFAGS.js} +1 -1
- package/dist/cli/chunks/{chunk-6EQDA4EC.js → chunk-663ZFPUL.js} +2 -2
- package/dist/cli/chunks/{chunk-HU474NXP.js → chunk-6JFGB2JB.js} +1 -1
- package/dist/cli/chunks/{chunk-AS54N3H7.js → chunk-6LG5UEQE.js} +2 -2
- package/dist/cli/chunks/{chunk-3UUMGWHW.js → chunk-6UYN5PHA.js} +4 -4
- package/dist/cli/chunks/{chunk-RQUSJEON.js → chunk-6ZIDZ4TJ.js} +2 -2
- package/dist/cli/chunks/{chunk-P36IODAM.js → chunk-7BIYJRQJ.js} +2 -2
- package/dist/cli/chunks/{chunk-5LEUEWJY.js → chunk-7EZLOC4K.js} +2 -2
- package/dist/cli/chunks/{chunk-EBIMVSPH.js → chunk-7YB2KELI.js} +2 -2
- package/dist/cli/chunks/{chunk-YCGU2LI7.js → chunk-A2WOQO2N.js} +2 -2
- package/dist/cli/chunks/{chunk-HSR53REE.js → chunk-A337MD3C.js} +2 -2
- package/dist/cli/chunks/{chunk-ZJW4HRUA.js → chunk-A5J4XJS6.js} +1 -1
- package/dist/cli/chunks/{chunk-POTVF6BY.js → chunk-AQN5EDBM.js} +1 -1
- package/dist/cli/chunks/{chunk-X335K4SU.js → chunk-AUZXRFOX.js} +2 -2
- package/dist/cli/chunks/{chunk-WI7I6LMM.js → chunk-B2UHTA4Q.js} +1 -1
- package/dist/cli/chunks/{chunk-W7EHNX3Y.js → chunk-BBL6YXD3.js} +2 -2
- package/dist/cli/chunks/chunk-BJ5P4IV2.js +2 -0
- package/dist/cli/chunks/{chunk-RDTR43YN.js → chunk-BMWAWZAN.js} +2 -2
- package/dist/cli/chunks/chunk-BO4PKNYP.js +102 -0
- package/dist/cli/chunks/{chunk-KGS6H2HB.js → chunk-BY646JOM.js} +2 -2
- package/dist/cli/chunks/{chunk-PPA53NJB.js → chunk-BYXNHGQC.js} +2 -2
- package/dist/cli/chunks/{chunk-RRSZ27A7.js → chunk-BZFT4QDQ.js} +2 -2
- package/dist/cli/chunks/{chunk-M3ACHBC7.js → chunk-CFPR24YK.js} +2 -2
- package/dist/cli/chunks/{chunk-SRDECRTL.js → chunk-CQMHDAJS.js} +2 -2
- package/dist/cli/chunks/{chunk-WW4RJ6BH.js → chunk-CR2JUANW.js} +2 -2
- package/dist/cli/chunks/{chunk-QSVNVDA5.js → chunk-CXOXUBYU.js} +1 -1
- package/dist/cli/chunks/chunk-D3G2NN7F.js +741 -0
- package/dist/cli/chunks/{chunk-RGD2CG23.js → chunk-DEGWCUMY.js} +2 -2
- package/dist/cli/chunks/{chunk-AEL4XJGJ.js → chunk-DFPL5N3Q.js} +2 -2
- package/dist/cli/chunks/{chunk-FTUNC4EI.js → chunk-DL5JENWD.js} +3 -3
- package/dist/cli/chunks/{chunk-DH5NWHH2.js → chunk-DLY4YEN3.js} +2 -2
- package/dist/cli/chunks/{chunk-V5NYGDSX.js → chunk-DPV33C77.js} +2 -2
- package/dist/cli/chunks/{chunk-A5H7TF7C.js → chunk-DPYDUKVZ.js} +2 -2
- package/dist/cli/chunks/{chunk-4JVVVKAX.js → chunk-DTJODGCE.js} +2 -2
- package/dist/cli/chunks/{chunk-6AKJ73X3.js → chunk-DWZI3IVB.js} +2 -2
- package/dist/cli/chunks/{chunk-7UUSV2SK.js → chunk-DXVZBJE4.js} +1 -1
- package/dist/cli/chunks/{chunk-FPFGN2Z5.js → chunk-E4VIVMDL.js} +2 -2
- package/dist/cli/chunks/{chunk-GPZH6OPP.js → chunk-EAYQCBXL.js} +3 -3
- package/dist/cli/chunks/{chunk-7SWHW5AC.js → chunk-EOR3RECZ.js} +20 -20
- package/dist/cli/chunks/chunk-ERGWWI4Y.js +3 -0
- package/dist/cli/chunks/{chunk-XXW4KFBB.js → chunk-EUEHBERE.js} +1 -1
- package/dist/cli/chunks/{chunk-VUBLJBHQ.js → chunk-EVCFUYYK.js} +2 -2
- package/dist/cli/chunks/{chunk-YQ3ZW47V.js → chunk-FBEXG4HD.js} +2 -2
- package/dist/cli/chunks/{chunk-HV3ZVUHO.js → chunk-FE3AIZI6.js} +1 -1
- package/dist/cli/chunks/{chunk-TBVPNN65.js → chunk-FHUJCVT3.js} +2 -2
- package/dist/cli/chunks/{chunk-3ZTBV6M3.js → chunk-FNAYDITO.js} +1 -1
- package/dist/cli/chunks/{chunk-JVQK6NGI.js → chunk-FQKEZVN6.js} +2 -2
- package/dist/cli/chunks/{chunk-MUSYQF53.js → chunk-FWYJ6UDX.js} +2 -2
- package/dist/cli/chunks/{chunk-QUXX2DP7.js → chunk-GGDKOJVF.js} +2 -2
- package/dist/cli/chunks/{chunk-VRT736E3.js → chunk-GKPRECLL.js} +2 -2
- package/dist/cli/chunks/{chunk-3MNKYCLH.js → chunk-GRIPCYW5.js} +1 -1
- package/dist/cli/chunks/{chunk-DE3QNPTG.js → chunk-GTSOFCMQ.js} +1 -1
- package/dist/cli/chunks/{chunk-2MEWIXW4.js → chunk-HBYQYGXP.js} +2 -2
- package/dist/cli/chunks/{chunk-RWLOERKK.js → chunk-HGBJ2QQ4.js} +2 -2
- package/dist/cli/chunks/{chunk-4IYHYHTG.js → chunk-HIUNCO2W.js} +2 -2
- package/dist/cli/chunks/{chunk-WSUYEVSY.js → chunk-HLFDC4SF.js} +1 -1
- package/dist/cli/chunks/{chunk-OKNMZLGB.js → chunk-HPLMX62I.js} +2 -2
- package/dist/cli/chunks/{chunk-Z7JPWXW2.js → chunk-IHFUEPZH.js} +2 -2
- package/dist/cli/chunks/{chunk-2TBHPYOU.js → chunk-IJ2EXSMO.js} +2 -2
- package/dist/cli/chunks/{chunk-SKHP5WUP.js → chunk-IJOFZBXD.js} +2 -2
- package/dist/cli/chunks/{chunk-YW4GM36K.js → chunk-JANLATHN.js} +2 -2
- package/dist/cli/chunks/{chunk-BDKQSEEY.js → chunk-JCC7QEKZ.js} +1 -1
- package/dist/cli/chunks/{chunk-7PDC4SKR.js → chunk-JI77KJP7.js} +1 -1
- package/dist/cli/chunks/{chunk-LEB6O2IN.js → chunk-JNMUVBAJ.js} +2 -2
- package/dist/cli/chunks/{chunk-ZI6NJEBY.js → chunk-JYY7AYGA.js} +1 -1
- package/dist/cli/chunks/{chunk-ASUXS4N4.js → chunk-KHCALIFP.js} +2 -2
- package/dist/cli/chunks/{chunk-ED5HUPUR.js → chunk-KJ3KBP24.js} +2 -2
- package/dist/cli/chunks/{chunk-YTRGMILO.js → chunk-KZVJW2SD.js} +2 -2
- package/dist/cli/chunks/chunk-L336HFFE.js +2 -0
- package/dist/cli/chunks/{chunk-GJB3LPCS.js → chunk-L375O3CZ.js} +2 -2
- package/dist/cli/chunks/{chunk-WQZBKLAG.js → chunk-L6SVCNXK.js} +1 -1
- package/dist/cli/chunks/{chunk-YGKU2QRC.js → chunk-LNO5IWGH.js} +1 -1
- package/dist/cli/chunks/{chunk-APV5UWTU.js → chunk-LRASYSGV.js} +2 -2
- package/dist/cli/chunks/{chunk-HW4V7BVV.js → chunk-MB4VFAJC.js} +2 -2
- package/dist/cli/chunks/{chunk-366IBPZB.js → chunk-MNQ36MAF.js} +2 -2
- package/dist/cli/chunks/{chunk-7TW5UGDP.js → chunk-MQGEZA2A.js} +2 -2
- package/dist/cli/chunks/{chunk-CFXROOIU.js → chunk-MS3Z2CP5.js} +2 -2
- package/dist/cli/chunks/{chunk-4TM5K6EZ.js → chunk-N2TJNIHA.js} +2 -2
- package/dist/cli/chunks/{chunk-DLA3EHKJ.js → chunk-NF6AFIAX.js} +1 -1
- package/dist/cli/chunks/{chunk-2GJJGO5D.js → chunk-NLDFNAOS.js} +2 -2
- package/dist/cli/chunks/{chunk-UCSGZVJX.js → chunk-NMJVG22Z.js} +1 -1
- package/dist/cli/chunks/{chunk-WSND64RL.js → chunk-OGYWWZU7.js} +2 -2
- package/dist/cli/chunks/{chunk-FXTZXZCU.js → chunk-ONCH5AXU.js} +3 -3
- package/dist/cli/chunks/{chunk-M3ONCPSU.js → chunk-OQDC7GCM.js} +2 -2
- package/dist/cli/chunks/{chunk-P6EGRAQG.js → chunk-ORTBRO7F.js} +2 -2
- package/dist/cli/chunks/{chunk-D6PUDLJ4.js → chunk-OU4ZAWCC.js} +2 -2
- package/dist/cli/chunks/{chunk-AOZJ6UUZ.js → chunk-OW42F2TX.js} +2 -2
- package/dist/cli/chunks/{chunk-4N7YXTV3.js → chunk-PCCIZFD7.js} +1 -1
- package/dist/cli/chunks/{chunk-OT6SOPAL.js → chunk-PDPEMBFV.js} +2 -2
- package/dist/cli/chunks/{chunk-A3IQU2ND.js → chunk-PHAQWAEV.js} +2 -2
- package/dist/cli/chunks/{chunk-XV2TIODR.js → chunk-PHP4UJYP.js} +1 -1
- package/dist/cli/chunks/{chunk-POVP6O6K.js → chunk-PURHGLEC.js} +1 -1
- package/dist/cli/chunks/{chunk-5QUOM357.js → chunk-PVAE65B4.js} +1 -1
- package/dist/cli/chunks/{chunk-ZL2GYU7H.js → chunk-QPV3OKX2.js} +2 -2
- package/dist/cli/chunks/{chunk-B23ROYST.js → chunk-QXY3IRBW.js} +21 -21
- package/dist/cli/chunks/chunk-RCXMUEZN.js +3 -0
- package/dist/cli/chunks/{chunk-HVIFA73X.js → chunk-RMJ7PJOS.js} +2 -2
- package/dist/cli/chunks/{chunk-OGARNKLS.js → chunk-RUJLVJDE.js} +2 -2
- package/dist/cli/chunks/{chunk-UGNTLSBL.js → chunk-RUSLEOMC.js} +2 -2
- package/dist/cli/chunks/chunk-SAPIRK2G.js +3 -0
- package/dist/cli/chunks/{chunk-F5BREV2Q.js → chunk-SDWMLT7B.js} +5 -5
- package/dist/cli/chunks/{chunk-A6PII4R4.js → chunk-SEZLYRCS.js} +1 -1
- package/dist/cli/chunks/{chunk-RWQDRPN5.js → chunk-TDLKXLJC.js} +2 -2
- package/dist/cli/chunks/{chunk-YJH7UFA2.js → chunk-U4TV75AC.js} +2 -2
- package/dist/cli/chunks/{chunk-34Y4CIHD.js → chunk-U6OVPMQX.js} +2 -2
- package/dist/cli/chunks/{chunk-L6OSEWOS.js → chunk-UE22ODHN.js} +1 -1
- package/dist/cli/chunks/{chunk-IARE5VGI.js → chunk-UXZEVIFX.js} +1 -1
- package/dist/cli/chunks/{chunk-OMHISPPF.js → chunk-V7GNUVYI.js} +1 -1
- package/dist/cli/chunks/{chunk-HR7RL4PB.js → chunk-VCKDVOPD.js} +2 -2
- package/dist/cli/chunks/{chunk-UZDTRCVU.js → chunk-VH3EB6ZG.js} +2 -2
- package/dist/cli/chunks/{chunk-6V6XVGCL.js → chunk-VLOIEVER.js} +3 -3
- package/dist/cli/chunks/{chunk-XTGVGZ4J.js → chunk-VML4SG3X.js} +3 -3
- package/dist/cli/chunks/{chunk-6TYTBQPV.js → chunk-VRJPH3LG.js} +2 -2
- package/dist/cli/chunks/{chunk-5WOBFN2T.js → chunk-VYDNLQJN.js} +2 -2
- package/dist/cli/chunks/{chunk-U5AVZ3T2.js → chunk-W3ZGNNDV.js} +1 -1
- package/dist/cli/chunks/{chunk-YGEC3PSD.js → chunk-WC47GICZ.js} +2 -2
- package/dist/cli/chunks/{chunk-WLOHTLHO.js → chunk-WLIYWBQR.js} +2 -2
- package/dist/cli/chunks/{chunk-I5VJ3FBC.js → chunk-WN55MNZ2.js} +2 -2
- package/dist/cli/chunks/chunk-WOZIXXY5.js +7 -0
- package/dist/cli/chunks/{chunk-X33LID2T.js → chunk-WR64BKUE.js} +1 -1
- package/dist/cli/chunks/{chunk-VGN46ZT4.js → chunk-WT3JC4A6.js} +2 -2
- package/dist/cli/chunks/{chunk-VOKIUF7I.js → chunk-X52TMBHU.js} +1 -1
- package/dist/cli/chunks/{chunk-ZATQLTYL.js → chunk-XIE7OHML.js} +1 -1
- package/dist/cli/chunks/{chunk-BO43BGHX.js → chunk-XNEEYXR2.js} +2 -2
- package/dist/cli/chunks/{chunk-KCBCYF7M.js → chunk-XNHB6TLC.js} +2 -2
- package/dist/cli/chunks/{chunk-VX7CQUO7.js → chunk-XQRE2HWM.js} +2 -2
- package/dist/cli/chunks/{chunk-CNQUU6CF.js → chunk-Y2E3IJ53.js} +2 -2
- package/dist/cli/chunks/{chunk-2M75CW5Q.js → chunk-Y2WMPEUP.js} +2 -2
- package/dist/cli/chunks/{chunk-WTMLRMKW.js → chunk-Y7GPLOXB.js} +2 -2
- package/dist/cli/chunks/{chunk-O66D4NEJ.js → chunk-YINFES3E.js} +2 -2
- package/dist/cli/chunks/{chunk-CF3BPD2R.js → chunk-ZLBBX24Q.js} +163 -164
- package/dist/cli/chunks/{chunk-S7D4GD7H.js → chunk-ZT3GUYM5.js} +2 -2
- package/dist/cli/chunks/{chunk-D5V6C3XG.js → chunk-ZTC5FBL6.js} +3 -3
- package/dist/cli/chunks/ci-KP4GZKJ7.js +81 -0
- package/dist/cli/chunks/ci-config-XDDZOOEI.js +2 -0
- package/dist/cli/chunks/{ci-output-DPHTFIGX.js → ci-output-7ZUQI4U6.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-PQ65VU2M.js → circuit-breaker-ALXKCFAL.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-GKHVO7AD.js → claude-flow-setup-RL7K2NI2.js} +2 -2
- package/dist/cli/chunks/client-C3KHVRM6.js +2 -0
- package/dist/cli/chunks/{cline-installer-HWMQZJ64.js → cline-installer-2Z2QQKC3.js} +2 -2
- package/dist/cli/chunks/{code-OTY7BF3D.js → code-QSZTDINQ.js} +4 -4
- package/dist/cli/chunks/{code-index-extractor-FG3TMHHR.js → code-index-extractor-5CGR5D3Y.js} +2 -2
- package/dist/cli/chunks/{codex-installer-63JARKKS.js → codex-installer-7JLSEDE5.js} +2 -2
- package/dist/cli/chunks/{completions-4ZHONFML.js → completions-U4NBSXEB.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-FYHTJW5Y.js → complexity-analyzer-WYZD2YSY.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-ZAWDSUR3.js → continuedev-installer-UPXINJFT.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-5QK565JX.js → copilot-installer-WIVYQRIF.js} +2 -2
- package/dist/cli/chunks/core-handlers-KSQM6Q6S.js +2 -0
- package/dist/cli/chunks/{cost-tracker-AWWMPPBJ.js → cost-tracker-RIN4JDDM.js} +2 -2
- package/dist/cli/chunks/coverage-SPFVHRRU.js +43 -0
- package/dist/cli/chunks/coverage-target-GSRBNHXE.js +2 -0
- package/dist/cli/chunks/cross-domain-router-CTGNOVCF.js +2 -0
- package/dist/cli/chunks/{cursor-installer-3BL7JACV.js → cursor-installer-POM7NGCC.js} +2 -2
- package/dist/cli/chunks/{daemon-R6ULBHHF.js → daemon-HFGKQ6LB.js} +3 -3
- package/dist/cli/chunks/{daemon-OJ624POF.js → daemon-M5TD5Y6T.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-J6I3LTMY.js → dag-attention-scheduler-HJXM7Q5P.js} +2 -2
- package/dist/cli/chunks/{detect-5Q5W33UR.js → detect-XKQGLZYN.js} +2 -2
- package/dist/cli/chunks/{dist-node-GJNW56NA.js → dist-node-SSKB53QL.js} +2 -2
- package/dist/cli/chunks/{domain-handler-IZQY2G44.js → domain-handler-6BNDHATU.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-PIGO3KI2.js → domain-plugins-DOX54YE3.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-NU3B4FQG.js → domain-transfer-FW4ZX3Z7.js} +2 -2
- package/dist/cli/chunks/dream-MIK2E4UL.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-5QDDRPWV.js → embed-and-insert-pattern-QST77T2B.js} +2 -2
- package/dist/cli/chunks/{eval-TB5HOAUY.js → eval-K7E4XXBS.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-SIYVLKDE.js → experience-capture-middleware-X66IYSRV.js} +3 -3
- package/dist/cli/chunks/{fast-paths-T7QELS6D.js → fast-paths-5JXXTYAG.js} +2 -2
- package/dist/cli/chunks/{feature-flags-TNZ7ZAJV.js → feature-flags-2CR3CO23.js} +2 -2
- package/dist/cli/chunks/{feature-flags-T3CNNYMJ.js → feature-flags-RB72LHOJ.js} +2 -2
- package/dist/cli/chunks/{file-discovery-M45P2ZCY.js → file-discovery-3NHRUQQB.js} +2 -2
- package/dist/cli/chunks/{fleet-DSBZPHBZ.js → fleet-SDU7QEOA.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-EHODCF32.js → gnn-wrapper-AWCFODUV.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-V5DBVF7V.js → heartbeat-handler-A4PJ3NFP.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-OCKRACUW.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-X67XG73C.js +2 -0
- package/dist/cli/chunks/hnsw-index-I7KCQBQR.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-IYKDYA2F.js → hnsw-legacy-bridge-KRS7SSFM.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-DKG4LW3X.js → hnswlib-node-OGGCPKPO.js} +2 -2
- package/dist/cli/chunks/{hooks-VKNMAILY.js → hooks-XNRNMUBW.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-FOUHTKAK.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-AXZVP7A7.js → hypergraph-engine-X35LTXYT.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-6EO6JN4Z.js → hypergraph-handler-M6THKAG6.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-GXYVX46O.js +2 -0
- package/dist/cli/chunks/{init-handler-N3NG3RHN.js → init-handler-2AXMXHYF.js} +6 -6
- package/dist/cli/chunks/init-wizard-C2MRX2QG.js +2 -0
- package/dist/cli/chunks/kernel-Q2IUDIDC.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-JICGAHLM.js → kilocode-installer-TEPR2ZJD.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-VYBFP6ZH.js → kiro-installer-RUKHGDEE.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-E2Z6K5EE.js +2 -0
- package/dist/cli/chunks/{learning-3BHEZEPK.js → learning-BEA26RNA.js} +3 -3
- package/dist/cli/chunks/{llm-router-GPTEZCUN.js → llm-router-7GECMDCP.js} +4 -4
- package/dist/cli/chunks/llm-router-service-YATYFEDD.js +2 -0
- package/dist/cli/chunks/{load-W5BIRPU4.js → load-NTJ4Y4ZR.js} +2 -2
- package/dist/cli/chunks/load-test-LV77JXWA.js +2 -0
- package/dist/cli/chunks/{mcp-EBV4DZPG.js → mcp-4335GTTG.js} +2 -2
- package/dist/cli/chunks/{memory-7F6YYKNL.js → memory-HYC4M4XS.js} +5 -5
- package/dist/cli/chunks/memory-backend-XME3X3QX.js +2 -0
- package/dist/cli/chunks/memory-handlers-VG47X5DX.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-3ZIA2YOL.js → multi-model-executor-T7FYKM6T.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-2XRZUTLR.js → opencode-installer-3USXVT5M.js} +2 -2
- package/dist/cli/chunks/{orchestrator-VSZVJUJW.js → orchestrator-VHUXUYIM.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-TAXMLENP.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-I2IGVHRL.js → pattern-usage-recorder-CMZLPX2K.js} +2 -2
- package/dist/cli/chunks/{pipeline-5G3O6WBY.js → pipeline-BTRZOVSL.js} +2 -2
- package/dist/cli/chunks/{platform-6GUFDIA3.js → platform-2MCRKC25.js} +2 -2
- package/dist/cli/chunks/{plugin-GYXE4CIC.js → plugin-2VAYWAO3.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-THX6JLGZ.js → prime-radiant-advanced-wasm-TXFEMBP6.js} +2 -2
- package/dist/cli/chunks/{project-root-QJRBKZQU.js → project-root-CFFPBGPX.js} +2 -2
- package/dist/cli/chunks/protocol-executor-ML76QAVQ.js +2 -0
- package/dist/cli/chunks/{protocol-handler-B54LRU26.js → protocol-handler-DZ26OYVZ.js} +2 -2
- package/dist/cli/chunks/{prove-PCY2WQOD.js → prove-QWONEJWX.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-LUZH6RYV.js +2 -0
- package/dist/cli/chunks/quality-WFH54FY7.js +8 -0
- package/dist/cli/chunks/{quality-gate-L3KXL6WE.js → quality-gate-ONJB7XU7.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-EWXNIXB6.js +2 -0
- package/dist/cli/chunks/{real-embeddings-N3H523PJ.js → real-embeddings-GZV4VKK4.js} +2 -2
- package/dist/cli/chunks/{ref-validation-6BKDPHZ7.js → ref-validation-HW5Y55ZC.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-NSGGTWXE.js → roocode-installer-5OABDNZT.js} +2 -2
- package/dist/cli/chunks/router-MXOBVEBF.js +2 -0
- package/dist/cli/chunks/routing-feedback-T6CCRUEK.js +2 -0
- package/dist/cli/chunks/{routing-handler-SRQNUBG3.js → routing-handler-CVHVOQTC.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-2IGULGDE.js → ruvector-commands-KKDKFGIQ.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-WHXVT3V3.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-JFPWIRCG.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-ZD6WK5CK.js → rvf-migration-coordinator-D4KUBNRZ.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-KOXR7TJL.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-QULKUBBI.js → rvf-store-integrity-UGUXKIFX.js} +2 -2
- package/dist/cli/chunks/safe-db-CI6IPSIN.js +2 -0
- package/dist/cli/chunks/schedule-X4HW6TVJ.js +2 -0
- package/dist/cli/chunks/scheduler-KCNJ2ON3.js +2 -0
- package/dist/cli/chunks/{security-JW4EBARW.js → security-7723AZZ4.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-VQ7NJTGY.js → shared-rvf-adapter-KEQ5CLNI.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-SKTS52HK.js → shared-rvf-dual-writer-ZSHYG5IA.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-PGHU6VUR.js +2 -0
- package/dist/cli/chunks/{standalone-memory-3N4YJCSY.js → standalone-memory-MHZEEYMK.js} +2 -2
- package/dist/cli/chunks/{status-handler-5BQ2IIDG.js → status-handler-JKXPJ22K.js} +2 -2
- package/dist/cli/chunks/{structural-health-WGYR2RJB.js → structural-health-J4RKCYWF.js} +2 -2
- package/dist/cli/chunks/{sync-R5OKUBTQ.js → sync-EFWXMA2H.js} +2 -2
- package/dist/cli/chunks/{sync-DLKSXTIR.js → sync-PDPORHVN.js} +2 -2
- package/dist/cli/chunks/{task-handler-Z5KNTSUX.js → task-handler-VERADM44.js} +2 -2
- package/dist/cli/chunks/{task-handlers-RZFMYFSC.js → task-handlers-4RUCWUR2.js} +3 -3
- package/dist/cli/chunks/{test-LHWKZJRN.js → test-DMBJFQNL.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-EN7WXUMS.js → test-scheduling-LUPTVGCD.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-4V3OO4EC.js → token-bootstrap-S346YBVO.js} +2 -2
- package/dist/cli/chunks/{token-usage-PFC2BYBS.js → token-usage-VOA34IKM.js} +2 -2
- package/dist/cli/chunks/{transformers-VZCC4SHC.js → transformers-GU4TYAN5.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-ZYDQXGKN.js → tree-sitter-wasm-parser-MZPXAH7C.js} +2 -2
- package/dist/cli/chunks/{types-I6AWHZZQ.js → types-K4FLXR2K.js} +2 -2
- package/dist/cli/chunks/unified-memory-6CK3TUNQ.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-A7BWBGYN.js +2 -0
- package/dist/cli/chunks/unified-persistence-GEPMDBQZ.js +2 -0
- package/dist/cli/chunks/{upgrade-T7SG75PA.js → upgrade-M3ATDRMK.js} +2 -2
- package/dist/cli/chunks/{validate-YLYEHTY3.js → validate-AAP773B3.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-VTLTRUE3.js → validate-swarm-7RGAZX5F.js} +2 -2
- package/dist/cli/chunks/visual-security-L4J7LQWT.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-JUM7ZY5M.js → web-tree-sitter-GQMRHGGI.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-4KS2466T.js → windsurf-installer-HG6HF2GF.js} +2 -2
- package/dist/cli/chunks/witness-chain-CDUMX623.js +2 -0
- package/dist/cli/chunks/{witness-chain-E4X6TOCT.js → witness-chain-WKU3ZIBQ.js} +2 -2
- package/dist/cli/chunks/{witness-chain-repair-MB53OZO6.js → witness-chain-repair-WNYH6O4L.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-LBWJHO7Y.js → witness-chain-verifier-Q2KW3QEQ.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-5IHVMXHJ.js → witness-key-manager-NQ5DAAC4.js} +2 -2
- package/dist/cli/chunks/{workflow-XUQXIRNE.js → workflow-CX6SHFBW.js} +5 -5
- package/dist/cli/chunks/workflow-orchestrator-USJDWVDR.js +2 -0
- package/dist/cli/chunks/{wrappers-YVF5SQUN.js → wrappers-CZDI6Z3X.js} +2 -2
- package/dist/cli/commands/ci.js +14 -6
- package/dist/cli/commands/code.js +1 -0
- package/dist/cli/commands/coverage.d.ts +28 -0
- package/dist/cli/commands/coverage.js +258 -143
- package/dist/cli/commands/quality.d.ts +12 -1
- package/dist/cli/commands/quality.js +51 -3
- package/dist/cli/commands/workflow.js +3 -0
- package/dist/cli/scheduler/persistent-scheduler.d.ts +2 -0
- package/dist/cli/scheduler/persistent-scheduler.js +12 -2
- package/dist/cli/utils/ci-output.d.ts +14 -4
- package/dist/cli/utils/ci-output.js +21 -4
- package/dist/cli/utils/coverage-data.d.ts +7 -0
- package/dist/cli/utils/coverage-data.js +21 -27
- package/dist/contracts/verdicts.d.ts +14 -0
- package/dist/contracts/verdicts.js +44 -3
- package/dist/coordination/handlers/coverage-handlers.js +121 -120
- package/dist/coordination/handlers/coverage-runner.d.ts +121 -0
- package/dist/coordination/handlers/coverage-runner.js +367 -0
- package/dist/coordination/handlers/coverage-target.d.ts +144 -0
- package/dist/coordination/handlers/coverage-target.js +311 -0
- package/dist/coordination/handlers/handler-utils.d.ts +9 -0
- package/dist/coordination/handlers/handler-utils.js +44 -1
- package/dist/coordination/handlers/quality-handlers.js +101 -15
- package/dist/coordination/result-saver.js +17 -3
- package/dist/coordination/task-executor.d.ts +5 -0
- package/dist/coordination/task-executor.js +7 -0
- package/dist/domains/code-intelligence/coordinator.d.ts +2 -1
- package/dist/domains/code-intelligence/coordinator.js +10 -32
- package/dist/domains/code-intelligence/interfaces.d.ts +5 -0
- package/dist/domains/code-intelligence/plugin.js +1 -0
- package/dist/domains/code-intelligence/project-root-resolver.d.ts +50 -0
- package/dist/domains/code-intelligence/project-root-resolver.js +121 -0
- package/dist/domains/code-intelligence/services/metric-collector/listing-process-owner.d.ts +3 -0
- package/dist/domains/code-intelligence/services/metric-collector/listing-process-owner.js +57 -0
- package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +124 -36
- package/dist/domains/coverage-analysis/coordinator.js +4 -1
- package/dist/domains/coverage-analysis/interfaces.d.ts +15 -0
- package/dist/domains/coverage-analysis/plugin.js +7 -1
- package/dist/domains/coverage-analysis/services/coverage-analyzer.d.ts +7 -0
- package/dist/domains/coverage-analysis/services/coverage-analyzer.js +29 -9
- package/dist/domains/quality-assessment/coordinator-claim-verifier.js +2 -1
- package/dist/domains/quality-assessment/coordinator.js +8 -8
- package/dist/domains/quality-assessment/coverage-report-event.d.ts +25 -0
- package/dist/domains/quality-assessment/coverage-report-event.js +36 -0
- package/dist/domains/quality-assessment/evidence-sufficiency.d.ts +57 -0
- package/dist/domains/quality-assessment/evidence-sufficiency.js +97 -0
- package/dist/domains/quality-assessment/index.d.ts +1 -1
- package/dist/domains/quality-assessment/index.js +1 -1
- package/dist/domains/quality-assessment/plugin.js +8 -8
- package/dist/domains/quality-assessment/quality-evidence.d.ts +50 -2
- package/dist/domains/quality-assessment/quality-evidence.js +90 -8
- package/dist/domains/quality-assessment/services/quality-analyzer.js +13 -9
- package/dist/mcp/bundle.js +457 -453
- package/dist/mcp/handlers/domain-handler-configs.d.ts +60 -1
- package/dist/mcp/handlers/domain-handler-configs.js +42 -4
- package/dist/mcp/handlers/handler-factory.js +3 -0
- package/dist/mcp/handlers/wrapped-domain-handlers.js +7 -1
- package/dist/mcp/protocol-server.js +3 -2
- package/dist/mcp/services/session-store.js +11 -1
- package/dist/mcp/tools/coverage-analysis/index.js +1 -0
- package/dist/mcp/types.d.ts +24 -0
- package/dist/memory/crdt/convergence-tracker.js +14 -24
- package/dist/memory/crdt/crdt-store.js +15 -0
- package/dist/memory/crdt/lww-register.js +3 -3
- package/dist/memory/crdt/or-set.js +18 -0
- package/dist/planning/goap-planner.js +18 -10
- package/dist/shared/embeddings/embedding-cache.d.ts +3 -3
- package/dist/shared/embeddings/embedding-cache.js +8 -8
- package/dist/shared/embeddings/nomic-embedder.js +9 -6
- package/dist/shared/events/domain-events.d.ts +2 -0
- package/dist/shared/llm/cache.js +1 -1
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-WQSFQES5.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-TDHBBADE.js +0 -2
- package/dist/cli/chunks/base-CZSB27VO.js +0 -2
- package/dist/cli/chunks/browser-workflow-AEMIS6PA.js +0 -2
- package/dist/cli/chunks/chunk-7IJVCDDC.js +0 -96
- package/dist/cli/chunks/chunk-INVDDFJC.js +0 -2
- package/dist/cli/chunks/chunk-K65X6CQA.js +0 -4
- package/dist/cli/chunks/chunk-MZDUBFLP.js +0 -2
- package/dist/cli/chunks/chunk-QDQLL2QB.js +0 -3
- package/dist/cli/chunks/chunk-QZBFMXO5.js +0 -742
- package/dist/cli/chunks/ci-JPISJ25U.js +0 -82
- package/dist/cli/chunks/client-BS7I637W.js +0 -2
- package/dist/cli/chunks/core-handlers-UG7RMTK5.js +0 -2
- package/dist/cli/chunks/coverage-SMFQEGKE.js +0 -27
- package/dist/cli/chunks/cross-domain-router-NX7F6TOF.js +0 -2
- package/dist/cli/chunks/dream-GYEH57FW.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-4TJ3T7LR.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-PHFK4EAP.js +0 -2
- package/dist/cli/chunks/hnsw-index-434XDDBH.js +0 -2
- package/dist/cli/chunks/hybrid-backend-DYVJQENQ.js +0 -2
- package/dist/cli/chunks/impact-analyzer-CBAST6M2.js +0 -2
- package/dist/cli/chunks/init-wizard-DWIJW7HY.js +0 -2
- package/dist/cli/chunks/kernel-AQGCS4X2.js +0 -2
- package/dist/cli/chunks/knowledge-graph-2ICXFUUV.js +0 -2
- package/dist/cli/chunks/llm-router-service-C47RGTH6.js +0 -2
- package/dist/cli/chunks/load-test-LRDAW3N6.js +0 -2
- package/dist/cli/chunks/memory-backend-UFBAYPQ6.js +0 -2
- package/dist/cli/chunks/memory-handlers-OGLJHAAJ.js +0 -2
- package/dist/cli/chunks/pattern-null-store-27FCITT3.js +0 -2
- package/dist/cli/chunks/protocol-executor-XWXXTMEW.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-3RMYXENE.js +0 -2
- package/dist/cli/chunks/quality-LPVDZC7U.js +0 -7
- package/dist/cli/chunks/queen-coordinator-AS6DZ7UJ.js +0 -2
- package/dist/cli/chunks/router-OVNLNGHO.js +0 -2
- package/dist/cli/chunks/routing-feedback-TBOWEB6H.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-YJYRCYGT.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-VMRQ2SFO.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-B75L3ALW.js +0 -2
- package/dist/cli/chunks/safe-db-CRQHMCV6.js +0 -2
- package/dist/cli/chunks/schedule-L3DKJRXU.js +0 -2
- package/dist/cli/chunks/scheduler-VRHYUGY5.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-JVAZETTL.js +0 -2
- package/dist/cli/chunks/unified-memory-WOOCCIUM.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-PDDHFLUB.js +0 -2
- package/dist/cli/chunks/unified-persistence-6ETD3JSC.js +0 -2
- package/dist/cli/chunks/visual-security-O4OT2YPY.js +0 -2
- package/dist/cli/chunks/witness-chain-67JHPDCN.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-ZVFSNRYZ.js +0 -2
|
@@ -11,7 +11,8 @@ import { TestGenerateParams, TestGenerateResult, TestExecuteParams, CoverageAnal
|
|
|
11
11
|
import type { SecurityScanEvidence } from '../../domains/security-compliance/scan-evidence.js';
|
|
12
12
|
import type { SecurityCoverage } from '../../domains/security-compliance/interfaces.js';
|
|
13
13
|
import { type RiskDecision } from '../../contracts/verdicts.js';
|
|
14
|
-
import type
|
|
14
|
+
import { type EvaluatedQualityCheck } from '../../domains/quality-assessment/quality-evidence.js';
|
|
15
|
+
import { type MeasuredFailure } from '../../domains/quality-assessment/evidence-sufficiency.js';
|
|
15
16
|
export interface TestExecuteResult {
|
|
16
17
|
taskId: string;
|
|
17
18
|
status: string;
|
|
@@ -26,6 +27,10 @@ export interface TestExecuteResult {
|
|
|
26
27
|
summary?: Record<string, unknown>;
|
|
27
28
|
learning?: Record<string, unknown>;
|
|
28
29
|
savedFiles?: string[];
|
|
30
|
+
/** #933: true when result files were written; see savedFiles for their paths. */
|
|
31
|
+
resultsSaved?: boolean;
|
|
32
|
+
/** #933: plain statement of what was (or was not) written to disk. */
|
|
33
|
+
resultsNote?: string;
|
|
29
34
|
}
|
|
30
35
|
export interface QualityAssessResult {
|
|
31
36
|
taskId: string;
|
|
@@ -39,8 +44,28 @@ export interface QualityAssessResult {
|
|
|
39
44
|
recommendations: string[];
|
|
40
45
|
duration: number;
|
|
41
46
|
savedFiles?: string[];
|
|
47
|
+
/** #933: true when result files were written; see savedFiles for their paths. */
|
|
48
|
+
resultsSaved?: boolean;
|
|
49
|
+
/** #933: plain statement of what was (or was not) written to disk. */
|
|
50
|
+
resultsNote?: string;
|
|
42
51
|
/** ADR-103: versioned, schema-validated gate verdict (additive) */
|
|
43
52
|
riskDecision?: RiskDecision;
|
|
53
|
+
/**
|
|
54
|
+
* #996 (additive): 'measured' when every requested metric had data;
|
|
55
|
+
* 'insufficient-evidence' when any did not — `passed` is then false and
|
|
56
|
+
* `status` is 'insufficient-evidence'.
|
|
57
|
+
*/
|
|
58
|
+
evidenceStatus?: 'measured' | 'insufficient-evidence';
|
|
59
|
+
/** #996: requested metrics with no measured data (reported as -1 in `metrics`). */
|
|
60
|
+
unmeasured?: string[];
|
|
61
|
+
/** #996: measured metrics that fail their own limit; any entry blocks. */
|
|
62
|
+
measuredFailures?: MeasuredFailure[];
|
|
63
|
+
/** #996: false for static analysis (runGate omitted/false) — no quality gate ran. */
|
|
64
|
+
gateEvaluated?: boolean;
|
|
65
|
+
/** #996: share of requested metrics that were measured, in [0, 1]. */
|
|
66
|
+
confidence?: number;
|
|
67
|
+
/** #996: plain statement of what was (and was not) evaluated. */
|
|
68
|
+
note?: string;
|
|
44
69
|
}
|
|
45
70
|
export interface SecurityScanResult {
|
|
46
71
|
taskId: string;
|
|
@@ -55,6 +80,10 @@ export interface SecurityScanResult {
|
|
|
55
80
|
recommendations: string[];
|
|
56
81
|
duration: number;
|
|
57
82
|
savedFiles?: string[];
|
|
83
|
+
/** #933: true when result files were written; see savedFiles for their paths. */
|
|
84
|
+
resultsSaved?: boolean;
|
|
85
|
+
/** #933: plain statement of what was (or was not) written to disk. */
|
|
86
|
+
resultsNote?: string;
|
|
58
87
|
informational?: number;
|
|
59
88
|
evidence?: SecurityScanEvidence;
|
|
60
89
|
limitations?: readonly string[];
|
|
@@ -78,6 +107,10 @@ export interface ContractValidateResult {
|
|
|
78
107
|
warnings: string[];
|
|
79
108
|
duration: number;
|
|
80
109
|
savedFiles?: string[];
|
|
110
|
+
/** #933: true when result files were written; see savedFiles for their paths. */
|
|
111
|
+
resultsSaved?: boolean;
|
|
112
|
+
/** #933: plain statement of what was (or was not) written to disk. */
|
|
113
|
+
resultsNote?: string;
|
|
81
114
|
}
|
|
82
115
|
export interface AccessibilityTestResult {
|
|
83
116
|
taskId: string;
|
|
@@ -88,6 +121,10 @@ export interface AccessibilityTestResult {
|
|
|
88
121
|
warnings: unknown[];
|
|
89
122
|
duration: number;
|
|
90
123
|
savedFiles?: string[];
|
|
124
|
+
/** #933: true when result files were written; see savedFiles for their paths. */
|
|
125
|
+
resultsSaved?: boolean;
|
|
126
|
+
/** #933: plain statement of what was (or was not) written to disk. */
|
|
127
|
+
resultsNote?: string;
|
|
91
128
|
}
|
|
92
129
|
export interface ChaosTestResult {
|
|
93
130
|
taskId: string;
|
|
@@ -100,11 +137,17 @@ export interface ChaosTestResult {
|
|
|
100
137
|
};
|
|
101
138
|
duration: number;
|
|
102
139
|
savedFiles?: string[];
|
|
140
|
+
/** #933: true when result files were written; see savedFiles for their paths. */
|
|
141
|
+
resultsSaved?: boolean;
|
|
142
|
+
/** #933: plain statement of what was (or was not) written to disk. */
|
|
143
|
+
resultsNote?: string;
|
|
103
144
|
}
|
|
104
145
|
export interface DefectPredictParams {
|
|
105
146
|
target?: string;
|
|
106
147
|
lookback?: number;
|
|
107
148
|
minConfidence?: number;
|
|
149
|
+
/** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
|
|
150
|
+
saveResults?: boolean;
|
|
108
151
|
}
|
|
109
152
|
export interface DefectPredictResult {
|
|
110
153
|
taskId: string;
|
|
@@ -118,11 +161,17 @@ export interface DefectPredictResult {
|
|
|
118
161
|
recommendations: string[];
|
|
119
162
|
duration: number;
|
|
120
163
|
savedFiles?: string[];
|
|
164
|
+
/** #933: true when result files were written; see savedFiles for their paths. */
|
|
165
|
+
resultsSaved?: boolean;
|
|
166
|
+
/** #933: plain statement of what was (or was not) written to disk. */
|
|
167
|
+
resultsNote?: string;
|
|
121
168
|
}
|
|
122
169
|
export interface RequirementsValidateParams {
|
|
123
170
|
requirementsPath?: string;
|
|
124
171
|
testPath?: string;
|
|
125
172
|
generateBDD?: boolean;
|
|
173
|
+
/** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
|
|
174
|
+
saveResults?: boolean;
|
|
126
175
|
}
|
|
127
176
|
export interface RequirementsValidateResult {
|
|
128
177
|
taskId: string;
|
|
@@ -133,11 +182,17 @@ export interface RequirementsValidateResult {
|
|
|
133
182
|
bddScenarios: string[];
|
|
134
183
|
duration: number;
|
|
135
184
|
savedFiles?: string[];
|
|
185
|
+
/** #933: true when result files were written; see savedFiles for their paths. */
|
|
186
|
+
resultsSaved?: boolean;
|
|
187
|
+
/** #933: plain statement of what was (or was not) written to disk. */
|
|
188
|
+
resultsNote?: string;
|
|
136
189
|
}
|
|
137
190
|
export interface CodeIndexParams {
|
|
138
191
|
target?: string;
|
|
139
192
|
incremental?: boolean;
|
|
140
193
|
gitSince?: string;
|
|
194
|
+
/** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
|
|
195
|
+
saveResults?: boolean;
|
|
141
196
|
}
|
|
142
197
|
export interface CodeIndexResult {
|
|
143
198
|
taskId: string;
|
|
@@ -147,6 +202,10 @@ export interface CodeIndexResult {
|
|
|
147
202
|
relationsFound: number;
|
|
148
203
|
duration: number;
|
|
149
204
|
savedFiles?: string[];
|
|
205
|
+
/** #933: true when result files were written; see savedFiles for their paths. */
|
|
206
|
+
resultsSaved?: boolean;
|
|
207
|
+
/** #933: plain statement of what was (or was not) written to disk. */
|
|
208
|
+
resultsNote?: string;
|
|
150
209
|
}
|
|
151
210
|
export declare const testGenerateConfig: DomainHandlerConfig<TestGenerateParams, TestGenerateResult>;
|
|
152
211
|
export declare const testExecuteConfig: DomainHandlerConfig<TestExecuteParams, TestExecuteResult>;
|
|
@@ -11,6 +11,8 @@ import { describeSavedResults } from './save-results-option.js';
|
|
|
11
11
|
import { MetricsCollector } from '../metrics/index.js';
|
|
12
12
|
import { DEFAULT_FRAMEWORKS, FRAMEWORK_TO_LANGUAGE, } from '../../shared/types/test-frameworks.js';
|
|
13
13
|
import { buildRiskDecisionFromQualityGate, validateRiskDecision, } from '../../contracts/verdicts.js';
|
|
14
|
+
import { INSUFFICIENT_EVIDENCE, } from '../../domains/quality-assessment/quality-evidence.js';
|
|
15
|
+
import { validateRequestedMetrics, } from '../../domains/quality-assessment/evidence-sufficiency.js';
|
|
14
16
|
import { validateBehaviorExamples } from '../../domains/test-generation/services/behavior-example-validation.js';
|
|
15
17
|
const SUPPORTED_LANGUAGES = Object.keys(DEFAULT_FRAMEWORKS);
|
|
16
18
|
/**
|
|
@@ -403,6 +405,8 @@ export const coverageAnalyzeConfig = {
|
|
|
403
405
|
coverageMethod: data.coverageMethod ?? 'unknown',
|
|
404
406
|
branchDataCollected,
|
|
405
407
|
functionDataCollected,
|
|
408
|
+
// #995: the target has no measurement at all — distinct from a measured 0%.
|
|
409
|
+
...(data.unmeasured === true ? { unmeasured: true } : {}),
|
|
406
410
|
...(data.warning ? { warning: data.warning } : {}),
|
|
407
411
|
};
|
|
408
412
|
},
|
|
@@ -420,32 +424,66 @@ export const qualityAssessConfig = {
|
|
|
420
424
|
if (params.runGate !== undefined && typeof params.runGate !== 'boolean') {
|
|
421
425
|
throw new Error('runGate must be a boolean.');
|
|
422
426
|
}
|
|
427
|
+
// #996 (N3): a string or unknown name is a caller error, not a metric list.
|
|
428
|
+
const metrics = params.metrics === undefined
|
|
429
|
+
? ['coverage', 'complexity', 'maintainability']
|
|
430
|
+
: validateRequestedMetrics(params.metrics);
|
|
423
431
|
return {
|
|
424
432
|
runGate: params.runGate ?? false,
|
|
425
433
|
threshold: params.threshold || 80,
|
|
426
|
-
|
|
434
|
+
// #996: only a caller-supplied threshold overrides the configured/default
|
|
435
|
+
// per-metric limits; the 80 fallback above must not.
|
|
436
|
+
thresholdSource: params.threshold === undefined ? 'default' : 'request',
|
|
437
|
+
metrics,
|
|
427
438
|
routingTier: routingResult?.decision.tier,
|
|
428
439
|
useAgentBooster: routingResult?.useAgentBooster,
|
|
429
440
|
compiledContext: routingResult?.compiledContext,
|
|
430
441
|
};
|
|
431
442
|
},
|
|
432
443
|
mapToResult: (taskId, data, duration, savedFiles) => {
|
|
444
|
+
// #996: never approve on missing data. Any unmeasured requested metric
|
|
445
|
+
// forces passed=false and an explicit insufficient-evidence status.
|
|
446
|
+
const unmeasured = Array.isArray(data.unmeasured)
|
|
447
|
+
? data.unmeasured.filter((m) => typeof m === 'string')
|
|
448
|
+
: undefined;
|
|
449
|
+
const insufficient = (unmeasured?.length ?? 0) > 0 || data.evidenceStatus === INSUFFICIENT_EVIDENCE;
|
|
450
|
+
const gateEvaluated = typeof data.gateEvaluated === 'boolean' ? data.gateEvaluated : undefined;
|
|
451
|
+
const confidence = typeof data.confidence === 'number' ? data.confidence : undefined;
|
|
452
|
+
const measuredFailures = Array.isArray(data.measuredFailures)
|
|
453
|
+
? data.measuredFailures
|
|
454
|
+
: undefined;
|
|
455
|
+
const failedMetrics = (measuredFailures ?? []).map((f) => f.metric);
|
|
456
|
+
const passed = !insufficient && failedMetrics.length === 0 && data.passed === true;
|
|
433
457
|
// ADR-103: attach a schema-validated RiskDecision envelope at the MCP
|
|
434
458
|
// boundary (additive — existing fields unchanged). Omit rather than
|
|
435
459
|
// emit an invalid envelope.
|
|
436
460
|
const riskDecision = buildRiskDecisionFromQualityGate({
|
|
437
|
-
passed:
|
|
461
|
+
passed: insufficient || failedMetrics.length > 0
|
|
462
|
+
? false
|
|
463
|
+
: typeof data.passed === 'boolean' ? data.passed : undefined,
|
|
438
464
|
qualityScore: data.qualityScore,
|
|
439
465
|
recommendations: data.recommendations || [],
|
|
466
|
+
unmeasured: insufficient ? (unmeasured?.length ? unmeasured : ['unknown']) : [],
|
|
467
|
+
failedMetrics,
|
|
468
|
+
evidenceConfidence: confidence,
|
|
469
|
+
gateEvaluated,
|
|
440
470
|
});
|
|
441
471
|
return {
|
|
442
472
|
taskId,
|
|
443
|
-
status: 'completed',
|
|
473
|
+
status: insufficient ? INSUFFICIENT_EVIDENCE : 'completed',
|
|
444
474
|
...(typeof data.qualityScore === 'number' ? { qualityScore: data.qualityScore } : {}),
|
|
445
475
|
...(Array.isArray(data.checks) ? { checks: data.checks } : {}),
|
|
446
|
-
passed
|
|
476
|
+
passed,
|
|
447
477
|
metrics: data.metrics || {},
|
|
448
478
|
recommendations: data.recommendations || [],
|
|
479
|
+
...(data.evidenceStatus === 'measured' || insufficient
|
|
480
|
+
? { evidenceStatus: insufficient ? INSUFFICIENT_EVIDENCE : 'measured' }
|
|
481
|
+
: {}),
|
|
482
|
+
...(unmeasured ? { unmeasured } : {}),
|
|
483
|
+
...(measuredFailures ? { measuredFailures } : {}),
|
|
484
|
+
...(gateEvaluated !== undefined ? { gateEvaluated } : {}),
|
|
485
|
+
...(confidence !== undefined ? { confidence } : {}),
|
|
486
|
+
...(typeof data.note === 'string' ? { note: data.note } : {}),
|
|
449
487
|
duration,
|
|
450
488
|
savedFiles,
|
|
451
489
|
...(validateRiskDecision(riskDecision).valid ? { riskDecision } : {}),
|
|
@@ -636,6 +636,9 @@ export function createDomainHandler(config) {
|
|
|
636
636
|
return {
|
|
637
637
|
success: false,
|
|
638
638
|
error: result.error || 'Task execution failed',
|
|
639
|
+
// #996: structured failure context (e.g. status + unmeasured metrics),
|
|
640
|
+
// only when the failing handler provided it. success stays false.
|
|
641
|
+
...(result.errorDetails ? { data: result.errorDetails } : {}),
|
|
639
642
|
};
|
|
640
643
|
}
|
|
641
644
|
// Step 5: Map result
|
|
@@ -53,7 +53,13 @@ function createWrappedHandler(handler, domain, agent) {
|
|
|
53
53
|
if (result.success) {
|
|
54
54
|
return { success: true, data: result.data };
|
|
55
55
|
}
|
|
56
|
-
|
|
56
|
+
// #996: keep structured failure context (e.g. insufficient-evidence details)
|
|
57
|
+
// when the domain handler provided it; success stays false.
|
|
58
|
+
return {
|
|
59
|
+
success: false,
|
|
60
|
+
error: result.error || 'Unknown error',
|
|
61
|
+
...(result.data !== undefined ? { data: result.data } : {}),
|
|
62
|
+
};
|
|
57
63
|
};
|
|
58
64
|
}
|
|
59
65
|
// ============================================================================
|
|
@@ -899,11 +899,12 @@ export class MCPProtocolServer {
|
|
|
899
899
|
this.registerTool({
|
|
900
900
|
definition: {
|
|
901
901
|
name: 'quality_assess',
|
|
902
|
-
description: `Assess code quality metrics and optionally run a pass/fail quality gate. ${SAVE_RESULTS_HINT} Example: quality_assess({ runGate: true })`,
|
|
902
|
+
description: `Assess code quality metrics and optionally run a pass/fail quality gate. Unmeasured metrics never pass. ${SAVE_RESULTS_HINT} Example: quality_assess({ runGate: true })`,
|
|
903
903
|
category: 'domain',
|
|
904
904
|
isConcurrencySafe: true,
|
|
905
905
|
parameters: [
|
|
906
|
-
{ name: 'runGate', type: 'boolean', description: 'Evaluate all seven canonical measured quality checks; requires complete, valid evidence from the last 24 hours. Returns individual checks, not a static aggregate score.', default: false },
|
|
906
|
+
{ name: 'runGate', type: 'boolean', description: 'Evaluate all seven canonical measured quality checks; requires complete, valid evidence from the last 24 hours. Returns individual checks, not a static aggregate score. Missing, stale or malformed evidence fails with status "insufficient-evidence" and lists the metrics in unmeasured. When false, only static analysis runs (gateEvaluated: false).', default: false },
|
|
907
|
+
{ name: 'metrics', type: 'array', description: 'Static-analysis metrics to assess (default coverage, complexity, maintainability). Known: coverage, complexity, maintainability, duplication, testability, security. Any requested metric without measured data gives status "insufficient-evidence", passed: false, and lists it in unmeasured; a measured metric failing its threshold blocks.', items: { type: 'string' } },
|
|
907
908
|
saveResultsParameter('quality_assess'),
|
|
908
909
|
],
|
|
909
910
|
},
|
|
@@ -235,7 +235,17 @@ export class SessionStore {
|
|
|
235
235
|
if (this.flushTimer === null) {
|
|
236
236
|
this.flushTimer = setTimeout(() => {
|
|
237
237
|
this.flushTimer = null;
|
|
238
|
-
|
|
238
|
+
try {
|
|
239
|
+
this.flush();
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// #983: a throw here has no caller and reaches 'uncaughtException',
|
|
243
|
+
// which the MCP entry logs as "[AQE] FATAL" on every tick while the
|
|
244
|
+
// disk stays full. The unwritten entries stay buffered for the next
|
|
245
|
+
// append or flush(), and the buffer's one-time WARN reports a
|
|
246
|
+
// persistent failure once it reaches its cap. An explicit flush() or
|
|
247
|
+
// close() still throws to its caller.
|
|
248
|
+
}
|
|
239
249
|
}, BATCH_FLUSH_MS);
|
|
240
250
|
}
|
|
241
251
|
}
|
|
@@ -143,6 +143,7 @@ export class CoverageAnalyzeTool extends MCPToolBase {
|
|
|
143
143
|
coverageData: { files: domainFiles, summary: calculateSummary(domainFiles) },
|
|
144
144
|
threshold: thresholds.lines || 80,
|
|
145
145
|
includeFileDetails: true,
|
|
146
|
+
measured: true, // parsed from a real report (no estimation fallback here)
|
|
146
147
|
});
|
|
147
148
|
if (!analyzeResult.success) {
|
|
148
149
|
return {
|
package/dist/mcp/types.d.ts
CHANGED
|
@@ -199,6 +199,8 @@ export interface TestExecuteParams {
|
|
|
199
199
|
timeout?: number;
|
|
200
200
|
collectCoverage?: boolean;
|
|
201
201
|
reportFormat?: 'json' | 'junit' | 'html' | 'markdown';
|
|
202
|
+
/** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
|
|
203
|
+
saveResults?: boolean;
|
|
202
204
|
}
|
|
203
205
|
/**
|
|
204
206
|
* Coverage analysis parameters
|
|
@@ -209,6 +211,8 @@ export interface CoverageAnalyzeParams {
|
|
|
209
211
|
detectGaps?: boolean;
|
|
210
212
|
mlPowered?: boolean;
|
|
211
213
|
prioritization?: 'complexity' | 'criticality' | 'change-frequency' | 'ml-confidence';
|
|
214
|
+
/** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
|
|
215
|
+
saveResults?: boolean;
|
|
212
216
|
}
|
|
213
217
|
/**
|
|
214
218
|
* Quality assessment parameters
|
|
@@ -217,6 +221,8 @@ export interface QualityAssessParams {
|
|
|
217
221
|
runGate?: boolean;
|
|
218
222
|
threshold?: number;
|
|
219
223
|
metrics?: string[];
|
|
224
|
+
/** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
|
|
225
|
+
saveResults?: boolean;
|
|
220
226
|
}
|
|
221
227
|
/**
|
|
222
228
|
* Security scan parameters
|
|
@@ -228,6 +234,8 @@ export interface SecurityScanParams {
|
|
|
228
234
|
target?: string;
|
|
229
235
|
/** URL for explicitly requested dynamic scanning. */
|
|
230
236
|
targetUrl?: string;
|
|
237
|
+
/** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
|
|
238
|
+
saveResults?: boolean;
|
|
231
239
|
}
|
|
232
240
|
/**
|
|
233
241
|
* Contract validation parameters
|
|
@@ -237,6 +245,8 @@ export interface ContractValidateParams {
|
|
|
237
245
|
providerUrl?: string;
|
|
238
246
|
consumerName?: string;
|
|
239
247
|
checkBreakingChanges?: boolean;
|
|
248
|
+
/** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
|
|
249
|
+
saveResults?: boolean;
|
|
240
250
|
}
|
|
241
251
|
/**
|
|
242
252
|
* Accessibility test parameters
|
|
@@ -245,6 +255,8 @@ export interface AccessibilityTestParams {
|
|
|
245
255
|
url?: string;
|
|
246
256
|
standard?: 'wcag21-aa' | 'wcag21-aaa' | 'wcag22-aa' | 'section508';
|
|
247
257
|
includeScreenReader?: boolean;
|
|
258
|
+
/** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
|
|
259
|
+
saveResults?: boolean;
|
|
248
260
|
}
|
|
249
261
|
/**
|
|
250
262
|
* Chaos test parameters
|
|
@@ -255,6 +267,8 @@ export interface ChaosTestParams {
|
|
|
255
267
|
duration?: number;
|
|
256
268
|
intensity?: number;
|
|
257
269
|
dryRun?: boolean;
|
|
270
|
+
/** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
|
|
271
|
+
saveResults?: boolean;
|
|
258
272
|
}
|
|
259
273
|
/**
|
|
260
274
|
* Protocol execute parameters
|
|
@@ -528,6 +542,10 @@ export interface CoverageAnalyzeResult {
|
|
|
528
542
|
gaps?: CoverageGap[];
|
|
529
543
|
riskScore?: number;
|
|
530
544
|
savedFiles?: string[];
|
|
545
|
+
/** #933: true when result files were written; see savedFiles for their paths. */
|
|
546
|
+
resultsSaved?: boolean;
|
|
547
|
+
/** #933: plain statement of what was (or was not) written to disk. */
|
|
548
|
+
resultsNote?: string;
|
|
531
549
|
/** #569: `null` when no figure was produced — see `lineCoverage`. */
|
|
532
550
|
statementCoverage?: number | null;
|
|
533
551
|
totalFiles?: number;
|
|
@@ -550,6 +568,12 @@ export interface CoverageAnalyzeResult {
|
|
|
550
568
|
branchDataCollected?: boolean;
|
|
551
569
|
/** Whether function-level data was actually collected. */
|
|
552
570
|
functionDataCollected?: boolean;
|
|
571
|
+
/**
|
|
572
|
+
* #995: true when coverage data exists for the project but none of it covers
|
|
573
|
+
* the requested target (or the run executed no code). The figures are null —
|
|
574
|
+
* this is "no measurement", never 0%.
|
|
575
|
+
*/
|
|
576
|
+
unmeasured?: boolean;
|
|
553
577
|
/** Caveats the caller should surface (e.g. "no instrumentation ran"). */
|
|
554
578
|
warning?: string;
|
|
555
579
|
}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @module memory/crdt/convergence-tracker
|
|
9
9
|
*/
|
|
10
|
+
import { createHash } from 'node:crypto';
|
|
10
11
|
// =============================================================================
|
|
11
12
|
// Default Configuration
|
|
12
13
|
// =============================================================================
|
|
@@ -23,7 +24,7 @@ const DEFAULT_CONFIG = {
|
|
|
23
24
|
* not the internal representations, so that stores with equivalent data produce
|
|
24
25
|
* the same hash regardless of how they arrived at that state.
|
|
25
26
|
*
|
|
26
|
-
*
|
|
27
|
+
* Fingerprints structured semantic entries; this is not authentication.
|
|
27
28
|
*/
|
|
28
29
|
function hashState(state) {
|
|
29
30
|
const parts = [];
|
|
@@ -31,7 +32,7 @@ function hashState(state) {
|
|
|
31
32
|
// compare the result - if both have same winner, they have same value)
|
|
32
33
|
for (const [key, reg] of Object.entries(state.registers)) {
|
|
33
34
|
// Include value, timestamp, and nodeId - these together determine the LWW winner
|
|
34
|
-
parts.push(
|
|
35
|
+
parts.push(JSON.stringify(['r', key, JSON.stringify(reg.value), reg.timestamp, reg.nodeId]));
|
|
35
36
|
}
|
|
36
37
|
// Hash G-Counters by their TOTAL value (not per-node breakdown)
|
|
37
38
|
// Two stores are converged if they produce the same sum, even if the internal
|
|
@@ -41,10 +42,9 @@ function hashState(state) {
|
|
|
41
42
|
// Also include non-zero counts to detect semantic differences
|
|
42
43
|
const nonZeroCounts = Object.entries(counter.counts)
|
|
43
44
|
.filter(([_, count]) => count > 0)
|
|
44
|
-
.sort(([a], [b]) => a
|
|
45
|
-
.map(([nodeId, count]) =>
|
|
46
|
-
|
|
47
|
-
parts.push(`g:${key}:${total}:{${nonZeroCounts}}`);
|
|
45
|
+
.sort(([a], [b]) => a === b ? 0 : a < b ? -1 : 1)
|
|
46
|
+
.map(([nodeId, count]) => [nodeId, count]);
|
|
47
|
+
parts.push(JSON.stringify(['g', key, total, nonZeroCounts]));
|
|
48
48
|
}
|
|
49
49
|
// Hash PN-Counters by their NET value (positive - negative)
|
|
50
50
|
// Two stores are converged if they evaluate to the same number
|
|
@@ -55,15 +55,13 @@ function hashState(state) {
|
|
|
55
55
|
// Include non-zero contributions for semantic comparison
|
|
56
56
|
const nonZeroPos = Object.entries(counter.positive.counts)
|
|
57
57
|
.filter(([_, count]) => count > 0)
|
|
58
|
-
.sort(([a], [b]) => a
|
|
59
|
-
.map(([nodeId, count]) =>
|
|
60
|
-
.join(',');
|
|
58
|
+
.sort(([a], [b]) => a === b ? 0 : a < b ? -1 : 1)
|
|
59
|
+
.map(([nodeId, count]) => [nodeId, count]);
|
|
61
60
|
const nonZeroNeg = Object.entries(counter.negative.counts)
|
|
62
61
|
.filter(([_, count]) => count > 0)
|
|
63
|
-
.sort(([a], [b]) => a
|
|
64
|
-
.map(([nodeId, count]) =>
|
|
65
|
-
|
|
66
|
-
parts.push(`p:${key}:${netValue}:{${nonZeroPos}|${nonZeroNeg}}`);
|
|
62
|
+
.sort(([a], [b]) => a === b ? 0 : a < b ? -1 : 1)
|
|
63
|
+
.map(([nodeId, count]) => [nodeId, count]);
|
|
64
|
+
parts.push(JSON.stringify(['p', key, netValue, nonZeroPos, nonZeroNeg]));
|
|
67
65
|
}
|
|
68
66
|
// Hash OR-Sets by their active elements (elements with at least one non-tombstoned tag)
|
|
69
67
|
for (const [key, set] of Object.entries(state.sets)) {
|
|
@@ -77,20 +75,12 @@ function hashState(state) {
|
|
|
77
75
|
}
|
|
78
76
|
}
|
|
79
77
|
activeElements.sort();
|
|
80
|
-
parts.push(
|
|
78
|
+
parts.push(JSON.stringify(['s', key, activeElements]));
|
|
81
79
|
}
|
|
82
80
|
// Sort for consistency
|
|
83
81
|
parts.sort();
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
let hash = 0;
|
|
87
|
-
for (let i = 0; i < joined.length; i++) {
|
|
88
|
-
const char = joined.charCodeAt(i);
|
|
89
|
-
hash = ((hash << 5) - hash) + char;
|
|
90
|
-
hash = hash & hash; // Convert to 32-bit integer
|
|
91
|
-
}
|
|
92
|
-
// Return hash without version - version is per-node and shouldn't affect convergence check
|
|
93
|
-
return hash.toString(16);
|
|
82
|
+
// Version is per-node and does not affect semantic convergence.
|
|
83
|
+
return createHash('sha256').update(JSON.stringify(parts)).digest('hex');
|
|
94
84
|
}
|
|
95
85
|
// =============================================================================
|
|
96
86
|
// Convergence Tracker Implementation
|
|
@@ -365,6 +365,21 @@ export function createCRDTStore(config) {
|
|
|
365
365
|
// For initial state, need full state - caller should use getState instead
|
|
366
366
|
return null;
|
|
367
367
|
}
|
|
368
|
+
// A retained suffix cannot cover an older checkpoint. Send complete CRDT
|
|
369
|
+
// state (including OR-set tombstones) through the existing delta merge API.
|
|
370
|
+
if (sinceVersion < deltaHistory[0].fromVersion) {
|
|
371
|
+
const snapshot = store.getState();
|
|
372
|
+
return {
|
|
373
|
+
fromVersion: sinceVersion,
|
|
374
|
+
toVersion: version,
|
|
375
|
+
timestamp: Date.now(),
|
|
376
|
+
nodeId,
|
|
377
|
+
registers: snapshot.registers,
|
|
378
|
+
gCounters: snapshot.gCounters,
|
|
379
|
+
pnCounters: snapshot.pnCounters,
|
|
380
|
+
sets: snapshot.sets,
|
|
381
|
+
};
|
|
382
|
+
}
|
|
368
383
|
// Find deltas that contain changes after the requested version
|
|
369
384
|
// A delta is relevant if its toVersion > sinceVersion
|
|
370
385
|
const relevantDeltas = deltaHistory.filter((d) => d.toVersion > sinceVersion);
|
|
@@ -43,7 +43,7 @@ export function createLWWRegister(nodeId, initialValue, initialTimestamp) {
|
|
|
43
43
|
return timestampA - timestampB;
|
|
44
44
|
}
|
|
45
45
|
// Tiebreaker: lexicographic comparison of node IDs
|
|
46
|
-
return nodeIdA
|
|
46
|
+
return nodeIdA === nodeIdB ? 0 : nodeIdA > nodeIdB ? 1 : -1;
|
|
47
47
|
}
|
|
48
48
|
return {
|
|
49
49
|
get() {
|
|
@@ -52,7 +52,7 @@ export function createLWWRegister(nodeId, initialValue, initialTimestamp) {
|
|
|
52
52
|
set(value, timestamp) {
|
|
53
53
|
const ts = timestamp ?? Date.now();
|
|
54
54
|
// Only update if new timestamp wins
|
|
55
|
-
if (state.
|
|
55
|
+
if (state.version === 0 ||
|
|
56
56
|
compareTimestamps(ts, nodeId, state.timestamp, state.nodeId) > 0) {
|
|
57
57
|
state = {
|
|
58
58
|
value,
|
|
@@ -79,7 +79,7 @@ export function createLWWRegister(nodeId, initialValue, initialTimestamp) {
|
|
|
79
79
|
},
|
|
80
80
|
applyState(incoming) {
|
|
81
81
|
// Only update if incoming timestamp wins
|
|
82
|
-
if (state.
|
|
82
|
+
if (state.version === 0 ||
|
|
83
83
|
compareTimestamps(incoming.timestamp, incoming.nodeId, state.timestamp, state.nodeId) > 0) {
|
|
84
84
|
state = {
|
|
85
85
|
value: incoming.value,
|
|
@@ -83,6 +83,22 @@ export function createORSet(nodeId) {
|
|
|
83
83
|
let version = 0;
|
|
84
84
|
let lastUpdated = Date.now();
|
|
85
85
|
let tagCounter = 0;
|
|
86
|
+
/** Continue this owner's allocation sequence after importing a checkpoint. */
|
|
87
|
+
function observeOwnedTag(tag) {
|
|
88
|
+
const prefix = `${nodeId}:`;
|
|
89
|
+
if (!tag.startsWith(prefix))
|
|
90
|
+
return;
|
|
91
|
+
const suffix = tag.slice(prefix.length);
|
|
92
|
+
const match = /^(-?\d+):(\d+)$/.exec(suffix);
|
|
93
|
+
if (!match)
|
|
94
|
+
return;
|
|
95
|
+
const timestamp = Number(match[1]);
|
|
96
|
+
const counter = Number(match[2]);
|
|
97
|
+
if (Number.isSafeInteger(timestamp) && Number.isSafeInteger(counter) &&
|
|
98
|
+
counter < Number.MAX_SAFE_INTEGER) {
|
|
99
|
+
tagCounter = Math.max(tagCounter, counter + 1);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
86
102
|
/**
|
|
87
103
|
* Check if an element has any active (non-tombstoned) tags
|
|
88
104
|
*/
|
|
@@ -202,6 +218,7 @@ export function createORSet(nodeId) {
|
|
|
202
218
|
}
|
|
203
219
|
const localTags = elements.get(serialized);
|
|
204
220
|
for (const tag of incomingTags) {
|
|
221
|
+
observeOwnedTag(tag);
|
|
205
222
|
if (!localTags.has(tag)) {
|
|
206
223
|
localTags.add(tag);
|
|
207
224
|
changed = true;
|
|
@@ -215,6 +232,7 @@ export function createORSet(nodeId) {
|
|
|
215
232
|
}
|
|
216
233
|
const localTombstones = tombstones.get(serialized);
|
|
217
234
|
for (const tag of incomingTombstones) {
|
|
235
|
+
observeOwnedTag(tag);
|
|
218
236
|
if (!localTombstones.has(tag)) {
|
|
219
237
|
localTombstones.add(tag);
|
|
220
238
|
changed = true;
|
|
@@ -16,6 +16,8 @@ import { safeJsonParse } from '../shared/safe-json.js';
|
|
|
16
16
|
import { getUnifiedPersistence } from '../kernel/unified-persistence.js';
|
|
17
17
|
import { DEFAULT_MAX_PLAN_STEPS, validateMaxSteps } from './types.js';
|
|
18
18
|
import { getAllQEActions, QE_GOALS } from './actions/qe-action-library.js';
|
|
19
|
+
/** Conservative budget fallback for actions without a declared estimate. */
|
|
20
|
+
const DEFAULT_ACTION_DURATION_MS = 1000;
|
|
19
21
|
// ============================================================================
|
|
20
22
|
// MinHeap for A* Open Set (O(log n) insert/extract vs O(n log n) sort+shift)
|
|
21
23
|
// ============================================================================
|
|
@@ -215,18 +217,24 @@ export class GOAPPlanner {
|
|
|
215
217
|
}
|
|
216
218
|
/** Restore missing estimates only for unchanged legacy library definitions. */
|
|
217
219
|
backfillActionDurationEstimates() {
|
|
218
|
-
const
|
|
220
|
+
const db = this.ensureDb();
|
|
221
|
+
const missing = db.prepare('SELECT 1 FROM goap_actions WHERE estimated_duration_ms IS NULL LIMIT 1').get();
|
|
222
|
+
if (!missing)
|
|
223
|
+
return;
|
|
224
|
+
const update = db.prepare(`
|
|
219
225
|
UPDATE goap_actions SET estimated_duration_ms = ?
|
|
220
226
|
WHERE estimated_duration_ms IS NULL AND name = ?
|
|
221
227
|
AND agent_type IS ? AND category = ? AND qe_domain IS ?
|
|
222
228
|
AND preconditions = ? AND effects = ?
|
|
223
229
|
AND method IS ? AND params IS ? AND implemented = ?
|
|
224
230
|
`);
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
231
|
+
db.transaction(() => {
|
|
232
|
+
for (const action of getAllQEActions()) {
|
|
233
|
+
if (action.estimatedDurationMs === undefined)
|
|
234
|
+
continue;
|
|
235
|
+
update.run(action.estimatedDurationMs, action.name, action.agentType ?? null, action.category, action.qeDomain ?? null, JSON.stringify(action.preconditions), JSON.stringify(action.effects), action.method ?? null, action.params ? JSON.stringify(action.params) : null, action.implemented ? 1 : 0);
|
|
236
|
+
}
|
|
237
|
+
})();
|
|
230
238
|
}
|
|
231
239
|
// ==========================================================================
|
|
232
240
|
// Core Planning - A* Search
|
|
@@ -258,7 +266,7 @@ export class GOAPPlanner {
|
|
|
258
266
|
this.recordPlanReuse(reusedPlan.id, true);
|
|
259
267
|
const clonedPlan = {
|
|
260
268
|
...reusedPlan,
|
|
261
|
-
estimatedDurationMs: reusedPlan.actions.reduce((sum, action) => sum + (action.estimatedDurationMs ??
|
|
269
|
+
estimatedDurationMs: reusedPlan.actions.reduce((sum, action) => sum + (action.estimatedDurationMs ?? DEFAULT_ACTION_DURATION_MS), 0),
|
|
262
270
|
id: `plan-${Date.now()}-${randomUUID().slice(0, 8)}`,
|
|
263
271
|
initialState: this.cloneState(currentState),
|
|
264
272
|
reusedFrom: reusedPlan.id,
|
|
@@ -285,7 +293,7 @@ export class GOAPPlanner {
|
|
|
285
293
|
goalState: goal,
|
|
286
294
|
actions: actionSequence,
|
|
287
295
|
totalCost: actionSequence.reduce((sum, a) => sum + a.cost, 0),
|
|
288
|
-
estimatedDurationMs: actionSequence.reduce((sum, a) => sum + (a.estimatedDurationMs ??
|
|
296
|
+
estimatedDurationMs: actionSequence.reduce((sum, a) => sum + (a.estimatedDurationMs ?? DEFAULT_ACTION_DURATION_MS), 0),
|
|
289
297
|
status: 'pending',
|
|
290
298
|
};
|
|
291
299
|
// A14: persist the plan itself (not just its reuse signature) so
|
|
@@ -404,7 +412,7 @@ export class GOAPPlanner {
|
|
|
404
412
|
continue;
|
|
405
413
|
}
|
|
406
414
|
// Check duration constraints
|
|
407
|
-
const estimatedDuration = current.estimatedDurationMs + (action.estimatedDurationMs ??
|
|
415
|
+
const estimatedDuration = current.estimatedDurationMs + (action.estimatedDurationMs ?? DEFAULT_ACTION_DURATION_MS);
|
|
408
416
|
if (estimatedDuration > maxDuration) {
|
|
409
417
|
continue;
|
|
410
418
|
}
|
|
@@ -1040,7 +1048,7 @@ export class GOAPPlanner {
|
|
|
1040
1048
|
if (plan.actions.length > maxSteps)
|
|
1041
1049
|
return false;
|
|
1042
1050
|
if (constraints?.maxDurationMs !== undefined &&
|
|
1043
|
-
plan.actions.reduce((sum, action) => sum + (action.estimatedDurationMs ??
|
|
1051
|
+
plan.actions.reduce((sum, action) => sum + (action.estimatedDurationMs ?? DEFAULT_ACTION_DURATION_MS), 0)
|
|
1044
1052
|
> constraints.maxDurationMs) {
|
|
1045
1053
|
return false;
|
|
1046
1054
|
}
|