0sec-cli 0.24.0 → 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.
Files changed (243) hide show
  1. package/0.js +64 -60
  2. package/README.md +121 -82
  3. package/chunks/{adapt-loop-TEJPXWFG.js → adapt-loop-L2PXCD4J.js} +6 -5
  4. package/chunks/{artifact-scraper-AJZ3LOQY.js → artifact-scraper-W3LGLXBM.js} +4 -3
  5. package/chunks/{assumption-mining-EATDC4BB.js → assumption-mining-7IJ6ZWZE.js} +22 -20
  6. package/chunks/{backend-connections-QE4NASAK.js → backend-connections-MYH4QRQG.js} +5 -4
  7. package/chunks/{chunk-RBOMXUYL.js → chunk-27SXCYWH.js} +1 -1
  8. package/chunks/{chunk-E42XEJTK.js → chunk-2J3STRJT.js} +337 -257
  9. package/chunks/chunk-36J5ZLFE.js +18729 -0
  10. package/chunks/chunk-3DF55BWV.js +49 -0
  11. package/chunks/{chunk-GHEBZKUS.js → chunk-3HMO42M2.js} +1426 -321
  12. package/chunks/{chunk-BIJPMYFA.js → chunk-3T5R7P4T.js} +6 -6
  13. package/chunks/{chunk-RD4FKFWR.js → chunk-5H2PXZ7Q.js} +1 -1
  14. package/chunks/chunk-5XOYTAOK.js +1546 -0
  15. package/chunks/{chunk-QEA2VHBD.js → chunk-6TA3CWND.js} +2656 -2960
  16. package/chunks/{chunk-H76JYUPE.js → chunk-76CLUI54.js} +3 -3
  17. package/chunks/{chunk-KCA35IL3.js → chunk-7PUJI64A.js} +11 -9
  18. package/chunks/{chunk-W6IYTSZH.js → chunk-7TIWL6E5.js} +8 -10
  19. package/chunks/chunk-ABKUI3QB.js +196 -0
  20. package/chunks/{chunk-YORL5S5V.js → chunk-ACYZMJHC.js} +1 -1
  21. package/chunks/{chunk-5FHFG5P2.js → chunk-AL32F74R.js} +1 -1
  22. package/chunks/{chunk-J6G73WYF.js → chunk-B5TIXHCO.js} +1 -1
  23. package/chunks/{chunk-G2EJ3R5I.js → chunk-BWUW6ZQR.js} +2052 -1075
  24. package/chunks/{chunk-3XLEDCFX.js → chunk-C6ZMPXN2.js} +5 -50
  25. package/chunks/{chunk-4TUR47H5.js → chunk-D4IBEO2K.js} +1 -1
  26. package/chunks/{chunk-EXTN4SQV.js → chunk-DHNYJ2ML.js} +1 -1
  27. package/chunks/{chunk-Y7KV7WV6.js → chunk-DJGJECBV.js} +93 -20
  28. package/chunks/{chunk-UHUW45S3.js → chunk-DMDWIW3E.js} +5 -5
  29. package/chunks/{chunk-V5I5GAQH.js → chunk-EEP6GBUO.js} +16037 -34417
  30. package/chunks/{chunk-EYBMTELO.js → chunk-EIONVEFN.js} +208 -29
  31. package/chunks/chunk-EQBC2ZWL.js +2481 -0
  32. package/chunks/{chunk-FKGFHLLS.js → chunk-FI2H6HV2.js} +1 -1
  33. package/chunks/{chunk-4YRXIVPZ.js → chunk-FI5YL4R2.js} +3 -3
  34. package/chunks/{chunk-DNV3ZMPX.js → chunk-FOLTHXRH.js} +1 -1
  35. package/chunks/{chunk-ZPFBQ3SD.js → chunk-GOUGG7IQ.js} +3 -3
  36. package/chunks/{chunk-O3ADFN2A.js → chunk-GXSECFUE.js} +1 -1
  37. package/chunks/{chunk-YYOQADBB.js → chunk-HDJSHLRM.js} +3 -2
  38. package/chunks/{chunk-A3EKBUEM.js → chunk-HFUOUT2B.js} +61232 -30665
  39. package/chunks/chunk-HJKJ4NQP.js +196 -0
  40. package/chunks/{chunk-RPTO5FY2.js → chunk-I4VIAQHM.js} +1 -1
  41. package/chunks/{chunk-A6AZZ6XX.js → chunk-ITEMDJAB.js} +3 -3
  42. package/chunks/chunk-ITHDAIRY.js +57 -0
  43. package/chunks/{chunk-TOFIGQ63.js → chunk-JCRQV4FE.js} +2 -2
  44. package/chunks/{chunk-SQCBHFWN.js → chunk-LWMEJYCP.js} +2 -2
  45. package/chunks/{chunk-52AWIBCT.js → chunk-MY44EZKD.js} +1 -1
  46. package/chunks/{chunk-SGILXLR3.js → chunk-NBLKIQCW.js} +226 -4
  47. package/chunks/chunk-NO543ZBU.js +90 -0
  48. package/chunks/{chunk-CIMN2AO6.js → chunk-OFPF26WL.js} +333 -3
  49. package/chunks/{chunk-YERUDEXT.js → chunk-PAE7ZAV6.js} +2780 -1255
  50. package/chunks/{chunk-V4BD7GSP.js → chunk-PMAKX6KP.js} +2 -2
  51. package/chunks/{chunk-62PGWN7Y.js → chunk-RBTJYREN.js} +8 -171
  52. package/chunks/{chunk-IK27KMVV.js → chunk-RFK5F45W.js} +1 -1
  53. package/chunks/{chunk-554D4AYM.js → chunk-S2WCYEK2.js} +4 -99
  54. package/chunks/{chunk-RZR2XXAK.js → chunk-S3B6HFSM.js} +144 -14
  55. package/chunks/{chunk-WUPN3D37.js → chunk-S4DFH2FJ.js} +26 -1
  56. package/chunks/{chunk-TZRHWP7R.js → chunk-SEWZ76MN.js} +77 -13
  57. package/chunks/{chunk-HRBOZBMC.js → chunk-TFKY6D7O.js} +1 -1
  58. package/chunks/{chunk-TOAAYJVN.js → chunk-WK6VUCKK.js} +3 -333
  59. package/chunks/{chunk-IXT64DV5.js → chunk-XPDJE537.js} +97 -1
  60. package/chunks/{chunk-RCHAFSWS.js → chunk-YXTV2FRE.js} +113 -22
  61. package/chunks/{chunk-TTDFBFNZ.js → chunk-YYFODVZG.js} +6 -10
  62. package/chunks/{chunk-3XLFB46W.js → chunk-ZWAWZU6C.js} +30 -13
  63. package/chunks/{chunk-5POT5OYF.js → chunk-ZZV56ACK.js} +11 -9
  64. package/chunks/{codex-models-FQPCWRPC.js → codex-models-KCUIVS3R.js} +9 -8
  65. package/chunks/{commands-I5L3VD2A.js → commands-MPPAADGY.js} +798 -608
  66. package/chunks/dashboard-MN7GZLLX.js +75 -0
  67. package/chunks/{db-P5EIKMLP.js → db-R2AQSESC.js} +5 -4
  68. package/chunks/{deep-review-I7RD5QSS.js → deep-review-Q6BJKEV4.js} +37 -38
  69. package/chunks/{disclose-PFBWESVJ.js → disclose-GGULOW27.js} +6 -5
  70. package/chunks/{dist-AJU25UXA.js → dist-6RNAVFAY.js} +376 -333
  71. package/chunks/{dist-VK2M4HNW.js → dist-DWN7U5OV.js} +5 -2
  72. package/chunks/{dist-M2X367VW.js → dist-JAZWL3SC.js} +3 -2
  73. package/chunks/{dist-3SWWY5FZ.js → dist-OLGNKDB2.js} +4 -3
  74. package/chunks/{dist-LNXGATR2.js → dist-WNAOCQGA.js} +5 -4
  75. package/chunks/eval-runner-WCTTIYN4.js +38 -0
  76. package/chunks/{exploit-agent-A4RTIJ4J.js → exploit-agent-M3KUMZJH.js} +1 -1
  77. package/chunks/{exploit-autoclimb-ABMMBC3M.js → exploit-autoclimb-QTTWC5WM.js} +1 -1
  78. package/chunks/{exploit-climb-BQ2SVU63.js → exploit-climb-E4KDELTN.js} +4 -3
  79. package/chunks/{fix-4YCLHFDT.js → fix-U5FFJD4F.js} +9 -8
  80. package/chunks/{harness-DHWULEIZ.js → harness-FMKIMEH5.js} +5 -4
  81. package/chunks/{http-conformance-U5F6GKYG.js → http-conformance-AXMUOE6C.js} +3 -2
  82. package/chunks/hunt-scan-RYPWRUQD.js +43 -0
  83. package/chunks/{kernel-primitive-SF4NALVR.js → kernel-primitive-CVG2E7MJ.js} +4 -3
  84. package/chunks/{kernel-vm-runner-WEBEZEIC.js → kernel-vm-runner-62KISULQ.js} +4 -3
  85. package/chunks/{local-engine-XUG7XRKM.js → local-engine-WP3I7K7G.js} +7 -6
  86. package/chunks/managed-operation-642WPTLC.js +59 -0
  87. package/chunks/{memsafety-scan-L2Z7E7TE.js → memsafety-scan-Q2MBZEGJ.js} +1 -2
  88. package/chunks/{native-loop-ZNAELJGB.js → native-loop-HC77R5NQ.js} +31 -16
  89. package/chunks/operator-services-E2NONBQS.js +79 -0
  90. package/chunks/orchestrate-Z3DW265M.js +62 -0
  91. package/chunks/{prepare-SODWQN6O.js → prepare-7DTS6RJT.js} +7 -6
  92. package/chunks/{remote-workflow-runtime-XNNGI2PG.js → remote-workflow-runtime-6CEVRZXS.js} +4 -3
  93. package/chunks/routing-ITJZBJIU.js +61 -0
  94. package/chunks/{runtime-MB4GEFBY.js → runtime-PZJ77QES.js} +9 -8
  95. package/chunks/{runtime-HFFRUOPL.js → runtime-W6JNDQRO.js} +4 -3
  96. package/chunks/{scan-stream-GXBJHCDF.js → scan-stream-6VOJTHTR.js} +6 -4
  97. package/chunks/{scope-M7L3CD6X.js → scope-FHXW6EX6.js} +4 -3
  98. package/chunks/service-plugins-CN6Q2NSN.js +63 -0
  99. package/chunks/{session-store-K7I4GLNH.js → session-store-DBBI544Y.js} +8 -5
  100. package/chunks/{variant-candidates-2KSP5EHH.js → variant-candidates-DPR6DJ3N.js} +9 -8
  101. package/chunks/{web-recon-prepass-RAXXTEWH.js → web-recon-prepass-HWDHDQMN.js} +7 -6
  102. package/chunks/{workflow-runtime-V26HIJO3.js → workflow-runtime-PLB32XC3.js} +50 -49
  103. package/dashboard/assets/{abnfDiagram-VCTEODGH-CGCueOp5.js → abnfDiagram-VCTEODGH-6e39CQKz.js} +1 -1
  104. package/dashboard/assets/{arc-BjZaQcCc.js → arc-ClYun86B.js} +1 -1
  105. package/dashboard/assets/architecture-7GRP2DOG-rM-lWo7E.js +1 -0
  106. package/dashboard/assets/architectureDiagram-5GKGNRK7-C9gEGZIU.js +36 -0
  107. package/dashboard/assets/{blockDiagram-I7D4REHJ-C-byT12_.js → blockDiagram-I7D4REHJ-Dgh2n5Lf.js} +2 -2
  108. package/dashboard/assets/{c4Diagram-7LVT6UL2-DoYjz-Uv.js → c4Diagram-7LVT6UL2-CsorW08z.js} +1 -1
  109. package/dashboard/assets/channel-BBlDqIBl.js +1 -0
  110. package/dashboard/assets/{chunk-4HAMMTFA-NBNp2zdt.js → chunk-4HAMMTFA-4_b_LGGQ.js} +1 -1
  111. package/dashboard/assets/{chunk-75Z2AOVW-BHmkuP0B.js → chunk-75Z2AOVW-qzNlKGCp.js} +1 -1
  112. package/dashboard/assets/chunk-DU6HZSFF-SAPICW28.js +127 -0
  113. package/dashboard/assets/{chunk-F27PBJKO-3wwNFUgZ.js → chunk-F27PBJKO-DlLotIQx.js} +1 -1
  114. package/dashboard/assets/{chunk-FOHPRMQF-DHwB1DNv.js → chunk-FOHPRMQF-COOliuUh.js} +14 -14
  115. package/dashboard/assets/{chunk-GMAD6QVW-Btg7huZW.js → chunk-GMAD6QVW-DNnr65Nb.js} +7 -7
  116. package/dashboard/assets/{chunk-GVQU2GXP-ihCURK5O.js → chunk-GVQU2GXP-DTwv0VfU.js} +1 -1
  117. package/dashboard/assets/{chunk-IMKFNOWR-FsXj7slg.js → chunk-IMKFNOWR-B1fk1q_W.js} +1 -1
  118. package/dashboard/assets/{chunk-L3NEJ4N5-DorFIxJY.js → chunk-L3NEJ4N5-ByVjFIox.js} +1 -1
  119. package/dashboard/assets/{chunk-OSK3NFVY-DKun_KfC.js → chunk-OSK3NFVY-DUDCzjbh.js} +1 -1
  120. package/dashboard/assets/{chunk-P2QGCYS3-XGgiU1Bz.js → chunk-P2QGCYS3-D_D5qEso.js} +1 -1
  121. package/dashboard/assets/{chunk-POPQ4Y6H-BTXEnGhJ.js → chunk-POPQ4Y6H-CetM-tVm.js} +1 -1
  122. package/dashboard/assets/{chunk-PWAF6VOD-DYZcGkTL.js → chunk-PWAF6VOD-BcJX4exl.js} +1 -1
  123. package/dashboard/assets/{chunk-SHT3W25Y-C4WQfwf8.js → chunk-SHT3W25Y-BWQql238.js} +1 -1
  124. package/dashboard/assets/{chunk-SVP7TREG-C4nCh0-1.js → chunk-SVP7TREG-BSLOD1JE.js} +1 -1
  125. package/dashboard/assets/{chunk-TICWLB2K-DSB-IiGc.js → chunk-TICWLB2K-DReOl-g_.js} +2 -2
  126. package/dashboard/assets/{chunk-XXDRQBXY-CS6fjUcj.js → chunk-XXDRQBXY-DSdSMeei.js} +1 -1
  127. package/dashboard/assets/classDiagram-ZZMXUADV-CRH2kB8G.js +1 -0
  128. package/dashboard/assets/classDiagram-v2-VYDZK3BY-CRH2kB8G.js +1 -0
  129. package/dashboard/assets/common-CRRsylCH.js +5 -0
  130. package/dashboard/assets/cose-bilkent-JH36ORCC-fg-DIBqt.js +1 -0
  131. package/dashboard/assets/cynefin-OW5HDTMX-XmrbEIFh.js +1 -0
  132. package/dashboard/assets/{cynefinDiagram-5FMLGOSQ-CgDOOY67.js → cynefinDiagram-5FMLGOSQ-CoQ7QEPl.js} +1 -1
  133. package/dashboard/assets/cytoscape.esm-BbBREfsg.js +321 -0
  134. package/dashboard/assets/dagre-D7JM2Yhv.js +1 -0
  135. package/dashboard/assets/dagre-GXQ25YYZ-qtQtsg6c.js +4 -0
  136. package/dashboard/assets/{diagram-S7CK7UJ4-CrKqRXZb.js → diagram-S7CK7UJ4-B_ts4_58.js} +2 -2
  137. package/dashboard/assets/{diagram-UQ7AKVKN-Cu6Es0-v.js → diagram-UQ7AKVKN-DwHbbxFy.js} +1 -1
  138. package/dashboard/assets/{diagram-VSXAHHWV-eK4d8FwS.js → diagram-VSXAHHWV-2Tg_RG89.js} +1 -1
  139. package/dashboard/assets/{diagram-VX7I27RA-bFxeFKOc.js → diagram-VX7I27RA-BFYp-YjF.js} +1 -1
  140. package/dashboard/assets/{diagram-Z3DM3KII-C0ClmnhC.js → diagram-Z3DM3KII-DrPiS4V0.js} +1 -1
  141. package/dashboard/assets/{dist-BZh8Kb3O.js → dist-cbVssBvx.js} +1 -1
  142. package/dashboard/assets/{ebnfDiagram-PWID7BFC-CUqxFPzf.js → ebnfDiagram-PWID7BFC-DCMOZtU2.js} +1 -1
  143. package/dashboard/assets/{erDiagram-RLTQ6QDP-CcYM7pLi.js → erDiagram-RLTQ6QDP-CW4rUJGU.js} +1 -1
  144. package/dashboard/assets/eventmodeling-NTZA5JFV-C2q-Aaav.js +1 -0
  145. package/dashboard/assets/flowDiagram-HODETNUW-3NOabgG3.js +1 -0
  146. package/dashboard/assets/{ganttDiagram-EL5Y4UJY-UmZfbMyD.js → ganttDiagram-EL5Y4UJY-C1AqcwIF.js} +1 -1
  147. package/dashboard/assets/gitGraph-4MIJSDKK-DYR76gtd.js +1 -0
  148. package/dashboard/assets/{gitGraphDiagram-WWUBYQGX-CvzeCxVy.js → gitGraphDiagram-WWUBYQGX-B7hL98CE.js} +1 -1
  149. package/dashboard/assets/info-A6RAGUB7-TXB43LiH.js +1 -0
  150. package/dashboard/assets/{infoDiagram-27XIBGKW-DjkpNtVW.js → infoDiagram-27XIBGKW-Dk5dXmh_.js} +1 -1
  151. package/dashboard/assets/{ishikawaDiagram-5VMMS53U-8FhjJaWT.js → ishikawaDiagram-5VMMS53U-BQDuNMka.js} +2 -2
  152. package/dashboard/assets/{journeyDiagram-3NMN7TZE-DyNJ755f.js → journeyDiagram-3NMN7TZE-DkustddD.js} +1 -1
  153. package/dashboard/assets/{kanban-definition-UXKFOSKX-_jCmtaY1.js → kanban-definition-UXKFOSKX-BW7Ann84.js} +1 -1
  154. package/dashboard/assets/{katex-BdBmVSus.js → katex-nLxf_RlZ.js} +2 -2
  155. package/dashboard/assets/{line-Bf0nxyWf.js → line-DVxcLeru.js} +1 -1
  156. package/dashboard/assets/linear-DOM_l9bO.js +1 -0
  157. package/dashboard/assets/mermaid-parser.core-CKg9fDvJ.js +7 -0
  158. package/dashboard/assets/{mermaid.core-B4yCwiN-.js → mermaid.core-DruW_5-Y.js} +9 -9
  159. package/dashboard/assets/{mindmap-definition-YA3MSWOX-D5DjWyXj.js → mindmap-definition-YA3MSWOX-Di5W5VB3.js} +1 -1
  160. package/dashboard/assets/operations-B-t_k60U.js +194 -0
  161. package/dashboard/assets/operations-D2ZKZFOF.css +1 -0
  162. package/dashboard/assets/packet-AYTQ26CC-BABwqtNu.js +1 -0
  163. package/dashboard/assets/{pegDiagram-XKGWAZYB-Bf6a1vaf.js → pegDiagram-XKGWAZYB-Cx4ABT6q.js} +1 -1
  164. package/dashboard/assets/pie-WAS4IAKB-CNdXyrze.js +1 -0
  165. package/dashboard/assets/{pieDiagram-E7YTZNPT-D0L1qbch.js → pieDiagram-E7YTZNPT-BilfQbIs.js} +1 -1
  166. package/dashboard/assets/{quadrantDiagram-AXDQQJYC-CbFyy2Pe.js → quadrantDiagram-AXDQQJYC-BVmMQHE5.js} +1 -1
  167. package/dashboard/assets/radar-RG4KPBEZ-fKNmDeoK.js +1 -0
  168. package/dashboard/assets/railroad-74A4TZTK-DhcvDCOh.js +1 -0
  169. package/dashboard/assets/railroad-abnf-HS5TGJTU-BTRVAmf0.js +1 -0
  170. package/dashboard/assets/railroad-ebnf-LZEXJU2U-CwS8fgC_.js +1 -0
  171. package/dashboard/assets/railroad-peg-WCYAUIDC-CXuhXlNp.js +1 -0
  172. package/dashboard/assets/{railroadDiagram-O6MQD6OU-t7Gp9g2R.js → railroadDiagram-O6MQD6OU-DnBru-jf.js} +1 -1
  173. package/dashboard/assets/{requirementDiagram-BXWQKSXE-LYmqeBXi.js → requirementDiagram-BXWQKSXE-FwdvUZ7_.js} +1 -1
  174. package/dashboard/assets/{sankeyDiagram-P5KCCOFB-DnpfA_94.js → sankeyDiagram-P5KCCOFB-BQvDORai.js} +1 -1
  175. package/dashboard/assets/{sequenceDiagram-WJ2MYXX4-C8s3pTUE.js → sequenceDiagram-WJ2MYXX4-FWYQLzcY.js} +2 -2
  176. package/dashboard/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
  177. package/dashboard/assets/src-BwkPhlcp.js +1 -0
  178. package/dashboard/assets/{stateDiagram-D77RDMKH-BMzm6fK1.js → stateDiagram-D77RDMKH-CjPBd_Sa.js} +1 -1
  179. package/dashboard/assets/stateDiagram-v2-MP3YSRHH-DHmenujm.js +1 -0
  180. package/dashboard/assets/swimlanes-42K2YHIH-SQLNsa4J.js +1 -0
  181. package/dashboard/assets/swimlanesDiagram-VR7AAH4N-D1bH4ETZ.js +8 -0
  182. package/dashboard/assets/{timeline-definition-24CTP7MA-BfLJMVeG.js → timeline-definition-24CTP7MA-BxCf20k1.js} +1 -1
  183. package/dashboard/assets/treeView-Q6P3EWNA-BGLYAyGp.js +1 -0
  184. package/dashboard/assets/treemap-WGGIJYW6-BlzAwncU.js +1 -0
  185. package/dashboard/assets/{vennDiagram-4TSXK5OY-BYJRHEaL.js → vennDiagram-4TSXK5OY-D76RIZLz.js} +1 -1
  186. package/dashboard/assets/wardley-WFR3VGLG-Ba_reiVw.js +1 -0
  187. package/dashboard/assets/{wardleyDiagram-VM6X3IG4-DgPN4nSe.js → wardleyDiagram-VM6X3IG4-Cux4coOD.js} +1 -1
  188. package/dashboard/assets/{xychartDiagram-S5SC5T6Z-BhkAMAOT.js → xychartDiagram-S5SC5T6Z-Ch5mvnlH.js} +1 -1
  189. package/dashboard/index.html +2 -2
  190. package/package.json +2 -5
  191. package/chunks/chunk-AV5BF4V7.js +0 -4304
  192. package/chunks/chunk-CSPF47S3.js +0 -6027
  193. package/chunks/chunk-ESM447R6.js +0 -77
  194. package/chunks/chunk-FEOPHBMY.js +0 -56
  195. package/chunks/chunk-GNR3APR6.js +0 -295
  196. package/chunks/chunk-IIBNQTOK.js +0 -1532
  197. package/chunks/chunk-JSTLXPJS.js +0 -284
  198. package/chunks/chunk-NJLKFC66.js +0 -4790
  199. package/chunks/chunk-O7Q2G2KW.js +0 -117
  200. package/chunks/chunk-VIT5ALXF.js +0 -4054
  201. package/chunks/chunk-YJU7QACE.js +0 -279
  202. package/chunks/dashboard-B2AEGCFM.js +0 -76
  203. package/chunks/eval-runner-XVRX3R2Y.js +0 -31
  204. package/chunks/hunt-scan-DXV5H6YN.js +0 -40
  205. package/chunks/managed-operation-SQFMBWHG.js +0 -60
  206. package/chunks/orchestrate-YHFJXGID.js +0 -63
  207. package/chunks/run-5T4Z3Q2D.js +0 -28242
  208. package/chunks/service-plugins-BGS6QKSZ.js +0 -64
  209. package/dashboard/assets/architecture-7GRP2DOG-hcbO-9zX.js +0 -1
  210. package/dashboard/assets/architectureDiagram-5GKGNRK7-DReOXTSq.js +0 -36
  211. package/dashboard/assets/channel-CUURBnpZ.js +0 -1
  212. package/dashboard/assets/chunk-DU6HZSFF-DgfLNaL2.js +0 -127
  213. package/dashboard/assets/classDiagram-ZZMXUADV-CD1Buc26.js +0 -1
  214. package/dashboard/assets/classDiagram-v2-VYDZK3BY-CD1Buc26.js +0 -1
  215. package/dashboard/assets/common-BMdQBwfR.js +0 -5
  216. package/dashboard/assets/cose-bilkent-JH36ORCC-CUjQHTML.js +0 -1
  217. package/dashboard/assets/cynefin-OW5HDTMX-BC7zCtFq.js +0 -1
  218. package/dashboard/assets/cytoscape.esm-CGd-uY3x.js +0 -321
  219. package/dashboard/assets/dagre-GXQ25YYZ-Dqc8FS9x.js +0 -4
  220. package/dashboard/assets/dagre-PrKaheQc.js +0 -1
  221. package/dashboard/assets/eventmodeling-NTZA5JFV-D8ZNnPkV.js +0 -1
  222. package/dashboard/assets/flowDiagram-HODETNUW-pDb1AYm8.js +0 -1
  223. package/dashboard/assets/gitGraph-4MIJSDKK-mvNUo0ZA.js +0 -1
  224. package/dashboard/assets/info-A6RAGUB7-DChKqZMi.js +0 -1
  225. package/dashboard/assets/linear-Bl6JKbf4.js +0 -1
  226. package/dashboard/assets/mermaid-parser.core-Cc6sgCzs.js +0 -7
  227. package/dashboard/assets/operations-B7JAWOi6.js +0 -130
  228. package/dashboard/assets/operations-QjKT0Hwi.css +0 -1
  229. package/dashboard/assets/packet-AYTQ26CC-bQXLDhQC.js +0 -1
  230. package/dashboard/assets/pie-WAS4IAKB-DfzoABIi.js +0 -1
  231. package/dashboard/assets/radar-RG4KPBEZ-CZ2pyeUT.js +0 -1
  232. package/dashboard/assets/railroad-74A4TZTK-CP4Jazfd.js +0 -1
  233. package/dashboard/assets/railroad-abnf-HS5TGJTU-3MvEiHwD.js +0 -1
  234. package/dashboard/assets/railroad-ebnf-LZEXJU2U-BWto6cXE.js +0 -1
  235. package/dashboard/assets/railroad-peg-WCYAUIDC-DasEjbyf.js +0 -1
  236. package/dashboard/assets/sizeCapture-INFHLROL-B0uUizjq.js +0 -1
  237. package/dashboard/assets/src-CaNUT1AQ.js +0 -1
  238. package/dashboard/assets/stateDiagram-v2-MP3YSRHH-B3REMjpY.js +0 -1
  239. package/dashboard/assets/swimlanes-42K2YHIH-uJE05Tt_.js +0 -1
  240. package/dashboard/assets/swimlanesDiagram-VR7AAH4N-CIaVMZEy.js +0 -8
  241. package/dashboard/assets/treeView-Q6P3EWNA-ZOE2enu2.js +0 -1
  242. package/dashboard/assets/treemap-WGGIJYW6-yIZoPBF5.js +0 -1
  243. package/dashboard/assets/wardley-WFR3VGLG-D5V-jLbB.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
