0sec-cli 0.24.1 → 0.25.0
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/0.js +64 -60
- package/README.md +121 -82
- package/chunks/{adapt-loop-L77BWMNE.js → adapt-loop-L2PXCD4J.js} +6 -5
- package/chunks/{artifact-scraper-BV67RAP5.js → artifact-scraper-W3LGLXBM.js} +4 -3
- package/chunks/{assumption-mining-RPVR77A3.js → assumption-mining-7IJ6ZWZE.js} +22 -20
- package/chunks/{backend-connections-ACIXNYZN.js → backend-connections-MYH4QRQG.js} +5 -4
- package/chunks/{chunk-QNRYOJEB.js → chunk-27SXCYWH.js} +1 -1
- package/chunks/{chunk-PJU24AKR.js → chunk-2J3STRJT.js} +337 -257
- package/chunks/chunk-36J5ZLFE.js +18729 -0
- package/chunks/chunk-3DF55BWV.js +49 -0
- package/chunks/{chunk-F2P25DJY.js → chunk-3HMO42M2.js} +1417 -316
- package/chunks/{chunk-PVJUPIQG.js → chunk-3T5R7P4T.js} +6 -6
- package/chunks/{chunk-SU4IHQQI.js → chunk-5H2PXZ7Q.js} +1 -1
- package/chunks/chunk-5XOYTAOK.js +1546 -0
- package/chunks/{chunk-X2IPO5JO.js → chunk-6TA3CWND.js} +2656 -2960
- package/chunks/{chunk-TVS6WVSK.js → chunk-76CLUI54.js} +3 -3
- package/chunks/{chunk-KCA35IL3.js → chunk-7PUJI64A.js} +11 -9
- package/chunks/{chunk-2NBZZFRG.js → chunk-7TIWL6E5.js} +8 -10
- package/chunks/chunk-ABKUI3QB.js +196 -0
- package/chunks/{chunk-3LPBJMHB.js → chunk-ACYZMJHC.js} +1 -1
- package/chunks/{chunk-H5QURBBK.js → chunk-AL32F74R.js} +1 -1
- package/chunks/{chunk-RURJYCWY.js → chunk-B5TIXHCO.js} +1 -1
- package/chunks/{chunk-GZA7RGK7.js → chunk-BWUW6ZQR.js} +2052 -1075
- package/chunks/{chunk-I43YYHDU.js → chunk-C6ZMPXN2.js} +5 -50
- package/chunks/{chunk-ILRMLA6J.js → chunk-D4IBEO2K.js} +1 -1
- package/chunks/{chunk-K74DRDC5.js → chunk-DHNYJ2ML.js} +1 -1
- package/chunks/{chunk-YKWARO3T.js → chunk-DJGJECBV.js} +93 -20
- package/chunks/{chunk-RVJVM5L4.js → chunk-DMDWIW3E.js} +5 -5
- package/chunks/{chunk-ZM6ANQZJ.js → chunk-EEP6GBUO.js} +16037 -34417
- package/chunks/{chunk-IJ6UPW3H.js → chunk-EIONVEFN.js} +208 -29
- package/chunks/chunk-EQBC2ZWL.js +2481 -0
- package/chunks/{chunk-3WUPCZGF.js → chunk-FI2H6HV2.js} +1 -1
- package/chunks/{chunk-5NFIY2SJ.js → chunk-FI5YL4R2.js} +3 -3
- package/chunks/{chunk-XA2IBHPB.js → chunk-FOLTHXRH.js} +1 -1
- package/chunks/{chunk-CJRZSWII.js → chunk-GOUGG7IQ.js} +3 -3
- package/chunks/{chunk-NBV4I237.js → chunk-GXSECFUE.js} +1 -1
- package/chunks/{chunk-BD7WULFS.js → chunk-HDJSHLRM.js} +3 -2
- package/chunks/{chunk-5WAHHZBF.js → chunk-HFUOUT2B.js} +61232 -30665
- package/chunks/chunk-HJKJ4NQP.js +196 -0
- package/chunks/{chunk-UJE4WOQS.js → chunk-I4VIAQHM.js} +1 -1
- package/chunks/{chunk-5ETI27Q3.js → chunk-ITEMDJAB.js} +3 -3
- package/chunks/chunk-ITHDAIRY.js +57 -0
- package/chunks/{chunk-R2XBH476.js → chunk-JCRQV4FE.js} +2 -2
- package/chunks/{chunk-SQCBHFWN.js → chunk-LWMEJYCP.js} +2 -2
- package/chunks/{chunk-5PFRE522.js → chunk-MY44EZKD.js} +1 -1
- package/chunks/{chunk-7UHAXEOV.js → chunk-NBLKIQCW.js} +226 -4
- package/chunks/chunk-NO543ZBU.js +90 -0
- package/chunks/{chunk-X2ZMSRTP.js → chunk-OFPF26WL.js} +333 -3
- package/chunks/{chunk-YERUDEXT.js → chunk-PAE7ZAV6.js} +2780 -1255
- package/chunks/{chunk-S2GITRD5.js → chunk-PMAKX6KP.js} +2 -2
- package/chunks/{chunk-LMP2T4G2.js → chunk-RBTJYREN.js} +8 -171
- package/chunks/{chunk-CGBDEST2.js → chunk-RFK5F45W.js} +1 -1
- package/chunks/{chunk-GTED3FSZ.js → chunk-S2WCYEK2.js} +4 -99
- package/chunks/{chunk-GXXX7AGH.js → chunk-S3B6HFSM.js} +144 -14
- package/chunks/{chunk-WUPN3D37.js → chunk-S4DFH2FJ.js} +26 -1
- package/chunks/{chunk-Q7JKIKKF.js → chunk-SEWZ76MN.js} +77 -13
- package/chunks/{chunk-6XMFCVJS.js → chunk-TFKY6D7O.js} +1 -1
- package/chunks/{chunk-BOBIAHKA.js → chunk-WK6VUCKK.js} +3 -333
- package/chunks/{chunk-IXT64DV5.js → chunk-XPDJE537.js} +97 -1
- package/chunks/{chunk-BMDG6T7D.js → chunk-YXTV2FRE.js} +113 -22
- package/chunks/{chunk-SZDD77KX.js → chunk-YYFODVZG.js} +6 -10
- package/chunks/{chunk-JWSOUKFF.js → chunk-ZWAWZU6C.js} +30 -13
- package/chunks/{chunk-GV5WXDHY.js → chunk-ZZV56ACK.js} +11 -9
- package/chunks/{codex-models-6XVNFRXZ.js → codex-models-KCUIVS3R.js} +9 -8
- package/chunks/{commands-FRPOFIO4.js → commands-MPPAADGY.js} +798 -608
- package/chunks/dashboard-MN7GZLLX.js +75 -0
- package/chunks/{db-BXJNWUYJ.js → db-R2AQSESC.js} +5 -4
- package/chunks/{deep-review-GSJEBLCG.js → deep-review-Q6BJKEV4.js} +37 -38
- package/chunks/{disclose-OU6Z6GVT.js → disclose-GGULOW27.js} +6 -5
- package/chunks/{dist-TQMHMSBZ.js → dist-6RNAVFAY.js} +376 -333
- package/chunks/{dist-7KSYDDSG.js → dist-DWN7U5OV.js} +5 -2
- package/chunks/{dist-M2X367VW.js → dist-JAZWL3SC.js} +3 -2
- package/chunks/{dist-RKLQIXDT.js → dist-OLGNKDB2.js} +4 -3
- package/chunks/{dist-LNXGATR2.js → dist-WNAOCQGA.js} +5 -4
- package/chunks/eval-runner-WCTTIYN4.js +38 -0
- package/chunks/{exploit-agent-Y2P4GFIY.js → exploit-agent-M3KUMZJH.js} +1 -1
- package/chunks/{exploit-autoclimb-YRZ3TMS2.js → exploit-autoclimb-QTTWC5WM.js} +1 -1
- package/chunks/{exploit-climb-4LEY4SDW.js → exploit-climb-E4KDELTN.js} +4 -3
- package/chunks/{fix-RQSIG75B.js → fix-U5FFJD4F.js} +9 -8
- package/chunks/{harness-3NVC3DDY.js → harness-FMKIMEH5.js} +5 -4
- package/chunks/{http-conformance-U5F6GKYG.js → http-conformance-AXMUOE6C.js} +3 -2
- package/chunks/hunt-scan-RYPWRUQD.js +43 -0
- package/chunks/{kernel-primitive-T47V3RD3.js → kernel-primitive-CVG2E7MJ.js} +4 -3
- package/chunks/{kernel-vm-runner-AEL5E3SV.js → kernel-vm-runner-62KISULQ.js} +4 -3
- package/chunks/{local-engine-ZCW4YC6E.js → local-engine-WP3I7K7G.js} +7 -6
- package/chunks/managed-operation-642WPTLC.js +59 -0
- package/chunks/{memsafety-scan-L2Z7E7TE.js → memsafety-scan-Q2MBZEGJ.js} +1 -2
- package/chunks/{native-loop-26X2CHBV.js → native-loop-HC77R5NQ.js} +31 -16
- package/chunks/operator-services-E2NONBQS.js +79 -0
- package/chunks/orchestrate-Z3DW265M.js +62 -0
- package/chunks/{prepare-C3KGMBXT.js → prepare-7DTS6RJT.js} +7 -6
- package/chunks/{remote-workflow-runtime-DB52SINR.js → remote-workflow-runtime-6CEVRZXS.js} +4 -3
- package/chunks/routing-ITJZBJIU.js +61 -0
- package/chunks/{runtime-U66JNSAY.js → runtime-PZJ77QES.js} +9 -8
- package/chunks/{runtime-AUBLQUOH.js → runtime-W6JNDQRO.js} +4 -3
- package/chunks/{scan-stream-34F3LTPV.js → scan-stream-6VOJTHTR.js} +6 -4
- package/chunks/{scope-HSTG63TQ.js → scope-FHXW6EX6.js} +4 -3
- package/chunks/service-plugins-CN6Q2NSN.js +63 -0
- package/chunks/{session-store-MKAAP3WL.js → session-store-DBBI544Y.js} +8 -5
- package/chunks/{variant-candidates-LG767HWH.js → variant-candidates-DPR6DJ3N.js} +9 -8
- package/chunks/{web-recon-prepass-NJP6J3E4.js → web-recon-prepass-HWDHDQMN.js} +7 -6
- package/chunks/{workflow-runtime-AR627I26.js → workflow-runtime-PLB32XC3.js} +50 -49
- package/dashboard/assets/{abnfDiagram-VCTEODGH-Cq149Jpk.js → abnfDiagram-VCTEODGH-6e39CQKz.js} +1 -1
- package/dashboard/assets/{arc-CpP-3TRW.js → arc-ClYun86B.js} +1 -1
- package/dashboard/assets/architecture-7GRP2DOG-rM-lWo7E.js +1 -0
- package/dashboard/assets/architectureDiagram-5GKGNRK7-C9gEGZIU.js +36 -0
- package/dashboard/assets/{blockDiagram-I7D4REHJ-CZYkRRDi.js → blockDiagram-I7D4REHJ-Dgh2n5Lf.js} +2 -2
- package/dashboard/assets/{c4Diagram-7LVT6UL2-CV7Iu3_Z.js → c4Diagram-7LVT6UL2-CsorW08z.js} +1 -1
- package/dashboard/assets/channel-BBlDqIBl.js +1 -0
- package/dashboard/assets/{chunk-4HAMMTFA-PKCyW4m-.js → chunk-4HAMMTFA-4_b_LGGQ.js} +1 -1
- package/dashboard/assets/{chunk-75Z2AOVW-C5MlFTc_.js → chunk-75Z2AOVW-qzNlKGCp.js} +1 -1
- package/dashboard/assets/chunk-DU6HZSFF-SAPICW28.js +127 -0
- package/dashboard/assets/{chunk-F27PBJKO-DTAok0qM.js → chunk-F27PBJKO-DlLotIQx.js} +1 -1
- package/dashboard/assets/{chunk-FOHPRMQF-DHwB1DNv.js → chunk-FOHPRMQF-COOliuUh.js} +14 -14
- package/dashboard/assets/{chunk-GMAD6QVW-CPsr2F33.js → chunk-GMAD6QVW-DNnr65Nb.js} +7 -7
- package/dashboard/assets/{chunk-GVQU2GXP-C2AXGf9A.js → chunk-GVQU2GXP-DTwv0VfU.js} +1 -1
- package/dashboard/assets/{chunk-IMKFNOWR-DMG6yD_O.js → chunk-IMKFNOWR-B1fk1q_W.js} +1 -1
- package/dashboard/assets/{chunk-L3NEJ4N5-BSvwdbXx.js → chunk-L3NEJ4N5-ByVjFIox.js} +1 -1
- package/dashboard/assets/{chunk-OSK3NFVY-CfB8V7FU.js → chunk-OSK3NFVY-DUDCzjbh.js} +1 -1
- package/dashboard/assets/{chunk-P2QGCYS3-CvmZvq6n.js → chunk-P2QGCYS3-D_D5qEso.js} +1 -1
- package/dashboard/assets/{chunk-POPQ4Y6H-D_TvwDxL.js → chunk-POPQ4Y6H-CetM-tVm.js} +1 -1
- package/dashboard/assets/{chunk-PWAF6VOD-Da5GnuOY.js → chunk-PWAF6VOD-BcJX4exl.js} +1 -1
- package/dashboard/assets/{chunk-SHT3W25Y-CcsMJpR-.js → chunk-SHT3W25Y-BWQql238.js} +1 -1
- package/dashboard/assets/{chunk-SVP7TREG-COojjieJ.js → chunk-SVP7TREG-BSLOD1JE.js} +1 -1
- package/dashboard/assets/{chunk-TICWLB2K-nBAmJwx6.js → chunk-TICWLB2K-DReOl-g_.js} +2 -2
- package/dashboard/assets/{chunk-XXDRQBXY-r5HyhWDv.js → chunk-XXDRQBXY-DSdSMeei.js} +1 -1
- package/dashboard/assets/classDiagram-ZZMXUADV-CRH2kB8G.js +1 -0
- package/dashboard/assets/classDiagram-v2-VYDZK3BY-CRH2kB8G.js +1 -0
- package/dashboard/assets/common-CRRsylCH.js +5 -0
- package/dashboard/assets/cose-bilkent-JH36ORCC-fg-DIBqt.js +1 -0
- package/dashboard/assets/cynefin-OW5HDTMX-XmrbEIFh.js +1 -0
- package/dashboard/assets/{cynefinDiagram-5FMLGOSQ-xodkuQtW.js → cynefinDiagram-5FMLGOSQ-CoQ7QEPl.js} +1 -1
- package/dashboard/assets/cytoscape.esm-BbBREfsg.js +321 -0
- package/dashboard/assets/dagre-D7JM2Yhv.js +1 -0
- package/dashboard/assets/dagre-GXQ25YYZ-qtQtsg6c.js +4 -0
- package/dashboard/assets/{diagram-S7CK7UJ4-DNoTMlCO.js → diagram-S7CK7UJ4-B_ts4_58.js} +2 -2
- package/dashboard/assets/{diagram-UQ7AKVKN-COccuyew.js → diagram-UQ7AKVKN-DwHbbxFy.js} +1 -1
- package/dashboard/assets/{diagram-VSXAHHWV-g6D1tWRb.js → diagram-VSXAHHWV-2Tg_RG89.js} +1 -1
- package/dashboard/assets/{diagram-VX7I27RA-DhO4eVIC.js → diagram-VX7I27RA-BFYp-YjF.js} +1 -1
- package/dashboard/assets/{diagram-Z3DM3KII-DeOQFexd.js → diagram-Z3DM3KII-DrPiS4V0.js} +1 -1
- package/dashboard/assets/{dist-BQYeOQg3.js → dist-cbVssBvx.js} +1 -1
- package/dashboard/assets/{ebnfDiagram-PWID7BFC-MtkX2feM.js → ebnfDiagram-PWID7BFC-DCMOZtU2.js} +1 -1
- package/dashboard/assets/{erDiagram-RLTQ6QDP-DIWSsoYZ.js → erDiagram-RLTQ6QDP-CW4rUJGU.js} +1 -1
- package/dashboard/assets/eventmodeling-NTZA5JFV-C2q-Aaav.js +1 -0
- package/dashboard/assets/flowDiagram-HODETNUW-3NOabgG3.js +1 -0
- package/dashboard/assets/{ganttDiagram-EL5Y4UJY-DKggkJe0.js → ganttDiagram-EL5Y4UJY-C1AqcwIF.js} +1 -1
- package/dashboard/assets/gitGraph-4MIJSDKK-DYR76gtd.js +1 -0
- package/dashboard/assets/{gitGraphDiagram-WWUBYQGX-r_iR8Qzo.js → gitGraphDiagram-WWUBYQGX-B7hL98CE.js} +1 -1
- package/dashboard/assets/info-A6RAGUB7-TXB43LiH.js +1 -0
- package/dashboard/assets/{infoDiagram-27XIBGKW-ClQk7UyQ.js → infoDiagram-27XIBGKW-Dk5dXmh_.js} +1 -1
- package/dashboard/assets/{ishikawaDiagram-5VMMS53U-tR7Vziog.js → ishikawaDiagram-5VMMS53U-BQDuNMka.js} +2 -2
- package/dashboard/assets/{journeyDiagram-3NMN7TZE-Cpb9IqKL.js → journeyDiagram-3NMN7TZE-DkustddD.js} +1 -1
- package/dashboard/assets/{kanban-definition-UXKFOSKX-BzUuKbA9.js → kanban-definition-UXKFOSKX-BW7Ann84.js} +1 -1
- package/dashboard/assets/{katex-BdBmVSus.js → katex-nLxf_RlZ.js} +2 -2
- package/dashboard/assets/{line-BHY_tSHu.js → line-DVxcLeru.js} +1 -1
- package/dashboard/assets/linear-DOM_l9bO.js +1 -0
- package/dashboard/assets/mermaid-parser.core-CKg9fDvJ.js +7 -0
- package/dashboard/assets/{mermaid.core-D_QsUPU8.js → mermaid.core-DruW_5-Y.js} +9 -9
- package/dashboard/assets/{mindmap-definition-YA3MSWOX-CtfLTPPJ.js → mindmap-definition-YA3MSWOX-Di5W5VB3.js} +1 -1
- package/dashboard/assets/operations-B-t_k60U.js +194 -0
- package/dashboard/assets/operations-D2ZKZFOF.css +1 -0
- package/dashboard/assets/packet-AYTQ26CC-BABwqtNu.js +1 -0
- package/dashboard/assets/{pegDiagram-XKGWAZYB-C1Dclbzj.js → pegDiagram-XKGWAZYB-Cx4ABT6q.js} +1 -1
- package/dashboard/assets/pie-WAS4IAKB-CNdXyrze.js +1 -0
- package/dashboard/assets/{pieDiagram-E7YTZNPT-Cd7XwYo5.js → pieDiagram-E7YTZNPT-BilfQbIs.js} +1 -1
- package/dashboard/assets/{quadrantDiagram-AXDQQJYC-CaS-GQ4X.js → quadrantDiagram-AXDQQJYC-BVmMQHE5.js} +1 -1
- package/dashboard/assets/radar-RG4KPBEZ-fKNmDeoK.js +1 -0
- package/dashboard/assets/railroad-74A4TZTK-DhcvDCOh.js +1 -0
- package/dashboard/assets/railroad-abnf-HS5TGJTU-BTRVAmf0.js +1 -0
- package/dashboard/assets/railroad-ebnf-LZEXJU2U-CwS8fgC_.js +1 -0
- package/dashboard/assets/railroad-peg-WCYAUIDC-CXuhXlNp.js +1 -0
- package/dashboard/assets/{railroadDiagram-O6MQD6OU-BeesTrqn.js → railroadDiagram-O6MQD6OU-DnBru-jf.js} +1 -1
- package/dashboard/assets/{requirementDiagram-BXWQKSXE-IjyK0DhW.js → requirementDiagram-BXWQKSXE-FwdvUZ7_.js} +1 -1
- package/dashboard/assets/{sankeyDiagram-P5KCCOFB-DmIluQqo.js → sankeyDiagram-P5KCCOFB-BQvDORai.js} +1 -1
- package/dashboard/assets/{sequenceDiagram-WJ2MYXX4-CUp8ZjTc.js → sequenceDiagram-WJ2MYXX4-FWYQLzcY.js} +2 -2
- package/dashboard/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
- package/dashboard/assets/src-BwkPhlcp.js +1 -0
- package/dashboard/assets/{stateDiagram-D77RDMKH-Dy9TQb8P.js → stateDiagram-D77RDMKH-CjPBd_Sa.js} +1 -1
- package/dashboard/assets/stateDiagram-v2-MP3YSRHH-DHmenujm.js +1 -0
- package/dashboard/assets/swimlanes-42K2YHIH-SQLNsa4J.js +1 -0
- package/dashboard/assets/swimlanesDiagram-VR7AAH4N-D1bH4ETZ.js +8 -0
- package/dashboard/assets/{timeline-definition-24CTP7MA-BGdXW-iY.js → timeline-definition-24CTP7MA-BxCf20k1.js} +1 -1
- package/dashboard/assets/treeView-Q6P3EWNA-BGLYAyGp.js +1 -0
- package/dashboard/assets/treemap-WGGIJYW6-BlzAwncU.js +1 -0
- package/dashboard/assets/{vennDiagram-4TSXK5OY-DzKWHJsl.js → vennDiagram-4TSXK5OY-D76RIZLz.js} +1 -1
- package/dashboard/assets/wardley-WFR3VGLG-Ba_reiVw.js +1 -0
- package/dashboard/assets/{wardleyDiagram-VM6X3IG4-DGsjYmNJ.js → wardleyDiagram-VM6X3IG4-Cux4coOD.js} +1 -1
- package/dashboard/assets/{xychartDiagram-S5SC5T6Z-C7_T_tWt.js → xychartDiagram-S5SC5T6Z-Ch5mvnlH.js} +1 -1
- package/dashboard/index.html +2 -2
- package/package.json +2 -5
- package/chunks/chunk-2XGBEH53.js +0 -4304
- package/chunks/chunk-4ROZFLSR.js +0 -279
- package/chunks/chunk-56UTQKXO.js +0 -56
- package/chunks/chunk-BPU6M42R.js +0 -77
- package/chunks/chunk-IIBNQTOK.js +0 -1532
- package/chunks/chunk-NJLKFC66.js +0 -4790
- package/chunks/chunk-OOMBOLAF.js +0 -295
- package/chunks/chunk-VIT5ALXF.js +0 -4054
- package/chunks/chunk-VU7V2SDW.js +0 -284
- package/chunks/chunk-W624J7NF.js +0 -117
- package/chunks/chunk-YSQWZ67M.js +0 -6027
- package/chunks/dashboard-5HDSNBAU.js +0 -76
- package/chunks/eval-runner-A2DIGVP7.js +0 -31
- package/chunks/hunt-scan-W246VWJC.js +0 -40
- package/chunks/managed-operation-6R2QPPW5.js +0 -60
- package/chunks/orchestrate-OBS37FWQ.js +0 -63
- package/chunks/run-MU3MFL2Z.js +0 -28242
- package/chunks/service-plugins-5B23PWXC.js +0 -64
- package/dashboard/assets/architecture-7GRP2DOG-z5EHYkyH.js +0 -1
- package/dashboard/assets/architectureDiagram-5GKGNRK7-ewtXpjR_.js +0 -36
- package/dashboard/assets/channel-CuYjfiC5.js +0 -1
- package/dashboard/assets/chunk-DU6HZSFF-3M37ulcO.js +0 -127
- package/dashboard/assets/classDiagram-ZZMXUADV-DCuOrWUV.js +0 -1
- package/dashboard/assets/classDiagram-v2-VYDZK3BY-DCuOrWUV.js +0 -1
- package/dashboard/assets/common-C6snVPsk.js +0 -5
- package/dashboard/assets/cose-bilkent-JH36ORCC-BLGcaZHk.js +0 -1
- package/dashboard/assets/cynefin-OW5HDTMX-DbZMK00I.js +0 -1
- package/dashboard/assets/cytoscape.esm-CGd-uY3x.js +0 -321
- package/dashboard/assets/dagre-GXQ25YYZ-CRk9qfSG.js +0 -4
- package/dashboard/assets/dagre-PrKaheQc.js +0 -1
- package/dashboard/assets/eventmodeling-NTZA5JFV-D_3ez4Gv.js +0 -1
- package/dashboard/assets/flowDiagram-HODETNUW-D2boyYEd.js +0 -1
- package/dashboard/assets/gitGraph-4MIJSDKK-DFOQYwXc.js +0 -1
- package/dashboard/assets/info-A6RAGUB7-DeednLoB.js +0 -1
- package/dashboard/assets/linear-naZZ1pHk.js +0 -1
- package/dashboard/assets/mermaid-parser.core-CPvd4cEx.js +0 -7
- package/dashboard/assets/operations-BwCzhVnT.js +0 -130
- package/dashboard/assets/operations-QjKT0Hwi.css +0 -1
- package/dashboard/assets/packet-AYTQ26CC-DDQbkT9I.js +0 -1
- package/dashboard/assets/pie-WAS4IAKB-LpU4ULAs.js +0 -1
- package/dashboard/assets/radar-RG4KPBEZ-CcxW3NJm.js +0 -1
- package/dashboard/assets/railroad-74A4TZTK-9P5Rl8fP.js +0 -1
- package/dashboard/assets/railroad-abnf-HS5TGJTU-CSfpwjna.js +0 -1
- package/dashboard/assets/railroad-ebnf-LZEXJU2U-D6R5qzr-.js +0 -1
- package/dashboard/assets/railroad-peg-WCYAUIDC-DKEX7ITG.js +0 -1
- package/dashboard/assets/sizeCapture-INFHLROL-B0uUizjq.js +0 -1
- package/dashboard/assets/src-r61wDjcA.js +0 -1
- package/dashboard/assets/stateDiagram-v2-MP3YSRHH-CQb0ZtPr.js +0 -1
- package/dashboard/assets/swimlanes-42K2YHIH-CZuDV7V5.js +0 -1
- package/dashboard/assets/swimlanesDiagram-VR7AAH4N-BxgWMq8X.js +0 -8
- package/dashboard/assets/treeView-Q6P3EWNA-DlRrayjM.js +0 -1
- package/dashboard/assets/treemap-WGGIJYW6-C6UqLKfI.js +0 -1
- package/dashboard/assets/wardley-WFR3VGLG-thmyHKb0.js +0 -1
|
@@ -2,335 +2,9 @@
|
|
|
2
2
|
import { createRequire as __0CreateRequire } from "node:module";
|
|
3
3
|
const require = __0CreateRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
scanExecutionSignal
|
|
9
|
-
} from "./chunk-BD7WULFS.js";
|
|
10
|
-
|
|
11
|
-
// packages/core/dist/scope/rate-limit.js
|
|
12
|
-
var TokenBucket = class {
|
|
13
|
-
state;
|
|
14
|
-
nowFn;
|
|
15
|
-
sleepFn;
|
|
16
|
-
jitter;
|
|
17
|
-
constructor(rps, capacity = rps, nowFn = () => Date.now(), sleepFn = defaultSleep, jitter) {
|
|
18
|
-
if (!Number.isFinite(rps) || rps <= 0) {
|
|
19
|
-
throw new Error(`TokenBucket: rps must be a positive finite number, got ${rps}`);
|
|
20
|
-
}
|
|
21
|
-
if (!Number.isFinite(capacity) || capacity <= 0) {
|
|
22
|
-
throw new Error(`TokenBucket: capacity must be a positive finite number, got ${capacity}`);
|
|
23
|
-
}
|
|
24
|
-
this.nowFn = nowFn;
|
|
25
|
-
this.sleepFn = sleepFn;
|
|
26
|
-
this.jitter = jitter && jitter.baseMs > 0 ? jitter : void 0;
|
|
27
|
-
this.state = {
|
|
28
|
-
tokens: capacity,
|
|
29
|
-
refillRatePerMs: rps / 1e3,
|
|
30
|
-
capacity,
|
|
31
|
-
lastRefill: nowFn(),
|
|
32
|
-
retryUntil: 0
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
refill() {
|
|
36
|
-
const now = this.nowFn();
|
|
37
|
-
const elapsed = now - this.state.lastRefill;
|
|
38
|
-
if (elapsed > 0) {
|
|
39
|
-
this.state.tokens = Math.min(this.state.capacity, this.state.tokens + elapsed * this.state.refillRatePerMs);
|
|
40
|
-
this.state.lastRefill = now;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Non-blocking. Returns true and consumes `n` tokens if available;
|
|
45
|
-
* returns false and consumes nothing otherwise. Blocked during 429
|
|
46
|
-
* cool-off (returns false until park expires).
|
|
47
|
-
*/
|
|
48
|
-
tryConsume(n = 1) {
|
|
49
|
-
if (this.nowFn() < this.state.retryUntil)
|
|
50
|
-
return false;
|
|
51
|
-
this.refill();
|
|
52
|
-
if (this.state.tokens >= n) {
|
|
53
|
-
this.state.tokens -= n;
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Block until `n` tokens are available, then consume them. Honours
|
|
60
|
-
* the 429 park deadline first, then refill-and-spin with sleeps
|
|
61
|
-
* sized to the exact next-token-available time.
|
|
62
|
-
*/
|
|
63
|
-
async acquire(n = 1, signal = scanExecutionSignal()) {
|
|
64
|
-
signal?.throwIfAborted();
|
|
65
|
-
if (n > this.state.capacity) {
|
|
66
|
-
n = this.state.capacity;
|
|
67
|
-
}
|
|
68
|
-
while (this.nowFn() < this.state.retryUntil) {
|
|
69
|
-
const wait = this.state.retryUntil - this.nowFn();
|
|
70
|
-
await this.sleepFn(Math.max(1, Math.min(wait, 1e3)), signal);
|
|
71
|
-
}
|
|
72
|
-
while (true) {
|
|
73
|
-
signal?.throwIfAborted();
|
|
74
|
-
this.refill();
|
|
75
|
-
if (this.state.tokens >= n) {
|
|
76
|
-
this.state.tokens -= n;
|
|
77
|
-
await this.pace(signal);
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
const tokensNeeded = n - this.state.tokens;
|
|
81
|
-
const waitMs = Math.max(1, Math.ceil(tokensNeeded / this.state.refillRatePerMs));
|
|
82
|
-
await this.sleepFn(waitMs, signal);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Sleep the configured full-jitter delay. No-op (and no `await`-visible
|
|
87
|
-
* sleep) when no jitter is configured, so the default path is unchanged.
|
|
88
|
-
*
|
|
89
|
-
* Reuses `jitterFor` from `waf-detect.ts` — attempt 0 with an injected rng
|
|
90
|
-
* yields full jitter in `[0, baseMs]` — rather than growing a second
|
|
91
|
-
* jitter implementation.
|
|
92
|
-
*/
|
|
93
|
-
async pace(signal = scanExecutionSignal()) {
|
|
94
|
-
signal?.throwIfAborted();
|
|
95
|
-
if (!this.jitter)
|
|
96
|
-
return;
|
|
97
|
-
const ms = jitterFor(0, this.jitter.baseMs, this.jitter.rng ?? Math.random);
|
|
98
|
-
if (ms > 0)
|
|
99
|
-
await this.sleepFn(ms, signal);
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Park the bucket until `deadline` (ms since epoch). Subsequent
|
|
103
|
-
* `acquire`/`tryConsume` calls block until the deadline passes.
|
|
104
|
-
* Idempotent in the "later wins" sense: a longer park overrides a
|
|
105
|
-
* shorter one, but a shorter park does NOT shorten an existing one.
|
|
106
|
-
*/
|
|
107
|
-
markRetryUntil(deadline) {
|
|
108
|
-
if (deadline > this.state.retryUntil) {
|
|
109
|
-
this.state.retryUntil = deadline;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
/** Test introspection. */
|
|
113
|
-
_peek() {
|
|
114
|
-
this.refill();
|
|
115
|
-
return {
|
|
116
|
-
tokens: this.state.tokens,
|
|
117
|
-
retryUntil: this.state.retryUntil,
|
|
118
|
-
capacity: this.state.capacity
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
};
|
|
122
|
-
var RateLimiter = class _RateLimiter {
|
|
123
|
-
buckets = /* @__PURE__ */ new Map();
|
|
124
|
-
defaultCfg;
|
|
125
|
-
perHost;
|
|
126
|
-
jitter;
|
|
127
|
-
nowFn;
|
|
128
|
-
sleepFn;
|
|
129
|
-
/**
|
|
130
|
-
* Conservative cool-off floor when a 429 lands without a useful
|
|
131
|
-
* `Retry-After`, or with a tiny one. 60s matches the PoC-runtime
|
|
132
|
-
* precedent in #206 — a target that just told us to slow down has
|
|
133
|
-
* earned more than a one-second pause.
|
|
134
|
-
*/
|
|
135
|
-
static RETRY_AFTER_FLOOR_MS = 6e4;
|
|
136
|
-
/**
|
|
137
|
-
* Optional observer invoked once whenever a fetch is actually throttled:
|
|
138
|
-
* either an `acquire` that had to block because the bucket was dry, or a
|
|
139
|
-
* 429 response parking the host. Used by the http_audit enforcement
|
|
140
|
-
* tracker to populate `rate_limited_count`. No-op when unset, so the
|
|
141
|
-
* normal scan path is unaffected.
|
|
142
|
-
*/
|
|
143
|
-
onThrottle;
|
|
144
|
-
constructor(config, opts = {}) {
|
|
145
|
-
this.defaultCfg = config.default;
|
|
146
|
-
this.jitter = config.jitter;
|
|
147
|
-
this.perHost = {};
|
|
148
|
-
if (config.perHost) {
|
|
149
|
-
for (const [host, cfg] of Object.entries(config.perHost)) {
|
|
150
|
-
this.perHost[host.toLowerCase()] = cfg;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
this.nowFn = opts.nowFn ?? (() => Date.now());
|
|
154
|
-
this.sleepFn = opts.sleepFn ?? defaultSleep;
|
|
155
|
-
this.onThrottle = opts.onThrottle;
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Normalize a URL or host string to a bucket key. Lowercased,
|
|
159
|
-
* port-stripped, IPv6 brackets retained on the literal but dropped
|
|
160
|
-
* from the port suffix (e.g. `[::1]:443` → `[::1]`).
|
|
161
|
-
*/
|
|
162
|
-
hostKey(urlOrHost) {
|
|
163
|
-
let host;
|
|
164
|
-
try {
|
|
165
|
-
host = new URL(urlOrHost).hostname;
|
|
166
|
-
} catch {
|
|
167
|
-
const trimmed = urlOrHost.trim();
|
|
168
|
-
if (!trimmed)
|
|
169
|
-
return null;
|
|
170
|
-
if (trimmed.startsWith("[")) {
|
|
171
|
-
const close = trimmed.indexOf("]");
|
|
172
|
-
if (close < 0)
|
|
173
|
-
return null;
|
|
174
|
-
host = trimmed.slice(0, close + 1);
|
|
175
|
-
} else {
|
|
176
|
-
host = trimmed.split(":")[0];
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
return host.toLowerCase();
|
|
180
|
-
}
|
|
181
|
-
getBucket(host) {
|
|
182
|
-
let bucket = this.buckets.get(host);
|
|
183
|
-
if (!bucket) {
|
|
184
|
-
const cfg = this.perHost[host] ?? this.defaultCfg;
|
|
185
|
-
bucket = new TokenBucket(cfg.rps, cfg.burst ?? cfg.rps, this.nowFn, this.sleepFn, this.jitter);
|
|
186
|
-
this.buckets.set(host, bucket);
|
|
187
|
-
}
|
|
188
|
-
return bucket;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Block until a token is available for `urlOrHost`'s host, then
|
|
192
|
-
* consume it. Unparseable input is treated as a no-op (returns
|
|
193
|
-
* immediately) — callers should not rely on rate-limiting unknowable
|
|
194
|
-
* hosts. The fetch sites that wire this up always pass full URLs.
|
|
195
|
-
*/
|
|
196
|
-
async acquire(urlOrHost, n = 1, signal = scanExecutionSignal()) {
|
|
197
|
-
signal?.throwIfAborted();
|
|
198
|
-
const host = this.hostKey(urlOrHost);
|
|
199
|
-
if (!host)
|
|
200
|
-
return;
|
|
201
|
-
const bucket = this.getBucket(host);
|
|
202
|
-
if (bucket.tryConsume(n)) {
|
|
203
|
-
await bucket.pace(signal);
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
this.onThrottle?.();
|
|
207
|
-
await bucket.acquire(n, signal);
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Non-blocking variant. Returns true and consumes if available,
|
|
211
|
-
* false otherwise. Used by callers that want to fall through to a
|
|
212
|
-
* fast-path / degrade rather than wait.
|
|
213
|
-
*/
|
|
214
|
-
tryAcquire(urlOrHost, n = 1) {
|
|
215
|
-
const host = this.hostKey(urlOrHost);
|
|
216
|
-
if (!host)
|
|
217
|
-
return true;
|
|
218
|
-
return this.getBucket(host).tryConsume(n);
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Inspect a fetch response and, if it's a 429, park the host's
|
|
222
|
-
* bucket until `Retry-After` (or 60s, whichever is longer). The
|
|
223
|
-
* parsed value supports both delta-seconds (RFC 7231 §7.1.3) and
|
|
224
|
-
* HTTP-date forms; anything else falls back to the floor.
|
|
225
|
-
*
|
|
226
|
-
* No-ops on non-429 responses, or on hosts with no bucket yet
|
|
227
|
-
* (which can't happen if the caller acquired before fetching, but
|
|
228
|
-
* we don't depend on that).
|
|
229
|
-
*/
|
|
230
|
-
noteResponse(urlOrHost, res) {
|
|
231
|
-
if (res.status !== 429)
|
|
232
|
-
return;
|
|
233
|
-
const host = this.hostKey(urlOrHost);
|
|
234
|
-
if (!host)
|
|
235
|
-
return;
|
|
236
|
-
this.onThrottle?.();
|
|
237
|
-
const bucket = this.getBucket(host);
|
|
238
|
-
const retryAfter = readHeader(res.headers, "retry-after");
|
|
239
|
-
const delayMs = parseRetryAfter(retryAfter, this.nowFn());
|
|
240
|
-
const deadline = this.nowFn() + Math.max(delayMs, _RateLimiter.RETRY_AFTER_FLOOR_MS);
|
|
241
|
-
bucket.markRetryUntil(deadline);
|
|
242
|
-
}
|
|
243
|
-
/** Test-only. Reset all buckets. */
|
|
244
|
-
_reset() {
|
|
245
|
-
this.buckets.clear();
|
|
246
|
-
}
|
|
247
|
-
};
|
|
248
|
-
function defaultSleep(ms, signal) {
|
|
249
|
-
signal?.throwIfAborted();
|
|
250
|
-
const { promise, resolve, reject } = Promise.withResolvers();
|
|
251
|
-
const timer = setTimeout(() => {
|
|
252
|
-
signal?.removeEventListener("abort", abort);
|
|
253
|
-
resolve();
|
|
254
|
-
}, ms);
|
|
255
|
-
const abort = () => {
|
|
256
|
-
clearTimeout(timer);
|
|
257
|
-
reject(signal?.reason ?? new Error("Rate-limit wait cancelled."));
|
|
258
|
-
};
|
|
259
|
-
signal?.addEventListener("abort", abort, { once: true });
|
|
260
|
-
return promise;
|
|
261
|
-
}
|
|
262
|
-
function readHeader(headers, name) {
|
|
263
|
-
if (typeof headers.get === "function") {
|
|
264
|
-
return headers.get(name);
|
|
265
|
-
}
|
|
266
|
-
return null;
|
|
267
|
-
}
|
|
268
|
-
function parseRetryAfter(value, now) {
|
|
269
|
-
if (!value)
|
|
270
|
-
return 0;
|
|
271
|
-
const trimmed = value.trim();
|
|
272
|
-
if (!trimmed)
|
|
273
|
-
return 0;
|
|
274
|
-
if (/^\d+$/.test(trimmed)) {
|
|
275
|
-
const seconds = parseInt(trimmed, 10);
|
|
276
|
-
return Number.isFinite(seconds) && seconds > 0 ? seconds * 1e3 : 0;
|
|
277
|
-
}
|
|
278
|
-
const date = Date.parse(trimmed);
|
|
279
|
-
if (Number.isFinite(date)) {
|
|
280
|
-
return Math.max(0, date - now);
|
|
281
|
-
}
|
|
282
|
-
return 0;
|
|
283
|
-
}
|
|
284
|
-
function parseRateLimitFlag(spec, fallbackRps = 5) {
|
|
285
|
-
const trimmed = spec.trim();
|
|
286
|
-
if (!trimmed) {
|
|
287
|
-
return { default: { rps: fallbackRps } };
|
|
288
|
-
}
|
|
289
|
-
const parts = trimmed.split(",").map((p) => p.trim()).filter(Boolean);
|
|
290
|
-
let defaultCfg = null;
|
|
291
|
-
const perHost = {};
|
|
292
|
-
for (const part of parts) {
|
|
293
|
-
const eq = part.indexOf("=");
|
|
294
|
-
if (eq < 0) {
|
|
295
|
-
const cfg = parseRpsBurst(part);
|
|
296
|
-
defaultCfg = cfg;
|
|
297
|
-
} else {
|
|
298
|
-
const host = part.slice(0, eq).trim().toLowerCase();
|
|
299
|
-
const cfg = parseRpsBurst(part.slice(eq + 1));
|
|
300
|
-
if (!host) {
|
|
301
|
-
throw new Error(`--rate-limit: empty host in "${part}"`);
|
|
302
|
-
}
|
|
303
|
-
perHost[host] = cfg;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
return {
|
|
307
|
-
default: defaultCfg ?? { rps: fallbackRps },
|
|
308
|
-
perHost: Object.keys(perHost).length > 0 ? perHost : void 0
|
|
309
|
-
};
|
|
310
|
-
}
|
|
311
|
-
function parseRpsBurst(s) {
|
|
312
|
-
const trimmed = s.trim();
|
|
313
|
-
if (!trimmed) {
|
|
314
|
-
throw new Error(`--rate-limit: empty rps value`);
|
|
315
|
-
}
|
|
316
|
-
const colon = trimmed.indexOf(":");
|
|
317
|
-
if (colon < 0) {
|
|
318
|
-
const rps2 = Number(trimmed);
|
|
319
|
-
if (!Number.isFinite(rps2) || rps2 <= 0) {
|
|
320
|
-
throw new Error(`--rate-limit: invalid rps "${trimmed}"`);
|
|
321
|
-
}
|
|
322
|
-
return { rps: rps2 };
|
|
323
|
-
}
|
|
324
|
-
const rps = Number(trimmed.slice(0, colon));
|
|
325
|
-
const burst = Number(trimmed.slice(colon + 1));
|
|
326
|
-
if (!Number.isFinite(rps) || rps <= 0) {
|
|
327
|
-
throw new Error(`--rate-limit: invalid rps "${trimmed.slice(0, colon)}"`);
|
|
328
|
-
}
|
|
329
|
-
if (!Number.isFinite(burst) || burst <= 0) {
|
|
330
|
-
throw new Error(`--rate-limit: invalid burst "${trimmed.slice(colon + 1)}"`);
|
|
331
|
-
}
|
|
332
|
-
return { rps, burst };
|
|
333
|
-
}
|
|
5
|
+
RateLimiter,
|
|
6
|
+
parseRateLimitFlag
|
|
7
|
+
} from "./chunk-OFPF26WL.js";
|
|
334
8
|
|
|
335
9
|
// packages/core/dist/stages/web.js
|
|
336
10
|
import { randomUUID } from "node:crypto";
|
|
@@ -923,10 +597,6 @@ function summarizeWebStackFingerprint(result) {
|
|
|
923
597
|
}
|
|
924
598
|
|
|
925
599
|
export {
|
|
926
|
-
TokenBucket,
|
|
927
|
-
RateLimiter,
|
|
928
|
-
parseRetryAfter,
|
|
929
|
-
parseRateLimitFlag,
|
|
930
600
|
runWebDiscoveryProbe,
|
|
931
601
|
runBaselineWebChecks,
|
|
932
602
|
fingerprintWebStack,
|
|
@@ -8107,6 +8107,99 @@ function errMessage(err) {
|
|
|
8107
8107
|
}
|
|
8108
8108
|
}
|
|
8109
8109
|
|
|
8110
|
+
// packages/core/dist/triage/can-auto-suppress.js
|
|
8111
|
+
var PROTECTED_SEVERITIES = /* @__PURE__ */ new Set([
|
|
8112
|
+
"critical",
|
|
8113
|
+
"high"
|
|
8114
|
+
]);
|
|
8115
|
+
var HIGH_IMPACT_CATEGORIES = /* @__PURE__ */ new Set([
|
|
8116
|
+
// Remote code / command / code execution
|
|
8117
|
+
"command-injection",
|
|
8118
|
+
"code-injection",
|
|
8119
|
+
// Injection into the data store
|
|
8120
|
+
"sql-injection",
|
|
8121
|
+
// Unsafe deserialization is a classic RCE primitive
|
|
8122
|
+
"unsafe-deserialization",
|
|
8123
|
+
// Server-side request forgery (pivot / internal network reach)
|
|
8124
|
+
"ssrf",
|
|
8125
|
+
// Arbitrary file read/write
|
|
8126
|
+
"path-traversal",
|
|
8127
|
+
// Memory corruption / binary / kernel classes
|
|
8128
|
+
"heap-overflow",
|
|
8129
|
+
"out-of-bounds-read",
|
|
8130
|
+
"out-of-bounds-write",
|
|
8131
|
+
"use-after-free",
|
|
8132
|
+
"stack-buffer-overflow",
|
|
8133
|
+
"integer-overflow",
|
|
8134
|
+
"type-confusion",
|
|
8135
|
+
"double-free",
|
|
8136
|
+
"format-string",
|
|
8137
|
+
"uninitialized-memory",
|
|
8138
|
+
"race-condition",
|
|
8139
|
+
"toctou",
|
|
8140
|
+
// Supply-chain compromise (known-vulnerable / malicious package)
|
|
8141
|
+
"known-vulnerable-package",
|
|
8142
|
+
"supply-chain",
|
|
8143
|
+
// Prototype-pollution gadget → auth bypass / RCE when chained. We actively
|
|
8144
|
+
// disclose these (e.g. the jsonwebtoken verify() gadget), so they must never
|
|
8145
|
+
// be auto-dropped on a score alone.
|
|
8146
|
+
"prototype-pollution",
|
|
8147
|
+
// Cryptographic misuse — hardcoded keys/IVs, JWT alg-confusion (alg=none /
|
|
8148
|
+
// HS-vs-RS), and predictable RNG for secrets are direct key-leak / auth-bypass
|
|
8149
|
+
// primitives, so the class is protected from score-only auto-drop.
|
|
8150
|
+
"crypto-misuse",
|
|
8151
|
+
// AI-system adversarial classes — the core 0 "adversarial reliability"
|
|
8152
|
+
// thesis (authorization-boundary break, unsafe tool use, data exfiltration,
|
|
8153
|
+
// prompt hijack). A missed one of these is a disclosure-grade loss.
|
|
8154
|
+
"prompt-injection",
|
|
8155
|
+
"data-exfiltration",
|
|
8156
|
+
"tool-misuse"
|
|
8157
|
+
]);
|
|
8158
|
+
function canAutoSuppressDetailed(finding) {
|
|
8159
|
+
if (PROTECTED_SEVERITIES.has(finding.severity)) {
|
|
8160
|
+
return {
|
|
8161
|
+
canSuppress: false,
|
|
8162
|
+
guard: "high_severity",
|
|
8163
|
+
reason: `severity=${finding.severity} is disclosure-grade; routed to verification instead of auto-drop`
|
|
8164
|
+
};
|
|
8165
|
+
}
|
|
8166
|
+
if (HIGH_IMPACT_CATEGORIES.has(finding.category)) {
|
|
8167
|
+
return {
|
|
8168
|
+
canSuppress: false,
|
|
8169
|
+
guard: "high_impact_class",
|
|
8170
|
+
reason: `category=${finding.category} is a high-impact class; routed to verification instead of auto-drop`
|
|
8171
|
+
};
|
|
8172
|
+
}
|
|
8173
|
+
return {
|
|
8174
|
+
canSuppress: true,
|
|
8175
|
+
reason: `severity=${finding.severity}, category=${finding.category} eligible for score/heuristic auto-suppression`
|
|
8176
|
+
};
|
|
8177
|
+
}
|
|
8178
|
+
|
|
8179
|
+
// packages/core/dist/triage/verify-verdict.js
|
|
8180
|
+
var REPRODUCING_LAYERS = /* @__PURE__ */ new Set(["poc_gen", "pov_gate", "oracle"]);
|
|
8181
|
+
function evidenceKindForFinding(finding) {
|
|
8182
|
+
const hasPocSteps = Array.isArray(finding.pocSteps) && finding.pocSteps.length > 0;
|
|
8183
|
+
const reproduced = hasPocSteps && (finding.layerVerdicts ?? []).some((v) => v.verdict === "pass" && REPRODUCING_LAYERS.has(v.layer));
|
|
8184
|
+
return reproduced ? "reproduced-poc" : "source-only";
|
|
8185
|
+
}
|
|
8186
|
+
function outcomeOf(verdict) {
|
|
8187
|
+
return typeof verdict === "string" ? verdict : verdict.verdict;
|
|
8188
|
+
}
|
|
8189
|
+
function isDisclosureWorthy(finding, verdict) {
|
|
8190
|
+
if (outcomeOf(verdict) !== "rejected") {
|
|
8191
|
+
return {
|
|
8192
|
+
keep: true,
|
|
8193
|
+
reason: `verdict=${outcomeOf(verdict)}: not a rejection \u2014 finding kept`
|
|
8194
|
+
};
|
|
8195
|
+
}
|
|
8196
|
+
const guard = canAutoSuppressDetailed(finding);
|
|
8197
|
+
if (guard.canSuppress) {
|
|
8198
|
+
return { keep: false, reason: guard.reason };
|
|
8199
|
+
}
|
|
8200
|
+
return { keep: true, guard: guard.guard, reason: guard.reason };
|
|
8201
|
+
}
|
|
8202
|
+
|
|
8110
8203
|
export {
|
|
8111
8204
|
require_dist,
|
|
8112
8205
|
hasKnownMarkerText,
|
|
@@ -8121,5 +8214,8 @@ export {
|
|
|
8121
8214
|
resolveUrl,
|
|
8122
8215
|
mergePersonaHeaders,
|
|
8123
8216
|
evaluateExpect,
|
|
8124
|
-
aggregateVerdict
|
|
8217
|
+
aggregateVerdict,
|
|
8218
|
+
canAutoSuppressDetailed,
|
|
8219
|
+
evidenceKindForFinding,
|
|
8220
|
+
isDisclosureWorthy
|
|
8125
8221
|
};
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
homeStateDir,
|
|
9
9
|
parseSecurityWorkflowInput,
|
|
10
10
|
runStateDir
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-S3B6HFSM.js";
|
|
12
12
|
import {
|
|
13
13
|
__export
|
|
14
14
|
} from "./chunk-VCSFCHAJ.js";
|
|
@@ -91,11 +91,11 @@ var ShimmedDatabase = class {
|
|
|
91
91
|
constructor(engine) {
|
|
92
92
|
this.engine = engine;
|
|
93
93
|
}
|
|
94
|
-
prepare(
|
|
95
|
-
return new StatementShim(this.engine.prepare(
|
|
94
|
+
prepare(sql2) {
|
|
95
|
+
return new StatementShim(this.engine.prepare(sql2));
|
|
96
96
|
}
|
|
97
|
-
exec(
|
|
98
|
-
this.engine.exec(
|
|
97
|
+
exec(sql2) {
|
|
98
|
+
this.engine.exec(sql2);
|
|
99
99
|
return this;
|
|
100
100
|
}
|
|
101
101
|
/**
|
|
@@ -157,13 +157,13 @@ function createWasmEngine(path) {
|
|
|
157
157
|
const { Database: WasmDatabaseCtor } = sqliteWasm;
|
|
158
158
|
const wasm = new WasmDatabaseCtor(path);
|
|
159
159
|
const prepared = /* @__PURE__ */ new Set();
|
|
160
|
-
const wrapStatement = (
|
|
161
|
-
let initial = wasm.prepare(
|
|
160
|
+
const wrapStatement = (sql2) => {
|
|
161
|
+
let initial = wasm.prepare(sql2);
|
|
162
162
|
prepared.add(initial);
|
|
163
163
|
const execute = (operation) => {
|
|
164
164
|
if (!wasm.isOpen)
|
|
165
165
|
throw new Error("Database already closed");
|
|
166
|
-
const statement = initial ?? wasm.prepare(
|
|
166
|
+
const statement = initial ?? wasm.prepare(sql2);
|
|
167
167
|
initial = void 0;
|
|
168
168
|
prepared.add(statement);
|
|
169
169
|
let succeeded = false;
|
|
@@ -195,9 +195,9 @@ function createWasmEngine(path) {
|
|
|
195
195
|
};
|
|
196
196
|
};
|
|
197
197
|
return {
|
|
198
|
-
prepare: (
|
|
199
|
-
exec: (
|
|
200
|
-
wasm.exec(
|
|
198
|
+
prepare: (sql2) => wrapStatement(sql2),
|
|
199
|
+
exec: (sql2) => {
|
|
200
|
+
wasm.exec(sql2);
|
|
201
201
|
},
|
|
202
202
|
close: () => {
|
|
203
203
|
for (const statement of prepared)
|
|
@@ -230,9 +230,9 @@ function createBunEngine(path) {
|
|
|
230
230
|
values: (bind) => bind === void 0 ? stmt.values() : stmt.values(bind)
|
|
231
231
|
});
|
|
232
232
|
return {
|
|
233
|
-
prepare: (
|
|
234
|
-
exec: (
|
|
235
|
-
db.exec(
|
|
233
|
+
prepare: (sql2) => wrapStatement(db.prepare(sql2)),
|
|
234
|
+
exec: (sql2) => {
|
|
235
|
+
db.exec(sql2);
|
|
236
236
|
},
|
|
237
237
|
close: () => db.close(),
|
|
238
238
|
get inTransaction() {
|
|
@@ -276,7 +276,7 @@ function ensureDatabaseDirectory(path) {
|
|
|
276
276
|
}
|
|
277
277
|
|
|
278
278
|
// packages/db/dist/database.js
|
|
279
|
-
import { asc, eq, desc, and, gt, inArray, or } from "drizzle-orm";
|
|
279
|
+
import { asc, eq, desc, and, gt, inArray, or, sql } from "drizzle-orm";
|
|
280
280
|
import { createHash, randomUUID } from "node:crypto";
|
|
281
281
|
import { join } from "node:path";
|
|
282
282
|
import { closeSync, existsSync as existsSync2, openSync, readSync, renameSync, rmSync, statSync, writeSync } from "node:fs";
|
|
@@ -1901,6 +1901,14 @@ var osecDB = class {
|
|
|
1901
1901
|
conditions.push(eq(pipelineEvents.eventType, opts.eventType));
|
|
1902
1902
|
return this.db.select().from(pipelineEvents).where(and(...conditions)).orderBy(pipelineEvents.timestamp).all();
|
|
1903
1903
|
}
|
|
1904
|
+
/** Bounded retained receipts for explicit verification lifecycle recovery. */
|
|
1905
|
+
getRecentScanEvents(scanId, eventType, limit2 = 100, tools) {
|
|
1906
|
+
if (!Number.isSafeInteger(limit2) || limit2 < 1 || limit2 > 500)
|
|
1907
|
+
throw new Error("invalid scan event limit");
|
|
1908
|
+
if (tools && (!tools.length || tools.length > 10 || tools.some((tool) => !/^[a-z_]{1,64}$/.test(tool))))
|
|
1909
|
+
throw new Error("invalid receipt tools");
|
|
1910
|
+
return this.db.select().from(pipelineEvents).where(and(eq(pipelineEvents.scanId, scanId), eq(pipelineEvents.eventType, eventType), tools ? inArray(sql`CASE WHEN json_valid(${pipelineEvents.payload}) THEN json_extract(${pipelineEvents.payload}, '$.tool') ELSE '' END`, tools) : void 0)).orderBy(desc(pipelineEvents.timestamp), desc(pipelineEvents.id)).limit(limit2).all();
|
|
1911
|
+
}
|
|
1904
1912
|
listRecentEvents(limit2 = 50) {
|
|
1905
1913
|
return this.db.select({
|
|
1906
1914
|
id: pipelineEvents.id,
|
|
@@ -2996,6 +3004,81 @@ var LearningStore = class {
|
|
|
2996
3004
|
getKnowledge(id) {
|
|
2997
3005
|
return read(this.#db, "learning_knowledge", id);
|
|
2998
3006
|
}
|
|
3007
|
+
/** Export is explicit and fails rather than silently truncating a large memory library. */
|
|
3008
|
+
exportKnowledge(projectId) {
|
|
3009
|
+
if (projectId !== void 0)
|
|
3010
|
+
bounded(projectId, "project ID");
|
|
3011
|
+
const entries = this.#db.prepare("SELECT body FROM learning_knowledge WHERE (? IS NULL OR project_id=?) ORDER BY updated_at DESC,id LIMIT 201").all(projectId ?? null, projectId ?? null).map((row) => JSON.parse(row.body));
|
|
3012
|
+
if (entries.length > 200)
|
|
3013
|
+
fail("More than 200 lessons. Export one project at a time.", 413);
|
|
3014
|
+
return entries;
|
|
3015
|
+
}
|
|
3016
|
+
#importIdentity(input) {
|
|
3017
|
+
return createHash2("sha256").update(JSON.stringify({ projectId: input.projectId, summary: input.summary, sourceLinks: [...input.sourceLinks].sort((a, b) => a.path.localeCompare(b.path) || a.hash.localeCompare(b.hash)) })).digest("hex");
|
|
3018
|
+
}
|
|
3019
|
+
#existingImport(input) {
|
|
3020
|
+
const identity = this.#importIdentity(input);
|
|
3021
|
+
const entries = this.#db.prepare("SELECT body FROM learning_knowledge WHERE project_id=? AND json_extract(body,'$.summary')=?").all(input.projectId, input.summary);
|
|
3022
|
+
return entries.some((row) => this.#importIdentity(JSON.parse(row.body)) === identity);
|
|
3023
|
+
}
|
|
3024
|
+
previewKnowledgeImport(inputs, exportedAt) {
|
|
3025
|
+
if (!Array.isArray(inputs) || inputs.length > 200)
|
|
3026
|
+
fail("At most 200 lessons can be imported.");
|
|
3027
|
+
if (!Number.isFinite(Date.parse(exportedAt)))
|
|
3028
|
+
fail("Invalid export timestamp.");
|
|
3029
|
+
const seen = /* @__PURE__ */ new Set();
|
|
3030
|
+
return inputs.map((input) => {
|
|
3031
|
+
bounded(input.id, "original lesson ID");
|
|
3032
|
+
bounded(input.projectId, "project ID");
|
|
3033
|
+
bounded(input.summary, "knowledge summary", 4e3);
|
|
3034
|
+
sources(input.sourceLinks);
|
|
3035
|
+
if (!Number.isFinite(Date.parse(input.createdAt)))
|
|
3036
|
+
fail("Invalid lesson timestamp.");
|
|
3037
|
+
for (const link of input.sourceLinks)
|
|
3038
|
+
if (isAbsolute2(link.path) || /^[A-Za-z]:[\\/]|^\\\\/.test(link.path) || /(?:^|[\\/])\.\.(?:[\\/]|$)/.test(link.path) || !/^sha256:[a-f0-9]{64}$/i.test(link.hash))
|
|
3039
|
+
fail("Imported source links must use relative paths and SHA-256 hashes.");
|
|
3040
|
+
if (!Array.isArray(input.provenance) || input.provenance.length > 64)
|
|
3041
|
+
fail("Invalid lesson provenance.");
|
|
3042
|
+
for (const evidence of input.provenance) {
|
|
3043
|
+
bounded(evidence.id, "original evidence ID");
|
|
3044
|
+
bounded(evidence.kind, "evidence kind");
|
|
3045
|
+
if (!Number.isFinite(Date.parse(evidence.createdAt)))
|
|
3046
|
+
fail("Invalid evidence timestamp.");
|
|
3047
|
+
}
|
|
3048
|
+
const identity = this.#importIdentity(input);
|
|
3049
|
+
const duplicate = seen.has(identity) || this.#existingImport(input);
|
|
3050
|
+
seen.add(identity);
|
|
3051
|
+
return duplicate;
|
|
3052
|
+
});
|
|
3053
|
+
}
|
|
3054
|
+
/** Imported prose is retained for inspection only, never admitted as current source evidence. */
|
|
3055
|
+
importKnowledge(inputs, exportedAt) {
|
|
3056
|
+
return this.#db.transaction(() => {
|
|
3057
|
+
const duplicates = this.previewKnowledgeImport(inputs, exportedAt);
|
|
3058
|
+
let imported = 0;
|
|
3059
|
+
inputs.forEach((input, index2) => {
|
|
3060
|
+
if (duplicates[index2])
|
|
3061
|
+
return;
|
|
3062
|
+
const fingerprint = this.#importIdentity(input);
|
|
3063
|
+
const event = appendLearningEvent(this.#db, { idempotencyKey: `memory-import:${fingerprint}`, projectId: input.projectId, kind: "memory-import", outcome: "retained-disabled", evidenceStrength: "hypothesis", summary: "Imported lesson retained as disabled; original provenance is untrusted data.", sourceLinks: input.sourceLinks });
|
|
3064
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
3065
|
+
const entry = {
|
|
3066
|
+
id: `knowledge:import:${fingerprint}`,
|
|
3067
|
+
projectId: input.projectId,
|
|
3068
|
+
summary: input.summary,
|
|
3069
|
+
sourceLinks: input.sourceLinks,
|
|
3070
|
+
evidenceEventIds: [event.id],
|
|
3071
|
+
status: "disabled",
|
|
3072
|
+
createdAt: now,
|
|
3073
|
+
updatedAt: now,
|
|
3074
|
+
importedFrom: { id: input.id, projectId: input.projectId, createdAt: input.createdAt, exportedAt, evidence: input.provenance }
|
|
3075
|
+
};
|
|
3076
|
+
write(this.#db, "learning_knowledge", entry);
|
|
3077
|
+
imported++;
|
|
3078
|
+
});
|
|
3079
|
+
return { imported, duplicates: duplicates.filter(Boolean).length, disabled: true };
|
|
3080
|
+
})();
|
|
3081
|
+
}
|
|
2999
3082
|
#checkEvidence(projectId, ids) {
|
|
3000
3083
|
refs(ids, "evidence event IDs");
|
|
3001
3084
|
if (!ids.length)
|
|
@@ -3006,19 +3089,27 @@ var LearningStore = class {
|
|
|
3006
3089
|
fail("Evidence must belong to the same project.");
|
|
3007
3090
|
}
|
|
3008
3091
|
}
|
|
3092
|
+
/** Match operator-disabled source lessons independently of library pagination. */
|
|
3093
|
+
findDisabledSourceKnowledge(projectId, summary, sourceLinks) {
|
|
3094
|
+
const fingerprint = (links) => JSON.stringify([...links].sort((a, b) => a.path.localeCompare(b.path) || a.hash.localeCompare(b.hash)));
|
|
3095
|
+
const matching = this.#db.prepare("SELECT body FROM learning_knowledge WHERE project_id=? AND json_extract(body,'$.summary')=? AND json_extract(body,'$.status')='disabled'").all(projectId, summary);
|
|
3096
|
+
const requested = fingerprint(sourceLinks);
|
|
3097
|
+
for (const row of matching) {
|
|
3098
|
+
const prior = JSON.parse(row.body);
|
|
3099
|
+
if (fingerprint(prior.sourceLinks) === requested)
|
|
3100
|
+
return prior;
|
|
3101
|
+
}
|
|
3102
|
+
return null;
|
|
3103
|
+
}
|
|
3009
3104
|
putKnowledge(input) {
|
|
3010
3105
|
bounded(input.projectId, "project ID");
|
|
3011
3106
|
bounded(input.summary, "knowledge summary", 4e3);
|
|
3012
3107
|
sources(input.sourceLinks);
|
|
3013
3108
|
this.#checkEvidence(input.projectId, input.evidenceEventIds);
|
|
3014
3109
|
if (input.sourceLinks.length) {
|
|
3015
|
-
const
|
|
3016
|
-
|
|
3017
|
-
|
|
3018
|
-
const prior = JSON.parse(row.body);
|
|
3019
|
-
if (fingerprint(prior.sourceLinks) === fingerprint(input.sourceLinks))
|
|
3020
|
-
return prior;
|
|
3021
|
-
}
|
|
3110
|
+
const disabled = this.findDisabledSourceKnowledge(input.projectId, input.summary, input.sourceLinks);
|
|
3111
|
+
if (disabled)
|
|
3112
|
+
return disabled;
|
|
3022
3113
|
}
|
|
3023
3114
|
const identity = `knowledge:${createHash2("sha256").update(JSON.stringify({ projectId: input.projectId, summary: input.summary, sourceLinks: [...input.sourceLinks].sort((a, b) => a.path.localeCompare(b.path)), evidenceEventIds: [...input.evidenceEventIds].sort() })).digest("hex")}`;
|
|
3024
3115
|
const existing = this.getKnowledge(identity);
|
|
@@ -5,23 +5,19 @@ import {
|
|
|
5
5
|
source_default
|
|
6
6
|
} from "./chunk-HLFS6WV2.js";
|
|
7
7
|
import {
|
|
8
|
-
agenticScan
|
|
9
|
-
|
|
10
|
-
import {
|
|
8
|
+
agenticScan,
|
|
9
|
+
getToolsForRole,
|
|
11
10
|
runAgentLoop
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import {
|
|
14
|
-
getToolsForRole
|
|
15
|
-
} from "./chunk-5WAHHZBF.js";
|
|
11
|
+
} from "./chunk-HFUOUT2B.js";
|
|
16
12
|
import {
|
|
17
13
|
createRuntime
|
|
18
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-DHNYJ2ML.js";
|
|
19
15
|
import {
|
|
20
16
|
osecDB
|
|
21
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-YXTV2FRE.js";
|
|
22
18
|
import {
|
|
23
19
|
LlmApiRuntime
|
|
24
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-EIONVEFN.js";
|
|
25
21
|
|
|
26
22
|
// packages/cli/src/commands/orchestrate.ts
|
|
27
23
|
import { randomUUID } from "node:crypto";
|