0sec-cli 0.23.0 → 0.24.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 +66 -67
- package/README.md +37 -11
- package/chunks/{adapt-loop-V3JFWOKC.js → adapt-loop-TEJPXWFG.js} +4 -4
- package/chunks/{artifact-scraper-NYKUF2M5.js → artifact-scraper-AJZ3LOQY.js} +2 -2
- package/chunks/{assumption-mining-ZX3YVWEH.js → assumption-mining-EATDC4BB.js} +18 -18
- package/chunks/{backend-connections-H52NIVH2.js → backend-connections-QE4NASAK.js} +3 -3
- package/chunks/chunk-3XLEDCFX.js +566 -0
- package/chunks/{chunk-I3OCJ2OA.js → chunk-3XLFB46W.js} +5 -3
- package/chunks/{chunk-TPUJZ74W.js → chunk-4TUR47H5.js} +2 -2
- package/chunks/{chunk-3ZNI7F42.js → chunk-4YRXIVPZ.js} +3 -3
- package/chunks/{chunk-A5QO7N3S.js → chunk-52AWIBCT.js} +1 -1
- package/chunks/{chunk-TO35Y326.js → chunk-554D4AYM.js} +5 -2
- package/chunks/{chunk-KHPOSLCF.js → chunk-5FHFG5P2.js} +174 -710
- package/chunks/{chunk-LT7BFGXA.js → chunk-5POT5OYF.js} +10 -10
- package/chunks/chunk-62PGWN7Y.js +700 -0
- package/chunks/{chunk-EH2WTNY7.js → chunk-A3EKBUEM.js} +1424 -859
- package/chunks/{chunk-YYS2H33A.js → chunk-A6AZZ6XX.js} +2 -2
- package/chunks/{chunk-A2ADXAC5.js → chunk-AV5BF4V7.js} +1288 -2313
- package/chunks/{chunk-NI6QYQSK.js → chunk-BIJPMYFA.js} +6 -6
- package/chunks/{chunk-JEYIWMGL.js → chunk-CIMN2AO6.js} +1 -1
- package/chunks/{chunk-P7KDN5PK.js → chunk-CSPF47S3.js} +14 -14
- package/chunks/{chunk-F344NYUN.js → chunk-DNV3ZMPX.js} +1 -1
- package/chunks/{chunk-YAEJAZYW.js → chunk-E42XEJTK.js} +2 -2
- package/chunks/{chunk-VDOWARMJ.js → chunk-ESM447R6.js} +15 -1
- package/chunks/{chunk-UZUELPFW.js → chunk-EXTN4SQV.js} +1 -1
- package/chunks/{chunk-BF5FIK7H.js → chunk-EYBMTELO.js} +108 -24
- package/chunks/chunk-FEOPHBMY.js +56 -0
- package/chunks/{chunk-XORZUR2H.js → chunk-FKGFHLLS.js} +1 -1
- package/chunks/chunk-G2EJ3R5I.js +5198 -0
- package/chunks/chunk-GHEBZKUS.js +5417 -0
- package/chunks/chunk-GNR3APR6.js +295 -0
- package/chunks/{chunk-EJH2TNVH.js → chunk-H76JYUPE.js} +3 -3
- package/chunks/{chunk-WIYNYNL2.js → chunk-HRBOZBMC.js} +1 -1
- package/chunks/{chunk-62ENS6XO.js → chunk-IIBNQTOK.js} +3 -2
- package/chunks/{chunk-UELXHK2Y.js → chunk-IK27KMVV.js} +16 -5
- package/chunks/{chunk-O6Z4XPOM.js → chunk-J6G73WYF.js} +1 -1
- package/chunks/chunk-JSTLXPJS.js +284 -0
- package/chunks/{chunk-K55B4OH4.js → chunk-O3ADFN2A.js} +1 -1
- package/chunks/chunk-O7Q2G2KW.js +117 -0
- package/chunks/{chunk-HFDSIHTE.js → chunk-QEA2VHBD.js} +202 -30
- package/chunks/{chunk-ITES7BCY.js → chunk-RBOMXUYL.js} +3 -111
- package/chunks/{chunk-T7ZEVY5G.js → chunk-RCHAFSWS.js} +815 -41
- package/chunks/{chunk-W5VNCB57.js → chunk-RD4FKFWR.js} +1 -1
- package/chunks/{chunk-LVGZGG63.js → chunk-RPTO5FY2.js} +1 -1
- package/chunks/{chunk-LTEE2JWK.js → chunk-RZR2XXAK.js} +251 -8
- package/chunks/chunk-SGILXLR3.js +289 -0
- package/chunks/{chunk-QMICC5O2.js → chunk-TOAAYJVN.js} +2 -2
- package/chunks/{chunk-PIR6BNE7.js → chunk-TOFIGQ63.js} +2 -2
- package/chunks/{chunk-V2BWXPZP.js → chunk-TTDFBFNZ.js} +6 -6
- package/chunks/{chunk-WYNZFNMF.js → chunk-TZRHWP7R.js} +289 -10
- package/chunks/chunk-UHUW45S3.js +164 -0
- package/chunks/{chunk-NX4H6L4M.js → chunk-V4BD7GSP.js} +2 -2
- package/chunks/{chunk-4HGGNBKK.js → chunk-V5I5GAQH.js} +2593 -1563
- package/chunks/{chunk-MQJVU2GZ.js → chunk-W6IYTSZH.js} +79 -9
- package/chunks/{chunk-OLSKXTQZ.js → chunk-WUPN3D37.js} +22 -248
- package/chunks/{chunk-AAA4PRWK.js → chunk-Y7KV7WV6.js} +2 -2
- package/chunks/{chunk-Y4HJRUFE.js → chunk-YERUDEXT.js} +876 -817
- package/chunks/{chunk-65H3MRBF.js → chunk-YJU7QACE.js} +1 -1
- package/chunks/{chunk-3E54JYS4.js → chunk-YORL5S5V.js} +1 -1
- package/chunks/{chunk-CP6HANBE.js → chunk-YYOQADBB.js} +4 -3
- package/chunks/{remote-workflow-runtime-RGQ5ECMN.js → chunk-ZPFBQ3SD.js} +39 -8
- package/chunks/{codex-models-Y457ND6Q.js → codex-models-FQPCWRPC.js} +7 -7
- package/chunks/{commands-PBDAOZKA.js → commands-I5L3VD2A.js} +1603 -6945
- package/chunks/dashboard-B2AEGCFM.js +76 -0
- package/chunks/{db-TPSI552V.js → db-P5EIKMLP.js} +3 -3
- package/chunks/{deep-review-DKED6EN5.js → deep-review-I7RD5QSS.js} +34 -33
- package/chunks/{disclose-LDNKAVRH.js → disclose-PFBWESVJ.js} +4 -2
- package/chunks/{dist-7Q5A6TQM.js → dist-3SWWY5FZ.js} +18 -2
- package/chunks/{dist-4LGRIBOC.js → dist-AJU25UXA.js} +99 -64
- package/chunks/{dist-RLPNLRZD.js → dist-VK2M4HNW.js} +33 -1
- package/chunks/eval-runner-XVRX3R2Y.js +31 -0
- package/chunks/{exploit-agent-RMFYNG7H.js → exploit-agent-A4RTIJ4J.js} +1 -1
- package/chunks/{exploit-autoclimb-2A2PQI4E.js → exploit-autoclimb-ABMMBC3M.js} +1 -1
- package/chunks/{exploit-climb-DEJ232QN.js → exploit-climb-BQ2SVU63.js} +2 -2
- package/chunks/{fix-JGBW7XUN.js → fix-4YCLHFDT.js} +7 -7
- package/chunks/{harness-CBOLMUHB.js → harness-DHWULEIZ.js} +3 -3
- package/chunks/{hunt-scan-MIRMABY4.js → hunt-scan-DXV5H6YN.js} +16 -16
- package/chunks/{kernel-primitive-NAPDMJC7.js → kernel-primitive-SF4NALVR.js} +2 -2
- package/chunks/{kernel-vm-runner-PR5OSDQ2.js → kernel-vm-runner-WEBEZEIC.js} +2 -2
- package/chunks/local-engine-XUG7XRKM.js +21 -0
- package/chunks/managed-operation-SQFMBWHG.js +60 -0
- package/chunks/{memsafety-scan-RPS446CD.js → memsafety-scan-L2Z7E7TE.js} +2 -2
- package/chunks/{native-loop-CGOJMNHV.js → native-loop-ZNAELJGB.js} +14 -13
- package/chunks/orchestrate-YHFJXGID.js +63 -0
- package/chunks/{prepare-YVNENPNL.js → prepare-SODWQN6O.js} +5 -5
- package/chunks/provider-model-discovery-QGUGL3XW.js +277 -0
- package/chunks/remote-workflow-runtime-XNNGI2PG.js +12 -0
- package/chunks/{run-VH4OIDKF.js → run-5T4Z3Q2D.js} +902 -322
- package/chunks/{runtime-4TAJFVF7.js → runtime-HFFRUOPL.js} +2 -2
- package/chunks/{runtime-HWL6HG7A.js → runtime-MB4GEFBY.js} +7 -7
- package/chunks/{scan-stream-HJAZJONE.js → scan-stream-GXBJHCDF.js} +3 -2
- package/chunks/{scope-Q5PIX2IS.js → scope-M7L3CD6X.js} +2 -2
- package/chunks/service-plugins-BGS6QKSZ.js +64 -0
- package/chunks/{session-store-2FEIZGSV.js → session-store-K7I4GLNH.js} +2 -2
- package/chunks/{variant-candidates-TX5V6XOT.js → variant-candidates-2KSP5EHH.js} +7 -7
- package/chunks/{web-recon-prepass-6HOUGF7Q.js → web-recon-prepass-RAXXTEWH.js} +5 -5
- package/chunks/workflow-runtime-V26HIJO3.js +178 -0
- package/dashboard/assets/{abnfDiagram-VCTEODGH-BuvumFYR.js → abnfDiagram-VCTEODGH-CGCueOp5.js} +1 -1
- package/dashboard/assets/{arc-DZzWDuCG.js → arc-BjZaQcCc.js} +1 -1
- package/dashboard/assets/architecture-7GRP2DOG-hcbO-9zX.js +1 -0
- package/dashboard/assets/{architectureDiagram-5GKGNRK7-Bw5el_EL.js → architectureDiagram-5GKGNRK7-DReOXTSq.js} +1 -1
- package/dashboard/assets/{blockDiagram-I7D4REHJ-BjVLEApp.js → blockDiagram-I7D4REHJ-C-byT12_.js} +1 -1
- package/dashboard/assets/{c4Diagram-7LVT6UL2-B9nNzx2J.js → c4Diagram-7LVT6UL2-DoYjz-Uv.js} +1 -1
- package/dashboard/assets/channel-CUURBnpZ.js +1 -0
- package/dashboard/assets/{chunk-4HAMMTFA-y72Q95nW.js → chunk-4HAMMTFA-NBNp2zdt.js} +1 -1
- package/dashboard/assets/{chunk-75Z2AOVW-BOhrOGMO.js → chunk-75Z2AOVW-BHmkuP0B.js} +1 -1
- package/dashboard/assets/{chunk-DU6HZSFF-B0EhAaNb.js → chunk-DU6HZSFF-DgfLNaL2.js} +2 -2
- package/dashboard/assets/{chunk-F27PBJKO-BR-hiDvM.js → chunk-F27PBJKO-3wwNFUgZ.js} +1 -1
- package/dashboard/assets/{chunk-GMAD6QVW-H15vJYXg.js → chunk-GMAD6QVW-Btg7huZW.js} +1 -1
- package/dashboard/assets/{chunk-GVQU2GXP-BRndps0o.js → chunk-GVQU2GXP-ihCURK5O.js} +1 -1
- package/dashboard/assets/{chunk-IMKFNOWR-CIzC_OWx.js → chunk-IMKFNOWR-FsXj7slg.js} +1 -1
- package/dashboard/assets/{chunk-L3NEJ4N5-NR4P1Vko.js → chunk-L3NEJ4N5-DorFIxJY.js} +1 -1
- package/dashboard/assets/{chunk-OSK3NFVY-DtjTDf8S.js → chunk-OSK3NFVY-DKun_KfC.js} +1 -1
- package/dashboard/assets/{chunk-P2QGCYS3-CYT11Qjx.js → chunk-P2QGCYS3-XGgiU1Bz.js} +1 -1
- package/dashboard/assets/{chunk-POPQ4Y6H-Duj2Ygwu.js → chunk-POPQ4Y6H-BTXEnGhJ.js} +1 -1
- package/dashboard/assets/{chunk-PWAF6VOD-z4p5Tf_y.js → chunk-PWAF6VOD-DYZcGkTL.js} +1 -1
- package/dashboard/assets/{chunk-SHT3W25Y-DYeLYLS3.js → chunk-SHT3W25Y-C4WQfwf8.js} +1 -1
- package/dashboard/assets/{chunk-SVP7TREG-BKowxCVI.js → chunk-SVP7TREG-C4nCh0-1.js} +1 -1
- package/dashboard/assets/{chunk-TICWLB2K-GDAwEFlH.js → chunk-TICWLB2K-DSB-IiGc.js} +1 -1
- package/dashboard/assets/{chunk-XXDRQBXY-DRD79Mjx.js → chunk-XXDRQBXY-CS6fjUcj.js} +1 -1
- package/dashboard/assets/classDiagram-ZZMXUADV-CD1Buc26.js +1 -0
- package/dashboard/assets/classDiagram-v2-VYDZK3BY-CD1Buc26.js +1 -0
- package/dashboard/assets/{common-vnzd7UOF.js → common-BMdQBwfR.js} +1 -1
- package/dashboard/assets/{cose-bilkent-JH36ORCC-GqCLsRyf.js → cose-bilkent-JH36ORCC-CUjQHTML.js} +1 -1
- package/dashboard/assets/{cynefin-OW5HDTMX-CJN9YwWN.js → cynefin-OW5HDTMX-BC7zCtFq.js} +1 -1
- package/dashboard/assets/{cynefinDiagram-5FMLGOSQ-DVJHCYQY.js → cynefinDiagram-5FMLGOSQ-CgDOOY67.js} +1 -1
- package/dashboard/assets/{dagre-GXQ25YYZ-BMCrrJJR.js → dagre-GXQ25YYZ-Dqc8FS9x.js} +1 -1
- package/dashboard/assets/{diagram-S7CK7UJ4-CLYDdOEm.js → diagram-S7CK7UJ4-CrKqRXZb.js} +1 -1
- package/dashboard/assets/{diagram-UQ7AKVKN-CnPuAZK7.js → diagram-UQ7AKVKN-Cu6Es0-v.js} +1 -1
- package/dashboard/assets/{diagram-VSXAHHWV-Cr2I2DnG.js → diagram-VSXAHHWV-eK4d8FwS.js} +1 -1
- package/dashboard/assets/{diagram-VX7I27RA-_mGW1wpp.js → diagram-VX7I27RA-bFxeFKOc.js} +1 -1
- package/dashboard/assets/{diagram-Z3DM3KII-igybB0l9.js → diagram-Z3DM3KII-C0ClmnhC.js} +1 -1
- package/dashboard/assets/{dist-Bb7_-x5y.js → dist-BZh8Kb3O.js} +1 -1
- package/dashboard/assets/{ebnfDiagram-PWID7BFC-CVCICf2R.js → ebnfDiagram-PWID7BFC-CUqxFPzf.js} +1 -1
- package/dashboard/assets/{erDiagram-RLTQ6QDP-CRjnfgxj.js → erDiagram-RLTQ6QDP-CcYM7pLi.js} +1 -1
- package/dashboard/assets/eventmodeling-NTZA5JFV-D8ZNnPkV.js +1 -0
- package/dashboard/assets/flowDiagram-HODETNUW-pDb1AYm8.js +1 -0
- package/dashboard/assets/{ganttDiagram-EL5Y4UJY-DppD7sD7.js → ganttDiagram-EL5Y4UJY-UmZfbMyD.js} +1 -1
- package/dashboard/assets/{gitGraph-4MIJSDKK-Tw0vNnQc.js → gitGraph-4MIJSDKK-mvNUo0ZA.js} +1 -1
- package/dashboard/assets/{gitGraphDiagram-WWUBYQGX-Cpf96-z3.js → gitGraphDiagram-WWUBYQGX-CvzeCxVy.js} +1 -1
- package/dashboard/assets/{info-A6RAGUB7-DLyt9arx.js → info-A6RAGUB7-DChKqZMi.js} +1 -1
- package/dashboard/assets/{infoDiagram-27XIBGKW-B6_piSNS.js → infoDiagram-27XIBGKW-DjkpNtVW.js} +1 -1
- package/dashboard/assets/{ishikawaDiagram-5VMMS53U-DvMO0B0X.js → ishikawaDiagram-5VMMS53U-8FhjJaWT.js} +1 -1
- package/dashboard/assets/{journeyDiagram-3NMN7TZE-f7ZK98b6.js → journeyDiagram-3NMN7TZE-DyNJ755f.js} +1 -1
- package/dashboard/assets/{kanban-definition-UXKFOSKX-Dso0nAxL.js → kanban-definition-UXKFOSKX-_jCmtaY1.js} +1 -1
- package/dashboard/assets/katex-BdBmVSus.js +257 -0
- package/dashboard/assets/{line-VcKaFG0G.js → line-Bf0nxyWf.js} +1 -1
- package/dashboard/assets/{linear-D7YnpiWh.js → linear-Bl6JKbf4.js} +1 -1
- package/dashboard/assets/{mermaid-parser.core-DriL2hrV.js → mermaid-parser.core-Cc6sgCzs.js} +3 -3
- package/dashboard/assets/{mermaid.core-DJWYDh_P.js → mermaid.core-B4yCwiN-.js} +4 -4
- package/dashboard/assets/{mindmap-definition-YA3MSWOX-DZsoIeac.js → mindmap-definition-YA3MSWOX-D5DjWyXj.js} +1 -1
- package/dashboard/assets/operations-B7JAWOi6.js +130 -0
- package/dashboard/assets/operations-QjKT0Hwi.css +1 -0
- package/dashboard/assets/{packet-AYTQ26CC-BQBIXKxk.js → packet-AYTQ26CC-bQXLDhQC.js} +1 -1
- package/dashboard/assets/{pegDiagram-XKGWAZYB-B0-lslgW.js → pegDiagram-XKGWAZYB-Bf6a1vaf.js} +1 -1
- package/dashboard/assets/{pie-WAS4IAKB-DoY6dwQs.js → pie-WAS4IAKB-DfzoABIi.js} +1 -1
- package/dashboard/assets/{pieDiagram-E7YTZNPT-ElmdRjp5.js → pieDiagram-E7YTZNPT-D0L1qbch.js} +1 -1
- package/dashboard/assets/{quadrantDiagram-AXDQQJYC-Ci1h98Q2.js → quadrantDiagram-AXDQQJYC-CbFyy2Pe.js} +1 -1
- package/dashboard/assets/{radar-RG4KPBEZ-DHod2WgB.js → radar-RG4KPBEZ-CZ2pyeUT.js} +1 -1
- package/dashboard/assets/{railroad-74A4TZTK-90JxB4xV.js → railroad-74A4TZTK-CP4Jazfd.js} +1 -1
- package/dashboard/assets/railroad-abnf-HS5TGJTU-3MvEiHwD.js +1 -0
- package/dashboard/assets/railroad-ebnf-LZEXJU2U-BWto6cXE.js +1 -0
- package/dashboard/assets/railroad-peg-WCYAUIDC-DasEjbyf.js +1 -0
- package/dashboard/assets/{railroadDiagram-O6MQD6OU-k3190A6L.js → railroadDiagram-O6MQD6OU-t7Gp9g2R.js} +1 -1
- package/dashboard/assets/{requirementDiagram-BXWQKSXE-C3-eR7I5.js → requirementDiagram-BXWQKSXE-LYmqeBXi.js} +1 -1
- package/dashboard/assets/{sankeyDiagram-P5KCCOFB-Bc86pi8w.js → sankeyDiagram-P5KCCOFB-DnpfA_94.js} +1 -1
- package/dashboard/assets/{sequenceDiagram-WJ2MYXX4-Bv_MvEmz.js → sequenceDiagram-WJ2MYXX4-C8s3pTUE.js} +1 -1
- package/dashboard/assets/{src-D7Dqq5yP.js → src-CaNUT1AQ.js} +1 -1
- package/dashboard/assets/{stateDiagram-D77RDMKH-Bq_GVmeW.js → stateDiagram-D77RDMKH-BMzm6fK1.js} +1 -1
- package/dashboard/assets/stateDiagram-v2-MP3YSRHH-B3REMjpY.js +1 -0
- package/dashboard/assets/{swimlanes-42K2YHIH-q0iK-e0P.js → swimlanes-42K2YHIH-uJE05Tt_.js} +1 -1
- package/dashboard/assets/swimlanesDiagram-VR7AAH4N-CIaVMZEy.js +8 -0
- package/dashboard/assets/{timeline-definition-24CTP7MA-CNfF07hM.js → timeline-definition-24CTP7MA-BfLJMVeG.js} +1 -1
- package/dashboard/assets/{treeView-Q6P3EWNA-m629ePnS.js → treeView-Q6P3EWNA-ZOE2enu2.js} +1 -1
- package/dashboard/assets/{treemap-WGGIJYW6-D9Cb2ETv.js → treemap-WGGIJYW6-yIZoPBF5.js} +1 -1
- package/dashboard/assets/{vennDiagram-4TSXK5OY-v4dKF-FE.js → vennDiagram-4TSXK5OY-BYJRHEaL.js} +1 -1
- package/dashboard/assets/{wardley-WFR3VGLG-DkwH_nRe.js → wardley-WFR3VGLG-D5V-jLbB.js} +1 -1
- package/dashboard/assets/{wardleyDiagram-VM6X3IG4-3ImohVu4.js → wardleyDiagram-VM6X3IG4-DgPN4nSe.js} +1 -1
- package/dashboard/assets/{xychartDiagram-S5SC5T6Z-QJu3dm7K.js → xychartDiagram-S5SC5T6Z-BhkAMAOT.js} +1 -1
- package/dashboard/index.html +3 -3
- package/package.json +3 -2
- package/worker-assets/demo-target/README.md +15 -0
- package/worker-assets/demo-target/include/decoder.h +27 -0
- package/worker-assets/demo-target/patched-decoder.c +40 -0
- package/worker-assets/demo-target/src/decoder.c +50 -0
- package/worker-assets/demo-target/witness-65537x1.bin +0 -0
- package/chunks/chunk-3P3XXSIJ.js +0 -463
- package/chunks/chunk-EWXOG6D3.js +0 -1695
- package/chunks/chunk-FXR3BT2G.js +0 -226
- package/chunks/chunk-R35KKJA4.js +0 -90
- package/chunks/eval-runner-RZKDOQ2G.js +0 -30
- package/chunks/managed-operation-YNQQEA5V.js +0 -59
- package/chunks/orchestrate-5NK34H3W.js +0 -62
- package/chunks/service-plugins-QYFITODK.js +0 -63
- package/chunks/workflow-runtime-ZEEBJFQG.js +0 -64
- package/dashboard/assets/architecture-7GRP2DOG-DK9bv1Md.js +0 -1
- package/dashboard/assets/channel-Ck17eKdX.js +0 -1
- package/dashboard/assets/classDiagram-ZZMXUADV-BaeZA6LE.js +0 -1
- package/dashboard/assets/classDiagram-v2-VYDZK3BY-BaeZA6LE.js +0 -1
- package/dashboard/assets/eventmodeling-NTZA5JFV-po5oDydv.js +0 -1
- package/dashboard/assets/flowDiagram-HODETNUW-TSV9s7q4.js +0 -1
- package/dashboard/assets/katex-CXMH3UgJ.js +0 -257
- package/dashboard/assets/operations-BIaUSnYv.js +0 -121
- package/dashboard/assets/operations-BeCdkT4S.css +0 -1
- package/dashboard/assets/railroad-abnf-HS5TGJTU-BkXGl114.js +0 -1
- package/dashboard/assets/railroad-ebnf-LZEXJU2U-QVAERn2C.js +0 -1
- package/dashboard/assets/railroad-peg-WCYAUIDC-B1-PM01z.js +0 -1
- package/dashboard/assets/stateDiagram-v2-MP3YSRHH-z1XRaftz.js +0 -1
- package/dashboard/assets/swimlanesDiagram-VR7AAH4N-C9L6XBQj.js +0 -8
- package/dashboard/assets/zero-connect-BGDY0PMZ.webp +0 -0
- package/dashboard/assets/zero-curious-DovTLOs8.webp +0 -0
- package/dashboard/assets/zero-peek-Dzm3MT3X.png +0 -0
- package/dashboard/assets/zero-planning-CBeHDrG_.webp +0 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __0CreateRequire } from "node:module";
|
|
3
|
+
const require = __0CreateRequire(import.meta.url);
|
|
4
|
+
import {
|
|
5
|
+
inspectLensRegistry,
|
|
6
|
+
lastGreen,
|
|
7
|
+
loadLedger,
|
|
8
|
+
loadManifest,
|
|
9
|
+
makeFinderLensProbe,
|
|
10
|
+
retireArchetype,
|
|
11
|
+
runLensSynthesisLoop
|
|
12
|
+
} from "./chunk-V5I5GAQH.js";
|
|
13
|
+
import {
|
|
14
|
+
harvestMissesFromLedgerEntry,
|
|
15
|
+
mergeHarvestedMisses
|
|
16
|
+
} from "./chunk-A3EKBUEM.js";
|
|
17
|
+
|
|
18
|
+
// packages/cli/src/commands/lens-synth.ts
|
|
19
|
+
import { createHash } from "node:crypto";
|
|
20
|
+
import { readFileSync } from "node:fs";
|
|
21
|
+
import { resolve } from "node:path";
|
|
22
|
+
function isRecord(value) {
|
|
23
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
24
|
+
}
|
|
25
|
+
function parseFixtures(value, label) {
|
|
26
|
+
if (value === void 0) return [];
|
|
27
|
+
if (!Array.isArray(value)) throw new Error(`${label} must be an array`);
|
|
28
|
+
return value.map((entry, i) => {
|
|
29
|
+
if (!isRecord(entry)) throw new Error(`${label}[${i}] must be an object`);
|
|
30
|
+
const id = entry.id;
|
|
31
|
+
const path = entry.path;
|
|
32
|
+
if (typeof id !== "string" || id.trim() === "") throw new Error(`${label}[${i}].id must be a non-empty string`);
|
|
33
|
+
if (typeof path !== "string" || path.trim() === "") throw new Error(`${label}[${i}].path must be a non-empty string`);
|
|
34
|
+
const fixture = { id, path };
|
|
35
|
+
if (typeof entry.note === "string") fixture.note = entry.note;
|
|
36
|
+
if (typeof entry.expectedCwe === "string") fixture.expectedCwe = entry.expectedCwe;
|
|
37
|
+
if (typeof entry.expectedFile === "string") fixture.expectedFile = entry.expectedFile;
|
|
38
|
+
if (typeof entry.expectedLine === "number" && Number.isFinite(entry.expectedLine)) {
|
|
39
|
+
fixture.expectedLine = entry.expectedLine;
|
|
40
|
+
}
|
|
41
|
+
if (Array.isArray(entry.expectedRange) && entry.expectedRange.length === 2 && typeof entry.expectedRange[0] === "number" && typeof entry.expectedRange[1] === "number") {
|
|
42
|
+
fixture.expectedRange = [entry.expectedRange[0], entry.expectedRange[1]];
|
|
43
|
+
}
|
|
44
|
+
if (typeof entry.contentDigest === "string") fixture.contentDigest = entry.contentDigest;
|
|
45
|
+
if (typeof entry.cleanProvenance === "string") fixture.cleanProvenance = entry.cleanProvenance;
|
|
46
|
+
return fixture;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function parseMissInputFile(raw) {
|
|
50
|
+
if (!isRecord(raw)) throw new Error("miss-input must be a JSON object");
|
|
51
|
+
const missesRaw = isRecord(raw.misses) ? raw.misses : {};
|
|
52
|
+
const corpusRaw = isRecord(raw.corpus) ? raw.corpus : {};
|
|
53
|
+
const misses = {
|
|
54
|
+
...Array.isArray(missesRaw.confirmedMisses) ? { confirmedMisses: missesRaw.confirmedMisses } : {},
|
|
55
|
+
...Array.isArray(missesRaw.incompleteCoverage) ? { incompleteCoverage: missesRaw.incompleteCoverage } : {},
|
|
56
|
+
...Array.isArray(missesRaw.curatedCandidates) ? { curatedCandidates: missesRaw.curatedCandidates } : {}
|
|
57
|
+
};
|
|
58
|
+
const heldOutFixtures = parseFixtures(corpusRaw.heldOut, "corpus.heldOut");
|
|
59
|
+
const corpus = {
|
|
60
|
+
positives: parseFixtures(corpusRaw.positives, "corpus.positives"),
|
|
61
|
+
negativeControls: parseFixtures(corpusRaw.negativeControls, "corpus.negativeControls"),
|
|
62
|
+
...heldOutFixtures.length > 0 ? { heldOut: heldOutFixtures } : {},
|
|
63
|
+
...typeof corpusRaw.baselineDigest === "string" ? { baselineDigest: corpusRaw.baselineDigest } : {}
|
|
64
|
+
};
|
|
65
|
+
if (corpus.positives.length === 0) {
|
|
66
|
+
throw new Error("corpus.positives must contain at least one fixture (the seeded miss) \u2014 the loop is fail-closed without it");
|
|
67
|
+
}
|
|
68
|
+
if (corpus.negativeControls.length === 0) {
|
|
69
|
+
throw new Error("corpus.negativeControls must contain at least one fixture \u2014 the loop cannot measure FP regression without it");
|
|
70
|
+
}
|
|
71
|
+
if (!corpus.heldOut || corpus.heldOut.length === 0) {
|
|
72
|
+
throw new Error("corpus.heldOut must contain at least one fixture \u2014 held-out positives are required to demonstrate generalisation beyond development misses");
|
|
73
|
+
}
|
|
74
|
+
return { misses, corpus };
|
|
75
|
+
}
|
|
76
|
+
async function harvestBenchMisses(fromBench, manifestPath) {
|
|
77
|
+
const ledger = await loadLedger(resolve(fromBench));
|
|
78
|
+
const entry = lastGreen(ledger) ?? ledger.entries[ledger.entries.length - 1];
|
|
79
|
+
if (!entry) throw new Error(`--from-bench: ledger ${fromBench} has no entries to harvest`);
|
|
80
|
+
const manifest = await loadManifest(resolve(manifestPath));
|
|
81
|
+
const result = harvestMissesFromLedgerEntry(entry, manifest);
|
|
82
|
+
return { misses: result.misses, result };
|
|
83
|
+
}
|
|
84
|
+
function trialCount(value) {
|
|
85
|
+
const count = value ?? 2;
|
|
86
|
+
if (!Number.isSafeInteger(count) || count < 2 || count > 10) throw new Error("--trials must be an integer between 2 and 10");
|
|
87
|
+
return count;
|
|
88
|
+
}
|
|
89
|
+
async function runLensSynthesisInput(input, opts, deps = {}) {
|
|
90
|
+
const trials = trialCount(opts.trials);
|
|
91
|
+
const log = deps.log ?? (() => {
|
|
92
|
+
});
|
|
93
|
+
const probe = deps.probe ?? makeFinderLensProbe({ log });
|
|
94
|
+
return runLensSynthesisLoop(input, {
|
|
95
|
+
...deps.model ? { model: deps.model } : {},
|
|
96
|
+
...opts.model ? { modelId: opts.model } : {},
|
|
97
|
+
probe,
|
|
98
|
+
...opts.registry ? { registryPath: resolve(opts.registry) } : {},
|
|
99
|
+
maxRegistrations: opts.maxRegister ?? 1,
|
|
100
|
+
dryRun: !opts.promote,
|
|
101
|
+
trials,
|
|
102
|
+
...opts.signal ? { signal: opts.signal } : {},
|
|
103
|
+
log
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
async function runLensSynthCommand(opts, deps = {}) {
|
|
107
|
+
const raw = JSON.parse(readFileSync(resolve(opts.missInput), "utf8"));
|
|
108
|
+
let input = parseMissInputFile(raw);
|
|
109
|
+
if (opts.fromBench) {
|
|
110
|
+
if (!opts.manifest) throw new Error("--from-bench requires --manifest");
|
|
111
|
+
const { misses } = await harvestBenchMisses(opts.fromBench, opts.manifest);
|
|
112
|
+
input = { ...input, misses: mergeHarvestedMisses(input.misses, misses) };
|
|
113
|
+
deps.log?.(`[lens-synth] harvested ${misses.length} bench miss(es) from ${opts.fromBench}`);
|
|
114
|
+
}
|
|
115
|
+
return runLensSynthesisInput(input, opts, deps);
|
|
116
|
+
}
|
|
117
|
+
async function watchLensSynthCommand(opts, deps = {}) {
|
|
118
|
+
const inputPath = resolve(opts.missInput);
|
|
119
|
+
const log = deps.log ?? (() => {
|
|
120
|
+
});
|
|
121
|
+
const requestedInterval = opts.pollIntervalMs ?? 2e3;
|
|
122
|
+
const pollIntervalMs = Number.isFinite(requestedInterval) ? Math.max(100, Math.floor(requestedInterval)) : 2e3;
|
|
123
|
+
const sleep = deps.sleep ?? ((milliseconds) => new Promise((done) => setTimeout(done, milliseconds)));
|
|
124
|
+
let previousRevision;
|
|
125
|
+
while (!deps.signal?.aborted) {
|
|
126
|
+
try {
|
|
127
|
+
const bytes = readFileSync(inputPath);
|
|
128
|
+
const revision = createHash("sha256").update(bytes).digest("hex");
|
|
129
|
+
if (revision !== previousRevision) {
|
|
130
|
+
previousRevision = revision;
|
|
131
|
+
const input = parseMissInputFile(JSON.parse(bytes.toString("utf8")));
|
|
132
|
+
const result = await runLensSynthesisInput(input, opts, deps);
|
|
133
|
+
deps.onResult?.(result);
|
|
134
|
+
}
|
|
135
|
+
} catch (cause) {
|
|
136
|
+
const error = cause instanceof Error ? cause : new Error(String(cause));
|
|
137
|
+
const revision = `error:${error.name}:${error.message}`;
|
|
138
|
+
if (revision !== previousRevision) {
|
|
139
|
+
previousRevision = revision;
|
|
140
|
+
if (deps.onError) deps.onError(error);
|
|
141
|
+
else log(`[lens-synth] input revision rejected: ${error.message}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (deps.signal?.aborted) return;
|
|
145
|
+
const signal = deps.signal;
|
|
146
|
+
if (!signal) {
|
|
147
|
+
await sleep(pollIntervalMs);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (signal.aborted) return;
|
|
151
|
+
await new Promise((resume) => {
|
|
152
|
+
const onAbort = () => {
|
|
153
|
+
signal.removeEventListener("abort", onAbort);
|
|
154
|
+
resume();
|
|
155
|
+
};
|
|
156
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
157
|
+
void sleep(pollIntervalMs).then(() => {
|
|
158
|
+
signal.removeEventListener("abort", onAbort);
|
|
159
|
+
resume();
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function formatLensSynthResult(result, dryRun) {
|
|
165
|
+
const lines = [
|
|
166
|
+
`captured ${result.candidatesCaptured} miss candidate(s) \u2192 ${result.clusters} cluster(s) \u2192 ${result.synthesized.length} synthesized`
|
|
167
|
+
];
|
|
168
|
+
for (const validation of result.validations) {
|
|
169
|
+
lines.push(` validate ${validation.lensId}: ${validation.passed ? "CHAMPION" : "rejected"} \u2014 ${validation.reason}`);
|
|
170
|
+
}
|
|
171
|
+
if (dryRun) {
|
|
172
|
+
lines.push(`dry-run: ${result.validations.filter((validation) => validation.passed).length} champion(s) would register (nothing written)`);
|
|
173
|
+
} else {
|
|
174
|
+
lines.push(
|
|
175
|
+
result.registered.length > 0 ? `REGISTERED ${result.registered.length} lens(es): ${result.registered.map((registered) => registered.uid).join(", ")}` : "registered 0 lenses"
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
for (const rejected of result.rejected) lines.push(` rejected ${rejected.id}: ${rejected.reason}`);
|
|
179
|
+
for (const warning of result.warnings) lines.push(` warning: ${warning}`);
|
|
180
|
+
return lines.join("\n");
|
|
181
|
+
}
|
|
182
|
+
function formatLensRegistryStatus(status) {
|
|
183
|
+
const lines = [
|
|
184
|
+
`registry: ${status.path}`,
|
|
185
|
+
`state: ${status.valid ? "valid" : "INVALID"}`,
|
|
186
|
+
`exists: ${status.exists ? "yes" : "no"}`,
|
|
187
|
+
`active lenses: ${status.activeLensCount}`,
|
|
188
|
+
`ledger entries: ${status.ledgerEntries}`,
|
|
189
|
+
`unbound archetypes: ${status.unboundArchetypes}`
|
|
190
|
+
];
|
|
191
|
+
if (status.error) lines.push(`error: ${status.error}`);
|
|
192
|
+
return lines.join("\n");
|
|
193
|
+
}
|
|
194
|
+
function registerLensSynthCommand(program) {
|
|
195
|
+
program.command("lens-synth").description("Improve appsec detection coverage from curated missed findings").option("--miss-input <path>", "curated miss-input JSON ({ misses, corpus })").option("--registry <path>", "durable overlay path (default: ~/.0/lenses/appsec-archetypes.json)").option("--max-register <n>", "cap promoted champions per input revision", (value) => Number.parseInt(value, 10)).option("-m, --model <id>", "synthesis model override").option("--promote", "persist a validated champion to the durable overlay", false).option("--trials <n>", "repeated validation trials (2\u201310; default 2)", Number).option("--from-bench <ledger>", "harvest the champion's false-negatives from a benchmark ledger into the curated misses (requires --manifest)").option("--manifest <path>", "bench manifest path (ground-truth vuln class + sink); required with --from-bench").option("--watch", "poll the miss-input and process each new content revision", false).option("--poll-interval <ms>", "watch polling interval (minimum 100ms)", "2000").option("--status", "show the active durable overlay and promotion ledger", false).option("--rollback <lens-id>", "retire one previously promoted overlay lens").option("--json", "print machine-readable output", false).action(async (opts) => {
|
|
196
|
+
try {
|
|
197
|
+
const registry = opts.registry ? resolve(opts.registry) : void 0;
|
|
198
|
+
if (opts.status && opts.rollback) throw new Error("--status and --rollback cannot be combined");
|
|
199
|
+
if (opts.status) {
|
|
200
|
+
const status = inspectLensRegistry(registry);
|
|
201
|
+
process.stdout.write(opts.json ? `${JSON.stringify(status, null, 2)}
|
|
202
|
+
` : `${formatLensRegistryStatus(status)}
|
|
203
|
+
`);
|
|
204
|
+
if (!status.valid) process.exitCode = 3;
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (opts.rollback) {
|
|
208
|
+
const outcome = retireArchetype(String(opts.rollback), { ...registry ? { registryPath: registry } : {} });
|
|
209
|
+
process.stdout.write(
|
|
210
|
+
opts.json ? `${JSON.stringify(outcome, null, 2)}
|
|
211
|
+
` : outcome.retired ? `RETIRED ${outcome.id} from ${outcome.registryPath}
|
|
212
|
+
` : `not retired ${outcome.id}: ${outcome.reason ?? "unknown reason"}
|
|
213
|
+
`
|
|
214
|
+
);
|
|
215
|
+
if (!outcome.retired) process.exitCode = 3;
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
if (!opts.missInput) throw new Error("--miss-input is required unless --status or --rollback is used");
|
|
219
|
+
if (opts.maxRegister !== void 0 && (!Number.isInteger(opts.maxRegister) || opts.maxRegister < 0)) {
|
|
220
|
+
throw new Error("--max-register must be a non-negative integer");
|
|
221
|
+
}
|
|
222
|
+
if (opts.fromBench && !opts.manifest) throw new Error("--from-bench requires --manifest");
|
|
223
|
+
if (opts.fromBench && opts.watch) throw new Error("--from-bench cannot be combined with --watch");
|
|
224
|
+
const pollIntervalMs = Number.parseInt(opts.pollInterval ?? "2000", 10);
|
|
225
|
+
if (!Number.isInteger(pollIntervalMs) || pollIntervalMs < 100) {
|
|
226
|
+
throw new Error("--poll-interval must be an integer of at least 100ms");
|
|
227
|
+
}
|
|
228
|
+
const request = {
|
|
229
|
+
missInput: String(opts.missInput),
|
|
230
|
+
...registry ? { registry } : {},
|
|
231
|
+
...opts.maxRegister !== void 0 ? { maxRegister: opts.maxRegister } : {},
|
|
232
|
+
...opts.model ? { model: String(opts.model) } : {},
|
|
233
|
+
promote: Boolean(opts.promote),
|
|
234
|
+
trials: trialCount(opts.trials),
|
|
235
|
+
...opts.fromBench ? { fromBench: String(opts.fromBench) } : {},
|
|
236
|
+
...opts.manifest ? { manifest: resolve(String(opts.manifest)) } : {}
|
|
237
|
+
};
|
|
238
|
+
const printResult = (result) => {
|
|
239
|
+
process.stdout.write(
|
|
240
|
+
opts.json ? `${JSON.stringify(result, null, 2)}
|
|
241
|
+
` : `${formatLensSynthResult(result, !opts.promote)}
|
|
242
|
+
`
|
|
243
|
+
);
|
|
244
|
+
};
|
|
245
|
+
const log = (message) => {
|
|
246
|
+
process.stderr.write(`${message}
|
|
247
|
+
`);
|
|
248
|
+
};
|
|
249
|
+
if (!opts.watch) {
|
|
250
|
+
printResult(await runLensSynthCommand(request, { log }));
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const controller = new AbortController();
|
|
254
|
+
const stop = () => controller.abort();
|
|
255
|
+
process.once("SIGINT", stop);
|
|
256
|
+
process.once("SIGTERM", stop);
|
|
257
|
+
try {
|
|
258
|
+
await watchLensSynthCommand(
|
|
259
|
+
{ ...request, pollIntervalMs },
|
|
260
|
+
{
|
|
261
|
+
log,
|
|
262
|
+
signal: controller.signal,
|
|
263
|
+
onResult: printResult,
|
|
264
|
+
onError: (error) => process.stderr.write(`lens-synth watch: ${error.message}
|
|
265
|
+
`)
|
|
266
|
+
}
|
|
267
|
+
);
|
|
268
|
+
} finally {
|
|
269
|
+
process.off("SIGINT", stop);
|
|
270
|
+
process.off("SIGTERM", stop);
|
|
271
|
+
}
|
|
272
|
+
} catch (error) {
|
|
273
|
+
process.stderr.write(`lens-synth: ${error instanceof Error ? error.message : String(error)}
|
|
274
|
+
`);
|
|
275
|
+
process.exitCode = 3;
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export {
|
|
281
|
+
runLensSynthesisInput,
|
|
282
|
+
watchLensSynthCommand,
|
|
283
|
+
registerLensSynthCommand
|
|
284
|
+
};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __0CreateRequire } from "node:module";
|
|
3
|
+
const require = __0CreateRequire(import.meta.url);
|
|
4
|
+
import {
|
|
5
|
+
fitTuiText,
|
|
6
|
+
fitTuiUrl
|
|
7
|
+
} from "./chunk-AV5BF4V7.js";
|
|
8
|
+
import {
|
|
9
|
+
parseImpactAssessment
|
|
10
|
+
} from "./chunk-V5I5GAQH.js";
|
|
11
|
+
import {
|
|
12
|
+
restoreFindingReviewFields
|
|
13
|
+
} from "./chunk-RCHAFSWS.js";
|
|
14
|
+
import {
|
|
15
|
+
compareFindingsByBusinessPriority,
|
|
16
|
+
getFindingPriority
|
|
17
|
+
} from "./chunk-RZR2XXAK.js";
|
|
18
|
+
|
|
19
|
+
// packages/cli/src/tui/findings-data.ts
|
|
20
|
+
function formatDuration(ms) {
|
|
21
|
+
if (!ms || ms <= 0) return "-";
|
|
22
|
+
if (ms < 1e3) return `${ms}ms`;
|
|
23
|
+
return `${(ms / 1e3).toFixed(1)}s`;
|
|
24
|
+
}
|
|
25
|
+
function parseSummary(summary) {
|
|
26
|
+
if (!summary) return {};
|
|
27
|
+
try {
|
|
28
|
+
return JSON.parse(summary);
|
|
29
|
+
} catch {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function findingRowPriority(row) {
|
|
34
|
+
return getFindingPriority({ severity: row.severity, impactAssessment: parseJsonColumn(row.impactAssessment) });
|
|
35
|
+
}
|
|
36
|
+
function compareFindingRowsByBusinessPriority(a, b) {
|
|
37
|
+
return compareFindingsByBusinessPriority(
|
|
38
|
+
{ severity: a.severity, cvssScore: a.cvssScore ?? void 0, impactAssessment: parseJsonColumn(a.impactAssessment) },
|
|
39
|
+
{ severity: b.severity, cvssScore: b.cvssScore ?? void 0, impactAssessment: parseJsonColumn(b.impactAssessment) }
|
|
40
|
+
) || b.timestamp - a.timestamp;
|
|
41
|
+
}
|
|
42
|
+
function parseJsonColumn(raw) {
|
|
43
|
+
if (!raw) return void 0;
|
|
44
|
+
try {
|
|
45
|
+
return JSON.parse(raw);
|
|
46
|
+
} catch {
|
|
47
|
+
return void 0;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function findingFromRow(row) {
|
|
51
|
+
const impactAssessment = parseJsonColumn(row.impactAssessment) === void 0 ? void 0 : parseImpactAssessment(row.impactAssessment) ?? void 0;
|
|
52
|
+
const record = {
|
|
53
|
+
id: row.id,
|
|
54
|
+
templateId: row.templateId,
|
|
55
|
+
title: row.title,
|
|
56
|
+
description: row.description,
|
|
57
|
+
severity: row.severity,
|
|
58
|
+
cvssScore: row.cvssScore ?? void 0,
|
|
59
|
+
cvssVector: row.cvssVector ?? void 0,
|
|
60
|
+
category: row.category,
|
|
61
|
+
status: row.status,
|
|
62
|
+
fingerprint: row.fingerprint ?? void 0,
|
|
63
|
+
triageStatus: row.triageStatus ?? void 0,
|
|
64
|
+
timestamp: row.timestamp,
|
|
65
|
+
evidence: {
|
|
66
|
+
request: row.evidenceRequest,
|
|
67
|
+
response: row.evidenceResponse,
|
|
68
|
+
analysis: row.evidenceAnalysis ?? void 0
|
|
69
|
+
},
|
|
70
|
+
verificationSpec: parseJsonColumn(row.verificationSpec),
|
|
71
|
+
impactAssessment,
|
|
72
|
+
...restoreFindingReviewFields(row)
|
|
73
|
+
};
|
|
74
|
+
return record;
|
|
75
|
+
}
|
|
76
|
+
function isNativeRuntime(runtime) {
|
|
77
|
+
return typeof runtime?.executeNative === "function";
|
|
78
|
+
}
|
|
79
|
+
function cycleChoice(items, current, delta) {
|
|
80
|
+
const index = items.indexOf(current);
|
|
81
|
+
const next = index < 0 ? 0 : (index + delta + items.length) % items.length;
|
|
82
|
+
return items[next];
|
|
83
|
+
}
|
|
84
|
+
function describeEventPayload(payload) {
|
|
85
|
+
try {
|
|
86
|
+
const parsed = JSON.parse(payload);
|
|
87
|
+
if (typeof parsed.summary === "string") return fitTuiText(parsed.summary, 120);
|
|
88
|
+
if (typeof parsed.message === "string") return fitTuiText(parsed.message, 120);
|
|
89
|
+
if (typeof parsed.error === "string") return fitTuiText(parsed.error, 120);
|
|
90
|
+
if (typeof parsed.action === "string") return fitTuiText(parsed.action, 120);
|
|
91
|
+
if (typeof parsed.target === "string") return fitTuiUrl(parsed.target, 120);
|
|
92
|
+
} catch {
|
|
93
|
+
}
|
|
94
|
+
return fitTuiText(payload, 120);
|
|
95
|
+
}
|
|
96
|
+
function describeFindingsFilters(options) {
|
|
97
|
+
const filters = [
|
|
98
|
+
options.scan ? `scan:${options.scan}` : null,
|
|
99
|
+
options.severity ? `severity:${options.severity}` : null,
|
|
100
|
+
options.category ? `category:${options.category}` : null,
|
|
101
|
+
options.status ? `status:${options.status}` : null,
|
|
102
|
+
options.triage ? `triage:${options.triage}` : null
|
|
103
|
+
].filter(Boolean);
|
|
104
|
+
return filters.length > 0 ? filters.join(" \xB7 ") : "all findings";
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export {
|
|
108
|
+
formatDuration,
|
|
109
|
+
parseSummary,
|
|
110
|
+
findingRowPriority,
|
|
111
|
+
compareFindingRowsByBusinessPriority,
|
|
112
|
+
findingFromRow,
|
|
113
|
+
isNativeRuntime,
|
|
114
|
+
cycleChoice,
|
|
115
|
+
describeEventPayload,
|
|
116
|
+
describeFindingsFilters
|
|
117
|
+
};
|