- jitterFor
6
- } from "./chunk-CIMN2AO6.js";
7
- import {
8
- scanExecutionSignal
9
- } from "./chunk-YYOQADBB.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-RZR2XXAK.js";
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(sql) {
95
- return new StatementShim(this.engine.prepare(sql));
94
+ prepare(sql2) {
95
+ return new StatementShim(this.engine.prepare(sql2));
96
96
  }
97
- exec(sql) {
98
- this.engine.exec(sql);
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 = (sql) => {
161
- let initial = wasm.prepare(sql);
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(sql);
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: (sql) => wrapStatement(sql),
199
- exec: (sql) => {
200
- wasm.exec(sql);
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: (sql) => wrapStatement(db.prepare(sql)),
234
- exec: (sql) => {
235
- db.exec(sql);
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 fingerprint = (links) => JSON.stringify([...links].sort((a, b) => a.path.localeCompare(b.path) || a.hash.localeCompare(b.hash)));
3016
- 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(input.projectId, input.summary);
3017
- for (const row of matching) {
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
- } from "./chunk-V5I5GAQH.js";
10
- import {
8
+ agenticScan,
9
+ getToolsForRole,
11
10
  runAgentLoop
12
- } from "./chunk-CSPF47S3.js";
13
- import {
14
- getToolsForRole
15
- } from "./chunk-A3EKBUEM.js";
11
+ } from "./chunk-HFUOUT2B.js";
16
12
  import {
17
13
  createRuntime
18
- } from "./chunk-EXTN4SQV.js";
14
+ } from "./chunk-DHNYJ2ML.js";
19
15
  import {
20
16
  osecDB
21
- } from "./chunk-RCHAFSWS.js";
17
+ } from "./chunk-YXTV2FRE.js";
22
18
  import {
23
19
  LlmApiRuntime
24
- } from "./chunk-EYBMTELO.js";
20
+ } from "./chunk-EIONVEFN.js";
25
21
 
26
22
  // packages/cli/src/commands/orchestrate.ts
27
23
  import { randomUUID } from "node:crypto";