agentic-qe 3.15.6 → 3.15.7
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 +141 -0
- package/README.md +2 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +8 -6
- package/dist/cli/chunks/adapter-PEOUNYXJ.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-SY7UCLBL.js → agent-booster-wasm-OS5G7KMQ.js} +2 -2
- package/dist/cli/chunks/{agent-handler-KAMYBU3S.js → agent-handler-PI4I7PME.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-2CAW3KUM.js → agent-memory-branch-J7TXHX4U.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-DHKZI5RX.js +2 -0
- package/dist/cli/chunks/{arena-QCCVIOAH.js → arena-FXESDCFR.js} +4 -4
- package/dist/cli/chunks/{arena-4OFLJ3R2.js → arena-OWUGXKNT.js} +2 -2
- package/dist/cli/chunks/{audit-RBDQJQJB.js → audit-EPAWLYIZ.js} +3 -3
- package/dist/cli/chunks/base-QZWK3D5P.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-5JRACCDQ.js → better-sqlite3-IYVR5EQY.js} +2 -2
- package/dist/cli/chunks/{brain-handler-W4QIIRT4.js → brain-handler-3W2E6TC6.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-IBNGI572.js → branch-enumerator-HU7VACJ4.js} +2 -2
- package/dist/cli/chunks/{browser-GMSCVAOI.js → browser-72XOR6E2.js} +2 -2
- package/dist/cli/chunks/browser-workflow-ITPX72RX.js +2 -0
- package/dist/cli/chunks/{chunk-CR66HNAE.js → chunk-2423JAA5.js} +1 -1
- package/dist/cli/chunks/{chunk-LAY7NCQK.js → chunk-24CENUT4.js} +3 -3
- package/dist/cli/chunks/{chunk-PEMSXSP2.js → chunk-2AYBYXOA.js} +2 -2
- package/dist/cli/chunks/{chunk-TUDENMAE.js → chunk-2E3XWKEU.js} +2 -2
- package/dist/cli/chunks/{chunk-KIDOBLUO.js → chunk-2RJYA6WK.js} +2 -2
- package/dist/cli/chunks/{chunk-2IWPJUVV.js → chunk-2YVJ5OUL.js} +5 -5
- package/dist/cli/chunks/{chunk-34MDMFET.js → chunk-34JLY3U6.js} +2 -2
- package/dist/cli/chunks/{chunk-SV5BUYHH.js → chunk-3JD2USUH.js} +2 -2
- package/dist/cli/chunks/{chunk-EF5UHDCG.js → chunk-3RM46XFP.js} +1 -1
- package/dist/cli/chunks/{chunk-7XTANLTN.js → chunk-44DPYNPE.js} +1 -1
- package/dist/cli/chunks/{chunk-ONPPBLRB.js → chunk-4DIZ5BT6.js} +2 -2
- package/dist/cli/chunks/{chunk-22OZIJAD.js → chunk-4G2VNW4C.js} +2 -2
- package/dist/cli/chunks/{chunk-LJCEDTUM.js → chunk-56ZKQYZY.js} +3 -3
- package/dist/cli/chunks/{chunk-HOEWMEF2.js → chunk-5KCBX225.js} +2 -2
- package/dist/cli/chunks/{chunk-V3OLS2NG.js → chunk-5KS7HA37.js} +2 -2
- package/dist/cli/chunks/{chunk-MQCTLTGE.js → chunk-5PBRBS7D.js} +2 -2
- package/dist/cli/chunks/{chunk-TVLOED6O.js → chunk-5Q22XPTH.js} +2 -2
- package/dist/cli/chunks/{chunk-B7RHBKHL.js → chunk-634D2ENF.js} +2 -2
- package/dist/cli/chunks/{chunk-7TVIX4WL.js → chunk-6AYRAOCA.js} +2 -2
- package/dist/cli/chunks/{chunk-4KOVHQXK.js → chunk-6BO3WCK7.js} +2 -2
- package/dist/cli/chunks/{chunk-5HAPS6VD.js → chunk-6FEQ73BF.js} +2 -2
- package/dist/cli/chunks/{chunk-FQ5N666N.js → chunk-6JT73S5B.js} +1 -1
- package/dist/cli/chunks/{chunk-6MXAJBEA.js → chunk-6OS7HREG.js} +1 -1
- package/dist/cli/chunks/{chunk-6R3FBFCJ.js → chunk-6PKCQXEW.js} +2 -2
- package/dist/cli/chunks/{chunk-DQNUPEY5.js → chunk-7EX4DEQR.js} +2 -2
- package/dist/cli/chunks/{chunk-KCB6P463.js → chunk-7UCVYYWL.js} +2 -2
- package/dist/cli/chunks/{chunk-RLB7K7QP.js → chunk-AAA4SHEG.js} +1 -1
- package/dist/cli/chunks/{chunk-ITIJ23K2.js → chunk-AXO7OOOA.js} +2 -2
- package/dist/cli/chunks/{chunk-6RDVY26I.js → chunk-B7M323VL.js} +2 -2
- package/dist/cli/chunks/{chunk-EJ4KZFZN.js → chunk-BB7OLQKO.js} +1 -1
- package/dist/cli/chunks/{chunk-5NC7QEJ6.js → chunk-BTIBXGVQ.js} +4 -4
- package/dist/cli/chunks/{chunk-RD5BYLN7.js → chunk-BTYKGVJ5.js} +1 -1
- package/dist/cli/chunks/{chunk-YXU35GGD.js → chunk-C2CUPJGR.js} +1 -1
- package/dist/cli/chunks/{chunk-XFPQIWEH.js → chunk-C2MDBBFF.js} +3 -3
- package/dist/cli/chunks/{chunk-QLKUCMZC.js → chunk-CG5DZCOZ.js} +1 -1
- package/dist/cli/chunks/{chunk-YLNYPQDR.js → chunk-CIFWOMNX.js} +1 -1
- package/dist/cli/chunks/{chunk-ORBODZSO.js → chunk-CWPRU7ZI.js} +2 -2
- package/dist/cli/chunks/{chunk-WKDWRRDT.js → chunk-CXTJ47QS.js} +2 -2
- package/dist/cli/chunks/{chunk-SOSJWM3E.js → chunk-DCJW2DPL.js} +4 -4
- package/dist/cli/chunks/{chunk-GVRFSXY6.js → chunk-DGK6GQMO.js} +2 -2
- package/dist/cli/chunks/{chunk-X33F7NXH.js → chunk-DVPGBDBP.js} +3 -3
- package/dist/cli/chunks/chunk-EB2PP6X2.js +2 -0
- package/dist/cli/chunks/{chunk-HZFK2Z2Z.js → chunk-ECSLJJOQ.js} +1 -1
- package/dist/cli/chunks/{chunk-JCE76MPP.js → chunk-ED32XJ5R.js} +2 -2
- package/dist/cli/chunks/{chunk-ULCHPPW2.js → chunk-EDU72RTW.js} +1 -1
- package/dist/cli/chunks/{chunk-ZOUEQ6DL.js → chunk-EL75G2A3.js} +1 -1
- package/dist/cli/chunks/{chunk-GNYOHZVV.js → chunk-EV2BYY6T.js} +1 -1
- package/dist/cli/chunks/{chunk-RUTO67PT.js → chunk-F62EKVVC.js} +2 -2
- package/dist/cli/chunks/{chunk-IVJIHZSM.js → chunk-FTTFJ7SJ.js} +1 -1
- package/dist/cli/chunks/{chunk-NYS2GUNO.js → chunk-FVBFASOD.js} +2 -2
- package/dist/cli/chunks/{chunk-5DH5QI7G.js → chunk-G762PEFO.js} +3 -3
- package/dist/cli/chunks/{chunk-JPJEAK4G.js → chunk-G7YTZTGU.js} +1 -1
- package/dist/cli/chunks/{chunk-5VUIXDY2.js → chunk-GY2SAIXP.js} +2 -2
- package/dist/cli/chunks/{chunk-7XUB7U6Z.js → chunk-H4WHDFB5.js} +2 -2
- package/dist/cli/chunks/{chunk-72MQCZSM.js → chunk-HLZATDD2.js} +2 -2
- package/dist/cli/chunks/{chunk-AX26QJ6T.js → chunk-HPG7354V.js} +2 -2
- package/dist/cli/chunks/{chunk-7SAMMQVS.js → chunk-HSDOOFV7.js} +1 -1
- package/dist/cli/chunks/{chunk-K55EAWZ5.js → chunk-HTWIGQL4.js} +2 -2
- package/dist/cli/chunks/{chunk-BXATKI5S.js → chunk-HXBAQKMH.js} +2 -2
- package/dist/cli/chunks/{chunk-46HBVDMU.js → chunk-HZFT3P5B.js} +1 -1
- package/dist/cli/chunks/{chunk-RFDFET3O.js → chunk-I7H4IP7T.js} +2 -2
- package/dist/cli/chunks/{chunk-AJT3XDRD.js → chunk-IARSGAG7.js} +2 -2
- package/dist/cli/chunks/{chunk-TL5GV3PR.js → chunk-IC2WSSD5.js} +3 -3
- package/dist/cli/chunks/{chunk-TLUIO37P.js → chunk-ICPALF4Q.js} +2 -2
- package/dist/cli/chunks/{chunk-ZSBD4FUX.js → chunk-IWQQIXHO.js} +2 -2
- package/dist/cli/chunks/{chunk-AUOSHM63.js → chunk-IYQ7XNE5.js} +2 -2
- package/dist/cli/chunks/{chunk-RHIQ6QO5.js → chunk-J26GADQE.js} +281 -281
- package/dist/cli/chunks/{chunk-AUN4FG7V.js → chunk-J43DV3ME.js} +1 -1
- package/dist/cli/chunks/{chunk-ALCIUWFC.js → chunk-JFPXCQNP.js} +1 -1
- package/dist/cli/chunks/{chunk-R363XXGH.js → chunk-JK6B3ULP.js} +2 -2
- package/dist/cli/chunks/{chunk-7VTKR44N.js → chunk-JPHDMHFG.js} +2 -2
- package/dist/cli/chunks/{chunk-FOJRPEIP.js → chunk-JVYPXW6Y.js} +2 -2
- package/dist/cli/chunks/{chunk-ZUTFHGEO.js → chunk-JY4AIEZ7.js} +1 -1
- package/dist/cli/chunks/{chunk-47Q7JL3V.js → chunk-JY4WLN3K.js} +2 -2
- package/dist/cli/chunks/{chunk-IEPWO4XP.js → chunk-JYXOFN3E.js} +2 -2
- package/dist/cli/chunks/{chunk-2CIDFR2H.js → chunk-K7W55B7Q.js} +2 -2
- package/dist/cli/chunks/{chunk-D5N2O5EH.js → chunk-KPOPBUUJ.js} +2 -2
- package/dist/cli/chunks/{chunk-OQ4S6B7P.js → chunk-LDXQRNTT.js} +1 -1
- package/dist/cli/chunks/{chunk-6T6AHVLF.js → chunk-LDZWIV2O.js} +1 -1
- package/dist/cli/chunks/{chunk-A7ANPS4E.js → chunk-LGBN7TKC.js} +2 -2
- package/dist/cli/chunks/{chunk-X2DR27AY.js → chunk-LMEU64TR.js} +2 -2
- package/dist/cli/chunks/{chunk-GI5HWS4H.js → chunk-LP4AS2E4.js} +1 -1
- package/dist/cli/chunks/{chunk-VVF337SV.js → chunk-LQOVA4YX.js} +2 -2
- package/dist/cli/chunks/{chunk-KYVIOC3C.js → chunk-LVEX4GID.js} +2 -2
- package/dist/cli/chunks/{chunk-BO7UFNYV.js → chunk-M63QB466.js} +2 -2
- package/dist/cli/chunks/{chunk-UHHMAKPE.js → chunk-MDC4G323.js} +1 -1
- package/dist/cli/chunks/{chunk-4CLDYT36.js → chunk-MHZPC4HJ.js} +2 -2
- package/dist/cli/chunks/{chunk-24ZSGYC6.js → chunk-MJJC6HUK.js} +1 -1
- package/dist/cli/chunks/{chunk-ZL5LJT7D.js → chunk-MKFQNCXI.js} +2 -2
- package/dist/cli/chunks/{chunk-XZ46CI35.js → chunk-MMXG3LL6.js} +2 -2
- package/dist/cli/chunks/{chunk-OPDZBRIL.js → chunk-MNCF643K.js} +2 -2
- package/dist/cli/chunks/{chunk-CEXNW5TR.js → chunk-MNZFEIE5.js} +1 -1
- package/dist/cli/chunks/{chunk-L4D3TPFP.js → chunk-MQ6OF6DU.js} +1 -1
- package/dist/cli/chunks/{chunk-UB6DQGWM.js → chunk-MRHM4COP.js} +2 -2
- package/dist/cli/chunks/{chunk-CLAMMGY3.js → chunk-N4PMPSJJ.js} +2 -2
- package/dist/cli/chunks/{chunk-XQ53PZEF.js → chunk-NZQPP533.js} +3 -3
- package/dist/cli/chunks/{chunk-FU7LNUD7.js → chunk-OA4GR3EZ.js} +2 -2
- package/dist/cli/chunks/{chunk-ORFL3YXB.js → chunk-OJEZNLB6.js} +2 -2
- package/dist/cli/chunks/{chunk-5LST62QR.js → chunk-ONVALAZN.js} +2 -2
- package/dist/cli/chunks/{chunk-DA7DGDTI.js → chunk-PEKDSJBC.js} +2 -2
- package/dist/cli/chunks/{chunk-3DJNKNBR.js → chunk-PG64YV6C.js} +57 -57
- package/dist/cli/chunks/{chunk-2ZTWPMTK.js → chunk-PQV7E7XH.js} +2 -2
- package/dist/cli/chunks/chunk-PTK66HEY.js +2 -0
- package/dist/cli/chunks/{chunk-CZBIREL5.js → chunk-PUECC4WI.js} +2 -2
- package/dist/cli/chunks/{chunk-JYKQVYX2.js → chunk-PXZKPUW6.js} +2 -2
- package/dist/cli/chunks/{chunk-I7WAW7TM.js → chunk-PYHYOKYT.js} +2 -2
- package/dist/cli/chunks/{chunk-LCCTJ2PC.js → chunk-PZG3542B.js} +2 -2
- package/dist/cli/chunks/{chunk-F7A2UBZO.js → chunk-Q2T5FXEA.js} +2 -2
- package/dist/cli/chunks/{chunk-PS6WFCA4.js → chunk-QJE6ZW2X.js} +2 -2
- package/dist/cli/chunks/{chunk-LZWJ5BMP.js → chunk-QNQSM2OG.js} +2 -2
- package/dist/cli/chunks/{chunk-QLYO3H7E.js → chunk-QQT6QENQ.js} +2 -2
- package/dist/cli/chunks/{chunk-VCONCVSY.js → chunk-QVG4ZDXX.js} +2 -2
- package/dist/cli/chunks/{chunk-NMY4KTWA.js → chunk-QWLTHFZW.js} +2 -2
- package/dist/cli/chunks/{chunk-NBUXM5X6.js → chunk-RCYLCA7E.js} +2 -2
- package/dist/cli/chunks/{chunk-P7DXVL2S.js → chunk-REEIFA6A.js} +2 -2
- package/dist/cli/chunks/{chunk-5MT7DMD7.js → chunk-RNYX4CPI.js} +2 -2
- package/dist/cli/chunks/{chunk-HAN4MS5T.js → chunk-RORZ5O5Z.js} +2 -2
- package/dist/cli/chunks/{chunk-ZCP4P6O2.js → chunk-RRPYWBFX.js} +2 -2
- package/dist/cli/chunks/{chunk-3NJ7O3OH.js → chunk-RXAFLK34.js} +2 -2
- package/dist/cli/chunks/{chunk-VAYZ5QIE.js → chunk-SQHLC6I5.js} +1 -1
- package/dist/cli/chunks/{chunk-Q2RBOC7V.js → chunk-SSP2B2WR.js} +2 -2
- package/dist/cli/chunks/{chunk-CCL436IU.js → chunk-SX2YSHE7.js} +14 -6
- package/dist/cli/chunks/{chunk-ZTB32K5N.js → chunk-T3ZDVU6F.js} +3 -3
- package/dist/cli/chunks/{chunk-624QRKQX.js → chunk-T6W5APYP.js} +1 -1
- package/dist/cli/chunks/{chunk-BAYGQRNP.js → chunk-TU4LIIOP.js} +2 -2
- package/dist/cli/chunks/{chunk-L2TDHJR3.js → chunk-UBYCR3O4.js} +2 -2
- package/dist/cli/chunks/{chunk-JAPBSSFY.js → chunk-UCLN6AME.js} +1 -1
- package/dist/cli/chunks/{chunk-66NW3ZB4.js → chunk-UIYKR2SA.js} +2 -2
- package/dist/cli/chunks/{chunk-BIXRTOH3.js → chunk-UUHIEM2M.js} +3 -3
- package/dist/cli/chunks/{chunk-ELI4GDQO.js → chunk-UY3REQOK.js} +2 -2
- package/dist/cli/chunks/{chunk-BUTGIVKW.js → chunk-V2SAEMZY.js} +1 -1
- package/dist/cli/chunks/{chunk-6WOZUSSN.js → chunk-V5NGBQAQ.js} +2 -2
- package/dist/cli/chunks/{chunk-7TJZDRDU.js → chunk-VCA6YYII.js} +1 -1
- package/dist/cli/chunks/chunk-VJRZFWR5.js +2 -0
- package/dist/cli/chunks/{chunk-5GIJU2ZY.js → chunk-VKPKYMCT.js} +2 -2
- package/dist/cli/chunks/{chunk-XPB5BVU6.js → chunk-VNW5Q2CX.js} +2 -2
- package/dist/cli/chunks/{chunk-7QVPMH25.js → chunk-VUFRTGML.js} +2 -2
- package/dist/cli/chunks/{chunk-MP3FSUNB.js → chunk-W4X2VTIY.js} +2 -2
- package/dist/cli/chunks/{chunk-GWM4M5NF.js → chunk-WTLIEBDH.js} +1 -1
- package/dist/cli/chunks/{chunk-QS5KZYUZ.js → chunk-WUV5RZUI.js} +2 -2
- package/dist/cli/chunks/{chunk-HEGGV2PT.js → chunk-WXI2STKQ.js} +2 -2
- package/dist/cli/chunks/{chunk-GFB6BZWU.js → chunk-XEWXYGJI.js} +2 -2
- package/dist/cli/chunks/{chunk-NHRF3V4B.js → chunk-XNSQZ3O7.js} +2 -2
- package/dist/cli/chunks/{chunk-4POOJYXA.js → chunk-XTJMY3KS.js} +1 -1
- package/dist/cli/chunks/{chunk-LMAEMVPA.js → chunk-XXAVQACL.js} +1 -1
- package/dist/cli/chunks/{chunk-RV6HSMKJ.js → chunk-Y4SAWE45.js} +1 -1
- package/dist/cli/chunks/{chunk-DLSFT6PO.js → chunk-Y6A46M3B.js} +2 -2
- package/dist/cli/chunks/{chunk-5UPIL62W.js → chunk-YDZJWDR6.js} +3 -3
- package/dist/cli/chunks/{chunk-F3KS3TAB.js → chunk-YFOBQSOW.js} +2 -2
- package/dist/cli/chunks/{chunk-XBEI2JBA.js → chunk-YK3NOC2R.js} +2 -2
- package/dist/cli/chunks/{chunk-MQTA6KIO.js → chunk-YUC7RJGR.js} +1 -1
- package/dist/cli/chunks/{chunk-A74J23QB.js → chunk-Z3VJLWRR.js} +2 -2
- package/dist/cli/chunks/{chunk-YNG7E26C.js → chunk-ZLVQSEZK.js} +2 -2
- package/dist/cli/chunks/{chunk-6HWARQWV.js → chunk-ZRLNACPY.js} +2 -2
- package/dist/cli/chunks/{chunk-XBFQJZWX.js → chunk-ZTMZFF25.js} +2 -2
- package/dist/cli/chunks/chunk-ZUMDDMDE.js +3 -0
- package/dist/cli/chunks/{ci-GEJCXMBK.js → ci-5HEXJZ2C.js} +2 -2
- package/dist/cli/chunks/{ci-config-2ZVV4OXL.js → ci-config-WU4NPDAM.js} +2 -2
- package/dist/cli/chunks/{ci-output-E45OGVPR.js → ci-output-BJQVXX5E.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-X73ITYZC.js → circuit-breaker-3BMGTQCB.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-W4PPH46C.js → claude-flow-setup-GVDGJWMU.js} +2 -2
- package/dist/cli/chunks/client-S7GNYTZ5.js +2 -0
- package/dist/cli/chunks/{cline-installer-NUEPMWDE.js → cline-installer-V4MRGWVA.js} +2 -2
- package/dist/cli/chunks/{code-6WQHBS7G.js → code-A3TGQPEO.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-BXQIFIFT.js → code-index-extractor-YJQSYWD3.js} +2 -2
- package/dist/cli/chunks/{codex-installer-Z337R2KH.js → codex-installer-7N7UQPAH.js} +2 -2
- package/dist/cli/chunks/{completions-F5DMYFHV.js → completions-PPGVYLZS.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-W2SYPZDI.js → complexity-analyzer-XZTFLYV5.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-ZCHUIFTN.js → continuedev-installer-Z5I57RAH.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-M5JNODXF.js → copilot-installer-F5YZ6BHB.js} +2 -2
- package/dist/cli/chunks/core-handlers-CUEPOQIO.js +2 -0
- package/dist/cli/chunks/{cost-tracker-LSYTHBHV.js → cost-tracker-GO33ZQAP.js} +2 -2
- package/dist/cli/chunks/{coverage-PGMRS5SS.js → coverage-GSHKLY74.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-CXN5QFEV.js +2 -0
- package/dist/cli/chunks/{cursor-installer-XPUA73UW.js → cursor-installer-JJ7IVJZB.js} +2 -2
- package/dist/cli/chunks/daemon-3DQCKRYO.js +10 -0
- package/dist/cli/chunks/{daemon-ITKDIYMW.js → daemon-IRL7QRNE.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-T55AXLD6.js → dag-attention-scheduler-ORXSUHPA.js} +2 -2
- package/dist/cli/chunks/{detect-DR7J6K4O.js → detect-RHU62KRI.js} +2 -2
- package/dist/cli/chunks/{dist-node-LAJJBOUT.js → dist-node-3VKV4Z6C.js} +2 -2
- package/dist/cli/chunks/{domain-handler-OMSHCRMK.js → domain-handler-SFIML4FK.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-EQXSKC5K.js → domain-plugins-CJ4FA3OC.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-FKRAGVSW.js → domain-transfer-BCRKPCAA.js} +2 -2
- package/dist/cli/chunks/dream-5AUNJW24.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-JZFPCNL3.js → embed-and-insert-pattern-VL3HFLPV.js} +2 -2
- package/dist/cli/chunks/{eval-JSNNASBW.js → eval-GGKRI4P5.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-UPD3IZBK.js → experience-capture-middleware-F72TIRQY.js} +3 -3
- package/dist/cli/chunks/{fast-paths-YNMIBS2E.js → fast-paths-7KOOF3MA.js} +2 -2
- package/dist/cli/chunks/{feature-flags-SRLXDKBI.js → feature-flags-FNHBTHBH.js} +2 -2
- package/dist/cli/chunks/{feature-flags-VIR7O4L7.js → feature-flags-IOZEWWFU.js} +2 -2
- package/dist/cli/chunks/file-discovery-AYWF357I.js +2 -0
- package/dist/cli/chunks/{fleet-K2ED46EL.js → fleet-QX5KXTRC.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-QCU4ZRYW.js → gnn-wrapper-OH2DOQP7.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-YYQI4WZM.js → heartbeat-handler-W67NXTNE.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-7ZIDVXIP.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-P77OC7FM.js +2 -0
- package/dist/cli/chunks/hnsw-index-3LBOTQAW.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-C5TJSWTZ.js → hnsw-legacy-bridge-6MLLOGOE.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-SE3MJJYS.js → hnswlib-node-4UDISJ3G.js} +2 -2
- package/dist/cli/chunks/{hooks-C572SRDH.js → hooks-NOQJWQ4P.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-LOM54PDD.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-35A6G3M5.js → hypergraph-engine-2OD3APVP.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-U2756CWI.js → hypergraph-handler-5AZGMBUM.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-QSDJVBPS.js +2 -0
- package/dist/cli/chunks/init-guard-SMGJ45PW.js +2 -0
- package/dist/cli/chunks/init-handler-5T4MP2NM.js +88 -0
- package/dist/cli/chunks/init-wizard-MK2325JJ.js +2 -0
- package/dist/cli/chunks/kernel-2NJQQ2KT.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-32PX5YH7.js → kilocode-installer-RLZYLVQJ.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-C4ROMMUS.js → kiro-installer-LFZOC7VD.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-SDISHO62.js +2 -0
- package/dist/cli/chunks/{learning-GEPVZGJQ.js → learning-XRPGLUWR.js} +20 -20
- package/dist/cli/chunks/{llm-router-XRKTTJTX.js → llm-router-OMK5HYPH.js} +4 -4
- package/dist/cli/chunks/llm-router-service-YTCMRBAN.js +2 -0
- package/dist/cli/chunks/{load-XVH6HW7E.js → load-XADC7KCU.js} +2 -2
- package/dist/cli/chunks/load-test-RPKHLBCC.js +2 -0
- package/dist/cli/chunks/{mcp-IULSTM4Z.js → mcp-PIBKSSVU.js} +2 -2
- package/dist/cli/chunks/{memory-6K7IAU4T.js → memory-AP7EZERS.js} +5 -5
- package/dist/cli/chunks/memory-backend-BZXFO4JZ.js +2 -0
- package/dist/cli/chunks/{memory-handlers-CG6DRLAW.js → memory-handlers-MOFDNB6E.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-VZDUYPLX.js → multi-model-executor-7JJ2FZ33.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-QUTXKNH4.js → opencode-installer-ZZZ6EBYJ.js} +2 -2
- package/dist/cli/chunks/{orchestrator-PCKKUWOP.js → orchestrator-2H2YKSGJ.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-4PRPIOR6.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-PX5HQVRL.js → pattern-usage-recorder-7MJJWC2Z.js} +2 -2
- package/dist/cli/chunks/{pipeline-O562GTOG.js → pipeline-LIE5BWQY.js} +2 -2
- package/dist/cli/chunks/{platform-PM7Q2AZS.js → platform-SMYUNLGX.js} +2 -2
- package/dist/cli/chunks/{plugin-OTYTFGPY.js → plugin-LJDIXQNT.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-6CFXTHC2.js → prime-radiant-advanced-wasm-RIDNE5D2.js} +2 -2
- package/dist/cli/chunks/project-root-NBIQF63D.js +2 -0
- package/dist/cli/chunks/protocol-executor-BRPGIYWQ.js +2 -0
- package/dist/cli/chunks/{protocol-handler-PPGNSAOS.js → protocol-handler-YVM66DLI.js} +2 -2
- package/dist/cli/chunks/{prove-WQ3BKRZG.js → prove-ZBDT52GD.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-GDZACWKW.js +2 -0
- package/dist/cli/chunks/{quality-C5WUU3AA.js → quality-DUKXGDDO.js} +2 -2
- package/dist/cli/chunks/{quality-gate-WSSRKD5U.js → quality-gate-SM3RXF4V.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-LDKLBPD5.js +2 -0
- package/dist/cli/chunks/{real-embeddings-CFQE7IRQ.js → real-embeddings-4QLQZDB5.js} +2 -2
- package/dist/cli/chunks/{ref-validation-DHKHXVZT.js → ref-validation-M3EO32YQ.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-3PPODABV.js → roocode-installer-S6Q5OLV5.js} +2 -2
- package/dist/cli/chunks/router-H5YSIRH2.js +2 -0
- package/dist/cli/chunks/routing-feedback-5R36TJDH.js +2 -0
- package/dist/cli/chunks/{routing-handler-JNXTGT6T.js → routing-handler-55FMUACP.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-6YLROPVP.js → ruvector-commands-QATKAAPK.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-TT2DBQQQ.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-BCLFJKSK.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-4DWB4WRK.js → rvf-migration-coordinator-RFXFU6JD.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-UXI66OQJ.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-YKR2ZNBF.js → rvf-store-integrity-PKDVXQAW.js} +2 -2
- package/dist/cli/chunks/safe-db-MSTD2GDH.js +2 -0
- package/dist/cli/chunks/schedule-KST6KIFD.js +2 -0
- package/dist/cli/chunks/scheduler-FTQS6YK3.js +2 -0
- package/dist/cli/chunks/security-CMRB6WA3.js +18 -0
- package/dist/cli/chunks/{shared-rvf-adapter-LNRLFP5I.js → shared-rvf-adapter-YHLLNFHF.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-GWU6YQNS.js → shared-rvf-dual-writer-4BGDVPQ7.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-ZX5QFDMR.js +2 -0
- package/dist/cli/chunks/{standalone-memory-46KKBSSV.js → standalone-memory-LUHKQAGM.js} +2 -2
- package/dist/cli/chunks/{status-handler-35T5FTDQ.js → status-handler-S6S5PNR7.js} +2 -2
- package/dist/cli/chunks/{structural-health-P7QPQWLO.js → structural-health-PQ7NZAJ4.js} +2 -2
- package/dist/cli/chunks/{sync-W6Z4R4PL.js → sync-Q6KRQXU6.js} +2 -2
- package/dist/cli/chunks/{sync-Y43EWBSY.js → sync-S744AEJC.js} +2 -2
- package/dist/cli/chunks/{task-handler-5CX3ZYT7.js → task-handler-GAMGEHUW.js} +2 -2
- package/dist/cli/chunks/{task-handlers-DQZGOJNE.js → task-handlers-6CRDEELN.js} +3 -3
- package/dist/cli/chunks/{test-TPP53VVV.js → test-FNH67DBK.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-WBV4UMQH.js → test-scheduling-NZA5SHK6.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-GIIDXHLC.js → token-bootstrap-CXKG55JD.js} +2 -2
- package/dist/cli/chunks/{token-usage-AKK37RB7.js → token-usage-M7WWEDJX.js} +2 -2
- package/dist/cli/chunks/{transformers-7MASPELS.js → transformers-2IFMCK6A.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-YZKD6UGB.js → tree-sitter-wasm-parser-NMNA6RJC.js} +2 -2
- package/dist/cli/chunks/{types-AZ3BTXDP.js → types-N7FWTOLD.js} +2 -2
- package/dist/cli/chunks/unified-memory-2Z2F446J.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-A4EWYPJQ.js +2 -0
- package/dist/cli/chunks/unified-persistence-Z6N6JZFA.js +2 -0
- package/dist/cli/chunks/{upgrade-L7OTDKEK.js → upgrade-KDB5RGL7.js} +2 -2
- package/dist/cli/chunks/{validate-O3QVFIGP.js → validate-KMUV5FUA.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-2UGBGLTX.js → validate-swarm-ANZWRCJU.js} +2 -2
- package/dist/cli/chunks/visual-security-GXYZV7KR.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-J75IYPRO.js → web-tree-sitter-SXXC4NMS.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-FQ5DBFCG.js → windsurf-installer-2LWSKMBU.js} +2 -2
- package/dist/cli/chunks/witness-chain-52PEIEGK.js +2 -0
- package/dist/cli/chunks/{witness-chain-I7TN4MXZ.js → witness-chain-JJMSJFZP.js} +2 -2
- package/dist/cli/chunks/{witness-chain-repair-D3NE3NQK.js → witness-chain-repair-OX7VFW6T.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-RU2WOP5M.js → witness-chain-verifier-QLSMXHAZ.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-IHQB2FR5.js → witness-key-manager-3DS4L7LE.js} +2 -2
- package/dist/cli/chunks/{workflow-6BWTNVV6.js → workflow-ARWAMHD3.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-DORMQMG7.js +2 -0
- package/dist/cli/chunks/{wrappers-URVP25VU.js → wrappers-J6KGTUSJ.js} +2 -2
- package/dist/cli/commands/learning.js +3 -2
- package/dist/cli/commands/security.d.ts +16 -0
- package/dist/cli/commands/security.js +76 -9
- package/dist/cli/handlers/init-guard.d.ts +21 -1
- package/dist/cli/handlers/init-guard.js +51 -8
- package/dist/cli/handlers/init-handler.js +57 -56
- package/dist/cli/index.js +11 -0
- package/dist/cli/utils/ci-output.d.ts +5 -0
- package/dist/cli/utils/ci-output.js +8 -0
- package/dist/coordination/handlers/security-handlers.js +22 -6
- package/dist/coordination/protocols/defect-investigation.js +7 -1
- package/dist/coordination/protocols/security-audit.js +11 -0
- package/dist/coordination/result-saver.d.ts +9 -0
- package/dist/coordination/result-saver.js +34 -4
- package/dist/domains/coverage-analysis/collected-metrics.d.ts +2 -0
- package/dist/domains/coverage-analysis/collected-metrics.js +6 -0
- package/dist/domains/defect-intelligence/services/defect-predictor.js +9 -6
- package/dist/domains/quality-assessment/interfaces.d.ts +4 -0
- package/dist/domains/quality-assessment/quality-evidence.d.ts +1 -1
- package/dist/domains/quality-assessment/services/quality-analyzer.js +7 -5
- package/dist/domains/quality-assessment/services/quality-gate.js +12 -3
- package/dist/domains/security-compliance/dependency-advisory-engine.d.ts +52 -0
- package/dist/domains/security-compliance/dependency-advisory-engine.js +113 -0
- package/dist/domains/security-compliance/interfaces.d.ts +30 -0
- package/dist/domains/security-compliance/plugin.d.ts +7 -1
- package/dist/domains/security-compliance/plugin.js +19 -0
- package/dist/domains/security-compliance/services/scanners/dependency-resolver.d.ts +71 -0
- package/dist/domains/security-compliance/services/scanners/dependency-resolver.js +232 -0
- package/dist/domains/security-compliance/services/scanners/dependency-scanner.d.ts +21 -6
- package/dist/domains/security-compliance/services/scanners/dependency-scanner.js +142 -64
- package/dist/domains/security-compliance/services/scanners/lockfile-versions.d.ts +43 -0
- package/dist/domains/security-compliance/services/scanners/lockfile-versions.js +248 -0
- package/dist/domains/security-compliance/services/scanners/scanner-types.d.ts +30 -2
- package/dist/domains/security-compliance/services/security-auditor.d.ts +19 -6
- package/dist/domains/security-compliance/services/security-auditor.js +133 -92
- package/dist/domains/test-execution/services/retry-handler.js +17 -6
- package/dist/domains/test-execution/services/test-executor.d.ts +1 -0
- package/dist/domains/test-execution/services/test-executor.js +87 -7
- package/dist/kernel/shared-dirs.js +17 -5
- package/dist/mcp/bundle.js +874 -874
- package/dist/mcp/handlers/domain-handler-configs.d.ts +4 -0
- package/dist/mcp/handlers/domain-handler-configs.js +5 -1
- package/dist/mcp/protocol-server.js +2 -1
- package/dist/mcp/types.d.ts +6 -0
- package/dist/shared/security/index.d.ts +2 -2
- package/dist/shared/security/index.js +1 -1
- package/dist/shared/security/osv-client.d.ts +79 -132
- package/dist/shared/security/osv-client.js +344 -167
- package/dist/shared/security/osv-lookup.d.ts +124 -0
- package/dist/shared/security/osv-lookup.js +246 -0
- package/dist/shared/security/osv-types.d.ts +119 -0
- package/dist/shared/security/osv-types.js +6 -0
- package/dist/workers/interfaces.d.ts +6 -1
- package/dist/workers/namespaced-keys.d.ts +16 -0
- package/dist/workers/namespaced-keys.js +24 -0
- package/dist/workers/quality-daemon/persistent-memory.d.ts +1 -1
- package/dist/workers/quality-daemon/persistent-memory.js +2 -2
- package/dist/workers/worker-manager.js +5 -2
- package/dist/workers/workers/defect-predictor.d.ts +25 -8
- package/dist/workers/workers/defect-predictor.js +223 -216
- package/dist/workers/workers/performance-baseline.d.ts +24 -9
- package/dist/workers/workers/performance-baseline.js +187 -230
- package/dist/workers/workers/quality-gate.d.ts +11 -9
- package/dist/workers/workers/quality-gate.js +125 -267
- package/dist/workers/workers/security-scan-records.d.ts +111 -0
- package/dist/workers/workers/security-scan-records.js +128 -0
- package/dist/workers/workers/security-scan.d.ts +25 -7
- package/dist/workers/workers/security-scan.js +187 -164
- package/package.json +2 -2
- package/dist/cli/chunks/adapter-PP3XIXDV.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-VDUQJKKY.js +0 -2
- package/dist/cli/chunks/base-QSYWWPCE.js +0 -2
- package/dist/cli/chunks/browser-workflow-WXXPBSCM.js +0 -2
- package/dist/cli/chunks/chunk-45MVRQG4.js +0 -2
- package/dist/cli/chunks/chunk-5VZVMO7B.js +0 -3
- package/dist/cli/chunks/chunk-EECF4CMA.js +0 -2
- package/dist/cli/chunks/client-6XKSQ4JT.js +0 -2
- package/dist/cli/chunks/core-handlers-OJYW4Y6M.js +0 -2
- package/dist/cli/chunks/cross-domain-router-QVUPQ2SC.js +0 -2
- package/dist/cli/chunks/daemon-QBYTCIMH.js +0 -10
- package/dist/cli/chunks/dream-3UABDRZJ.js +0 -2
- package/dist/cli/chunks/file-discovery-ZFGZTKZ4.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-MJ6MTPDF.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-FQWJCFVW.js +0 -2
- package/dist/cli/chunks/hnsw-index-NJYKJUHC.js +0 -2
- package/dist/cli/chunks/hybrid-backend-SL7RFID7.js +0 -2
- package/dist/cli/chunks/impact-analyzer-5ZJTXPVC.js +0 -2
- package/dist/cli/chunks/init-handler-PCLYQUSB.js +0 -88
- package/dist/cli/chunks/init-wizard-MQMDSIOF.js +0 -2
- package/dist/cli/chunks/kernel-MEJ5GMRH.js +0 -2
- package/dist/cli/chunks/knowledge-graph-XUBZSEZE.js +0 -2
- package/dist/cli/chunks/llm-router-service-QZAPAEPX.js +0 -2
- package/dist/cli/chunks/load-test-OVXIQ3AF.js +0 -2
- package/dist/cli/chunks/memory-backend-TRPOMPK4.js +0 -2
- package/dist/cli/chunks/pattern-null-store-JWYBRBZG.js +0 -2
- package/dist/cli/chunks/project-root-VVSTHIP4.js +0 -2
- package/dist/cli/chunks/protocol-executor-PXZCLZD3.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-42FRS5V3.js +0 -2
- package/dist/cli/chunks/queen-coordinator-UI3B7DI6.js +0 -2
- package/dist/cli/chunks/router-HYRPWLAY.js +0 -2
- package/dist/cli/chunks/routing-feedback-BPZ5R6F3.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-DEKDQ6KO.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-L53VBS7I.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-I6RUGD2D.js +0 -2
- package/dist/cli/chunks/safe-db-KS65XDCP.js +0 -2
- package/dist/cli/chunks/schedule-KD2VN6GB.js +0 -2
- package/dist/cli/chunks/scheduler-ZH3RMUHY.js +0 -2
- package/dist/cli/chunks/security-PWQTGDRU.js +0 -13
- package/dist/cli/chunks/sqlite-persistence-6DTVME5D.js +0 -2
- package/dist/cli/chunks/unified-memory-FCX7NLFZ.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-VU5QJK37.js +0 -2
- package/dist/cli/chunks/unified-persistence-FM376LGE.js +0 -2
- package/dist/cli/chunks/visual-security-EU7Y3X46.js +0 -2
- package/dist/cli/chunks/witness-chain-CSEBT52D.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-ALNKOM3N.js +0 -2
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - OSV lookup outcome types and response validation (#1049)
|
|
3
|
+
*
|
|
4
|
+
* A failed or partial advisory lookup is never "no vulnerabilities". Every
|
|
5
|
+
* package the lookup could not check is listed with the reason, and the
|
|
6
|
+
* overall status says whether the result can be read as a measurement.
|
|
7
|
+
*/
|
|
8
|
+
import type { ParsedVulnerability } from './osv-types';
|
|
9
|
+
/** A package handed to an OSV lookup. */
|
|
10
|
+
export interface OSVPackageQuery {
|
|
11
|
+
name: string;
|
|
12
|
+
ecosystem: string;
|
|
13
|
+
version?: string;
|
|
14
|
+
}
|
|
15
|
+
/** A package whose advisories could not be checked, and why. */
|
|
16
|
+
export interface OSVUncheckedPackage {
|
|
17
|
+
name: string;
|
|
18
|
+
ecosystem: string;
|
|
19
|
+
version?: string;
|
|
20
|
+
reason: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Outcome of an OSV batch lookup.
|
|
24
|
+
* - complete: every package was checked; `results` is a measurement.
|
|
25
|
+
* - incomplete: some packages were checked (their findings are real), others not.
|
|
26
|
+
* - failed: no package could be checked.
|
|
27
|
+
*/
|
|
28
|
+
export interface OSVBatchLookup {
|
|
29
|
+
status: 'complete' | 'incomplete' | 'failed';
|
|
30
|
+
/** Keyed `${ecosystem}:${name}`; only packages that were actually checked. */
|
|
31
|
+
results: Map<string, ParsedVulnerability[]>;
|
|
32
|
+
packagesRequested: number;
|
|
33
|
+
packagesChecked: number;
|
|
34
|
+
unchecked: OSVUncheckedPackage[];
|
|
35
|
+
/** Bounded, request-level error descriptions (no response bodies). */
|
|
36
|
+
errors: string[];
|
|
37
|
+
}
|
|
38
|
+
/** Thrown by the legacy list-returning methods when a lookup did not complete. */
|
|
39
|
+
export declare class OSVLookupError extends Error {
|
|
40
|
+
readonly lookup?: OSVBatchLookup;
|
|
41
|
+
constructor(message: string, lookup?: OSVBatchLookup);
|
|
42
|
+
static fromLookup(lookup: OSVBatchLookup): OSVLookupError;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Result key for one queried package: `${ecosystem}:${name}@${version}`.
|
|
46
|
+
* Keyed by version so two versions of one package never overwrite each other.
|
|
47
|
+
*/
|
|
48
|
+
export declare const lookupKey: (pkg: {
|
|
49
|
+
ecosystem: string;
|
|
50
|
+
name: string;
|
|
51
|
+
version?: string;
|
|
52
|
+
}) => string;
|
|
53
|
+
/** At most `max` ids, then "and N more" — keeps reasons bounded. */
|
|
54
|
+
export declare function boundedList(items: readonly string[], max?: number): string;
|
|
55
|
+
/**
|
|
56
|
+
* The exact npm version a spec pins ("4.17.15", "=4.17.15", "v4.17.15"), or
|
|
57
|
+
* null for anything else: ranges (^ ~ < > <= >= || hyphen), wildcards, tags,
|
|
58
|
+
* and non-registry specs. A range is never reduced to a guessed version (#1049).
|
|
59
|
+
*/
|
|
60
|
+
export declare function exactNpmVersion(spec: string): string | null;
|
|
61
|
+
/**
|
|
62
|
+
* What an npm dependency spec points at (#1049):
|
|
63
|
+
* - `local`: a workspace / linked / local-directory package. Not an OSV subject
|
|
64
|
+
* (its own dependencies are what can carry advisories).
|
|
65
|
+
* - `remote`: git, GitHub shorthand, URL or tarball (incl. `file:*.tgz`): third-party
|
|
66
|
+
* code with no registry version, so advisories cannot be matched.
|
|
67
|
+
* - `alias`: `npm:<real>@<range>` — the registry package `<real>`.
|
|
68
|
+
* - `registry`: an ordinary registry spec (exact version, range or tag).
|
|
69
|
+
*/
|
|
70
|
+
export type NpmSpecKind = {
|
|
71
|
+
kind: 'local';
|
|
72
|
+
} | {
|
|
73
|
+
kind: 'remote';
|
|
74
|
+
} | {
|
|
75
|
+
kind: 'alias';
|
|
76
|
+
name: string;
|
|
77
|
+
spec: string;
|
|
78
|
+
} | {
|
|
79
|
+
kind: 'registry';
|
|
80
|
+
spec: string;
|
|
81
|
+
};
|
|
82
|
+
export declare function classifyNpmSpec(spec: string): NpmSpecKind;
|
|
83
|
+
/** A spec whose source is not the npm registry (local or remote); aliases are registry packages. */
|
|
84
|
+
export declare function isNonRegistrySpec(spec: string): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* True for a concrete version OSV can match ("4.17.15", "1.0rc1", "2.0.0-beta.1").
|
|
87
|
+
* Ranges, tags, wildcards, URLs and aliases are not: querying OSV without a
|
|
88
|
+
* concrete version returns every advisory the package ever had.
|
|
89
|
+
*/
|
|
90
|
+
export declare function isConcreteVersion(version: string): boolean;
|
|
91
|
+
/** Longest version string considered; versions come from repo-controlled files. */
|
|
92
|
+
export declare const MAX_VERSION_LENGTH = 256;
|
|
93
|
+
/** One querybatch entry: the advisory ids reported for a package, or why it is unusable. */
|
|
94
|
+
export type BatchEntry = {
|
|
95
|
+
ids: string[];
|
|
96
|
+
} | {
|
|
97
|
+
reason: string;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Validate a querybatch body against the queries sent. `null` means the body as
|
|
101
|
+
* a whole is unusable (every package in the chunk is unchecked).
|
|
102
|
+
*/
|
|
103
|
+
export declare function parseBatchBody(body: unknown, expected: number): BatchEntry[] | null;
|
|
104
|
+
/** A full OSV advisory record has a string id and an `affected` array. */
|
|
105
|
+
export declare function isAdvisoryRecord(body: unknown): body is {
|
|
106
|
+
id: string;
|
|
107
|
+
affected: unknown[];
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Whether an advisory affects `pkg@version` according to its own `affected`
|
|
111
|
+
* entries. Used to confirm querybatch matches: OSV's batch endpoint can return
|
|
112
|
+
* advisories whose ranges for the package exclude the version. An advisory is
|
|
113
|
+
* dropped only when every matching entry is positively evaluated as not
|
|
114
|
+
* affected; anything that cannot be evaluated (no matching entry, ECOSYSTEM/GIT
|
|
115
|
+
* ranges, unparseable versions) is kept.
|
|
116
|
+
*/
|
|
117
|
+
export declare function advisoryAffectsVersion(advisory: unknown, pkg: {
|
|
118
|
+
name: string;
|
|
119
|
+
ecosystem: string;
|
|
120
|
+
version: string;
|
|
121
|
+
}): boolean;
|
|
122
|
+
/** Lookup status from the counts. */
|
|
123
|
+
export declare function lookupStatus(requested: number, checked: number): OSVBatchLookup['status'];
|
|
124
|
+
//# sourceMappingURL=osv-lookup.d.ts.map
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - OSV lookup outcome types and response validation (#1049)
|
|
3
|
+
*
|
|
4
|
+
* A failed or partial advisory lookup is never "no vulnerabilities". Every
|
|
5
|
+
* package the lookup could not check is listed with the reason, and the
|
|
6
|
+
* overall status says whether the result can be read as a measurement.
|
|
7
|
+
*/
|
|
8
|
+
/** Thrown by the legacy list-returning methods when a lookup did not complete. */
|
|
9
|
+
export class OSVLookupError extends Error {
|
|
10
|
+
lookup;
|
|
11
|
+
constructor(message, lookup) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = 'OSVLookupError';
|
|
14
|
+
this.lookup = lookup;
|
|
15
|
+
}
|
|
16
|
+
static fromLookup(lookup) {
|
|
17
|
+
const reasons = [...new Set(lookup.unchecked.map((p) => p.reason))].slice(0, 3).join('; ');
|
|
18
|
+
return new OSVLookupError(`OSV advisories could not be checked for ${lookup.unchecked.length} of ${lookup.packagesRequested} package(s): ${reasons}`, lookup);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Result key for one queried package: `${ecosystem}:${name}@${version}`.
|
|
23
|
+
* Keyed by version so two versions of one package never overwrite each other.
|
|
24
|
+
*/
|
|
25
|
+
export const lookupKey = (pkg) => `${pkg.ecosystem}:${pkg.name}@${pkg.version ?? ''}`;
|
|
26
|
+
/** At most `max` ids, then "and N more" — keeps reasons bounded. */
|
|
27
|
+
export function boundedList(items, max = 5) {
|
|
28
|
+
return items.length <= max ? items.join(', ') : `${items.slice(0, max).join(', ')} and ${items.length - max} more`;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The exact npm version a spec pins ("4.17.15", "=4.17.15", "v4.17.15"), or
|
|
32
|
+
* null for anything else: ranges (^ ~ < > <= >= || hyphen), wildcards, tags,
|
|
33
|
+
* and non-registry specs. A range is never reduced to a guessed version (#1049).
|
|
34
|
+
*/
|
|
35
|
+
export function exactNpmVersion(spec) {
|
|
36
|
+
const m = /^=?v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)$/.exec(spec.trim());
|
|
37
|
+
return m ? m[1] : null;
|
|
38
|
+
}
|
|
39
|
+
export function classifyNpmSpec(spec) {
|
|
40
|
+
const s = spec.trim();
|
|
41
|
+
const alias = /^npm:((?:@[^/@\s]+\/)?[^@\s]+)(?:@(.*))?$/.exec(s);
|
|
42
|
+
if (alias)
|
|
43
|
+
return { kind: 'alias', name: alias[1], spec: alias[2] ?? '' };
|
|
44
|
+
if (/^(workspace:|link:|portal:)/.test(s))
|
|
45
|
+
return { kind: 'local' };
|
|
46
|
+
if (/^file:/.test(s))
|
|
47
|
+
return /\.(tgz|tar\.gz|tar)$/i.test(s) ? { kind: 'remote' } : { kind: 'local' };
|
|
48
|
+
if (/^(\.{0,2}\/|~\/)/.test(s))
|
|
49
|
+
return /\.(tgz|tar\.gz|tar)$/i.test(s) ? { kind: 'remote' } : { kind: 'local' };
|
|
50
|
+
if (/^(patch:|exec:|git\+|git:|github:|gitlab:|bitbucket:|https?:)/.test(s))
|
|
51
|
+
return { kind: 'remote' };
|
|
52
|
+
if (/^[^\s@/:]+\/[^\s@/:]+(#.*)?$/.test(s))
|
|
53
|
+
return { kind: 'remote' }; // GitHub "user/repo" shorthand
|
|
54
|
+
return { kind: 'registry', spec: s };
|
|
55
|
+
}
|
|
56
|
+
/** A spec whose source is not the npm registry (local or remote); aliases are registry packages. */
|
|
57
|
+
export function isNonRegistrySpec(spec) {
|
|
58
|
+
const k = classifyNpmSpec(spec).kind;
|
|
59
|
+
return k === 'local' || k === 'remote';
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* True for a concrete version OSV can match ("4.17.15", "1.0rc1", "2.0.0-beta.1").
|
|
63
|
+
* Ranges, tags, wildcards, URLs and aliases are not: querying OSV without a
|
|
64
|
+
* concrete version returns every advisory the package ever had.
|
|
65
|
+
*/
|
|
66
|
+
export function isConcreteVersion(version) {
|
|
67
|
+
if (version.length === 0 || version.length > MAX_VERSION_LENGTH)
|
|
68
|
+
return false;
|
|
69
|
+
if (!matchesVersionShape(version))
|
|
70
|
+
return false;
|
|
71
|
+
return !/(^|\.)[xX*](\.|$)/.test(version);
|
|
72
|
+
}
|
|
73
|
+
/** Longest version string considered; versions come from repo-controlled files. */
|
|
74
|
+
export const MAX_VERSION_LENGTH = 256;
|
|
75
|
+
const VERSION_CORE = /^\d+(?:\.\d+)*$/;
|
|
76
|
+
const VERSION_TAIL = /^[0-9A-Za-z][0-9A-Za-z.+-]*$/;
|
|
77
|
+
/**
|
|
78
|
+
* Linear equivalent of `^\d+(\.\d+)*([-+._]?[0-9A-Za-z][0-9A-Za-z.+-]*)?$`
|
|
79
|
+
* (whose overlapping quantifiers backtrack polynomially, CodeQL js/polynomial-redos).
|
|
80
|
+
* `_` is not in the tail class, so it can only be the separator right after the
|
|
81
|
+
* numeric core. Without `_`, any accepted split can be re-split after the first
|
|
82
|
+
* digit run (the remaining `.digits` segments fit the tail class).
|
|
83
|
+
*/
|
|
84
|
+
function matchesVersionShape(version) {
|
|
85
|
+
const underscore = version.indexOf('_');
|
|
86
|
+
if (underscore >= 0) {
|
|
87
|
+
return VERSION_CORE.test(version.slice(0, underscore)) && VERSION_TAIL.test(version.slice(underscore + 1));
|
|
88
|
+
}
|
|
89
|
+
let i = 0;
|
|
90
|
+
while (i < version.length && version.charCodeAt(i) >= 48 && version.charCodeAt(i) <= 57)
|
|
91
|
+
i++;
|
|
92
|
+
if (i === 0)
|
|
93
|
+
return false;
|
|
94
|
+
const rest = version.slice(i);
|
|
95
|
+
if (rest === '')
|
|
96
|
+
return true;
|
|
97
|
+
// Splitting inside a 2+ digit run makes the tail start with a digit: the rest
|
|
98
|
+
// then only has to fit the tail class ("11." = core "1" + tail "1.").
|
|
99
|
+
if (i >= 2 && VERSION_TAIL_REST.test(rest))
|
|
100
|
+
return true;
|
|
101
|
+
const sep = rest[0] === '-' || rest[0] === '+' || rest[0] === '.';
|
|
102
|
+
return VERSION_TAIL.test(sep ? rest.slice(1) : rest);
|
|
103
|
+
}
|
|
104
|
+
const VERSION_TAIL_REST = /^[0-9A-Za-z.+-]*$/;
|
|
105
|
+
const isObject = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
106
|
+
/**
|
|
107
|
+
* Validate a querybatch body against the queries sent. `null` means the body as
|
|
108
|
+
* a whole is unusable (every package in the chunk is unchecked).
|
|
109
|
+
*/
|
|
110
|
+
export function parseBatchBody(body, expected) {
|
|
111
|
+
if (!isObject(body) || !Array.isArray(body.results) || body.results.length !== expected)
|
|
112
|
+
return null;
|
|
113
|
+
return body.results.map((entry) => {
|
|
114
|
+
if (!isObject(entry))
|
|
115
|
+
return { reason: 'malformed OSV result entry' };
|
|
116
|
+
if (typeof entry.next_page_token === 'string' && entry.next_page_token) {
|
|
117
|
+
return { reason: 'OSV advisory list was truncated (paginated) and not fully retrieved' };
|
|
118
|
+
}
|
|
119
|
+
if (entry.vulns === undefined)
|
|
120
|
+
return { ids: [] };
|
|
121
|
+
if (!Array.isArray(entry.vulns))
|
|
122
|
+
return { reason: 'malformed OSV result entry' };
|
|
123
|
+
const ids = [];
|
|
124
|
+
for (const v of entry.vulns) {
|
|
125
|
+
if (!isObject(v) || typeof v.id !== 'string' || !v.id)
|
|
126
|
+
return { reason: 'malformed OSV advisory reference' };
|
|
127
|
+
ids.push(v.id);
|
|
128
|
+
}
|
|
129
|
+
return { ids };
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/** A full OSV advisory record has a string id and an `affected` array. */
|
|
133
|
+
export function isAdvisoryRecord(body) {
|
|
134
|
+
return isObject(body) && typeof body.id === 'string' && Array.isArray(body.affected);
|
|
135
|
+
}
|
|
136
|
+
function parseSemver(version) {
|
|
137
|
+
const m = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/.exec(version.trim());
|
|
138
|
+
if (!m)
|
|
139
|
+
return null;
|
|
140
|
+
return { nums: [Number(m[1]), Number(m[2]), Number(m[3])], pre: m[4] ? m[4].split('.') : [] };
|
|
141
|
+
}
|
|
142
|
+
function compareSemver(a, b) {
|
|
143
|
+
for (let i = 0; i < 3; i++)
|
|
144
|
+
if (a.nums[i] !== b.nums[i])
|
|
145
|
+
return a.nums[i] < b.nums[i] ? -1 : 1;
|
|
146
|
+
if (a.pre.length === 0 || b.pre.length === 0)
|
|
147
|
+
return a.pre.length === b.pre.length ? 0 : a.pre.length === 0 ? 1 : -1;
|
|
148
|
+
for (let i = 0; i < Math.max(a.pre.length, b.pre.length); i++) {
|
|
149
|
+
const x = a.pre[i];
|
|
150
|
+
const y = b.pre[i];
|
|
151
|
+
if (x === undefined || y === undefined)
|
|
152
|
+
return x === undefined ? -1 : 1;
|
|
153
|
+
if (x === y)
|
|
154
|
+
continue;
|
|
155
|
+
const nx = /^\d+$/.test(x);
|
|
156
|
+
const ny = /^\d+$/.test(y);
|
|
157
|
+
if (nx && ny)
|
|
158
|
+
return Number(x) < Number(y) ? -1 : 1;
|
|
159
|
+
if (nx !== ny)
|
|
160
|
+
return nx ? -1 : 1;
|
|
161
|
+
return x < y ? -1 : 1;
|
|
162
|
+
}
|
|
163
|
+
return 0;
|
|
164
|
+
}
|
|
165
|
+
/** OSV SEMVER range evaluation; null when an event version cannot be parsed. */
|
|
166
|
+
function semverRangeAffects(version, events) {
|
|
167
|
+
// `at: null` is `introduced: "0"`: before every version, prereleases included.
|
|
168
|
+
const keyed = [];
|
|
169
|
+
for (const e of events) {
|
|
170
|
+
const kind = e.introduced !== undefined ? 'introduced' : e.fixed !== undefined ? 'fixed' : e.last_affected !== undefined ? 'last_affected' : null;
|
|
171
|
+
if (!kind)
|
|
172
|
+
continue; // `limit` does not change membership for a single version
|
|
173
|
+
const raw = e[kind];
|
|
174
|
+
if (kind === 'introduced' && raw === '0') {
|
|
175
|
+
keyed.push({ at: null, kind });
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const at = parseSemver(raw);
|
|
179
|
+
if (!at)
|
|
180
|
+
return null;
|
|
181
|
+
keyed.push({ at, kind });
|
|
182
|
+
}
|
|
183
|
+
// Sort by version; on a tie a fixed/last_affected closes the earlier window
|
|
184
|
+
// before an introduced at the same version opens the next one.
|
|
185
|
+
const tieRank = (kind) => (kind === 'introduced' ? 1 : 0);
|
|
186
|
+
keyed.sort((a, b) => {
|
|
187
|
+
if (!a.at || !b.at)
|
|
188
|
+
return a.at === b.at ? 0 : a.at ? 1 : -1;
|
|
189
|
+
return compareSemver(a.at, b.at) || tieRank(a.kind) - tieRank(b.kind);
|
|
190
|
+
});
|
|
191
|
+
let affected = false;
|
|
192
|
+
for (const { at, kind } of keyed) {
|
|
193
|
+
if (!at) {
|
|
194
|
+
affected = true;
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
const cmp = compareSemver(version, at);
|
|
198
|
+
if (kind === 'introduced' && cmp >= 0)
|
|
199
|
+
affected = true;
|
|
200
|
+
else if (kind === 'fixed' && cmp >= 0)
|
|
201
|
+
affected = false;
|
|
202
|
+
else if (kind === 'last_affected' && cmp > 0)
|
|
203
|
+
affected = false;
|
|
204
|
+
}
|
|
205
|
+
return affected;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Whether an advisory affects `pkg@version` according to its own `affected`
|
|
209
|
+
* entries. Used to confirm querybatch matches: OSV's batch endpoint can return
|
|
210
|
+
* advisories whose ranges for the package exclude the version. An advisory is
|
|
211
|
+
* dropped only when every matching entry is positively evaluated as not
|
|
212
|
+
* affected; anything that cannot be evaluated (no matching entry, ECOSYSTEM/GIT
|
|
213
|
+
* ranges, unparseable versions) is kept.
|
|
214
|
+
*/
|
|
215
|
+
export function advisoryAffectsVersion(advisory, pkg) {
|
|
216
|
+
const affected = advisory.affected;
|
|
217
|
+
if (!Array.isArray(affected))
|
|
218
|
+
return true;
|
|
219
|
+
const entries = affected.filter((a) => isObject(a) && isObject(a.package)
|
|
220
|
+
&& a.package.name === pkg.name && a.package.ecosystem === pkg.ecosystem);
|
|
221
|
+
if (entries.length === 0)
|
|
222
|
+
return true;
|
|
223
|
+
const version = parseSemver(pkg.version);
|
|
224
|
+
for (const entry of entries) {
|
|
225
|
+
if (Array.isArray(entry.versions) && entry.versions.includes(pkg.version))
|
|
226
|
+
return true;
|
|
227
|
+
const ranges = Array.isArray(entry.ranges) ? entry.ranges.filter(isObject) : [];
|
|
228
|
+
if (ranges.length === 0 && !Array.isArray(entry.versions))
|
|
229
|
+
return true;
|
|
230
|
+
for (const range of ranges) {
|
|
231
|
+
if (range.type !== 'SEMVER' || !version || !Array.isArray(range.events))
|
|
232
|
+
return true;
|
|
233
|
+
const verdict = semverRangeAffects(version, range.events);
|
|
234
|
+
if (verdict !== false)
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
/** Lookup status from the counts. */
|
|
241
|
+
export function lookupStatus(requested, checked) {
|
|
242
|
+
if (checked === requested)
|
|
243
|
+
return 'complete';
|
|
244
|
+
return checked === 0 ? 'failed' : 'incomplete';
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=osv-lookup.js.map
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - OSV API record types
|
|
3
|
+
* API Documentation: https://google.github.io/osv.dev/api/
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* OSV query request
|
|
7
|
+
*/
|
|
8
|
+
export interface OSVQueryRequest {
|
|
9
|
+
/** Package name */
|
|
10
|
+
package?: {
|
|
11
|
+
name: string;
|
|
12
|
+
ecosystem: OSVEcosystem;
|
|
13
|
+
};
|
|
14
|
+
/** Git commit hash */
|
|
15
|
+
commit?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Package version to match. OSV reads it here, at the top level of the query;
|
|
18
|
+
* a `version` inside `package` is ignored (it returns every advisory ever).
|
|
19
|
+
*/
|
|
20
|
+
version?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Supported ecosystems
|
|
24
|
+
*/
|
|
25
|
+
export type OSVEcosystem = 'npm' | 'PyPI' | 'Go' | 'Maven' | 'crates.io' | 'NuGet' | 'Packagist' | 'RubyGems' | 'Hex' | 'Pub';
|
|
26
|
+
/**
|
|
27
|
+
* OSV vulnerability record
|
|
28
|
+
*/
|
|
29
|
+
export interface OSVVulnerability {
|
|
30
|
+
id: string;
|
|
31
|
+
summary: string;
|
|
32
|
+
details?: string;
|
|
33
|
+
aliases?: string[];
|
|
34
|
+
modified: string;
|
|
35
|
+
published?: string;
|
|
36
|
+
withdrawn?: string;
|
|
37
|
+
severity?: OSVSeverity[];
|
|
38
|
+
affected: OSVAffected[];
|
|
39
|
+
references?: OSVReference[];
|
|
40
|
+
database_specific?: Record<string, unknown>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* OSV severity rating
|
|
44
|
+
*/
|
|
45
|
+
export interface OSVSeverity {
|
|
46
|
+
type: 'CVSS_V2' | 'CVSS_V3';
|
|
47
|
+
score: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* OSV affected package information
|
|
51
|
+
*/
|
|
52
|
+
export interface OSVAffected {
|
|
53
|
+
package: {
|
|
54
|
+
name: string;
|
|
55
|
+
ecosystem: string;
|
|
56
|
+
purl?: string;
|
|
57
|
+
};
|
|
58
|
+
ranges?: OSVRange[];
|
|
59
|
+
versions?: string[];
|
|
60
|
+
ecosystem_specific?: Record<string, unknown>;
|
|
61
|
+
database_specific?: Record<string, unknown>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* OSV version range
|
|
65
|
+
*/
|
|
66
|
+
export interface OSVRange {
|
|
67
|
+
type: 'SEMVER' | 'ECOSYSTEM' | 'GIT';
|
|
68
|
+
repo?: string;
|
|
69
|
+
events: Array<{
|
|
70
|
+
introduced?: string;
|
|
71
|
+
fixed?: string;
|
|
72
|
+
last_affected?: string;
|
|
73
|
+
limit?: string;
|
|
74
|
+
}>;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* OSV reference link
|
|
78
|
+
*/
|
|
79
|
+
export interface OSVReference {
|
|
80
|
+
type: 'ADVISORY' | 'ARTICLE' | 'DETECTION' | 'DISCUSSION' | 'REPORT' | 'FIX' | 'GIT' | 'PACKAGE' | 'EVIDENCE' | 'WEB';
|
|
81
|
+
url: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* OSV query response
|
|
85
|
+
*/
|
|
86
|
+
export interface OSVQueryResponse {
|
|
87
|
+
vulns: OSVVulnerability[];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* OSV batch query request
|
|
91
|
+
*/
|
|
92
|
+
export interface OSVBatchQueryRequest {
|
|
93
|
+
queries: OSVQueryRequest[];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* OSV batch query response
|
|
97
|
+
*/
|
|
98
|
+
export interface OSVBatchQueryResponse {
|
|
99
|
+
results: Array<{
|
|
100
|
+
vulns?: OSVVulnerability[];
|
|
101
|
+
}>;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Parsed vulnerability for easier consumption
|
|
105
|
+
*/
|
|
106
|
+
export interface ParsedVulnerability {
|
|
107
|
+
id: string;
|
|
108
|
+
cveIds: string[];
|
|
109
|
+
summary: string;
|
|
110
|
+
details: string;
|
|
111
|
+
severity: 'critical' | 'high' | 'medium' | 'low' | 'unknown';
|
|
112
|
+
cvssScore: number | null;
|
|
113
|
+
affectedPackage: string;
|
|
114
|
+
affectedVersions: string[];
|
|
115
|
+
fixedVersions: string[];
|
|
116
|
+
publishedDate: Date | null;
|
|
117
|
+
references: string[];
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=osv-types.d.ts.map
|
|
@@ -163,7 +163,12 @@ export interface WorkerMemory {
|
|
|
163
163
|
*/
|
|
164
164
|
get<T>(key: string, options?: WorkerMemoryReadOptions): Promise<T | undefined>;
|
|
165
165
|
set<T>(key: string, value: T): Promise<void>;
|
|
166
|
-
|
|
166
|
+
/**
|
|
167
|
+
* Keys matching a glob pattern. Like `get`, `options.namespace` searches
|
|
168
|
+
* another domain's records (e.g. recorded security scans, #1043); a backend
|
|
169
|
+
* without namespaces returns nothing for one.
|
|
170
|
+
*/
|
|
171
|
+
search(pattern: string, limit?: number, options?: WorkerMemoryReadOptions): Promise<string[]>;
|
|
167
172
|
}
|
|
168
173
|
export interface WorkerLogger {
|
|
169
174
|
debug(message: string, meta?: Record<string, unknown>): void;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - namespaced search keys (#1049)
|
|
3
|
+
*
|
|
4
|
+
* Kernel memory backends disagree on what a namespaced `search` returns: the
|
|
5
|
+
* hybrid (sqlite) backend returns bare keys, the in-memory backend returns
|
|
6
|
+
* `<namespace>:<key>`. A worker that passes a search result straight back to
|
|
7
|
+
* `get(key, { namespace })` then double-prefixes the key and reads nothing.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* The bare key for a key returned by `search(pattern, limit, { namespace })`.
|
|
11
|
+
* A result that already matches `pattern` is bare (keys may legitimately start
|
|
12
|
+
* with the namespace name, e.g. `defect-intelligence:predictor:…`); otherwise a
|
|
13
|
+
* leading `<namespace>:` is the backend's prefix and is removed.
|
|
14
|
+
*/
|
|
15
|
+
export declare function bareSearchKey(found: string, namespace: string, pattern: string): string;
|
|
16
|
+
//# sourceMappingURL=namespaced-keys.d.ts.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - namespaced search keys (#1049)
|
|
3
|
+
*
|
|
4
|
+
* Kernel memory backends disagree on what a namespaced `search` returns: the
|
|
5
|
+
* hybrid (sqlite) backend returns bare keys, the in-memory backend returns
|
|
6
|
+
* `<namespace>:<key>`. A worker that passes a search result straight back to
|
|
7
|
+
* `get(key, { namespace })` then double-prefixes the key and reads nothing.
|
|
8
|
+
*/
|
|
9
|
+
function globToRegExp(pattern) {
|
|
10
|
+
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
11
|
+
return new RegExp(`^${escaped.replace(/\*/g, '.*').replace(/\?/g, '.')}$`, 's');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The bare key for a key returned by `search(pattern, limit, { namespace })`.
|
|
15
|
+
* A result that already matches `pattern` is bare (keys may legitimately start
|
|
16
|
+
* with the namespace name, e.g. `defect-intelligence:predictor:…`); otherwise a
|
|
17
|
+
* leading `<namespace>:` is the backend's prefix and is removed.
|
|
18
|
+
*/
|
|
19
|
+
export function bareSearchKey(found, namespace, pattern) {
|
|
20
|
+
if (globToRegExp(pattern).test(found))
|
|
21
|
+
return found;
|
|
22
|
+
return found.startsWith(`${namespace}:`) ? found.slice(namespace.length + 1) : found;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=namespaced-keys.js.map
|
|
@@ -26,6 +26,6 @@ export declare class PersistentWorkerMemory implements WorkerMemory {
|
|
|
26
26
|
constructor(backend: KVBackend);
|
|
27
27
|
get<T>(key: string, options?: WorkerMemoryReadOptions): Promise<T | undefined>;
|
|
28
28
|
set<T>(key: string, value: T): Promise<void>;
|
|
29
|
-
search(pattern: string): Promise<string[]>;
|
|
29
|
+
search(pattern: string, limit?: number, options?: WorkerMemoryReadOptions): Promise<string[]>;
|
|
30
30
|
}
|
|
31
31
|
//# sourceMappingURL=persistent-memory.d.ts.map
|
|
@@ -23,8 +23,8 @@ export class PersistentWorkerMemory {
|
|
|
23
23
|
async set(key, value) {
|
|
24
24
|
await this.backend.kvSet(key, value, NAMESPACE);
|
|
25
25
|
}
|
|
26
|
-
async search(pattern) {
|
|
27
|
-
return this.backend.kvSearch(pattern, NAMESPACE);
|
|
26
|
+
async search(pattern, limit, options) {
|
|
27
|
+
return this.backend.kvSearch(pattern, options?.namespace ?? NAMESPACE, limit);
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
//# sourceMappingURL=persistent-memory.js.map
|
|
@@ -58,10 +58,13 @@ class InMemoryWorkerMemory {
|
|
|
58
58
|
async set(key, value) {
|
|
59
59
|
this.store.set(key, value);
|
|
60
60
|
}
|
|
61
|
-
async search(pattern) {
|
|
61
|
+
async search(pattern, limit, options) {
|
|
62
|
+
if (options?.namespace)
|
|
63
|
+
return [];
|
|
62
64
|
const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
|
|
63
65
|
const regex = new RegExp(escaped.replace(/\*/g, '.*'));
|
|
64
|
-
|
|
66
|
+
const keys = Array.from(this.store.keys()).filter((key) => regex.test(key));
|
|
67
|
+
return limit === undefined ? keys : keys.slice(0, limit);
|
|
65
68
|
}
|
|
66
69
|
/**
|
|
67
70
|
* Clear all stored data
|
|
@@ -2,21 +2,38 @@
|
|
|
2
2
|
* Agentic QE v3 - Defect Predictor Worker
|
|
3
3
|
* ADR-014: Background Workers for QE Monitoring
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
8
|
-
*
|
|
9
|
-
*
|
|
5
|
+
* Surfaces the defect-intelligence domain's latest predictions:
|
|
6
|
+
* - High-risk files and their contributing factors
|
|
7
|
+
* - Targeted review / refactoring / coverage recommendations
|
|
8
|
+
*
|
|
9
|
+
* #1043: every prediction comes from a run of the defect-intelligence
|
|
10
|
+
* predictor (`defect-intelligence:predictor:prediction:<id>` in the
|
|
11
|
+
* `defect-intelligence` namespace, written by DefectPredictorService), and
|
|
12
|
+
* only files that exist in the project are kept. Code hotspots have no
|
|
13
|
+
* measured source and are reported unmeasured. Nothing predicted → nothing
|
|
14
|
+
* stored, an "unmeasured" info finding. A `defect:predictions` record without
|
|
15
|
+
* the measured stamp (the invented one written by <= 3.15.6) is ignored and
|
|
16
|
+
* replaced by the next measured run.
|
|
10
17
|
*/
|
|
11
18
|
import { BaseWorker } from '../base-worker';
|
|
12
19
|
import { WorkerContext, WorkerResult } from '../interfaces';
|
|
13
20
|
export declare class DefectPredictorWorker extends BaseWorker {
|
|
14
21
|
constructor();
|
|
15
22
|
protected doExecute(context: WorkerContext): Promise<WorkerResult>;
|
|
16
|
-
|
|
17
|
-
|
|
23
|
+
/**
|
|
24
|
+
* #1043 round 2b: the newest prediction names no usable file, so a stored
|
|
25
|
+
* measured record from an older prediction is no longer current — stamp it
|
|
26
|
+
* stale (once) instead of leaving it looking like the latest analysis.
|
|
27
|
+
*/
|
|
28
|
+
private markPreviousStale;
|
|
29
|
+
/**
|
|
30
|
+
* #1043: the most recent prediction run the defect-intelligence predictor
|
|
31
|
+
* recorded, restricted to regular files whose real path is inside the
|
|
32
|
+
* project root. `measured` is `null` when there is no such prediction;
|
|
33
|
+
* `unusable` describes a newest prediction none of whose files qualify.
|
|
34
|
+
*/
|
|
35
|
+
private readLatestPrediction;
|
|
18
36
|
private analyzeHighRiskPredictions;
|
|
19
|
-
private analyzeHotspots;
|
|
20
37
|
private calculateHealthScore;
|
|
21
38
|
}
|
|
22
39
|
//# sourceMappingURL=defect-predictor.d.ts.map
|