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.
Files changed (243) hide show
  1. package/0.js +64 -60
  2. package/README.md +121 -82
  3. package/chunks/{adapt-loop-L77BWMNE.js → adapt-loop-L2PXCD4J.js} +6 -5
  4. package/chunks/{artifact-scraper-BV67RAP5.js → artifact-scraper-W3LGLXBM.js} +4 -3
  5. package/chunks/{assumption-mining-RPVR77A3.js → assumption-mining-7IJ6ZWZE.js} +22 -20
  6. package/chunks/{backend-connections-ACIXNYZN.js → backend-connections-MYH4QRQG.js} +5 -4
  7. package/chunks/{chunk-QNRYOJEB.js → chunk-27SXCYWH.js} +1 -1
  8. package/chunks/{chunk-PJU24AKR.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-F2P25DJY.js → chunk-3HMO42M2.js} +1417 -316
  12. package/chunks/{chunk-PVJUPIQG.js → chunk-3T5R7P4T.js} +6 -6
  13. package/chunks/{chunk-SU4IHQQI.js → chunk-5H2PXZ7Q.js} +1 -1
  14. package/chunks/chunk-5XOYTAOK.js +1546 -0
  15. package/chunks/{chunk-X2IPO5JO.js → chunk-6TA3CWND.js} +2656 -2960
  16. package/chunks/{chunk-TVS6WVSK.js → chunk-76CLUI54.js} +3 -3
  17. package/chunks/{chunk-KCA35IL3.js → chunk-7PUJI64A.js} +11 -9
  18. package/chunks/{chunk-2NBZZFRG.js → chunk-7TIWL6E5.js} +8 -10
  19. package/chunks/chunk-ABKUI3QB.js +196 -0
  20. package/chunks/{chunk-3LPBJMHB.js → chunk-ACYZMJHC.js} +1 -1
  21. package/chunks/{chunk-H5QURBBK.js → chunk-AL32F74R.js} +1 -1
  22. package/chunks/{chunk-RURJYCWY.js → chunk-B5TIXHCO.js} +1 -1
  23. package/chunks/{chunk-GZA7RGK7.js → chunk-BWUW6ZQR.js} +2052 -1075
  24. package/chunks/{chunk-I43YYHDU.js → chunk-C6ZMPXN2.js} +5 -50
  25. package/chunks/{chunk-ILRMLA6J.js → chunk-D4IBEO2K.js} +1 -1
  26. package/chunks/{chunk-K74DRDC5.js → chunk-DHNYJ2ML.js} +1 -1
  27. package/chunks/{chunk-YKWARO3T.js → chunk-DJGJECBV.js} +93 -20
  28. package/chunks/{chunk-RVJVM5L4.js → chunk-DMDWIW3E.js} +5 -5
  29. package/chunks/{chunk-ZM6ANQZJ.js → chunk-EEP6GBUO.js} +16037 -34417
  30. package/chunks/{chunk-IJ6UPW3H.js → chunk-EIONVEFN.js} +208 -29
  31. package/chunks/chunk-EQBC2ZWL.js +2481 -0
  32. package/chunks/{chunk-3WUPCZGF.js → chunk-FI2H6HV2.js} +1 -1
  33. package/chunks/{chunk-5NFIY2SJ.js → chunk-FI5YL4R2.js} +3 -3
  34. package/chunks/{chunk-XA2IBHPB.js → chunk-FOLTHXRH.js} +1 -1
  35. package/chunks/{chunk-CJRZSWII.js → chunk-GOUGG7IQ.js} +3 -3
  36. package/chunks/{chunk-NBV4I237.js → chunk-GXSECFUE.js} +1 -1
  37. package/chunks/{chunk-BD7WULFS.js → chunk-HDJSHLRM.js} +3 -2
  38. package/chunks/{chunk-5WAHHZBF.js → chunk-HFUOUT2B.js} +61232 -30665
  39. package/chunks/chunk-HJKJ4NQP.js +196 -0
  40. package/chunks/{chunk-UJE4WOQS.js → chunk-I4VIAQHM.js} +1 -1
  41. package/chunks/{chunk-5ETI27Q3.js → chunk-ITEMDJAB.js} +3 -3
  42. package/chunks/chunk-ITHDAIRY.js +57 -0
  43. package/chunks/{chunk-R2XBH476.js → chunk-JCRQV4FE.js} +2 -2
  44. package/chunks/{chunk-SQCBHFWN.js → chunk-LWMEJYCP.js} +2 -2
  45. package/chunks/{chunk-5PFRE522.js → chunk-MY44EZKD.js} +1 -1
  46. package/chunks/{chunk-7UHAXEOV.js → chunk-NBLKIQCW.js} +226 -4
  47. package/chunks/chunk-NO543ZBU.js +90 -0
  48. package/chunks/{chunk-X2ZMSRTP.js → chunk-OFPF26WL.js} +333 -3
  49. package/chunks/{chunk-YERUDEXT.js → chunk-PAE7ZAV6.js} +2780 -1255
  50. package/chunks/{chunk-S2GITRD5.js → chunk-PMAKX6KP.js} +2 -2
  51. package/chunks/{chunk-LMP2T4G2.js → chunk-RBTJYREN.js} +8 -171
  52. package/chunks/{chunk-CGBDEST2.js → chunk-RFK5F45W.js} +1 -1
  53. package/chunks/{chunk-GTED3FSZ.js → chunk-S2WCYEK2.js} +4 -99
  54. package/chunks/{chunk-GXXX7AGH.js → chunk-S3B6HFSM.js} +144 -14
  55. package/chunks/{chunk-WUPN3D37.js → chunk-S4DFH2FJ.js} +26 -1
  56. package/chunks/{chunk-Q7JKIKKF.js → chunk-SEWZ76MN.js} +77 -13
  57. package/chunks/{chunk-6XMFCVJS.js → chunk-TFKY6D7O.js} +1 -1
  58. package/chunks/{chunk-BOBIAHKA.js → chunk-WK6VUCKK.js} +3 -333
  59. package/chunks/{chunk-IXT64DV5.js → chunk-XPDJE537.js} +97 -1
  60. package/chunks/{chunk-BMDG6T7D.js → chunk-YXTV2FRE.js} +113 -22
  61. package/chunks/{chunk-SZDD77KX.js → chunk-YYFODVZG.js} +6 -10
  62. package/chunks/{chunk-JWSOUKFF.js → chunk-ZWAWZU6C.js} +30 -13
  63. package/chunks/{chunk-GV5WXDHY.js → chunk-ZZV56ACK.js} +11 -9
  64. package/chunks/{codex-models-6XVNFRXZ.js → codex-models-KCUIVS3R.js} +9 -8
  65. package/chunks/{commands-FRPOFIO4.js → commands-MPPAADGY.js} +798 -608
  66. package/chunks/dashboard-MN7GZLLX.js +75 -0
  67. package/chunks/{db-BXJNWUYJ.js → db-R2AQSESC.js} +5 -4
  68. package/chunks/{deep-review-GSJEBLCG.js → deep-review-Q6BJKEV4.js} +37 -38
  69. package/chunks/{disclose-OU6Z6GVT.js → disclose-GGULOW27.js} +6 -5
  70. package/chunks/{dist-TQMHMSBZ.js → dist-6RNAVFAY.js} +376 -333
  71. package/chunks/{dist-7KSYDDSG.js → dist-DWN7U5OV.js} +5 -2
  72. package/chunks/{dist-M2X367VW.js → dist-JAZWL3SC.js} +3 -2
  73. package/chunks/{dist-RKLQIXDT.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-Y2P4GFIY.js → exploit-agent-M3KUMZJH.js} +1 -1
  77. package/chunks/{exploit-autoclimb-YRZ3TMS2.js → exploit-autoclimb-QTTWC5WM.js} +1 -1
  78. package/chunks/{exploit-climb-4LEY4SDW.js → exploit-climb-E4KDELTN.js} +4 -3
  79. package/chunks/{fix-RQSIG75B.js → fix-U5FFJD4F.js} +9 -8
  80. package/chunks/{harness-3NVC3DDY.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-T47V3RD3.js → kernel-primitive-CVG2E7MJ.js} +4 -3
  84. package/chunks/{kernel-vm-runner-AEL5E3SV.js → kernel-vm-runner-62KISULQ.js} +4 -3
  85. package/chunks/{local-engine-ZCW4YC6E.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-26X2CHBV.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-C3KGMBXT.js → prepare-7DTS6RJT.js} +7 -6
  92. package/chunks/{remote-workflow-runtime-DB52SINR.js → remote-workflow-runtime-6CEVRZXS.js} +4 -3
  93. package/chunks/routing-ITJZBJIU.js +61 -0
  94. package/chunks/{runtime-U66JNSAY.js → runtime-PZJ77QES.js} +9 -8
  95. package/chunks/{runtime-AUBLQUOH.js → runtime-W6JNDQRO.js} +4 -3
  96. package/chunks/{scan-stream-34F3LTPV.js → scan-stream-6VOJTHTR.js} +6 -4
  97. package/chunks/{scope-HSTG63TQ.js → scope-FHXW6EX6.js} +4 -3
  98. package/chunks/service-plugins-CN6Q2NSN.js +63 -0
  99. package/chunks/{session-store-MKAAP3WL.js → session-store-DBBI544Y.js} +8 -5
  100. package/chunks/{variant-candidates-LG767HWH.js → variant-candidates-DPR6DJ3N.js} +9 -8
  101. package/chunks/{web-recon-prepass-NJP6J3E4.js → web-recon-prepass-HWDHDQMN.js} +7 -6
  102. package/chunks/{workflow-runtime-AR627I26.js → workflow-runtime-PLB32XC3.js} +50 -49
  103. package/dashboard/assets/{abnfDiagram-VCTEODGH-Cq149Jpk.js → abnfDiagram-VCTEODGH-6e39CQKz.js} +1 -1
  104. package/dashboard/assets/{arc-CpP-3TRW.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-CZYkRRDi.js → blockDiagram-I7D4REHJ-Dgh2n5Lf.js} +2 -2
  108. package/dashboard/assets/{c4Diagram-7LVT6UL2-CV7Iu3_Z.js → c4Diagram-7LVT6UL2-CsorW08z.js} +1 -1
  109. package/dashboard/assets/channel-BBlDqIBl.js +1 -0
  110. package/dashboard/assets/{chunk-4HAMMTFA-PKCyW4m-.js → chunk-4HAMMTFA-4_b_LGGQ.js} +1 -1
  111. package/dashboard/assets/{chunk-75Z2AOVW-C5MlFTc_.js → chunk-75Z2AOVW-qzNlKGCp.js} +1 -1
  112. package/dashboard/assets/chunk-DU6HZSFF-SAPICW28.js +127 -0
  113. package/dashboard/assets/{chunk-F27PBJKO-DTAok0qM.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-CPsr2F33.js → chunk-GMAD6QVW-DNnr65Nb.js} +7 -7
  116. package/dashboard/assets/{chunk-GVQU2GXP-C2AXGf9A.js → chunk-GVQU2GXP-DTwv0VfU.js} +1 -1
  117. package/dashboard/assets/{chunk-IMKFNOWR-DMG6yD_O.js → chunk-IMKFNOWR-B1fk1q_W.js} +1 -1
  118. package/dashboard/assets/{chunk-L3NEJ4N5-BSvwdbXx.js → chunk-L3NEJ4N5-ByVjFIox.js} +1 -1
  119. package/dashboard/assets/{chunk-OSK3NFVY-CfB8V7FU.js → chunk-OSK3NFVY-DUDCzjbh.js} +1 -1
  120. package/dashboard/assets/{chunk-P2QGCYS3-CvmZvq6n.js → chunk-P2QGCYS3-D_D5qEso.js} +1 -1
  121. package/dashboard/assets/{chunk-POPQ4Y6H-D_TvwDxL.js → chunk-POPQ4Y6H-CetM-tVm.js} +1 -1
  122. package/dashboard/assets/{chunk-PWAF6VOD-Da5GnuOY.js → chunk-PWAF6VOD-BcJX4exl.js} +1 -1
  123. package/dashboard/assets/{chunk-SHT3W25Y-CcsMJpR-.js → chunk-SHT3W25Y-BWQql238.js} +1 -1
  124. package/dashboard/assets/{chunk-SVP7TREG-COojjieJ.js → chunk-SVP7TREG-BSLOD1JE.js} +1 -1
  125. package/dashboard/assets/{chunk-TICWLB2K-nBAmJwx6.js → chunk-TICWLB2K-DReOl-g_.js} +2 -2
  126. package/dashboard/assets/{chunk-XXDRQBXY-r5HyhWDv.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-xodkuQtW.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-DNoTMlCO.js → diagram-S7CK7UJ4-B_ts4_58.js} +2 -2
  137. package/dashboard/assets/{diagram-UQ7AKVKN-COccuyew.js → diagram-UQ7AKVKN-DwHbbxFy.js} +1 -1
  138. package/dashboard/assets/{diagram-VSXAHHWV-g6D1tWRb.js → diagram-VSXAHHWV-2Tg_RG89.js} +1 -1
  139. package/dashboard/assets/{diagram-VX7I27RA-DhO4eVIC.js → diagram-VX7I27RA-BFYp-YjF.js} +1 -1
  140. package/dashboard/assets/{diagram-Z3DM3KII-DeOQFexd.js → diagram-Z3DM3KII-DrPiS4V0.js} +1 -1
  141. package/dashboard/assets/{dist-BQYeOQg3.js → dist-cbVssBvx.js} +1 -1
  142. package/dashboard/assets/{ebnfDiagram-PWID7BFC-MtkX2feM.js → ebnfDiagram-PWID7BFC-DCMOZtU2.js} +1 -1
  143. package/dashboard/assets/{erDiagram-RLTQ6QDP-DIWSsoYZ.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-DKggkJe0.js → ganttDiagram-EL5Y4UJY-C1AqcwIF.js} +1 -1
  147. package/dashboard/assets/gitGraph-4MIJSDKK-DYR76gtd.js +1 -0
  148. package/dashboard/assets/{gitGraphDiagram-WWUBYQGX-r_iR8Qzo.js → gitGraphDiagram-WWUBYQGX-B7hL98CE.js} +1 -1
  149. package/dashboard/assets/info-A6RAGUB7-TXB43LiH.js +1 -0
  150. package/dashboard/assets/{infoDiagram-27XIBGKW-ClQk7UyQ.js → infoDiagram-27XIBGKW-Dk5dXmh_.js} +1 -1
  151. package/dashboard/assets/{ishikawaDiagram-5VMMS53U-tR7Vziog.js → ishikawaDiagram-5VMMS53U-BQDuNMka.js} +2 -2
  152. package/dashboard/assets/{journeyDiagram-3NMN7TZE-Cpb9IqKL.js → journeyDiagram-3NMN7TZE-DkustddD.js} +1 -1
  153. package/dashboard/assets/{kanban-definition-UXKFOSKX-BzUuKbA9.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-BHY_tSHu.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-D_QsUPU8.js → mermaid.core-DruW_5-Y.js} +9 -9
  159. package/dashboard/assets/{mindmap-definition-YA3MSWOX-CtfLTPPJ.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-C1Dclbzj.js → pegDiagram-XKGWAZYB-Cx4ABT6q.js} +1 -1
  164. package/dashboard/assets/pie-WAS4IAKB-CNdXyrze.js +1 -0
  165. package/dashboard/assets/{pieDiagram-E7YTZNPT-Cd7XwYo5.js → pieDiagram-E7YTZNPT-BilfQbIs.js} +1 -1
  166. package/dashboard/assets/{quadrantDiagram-AXDQQJYC-CaS-GQ4X.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-BeesTrqn.js → railroadDiagram-O6MQD6OU-DnBru-jf.js} +1 -1
  173. package/dashboard/assets/{requirementDiagram-BXWQKSXE-IjyK0DhW.js → requirementDiagram-BXWQKSXE-FwdvUZ7_.js} +1 -1
  174. package/dashboard/assets/{sankeyDiagram-P5KCCOFB-DmIluQqo.js → sankeyDiagram-P5KCCOFB-BQvDORai.js} +1 -1
  175. package/dashboard/assets/{sequenceDiagram-WJ2MYXX4-CUp8ZjTc.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-Dy9TQb8P.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-BGdXW-iY.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-DzKWHJsl.js → vennDiagram-4TSXK5OY-D76RIZLz.js} +1 -1
  186. package/dashboard/assets/wardley-WFR3VGLG-Ba_reiVw.js +1 -0
  187. package/dashboard/assets/{wardleyDiagram-VM6X3IG4-DGsjYmNJ.js → wardleyDiagram-VM6X3IG4-Cux4coOD.js} +1 -1
  188. package/dashboard/assets/{xychartDiagram-S5SC5T6Z-C7_T_tWt.js → xychartDiagram-S5SC5T6Z-Ch5mvnlH.js} +1 -1
  189. package/dashboard/index.html +2 -2
  190. package/package.json +2 -5
  191. package/chunks/chunk-2XGBEH53.js +0 -4304
  192. package/chunks/chunk-4ROZFLSR.js +0 -279
  193. package/chunks/chunk-56UTQKXO.js +0 -56
  194. package/chunks/chunk-BPU6M42R.js +0 -77
  195. package/chunks/chunk-IIBNQTOK.js +0 -1532
  196. package/chunks/chunk-NJLKFC66.js +0 -4790
  197. package/chunks/chunk-OOMBOLAF.js +0 -295
  198. package/chunks/chunk-VIT5ALXF.js +0 -4054
  199. package/chunks/chunk-VU7V2SDW.js +0 -284
  200. package/chunks/chunk-W624J7NF.js +0 -117
  201. package/chunks/chunk-YSQWZ67M.js +0 -6027
  202. package/chunks/dashboard-5HDSNBAU.js +0 -76
  203. package/chunks/eval-runner-A2DIGVP7.js +0 -31
  204. package/chunks/hunt-scan-W246VWJC.js +0 -40
  205. package/chunks/managed-operation-6R2QPPW5.js +0 -60
  206. package/chunks/orchestrate-OBS37FWQ.js +0 -63
  207. package/chunks/run-MU3MFL2Z.js +0 -28242
  208. package/chunks/service-plugins-5B23PWXC.js +0 -64
  209. package/dashboard/assets/architecture-7GRP2DOG-z5EHYkyH.js +0 -1
  210. package/dashboard/assets/architectureDiagram-5GKGNRK7-ewtXpjR_.js +0 -36
  211. package/dashboard/assets/channel-CuYjfiC5.js +0 -1
  212. package/dashboard/assets/chunk-DU6HZSFF-3M37ulcO.js +0 -127
  213. package/dashboard/assets/classDiagram-ZZMXUADV-DCuOrWUV.js +0 -1
  214. package/dashboard/assets/classDiagram-v2-VYDZK3BY-DCuOrWUV.js +0 -1
  215. package/dashboard/assets/common-C6snVPsk.js +0 -5
  216. package/dashboard/assets/cose-bilkent-JH36ORCC-BLGcaZHk.js +0 -1
  217. package/dashboard/assets/cynefin-OW5HDTMX-DbZMK00I.js +0 -1
  218. package/dashboard/assets/cytoscape.esm-CGd-uY3x.js +0 -321
  219. package/dashboard/assets/dagre-GXQ25YYZ-CRk9qfSG.js +0 -4
  220. package/dashboard/assets/dagre-PrKaheQc.js +0 -1
  221. package/dashboard/assets/eventmodeling-NTZA5JFV-D_3ez4Gv.js +0 -1
  222. package/dashboard/assets/flowDiagram-HODETNUW-D2boyYEd.js +0 -1
  223. package/dashboard/assets/gitGraph-4MIJSDKK-DFOQYwXc.js +0 -1
  224. package/dashboard/assets/info-A6RAGUB7-DeednLoB.js +0 -1
  225. package/dashboard/assets/linear-naZZ1pHk.js +0 -1
  226. package/dashboard/assets/mermaid-parser.core-CPvd4cEx.js +0 -7
  227. package/dashboard/assets/operations-BwCzhVnT.js +0 -130
  228. package/dashboard/assets/operations-QjKT0Hwi.css +0 -1
  229. package/dashboard/assets/packet-AYTQ26CC-DDQbkT9I.js +0 -1
  230. package/dashboard/assets/pie-WAS4IAKB-LpU4ULAs.js +0 -1
  231. package/dashboard/assets/radar-RG4KPBEZ-CcxW3NJm.js +0 -1
  232. package/dashboard/assets/railroad-74A4TZTK-9P5Rl8fP.js +0 -1
  233. package/dashboard/assets/railroad-abnf-HS5TGJTU-CSfpwjna.js +0 -1
  234. package/dashboard/assets/railroad-ebnf-LZEXJU2U-D6R5qzr-.js +0 -1
  235. package/dashboard/assets/railroad-peg-WCYAUIDC-DKEX7ITG.js +0 -1
  236. package/dashboard/assets/sizeCapture-INFHLROL-B0uUizjq.js +0 -1
  237. package/dashboard/assets/src-r61wDjcA.js +0 -1
  238. package/dashboard/assets/stateDiagram-v2-MP3YSRHH-CQb0ZtPr.js +0 -1
  239. package/dashboard/assets/swimlanes-42K2YHIH-CZuDV7V5.js +0 -1
  240. package/dashboard/assets/swimlanesDiagram-VR7AAH4N-BxgWMq8X.js +0 -8
  241. package/dashboard/assets/treeView-Q6P3EWNA-DlRrayjM.js +0 -1
  242. package/dashboard/assets/treemap-WGGIJYW6-C6UqLKfI.js +0 -1
  243. package/dashboard/assets/wardley-WFR3VGLG-thmyHKb0.js +0 -1
@@ -3,7 +3,7 @@ import { createRequire as __0CreateRequire } from "node:module";
3
3
  const require = __0CreateRequire(import.meta.url);
4
4
  import {
5
5
  external_exports
6
- } from "./chunk-VIT5ALXF.js";
6
+ } from "./chunk-5XOYTAOK.js";
7
7
 
8
8
  // packages/shared/dist/types.js
9
9
  function validateScanPlan(plan) {
@@ -67,7 +67,7 @@ import { fileURLToPath } from "node:url";
67
67
  import { dirname, join } from "node:path";
68
68
  function loadVersion() {
69
69
  if (true) {
70
- return "0.24.1";
70
+ return "0.25.0";
71
71
  }
72
72
  try {
73
73
  const here = dirname(fileURLToPath(import.meta.url));
@@ -573,7 +573,7 @@ var pocStepActionSchema = external_exports.discriminatedUnion("type", [
573
573
  type: external_exports.literal("http"),
574
574
  method: external_exports.string(),
575
575
  url: external_exports.string(),
576
- headers: external_exports.record(external_exports.string()).optional(),
576
+ headers: external_exports.record(external_exports.string(), external_exports.string()).optional(),
577
577
  body: external_exports.string().optional()
578
578
  }),
579
579
  external_exports.object({
@@ -970,7 +970,7 @@ var AgentActionTargetMetadataSchema = external_exports.object({
970
970
  target_version: external_exports.string().min(1),
971
971
  policy_version: external_exports.string().min(1),
972
972
  model_version: external_exports.string().min(1),
973
- tool_versions: external_exports.record(external_exports.string().min(1)),
973
+ tool_versions: external_exports.record(external_exports.string(), external_exports.string().min(1)),
974
974
  configuration_sha256: Sha256Schema
975
975
  }).strict();
976
976
  var AgentActionToolCallSchema = external_exports.object({
@@ -1126,7 +1126,7 @@ var questionSchema = external_exports.discriminatedUnion("type", [
1126
1126
  ]);
1127
1127
  var normalizedAnswerSchema = external_exports.discriminatedUnion("type", [
1128
1128
  external_exports.object({ type: external_exports.literal("boolean"), probability }),
1129
- external_exports.object({ type: external_exports.literal("choice"), choice: external_exports.string(), probabilities: external_exports.record(probability) })
1129
+ external_exports.object({ type: external_exports.literal("choice"), choice: external_exports.string(), probabilities: external_exports.record(external_exports.string(), probability) })
1130
1130
  ]);
1131
1131
  var usageSchema = external_exports.object({
1132
1132
  inputTokens: external_exports.number().int().nonnegative().max(MAX_INPUT_TOKENS),
@@ -1219,14 +1219,14 @@ function createJevEvaluator(config) {
1219
1219
  });
1220
1220
  if (!response.ok)
1221
1221
  throw new Error(`Jev provider returned HTTP ${response.status}`);
1222
- const body = external_exports.object({ model: external_exports.string().min(1), answers: external_exports.record(external_exports.unknown()), usage: usageSchema }).parse(await response.json());
1222
+ const body = external_exports.object({ model: external_exports.string().min(1), answers: external_exports.record(external_exports.string(), external_exports.unknown()), usage: usageSchema }).parse(await response.json());
1223
1223
  model = body.model;
1224
1224
  rawUsage = body.usage;
1225
1225
  rawAnswers = body.answers;
1226
1226
  } else {
1227
1227
  const [{ experimental_evaluate: evaluate }, { createGateway }] = await Promise.all([
1228
- import("./dist-LNXGATR2.js"),
1229
- import("./dist-M2X367VW.js")
1228
+ import("./dist-WNAOCQGA.js"),
1229
+ import("./dist-JAZWL3SC.js")
1230
1230
  ]);
1231
1231
  signal.throwIfAborted();
1232
1232
  const gateway = createGateway({ apiKey: config.apiKey, fetch: fetchImpl });
@@ -1601,7 +1601,7 @@ var SecurityWorkflowBindingsSchema = external_exports.unknown().superRefine((bin
1601
1601
  }
1602
1602
  if (new TextEncoder().encode(JSON.stringify(bindings)).byteLength > 32768)
1603
1603
  context.addIssue({ code: external_exports.ZodIssueCode.custom, message: "Workflow inputs must be at most 32 KiB." });
1604
- }).pipe(external_exports.record(external_exports.unknown()));
1604
+ }).pipe(external_exports.record(external_exports.string(), external_exports.unknown()));
1605
1605
  var inputSchema = external_exports.object({ findingId: identifier.optional(), scanId: identifier.optional(), dbPath: external_exports.string().trim().min(1).max(4096).optional(), fromStep: identifier.optional(), artifactId: identifier.optional() }).strict();
1606
1606
  var nodeSchema = external_exports.object({ id: identifier, type: external_exports.enum(["trigger", "audit", "report", "verify", "fix", "research", "deep-review"]), label: external_exports.string().trim().min(1).max(160), enabled: external_exports.boolean(), plan: planSchema.optional(), execution: executionSchema.optional(), input: inputSchema.optional(), inputs: SecurityWorkflowBindingsSchema.superRefine((bindings, context) => {
1607
1607
  const pending = [bindings];
@@ -1751,7 +1751,7 @@ function operationTemplate(id, name, description, operation, compatibleTargetTyp
1751
1751
  }
1752
1752
  var FINDING_INPUT_REQUIREMENT = { names: ["finding", "findingPath", "findingId"], required: true, description: "Supply an existing finding, a finding JSON path, or a retained finding ID. Connected earlier finding evidence can also provide the input." };
1753
1753
  var SECURITY_WORKFLOW_TEMPLATES = [
1754
- template("repository-review", "Repository security review", "Review a local repository's trust boundaries, dependency exposure, and security-sensitive code.", "repository", [
1754
+ template("repository-review", "Whitebox pentest", "Test a source repository for exploitable code paths, trust-boundary failures, dependency exposure, and unsafe configuration.", "repository", [
1755
1755
  phase("dependencies", "Dependency exposure", "known-vulnerabilities", "Inspect dependency manifests and lockfiles. Prioritize reachable vulnerable dependencies and supply-chain trust boundaries; distinguish confirmed exposure from version-only matches.", "quick"),
1756
1756
  phase("boundaries", "Trust boundaries", "unknown-vulnerabilities", "Trace authentication, authorization, tenant isolation, and privileged entry points in the authorized repository. Follow input-to-sink paths and report only supported security findings.", "deep"),
1757
1757
  phase("configuration", "Configuration and secrets", "misconfigurations", "Review repository configuration, credential handling, unsafe defaults, and sensitive debug surfaces. Do not expose secret values in reports.")
@@ -1839,6 +1839,7 @@ var BACKEND_CAPABILITIES = [
1839
1839
  "workspaces",
1840
1840
  "artifacts",
1841
1841
  "model-connections",
1842
+ "provider-relay",
1842
1843
  "process-controls",
1843
1844
  "operator-services",
1844
1845
  "learning"
@@ -1935,6 +1936,8 @@ function backendCapabilitiesForApiPath(pathname) {
1935
1936
  };
1936
1937
  if (pathname === "/api/backend/handshake")
1937
1938
  return [];
1939
+ if (pathname === "/api/console/provider-relays" || pathname.startsWith("/api/console/provider-relays/"))
1940
+ return ["provider-relay"];
1938
1941
  if (pathname === "/api/workflow-engine/call")
1939
1942
  return ["workflow-engine"];
1940
1943
  if (parts[0] === "control" && parts.length === 2 && ["recover-stale-workers", "prune-stopped-workers", "reset-database", "start-daemon", "stop-daemon", "launch-run"].includes(parts[1]))
@@ -2148,6 +2151,107 @@ var successfulObservation = (value) => {
2148
2151
  };
2149
2152
  function accessMilestoneFromArtifact(eventType, value, scopeId, evidenceEventId) {
2150
2153
  const item = record(value);
2154
+ if (eventType === "tool_artifact" && item && ["access_control_workflow", "access_control_cleanup"].includes(String(item.tool)) && item.state_access_proof !== void 0) {
2155
+ const proof = record(item.state_access_proof);
2156
+ const digest = (value2) => typeof value2 === "string" && /^sha256:[a-f0-9]{64}$/.test(value2);
2157
+ const timestamp = (value2) => typeof value2 === "number" && Number.isFinite(value2) && value2 >= 0 && value2 <= 864e13;
2158
+ if (!proof || proof.schema !== "0.state-access-proof/v1" || proof.authority !== "operator-fixture" || proof.access_class !== "unauthorized-write" || proof.status !== "confirmed" || proof.challenge_bound !== true || typeof proof.proof_id !== "string" || !/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(proof.proof_id) || !digest(proof.fixture_digest) || !digest(proof.baseline_digest) || !digest(proof.observed_digest) || !timestamp(proof.verified_at) || !Number.isSafeInteger(proof.generation) || Number(proof.generation) < 1 || !Number.isSafeInteger(proof.cleanup_revision) || Number(proof.cleanup_revision) < 0 || !["required", "completed", "failed"].includes(String(proof.cleanup)) || proof.cleanup !== "required" && !timestamp(proof.cleanup_at) || typeof item.observation_url !== "string" || item.observation_url.length > 8192 || !scopeId || scopeId.length > 512)
2159
+ return null;
2160
+ if (item.tool === "access_control_workflow") {
2161
+ const before2 = successfulObservation(item.observation_before), after2 = successfulObservation(item.observation_after);
2162
+ const steps = item.steps;
2163
+ if (item.verdict !== "confirmed" || !before2 || !after2 || before2.redacted !== false || after2.redacted !== false || before2.value_truncated === true || after2.value_truncated === true || before2.json_pointer_value === after2.json_pointer_value || after2.json_pointer_value !== item.expected_state || !Array.isArray(steps) || !steps.length || steps.length > 10 || !steps.some((value2) => {
2164
+ const step = record(value2);
2165
+ return step?.request_marker_sent === true && ["POST", "PUT", "PATCH"].includes(String(step.method));
2166
+ }) || steps.some((value2) => {
2167
+ const step = record(value2);
2168
+ return !step || typeof step.status !== "number" || !Number.isInteger(step.status) || step.status < 100 || step.status > 599 || step.error !== void 0;
2169
+ }))
2170
+ return null;
2171
+ }
2172
+ if (item.tool === "access_control_cleanup") {
2173
+ const observation = record(item.observation);
2174
+ if (!observation || typeof observation.status !== "number" || observation.status < 200 || observation.status >= 300 || observation.truncated !== false || !digest(observation.value_digest) || observation.value_digest === proof.baseline_digest !== (proof.cleanup === "completed"))
2175
+ return null;
2176
+ }
2177
+ let asset2;
2178
+ try {
2179
+ const url = new URL(item.observation_url);
2180
+ if (!["http:", "https:"].includes(url.protocol) || url.username || url.password)
2181
+ return null;
2182
+ asset2 = url.origin;
2183
+ } catch {
2184
+ return null;
2185
+ }
2186
+ const originalId = typeof proof.evidence_event_id === "string" && proof.evidence_event_id.length <= 512 ? proof.evidence_event_id : evidenceEventId;
2187
+ return {
2188
+ key: JSON.stringify([scopeId, "unauthorized-write", item.observation_url]),
2189
+ asset: asset2,
2190
+ status: "confirmed",
2191
+ accessClass: "unauthorized-write",
2192
+ headline: "Unauthorized state change confirmed",
2193
+ summary: "A configured comparison identity changed the observed field of an operator-declared restricted disposable resource. Verification observed the new marker using the owner's request context.",
2194
+ cleanup: proof.cleanup,
2195
+ confidence: 1,
2196
+ severity: "unassessed",
2197
+ accessLevel: "Resource write",
2198
+ prerequisites: ["Operator-declared restricted disposable resource", "Fresh private synthetic marker", "Distinct configured owner and comparison credentials"],
2199
+ limitations: ["The proof covers only the configured resource and observed field. Cleanup checks that field only; other side effects, shell access and broader privileges are not established."],
2200
+ verifiedAt: proof.verified_at,
2201
+ proofId: proof.proof_id,
2202
+ proofGeneration: proof.generation,
2203
+ cleanupRevision: proof.cleanup_revision,
2204
+ ...proof.cleanup_at !== void 0 ? { cleanupAt: proof.cleanup_at } : {},
2205
+ ...originalId ? { evidenceEventId: originalId } : {},
2206
+ ...proof.cleanup !== "required" && evidenceEventId ? { cleanupEvidenceEventId: evidenceEventId } : {}
2207
+ };
2208
+ }
2209
+ if (eventType === "tool_artifact" && item?.tool === "access_control_probe") {
2210
+ const proof = record(item.access_proof);
2211
+ if (!proof || proof.schema !== "0.access-proof/v1" || proof.authority !== "operator-fixture" || proof.access_class !== "unauthorized-read" || !["confirmed", "blocked"].includes(String(proof.status)) || proof.owner_marker_observed !== true || proof.cleanup !== "not-required" || typeof proof.baseline_status !== "number" || !Number.isInteger(proof.baseline_status) || proof.baseline_status < 200 || proof.baseline_status >= 300 || proof.comparison_marker_observed !== (proof.status === "confirmed") || item.method !== "GET" || typeof item.url !== "string" || item.url.length > 8192 || !scopeId || scopeId.length > 512)
2212
+ return null;
2213
+ const baseline = record(proof.baseline_observation);
2214
+ const observations = proof.comparison_observations;
2215
+ const validObservation = (value2) => {
2216
+ const observation = record(value2);
2217
+ return observation && typeof observation.status === "number" && Number.isInteger(observation.status) && observation.truncated === false && typeof observation.marker_observed === "boolean" && typeof observation.response_digest === "string" && /^sha256:[a-f0-9]{64}$/.test(observation.response_digest);
2218
+ };
2219
+ if (!validObservation(baseline) || baseline.status !== proof.baseline_status || baseline.marker_observed !== true || !Array.isArray(observations) || !observations.length || observations.length > 16 || !observations.every(validObservation))
2220
+ return null;
2221
+ if (proof.status === "confirmed" ? !observations.some((value2) => {
2222
+ const o = record(value2);
2223
+ return Number(o.status) >= 200 && Number(o.status) < 300 && o.marker_observed === true;
2224
+ }) : !observations.every((value2) => {
2225
+ const o = record(value2);
2226
+ return [401, 403].includes(Number(o.status)) && o.marker_observed === false;
2227
+ }))
2228
+ return null;
2229
+ let asset2;
2230
+ try {
2231
+ const url = new URL(item.url);
2232
+ if (!["http:", "https:"].includes(url.protocol) || url.username || url.password)
2233
+ return null;
2234
+ asset2 = url.origin;
2235
+ } catch {
2236
+ return null;
2237
+ }
2238
+ const confirmed = proof.status === "confirmed";
2239
+ return {
2240
+ key: JSON.stringify([scopeId, "unauthorized-read", item.url]),
2241
+ asset: asset2,
2242
+ status: confirmed ? "confirmed" : "blocked",
2243
+ accessClass: "unauthorized-read",
2244
+ headline: confirmed ? "Unauthorized resource read confirmed" : "Unauthorized resource read blocked",
2245
+ summary: confirmed ? "A comparison identity retrieved the private owner marker from an operator-declared restricted resource. This read-only proof required no cleanup. The result applies to the configured ownership contract." : "The configured comparison identities were denied access to the operator-declared restricted resource. This read-only test required no cleanup.",
2246
+ cleanup: "not-required",
2247
+ confidence: 1,
2248
+ severity: confirmed ? "unassessed" : "info",
2249
+ accessLevel: confirmed ? "Resource read" : "Access denied",
2250
+ prerequisites: ["Operator-declared ownership contract"],
2251
+ limitations: ["The result covers only the configured resource and tested identities."],
2252
+ ...evidenceEventId && evidenceEventId.length <= 512 ? { evidenceEventId } : {}
2253
+ };
2254
+ }
2151
2255
  if (eventType !== "tool_artifact" || !item || item.tool !== "access_control_workflow" || item.workflow !== "access_control_workflow" || item.verdict !== "confirmed" || typeof item.owner_identity !== "string" || !item.owner_identity || typeof item.actor_identity !== "string" || !item.actor_identity || item.owner_identity === item.actor_identity || typeof item.expected_state !== "string" || item.expected_state.length > 500 || typeof item.observation_url !== "string" || item.observation_url.length > 8192 || !scopeId || scopeId.length > 512)
2152
2256
  return null;
2153
2257
  const before = successfulObservation(item.observation_before);
@@ -2176,13 +2280,38 @@ function accessMilestoneFromArtifact(eventType, value, scopeId, evidenceEventId)
2176
2280
  headline: "State change confirmed across request contexts",
2177
2281
  summary: "The observing context saw the declared marker after requests using different configured authentication headers. Authorization impact requires validation. Cleanup was not verified.",
2178
2282
  cleanup: "unknown",
2283
+ confidence: 1,
2284
+ severity: "info",
2285
+ accessLevel: "Observed state transition",
2286
+ prerequisites: ["Distinct configured authentication headers"],
2287
+ limitations: ["Authorization impact and cleanup are unverified."],
2179
2288
  ...evidenceEventId && evidenceEventId.length <= 512 ? { evidenceEventId } : {}
2180
2289
  };
2181
2290
  }
2182
2291
  function appendAccessMilestone(current, next, limit = 80) {
2183
- if (current.some((item) => item.milestone.key === next.milestone.key))
2184
- return [...current];
2185
- return [...current, next].slice(-Math.max(1, Math.min(80, limit)));
2292
+ const index = current.findIndex((item) => item.milestone.key === next.milestone.key);
2293
+ if (index !== -1) {
2294
+ const rank = { blocked: 0, conditional: 1, confirmed: 2 };
2295
+ const previous = current[index].milestone;
2296
+ const sameProof = next.milestone.proofId !== void 0 && next.milestone.proofId === previous.proofId;
2297
+ const newerCleanup = sameProof && next.milestone.cleanup !== previous.cleanup && (next.milestone.cleanupRevision ?? -1) > (previous.cleanupRevision ?? -1);
2298
+ const newerProof = next.milestone.proofId !== void 0 && next.milestone.proofId !== previous.proofId && (next.milestone.verifiedAt ?? -1) >= (previous.verifiedAt ?? -1) && ((next.milestone.proofGeneration ?? 0) > (previous.proofGeneration ?? 0) || (next.milestone.verifiedAt ?? -1) > (previous.verifiedAt ?? -1));
2299
+ if (rank[next.milestone.status] <= rank[previous.status] && !newerCleanup && !newerProof)
2300
+ return [...current];
2301
+ const updated = [...current];
2302
+ updated[index] = next;
2303
+ return updated;
2304
+ }
2305
+ const appended = [...current, next];
2306
+ const cap = Math.max(1, Math.min(80, Number.isFinite(limit) ? Math.floor(limit) : 80));
2307
+ if (appended.length <= cap)
2308
+ return appended;
2309
+ const retained = new Set(visibleAccessMilestones(appended, cap));
2310
+ return appended.filter((item) => retained.has(item));
2311
+ }
2312
+ function visibleAccessMilestones(items, limit = 3) {
2313
+ const impact = (milestone) => milestone.status === "confirmed" ? milestone.accessClass === "unauthorized-write" ? 4 : 3 : milestone.status === "conditional" ? 1 : 0;
2314
+ return items.map((item, index) => ({ item, index })).sort((a, b) => impact(b.item.milestone) - impact(a.item.milestone) || b.index - a.index).slice(0, Math.max(1, Math.min(80, Number.isFinite(limit) ? Math.floor(limit) : 3))).map((entry) => entry.item);
2186
2315
  }
2187
2316
 
2188
2317
  export {
@@ -2319,5 +2448,6 @@ export {
2319
2448
  getFindingPriority,
2320
2449
  compareFindingsByBusinessPriority,
2321
2450
  accessMilestoneFromArtifact,
2322
- appendAccessMilestone
2451
+ appendAccessMilestone,
2452
+ visibleAccessMilestones
2323
2453
  };
@@ -3017,8 +3017,33 @@ var {
3017
3017
  Help
3018
3018
  } = import_index.default;
3019
3019
 
3020
+ // packages/cli/src/presentation/event-bus.ts
3021
+ var PresentationEventBus = class {
3022
+ listeners = [];
3023
+ subscribe(listener) {
3024
+ this.listeners.push(listener);
3025
+ return () => {
3026
+ const index = this.listeners.indexOf(listener);
3027
+ if (index >= 0) this.listeners.splice(index, 1);
3028
+ };
3029
+ }
3030
+ emit(event) {
3031
+ for (const listener of [...this.listeners]) {
3032
+ try {
3033
+ listener.emit(event);
3034
+ } catch {
3035
+ }
3036
+ }
3037
+ }
3038
+ get size() {
3039
+ return this.listeners.length;
3040
+ }
3041
+ };
3042
+ var presentationEventBus = new PresentationEventBus();
3043
+
3020
3044
  export {
3021
3045
  InvalidArgumentError,
3022
3046
  Command,
3023
- Option
3047
+ Option,
3048
+ presentationEventBus
3024
3049
  };
@@ -3,7 +3,7 @@ import { createRequire as __0CreateRequire } from "node:module";
3
3
  const require = __0CreateRequire(import.meta.url);
4
4
  import {
5
5
  resolveOsecDbPath
6
- } from "./chunk-BMDG6T7D.js";
6
+ } from "./chunk-YXTV2FRE.js";
7
7
  import {
8
8
  BACKEND_PROTOCOL_VERSION,
9
9
  BackendDescriptorSchema,
@@ -12,10 +12,10 @@ import {
12
12
  backendCapabilitiesForApiPath,
13
13
  homeStateDir,
14
14
  parseBackendHandshake
15
- } from "./chunk-GXXX7AGH.js";
15
+ } from "./chunk-S3B6HFSM.js";
16
16
  import {
17
17
  external_exports
18
- } from "./chunk-VIT5ALXF.js";
18
+ } from "./chunk-5XOYTAOK.js";
19
19
 
20
20
  // packages/cli/src/worker-deploy.ts
21
21
  import { execFileSync, spawn, spawnSync } from "node:child_process";
@@ -30,12 +30,8 @@ var REMOTE_DEPS = {
30
30
  "node-sqlite3-wasm": "^0.8.55",
31
31
  "pdfkit": "^0.15.2",
32
32
  "playwright": "1.60.0",
33
- "react": "^19.2.4",
34
- "react-dom": "^19.2.4",
35
33
  "tree-sitter": `file:${REMOTE_DIR}/vendor/tree-sitter-0.21.1-node24.tgz`,
36
- "tree-sitter-c": "0.21.4",
37
- "@opentui/core": "0.5.4",
38
- "@opentui/react": "0.5.4"
34
+ "tree-sitter-c": "0.21.4"
39
35
  };
40
36
  var SSH_HOST_PATTERN = /^[A-Za-z0-9._@-]+$/;
41
37
  var LIMA_NAME_PATTERN = /^[\w.-]+$/;
@@ -64,10 +60,10 @@ function createRunner(options) {
64
60
  const configArgs = options.sshConfig ? ["-F", options.sshConfig] : [];
65
61
  return {
66
62
  label: host,
67
- shell: (command, timeout = 3e5) => execFileSync("ssh", ["-o", "BatchMode=yes", "-o", "ConnectTimeout=15", ...configArgs, "--", host, "bash", "-s"], { input: command, encoding: "utf8", timeout }),
63
+ shell: (command, timeout = 3e5) => execFileSync("ssh", ["-o", "BatchMode=yes", "-o", "StrictHostKeyChecking=yes", "-o", "ConnectTimeout=15", ...configArgs, "--", host, "bash", "-s"], { input: command, encoding: "utf8", timeout }),
68
64
  copy: (local, remote) => execFileSync("scp", ["-q", "-o", "BatchMode=yes", ...configArgs, "--", local, `${host}:${remote}`], { stdio: "inherit", timeout: 6e5 }),
69
65
  tunnel: (port) => {
70
- const child = spawn("ssh", ["-o", "BatchMode=yes", ...configArgs, "-N", "-L", `${port}:127.0.0.1:${port}`, "--", host], { stdio: "ignore", detached: true });
66
+ const child = spawn("ssh", ["-o", "BatchMode=yes", "-o", "StrictHostKeyChecking=yes", "-o", "ExitOnForwardFailure=yes", ...configArgs, "-N", "-L", `${port}:127.0.0.1:${port}`, "--", host], { stdio: "ignore", detached: true });
71
67
  child.unref();
72
68
  return child.pid;
73
69
  }
@@ -168,7 +164,12 @@ async function deployWorker(options, runner = createRunner(options)) {
168
164
  writeFileSync(backendsConfig, JSON.stringify(registry, null, 2) + "\n", { mode: 384 });
169
165
  writeFileSync(join(stateDir, `${backendId}.env`), `${tokenEnv}=${token}
170
166
  `, { mode: 384 });
171
- writeFileSync(join(stateDir, `${backendId}.json`), JSON.stringify({ schemaVersion: 1, backendId, ssh: options.ssh, lima: options.ssh ? void 0 : options.lima ?? "zero-worker", sshConfig: options.sshConfig, port, tunnelPid, remoteDir: REMOTE_DIR }, null, 2) + "\n", { mode: 384 });
167
+ let previousMetadata = {};
168
+ try {
169
+ previousMetadata = JSON.parse(readFileSync(join(stateDir, `${backendId}.json`), "utf8"));
170
+ } catch {
171
+ }
172
+ writeFileSync(join(stateDir, `${backendId}.json`), JSON.stringify({ ...previousMetadata, schemaVersion: 1, backendId, autoReconnect: true, ssh: options.ssh, lima: options.ssh ? void 0 : options.lima ?? "zero-worker", sshConfig: options.sshConfig, port, tunnelPid, remoteDir: REMOTE_DIR }, null, 2) + "\n", { mode: 384 });
172
173
  process.env[tokenEnv] = token;
173
174
  return { backendId, engine: `http://127.0.0.1:${port}/`, target: targetPath, backendsConfig, tokenEnv };
174
175
  } finally {
@@ -183,7 +184,7 @@ function loadManagedWorker(backendId) {
183
184
  } catch {
184
185
  throw new Error("This connection has no managed deployment metadata. Stop its engine directly on the host.");
185
186
  }
186
- if (worker.schemaVersion !== 1 || worker.backendId !== backendId || worker.remoteDir !== REMOTE_DIR || !!worker.ssh === !!worker.lima) throw new Error("Invalid managed deployment metadata.");
187
+ if (worker.schemaVersion !== 1 || worker.backendId !== backendId || worker.remoteDir !== REMOTE_DIR || !!worker.ssh === !!worker.lima || worker.autoReconnect !== void 0 && typeof worker.autoReconnect !== "boolean") throw new Error("Invalid managed deployment metadata.");
187
188
  validateWorkerOptions({ ...worker, enginePort: worker.port });
188
189
  return worker;
189
190
  }
@@ -202,6 +203,7 @@ function stopManagedTunnel(worker) {
202
203
  }
203
204
  async function stopWorker(backendId, suppliedRunner) {
204
205
  const worker = loadManagedWorker(backendId);
206
+ writeFileSync(join(homeStateDir(), "workers", `${backendId}.json`), JSON.stringify({ ...worker, autoReconnect: false }, null, 2) + "\n", { mode: 384 });
205
207
  const runner = suppliedRunner ?? createRunner(worker);
206
208
  runner.shell(`set -eu
207
209
  if test ! -f ${REMOTE_DIR}/engine.pid; then echo 'Managed engine PID is unavailable; engine was not stopped.' >&2; exit 1; fi
@@ -216,6 +218,64 @@ fi
216
218
  rm -f ${REMOTE_DIR}/engine.pid`, 3e4);
217
219
  return { stopped: true, tunnelStopped: stopManagedTunnel(worker), remoteFilesRemoved: false };
218
220
  }
221
+ async function repairWorker(backendId, suppliedRunner, probe = (port) => {
222
+ try {
223
+ execFileSync("curl", ["-sf", "--connect-timeout", "2", "--max-time", "3", `http://127.0.0.1:${port}/`], { stdio: "ignore" });
224
+ return true;
225
+ } catch {
226
+ return false;
227
+ }
228
+ }) {
229
+ const worker = loadManagedWorker(backendId);
230
+ const credential = readFileSync(join(homeStateDir(), "workers", `${backendId}.env`), "utf8").trim();
231
+ const match = /^(ZERO_WORKER_[A-F0-9]+_TOKEN)=([a-f0-9]{64})$/.exec(credential);
232
+ if (!match) throw new Error("Managed worker credential is unavailable. Deploy this host again.");
233
+ writeFileSync(join(homeStateDir(), "workers", `${backendId}.json`), JSON.stringify({ ...worker, autoReconnect: true }, null, 2) + "\n", { mode: 384 });
234
+ const runner = suppliedRunner ?? createRunner(worker);
235
+ const result = runner.shell(`set -eu
236
+ cd ${REMOTE_DIR}
237
+ test -f dist/0.js && test -d work || { echo 'Managed engine files are missing. Deploy this host again.' >&2; exit 1; }
238
+ command -v node >/dev/null || { echo 'Node is unavailable on this host.' >&2; exit 1; }
239
+ running=0
240
+ if test -f engine.pid; then
241
+ pid=$(cat engine.pid)
242
+ case "$pid" in ''|*[!0-9]*) echo 'Invalid managed engine PID.' >&2; exit 1;; esac
243
+ if test "$pid" -gt 1 && kill -0 "$pid" 2>/dev/null; then
244
+ test "$(readlink /proc/$pid/cwd)" = "${REMOTE_DIR}" || { echo 'Managed engine PID belongs to another process.' >&2; exit 1; }
245
+ command=$(tr '\\000' ' ' < /proc/$pid/cmdline)
246
+ case "$command" in 'node dist/0.js dashboard '*|'node /tmp/zero-engine/dist/0.js dashboard '*) running=1;; *) echo 'Managed engine PID does not match Zero.' >&2; exit 1;; esac
247
+ fi
248
+ fi
249
+ if test "$running" = 0; then
250
+ if ss -ltn 2>/dev/null | grep -q ':${worker.port} '; then echo 'Engine port is occupied. No process was replaced.' >&2; exit 1; fi
251
+ ZERO_WORKER_TOKEN=${match[2]} setsid nohup node dist/0.js dashboard --host 127.0.0.1 --port ${worker.port} --no-open --ready-json --engine-token-env ZERO_WORKER_TOKEN --engine-workspace ${REMOTE_DIR}/work > engine.log 2>&1 < /dev/null &
252
+ echo $! > engine.pid
253
+ echo ENGINE_STARTED
254
+ fi
255
+ for i in $(seq 1 20); do
256
+ if curl -sf --max-time 1 http://127.0.0.1:${worker.port}/ >/dev/null; then echo ENGINE_READY; exit 0; fi
257
+ sleep 1
258
+ done
259
+ echo 'Managed engine did not become ready.' >&2; exit 1`, 3e4);
260
+ if (!result.includes("ENGINE_READY")) throw new Error("Managed engine did not become ready.");
261
+ process.env[match[1]] = match[2];
262
+ if (!probe(worker.port)) {
263
+ stopManagedTunnel(worker);
264
+ const tunnelPid = runner.tunnel(worker.port);
265
+ if (!Number.isSafeInteger(tunnelPid) || tunnelPid <= 1) throw new Error("Could not start the SSH tunnel.");
266
+ writeFileSync(join(homeStateDir(), "workers", `${backendId}.json`), JSON.stringify({ ...loadManagedWorker(backendId), tunnelPid }, null, 2) + "\n", { mode: 384 });
267
+ let ready = false;
268
+ for (let attempt = 0; attempt < 12; attempt++) {
269
+ if (probe(worker.port)) {
270
+ ready = true;
271
+ break;
272
+ }
273
+ await new Promise((resolve2) => setTimeout(resolve2, 250));
274
+ }
275
+ if (!ready) throw new Error("Remote engine is ready, but its SSH tunnel could not reconnect.");
276
+ }
277
+ return { backendId, reconnected: true, engineStarted: result.includes("ENGINE_STARTED") };
278
+ }
219
279
 
220
280
  // packages/cli/src/web/backend-connections.ts
221
281
  import { randomUUID } from "node:crypto";
@@ -642,7 +702,7 @@ function json(res, status, value) {
642
702
  res.writeHead(status, { "Content-Type": "application/json", "Cache-Control": "no-store" });
643
703
  res.end(JSON.stringify(value));
644
704
  }
645
- async function handleBackendConnectionRequest(req, res, url, registry) {
705
+ async function handleBackendConnectionRequest(req, res, url, registry, onSessionClosed) {
646
706
  if (url.pathname === "/api/backends") {
647
707
  if (req.method !== "GET") throw new BackendConnectionError("Backend registry is read-only.", 405);
648
708
  registry.reload();
@@ -670,6 +730,7 @@ async function handleBackendConnectionRequest(req, res, url, registry) {
670
730
  return { handled: true };
671
731
  }
672
732
  const path = apiPath(`${url.pathname.slice(url.pathname.indexOf("/proxy/") + "/proxy".length)}${url.search}`);
733
+ if (new URL(path, "http://backend.invalid").pathname.startsWith("/api/console/provider-relays")) throw new BackendConnectionError("Provider relay grants are managed by the local engine.", 403);
673
734
  if (id === "local") return { handled: false, localPath: path };
674
735
  const abort = new AbortController();
675
736
  const disconnect = () => abort.abort();
@@ -679,6 +740,8 @@ async function handleBackendConnectionRequest(req, res, url, registry) {
679
740
  const body = ["GET", "HEAD"].includes(req.method ?? "GET") ? void 0 : await requestJson(req);
680
741
  const stream = req.headers.accept?.includes("text/event-stream") === true;
681
742
  const response = await registry.request(id, path, { method: req.method, body, stream, signal: abort.signal, lastEventId: typeof req.headers["last-event-id"] === "string" ? req.headers["last-event-id"] : void 0, requestId: typeof req.headers["x-0-request-id"] === "string" ? req.headers["x-0-request-id"] : void 0 });
743
+ const closedSession = /^\/api\/console\/sessions\/([^/]+)(\/delete)?$/.exec(new URL(path, "http://backend.invalid").pathname);
744
+ if (response.ok && closedSession && (req.method === "DELETE" && !closedSession[2] || req.method === "POST" && closedSession[2])) await onSessionClosed?.(id, decodeURIComponent(closedSession[1]));
682
745
  if (res.destroyed) return { handled: true };
683
746
  res.writeHead(response.status, { "Content-Type": response.headers.get("content-type") ?? "application/json", ...attachmentHeaders(response.headers), "Cache-Control": "no-store", "X-0-Request-ID": response.headers.get("x-0-request-id") ?? randomUUID(), ...response.headers.get("x-0-engine-id") ? { "X-0-Engine-ID": response.headers.get("x-0-engine-id") } : {}, "X-Content-Type-Options": "nosniff", ...stream ? { "X-Accel-Buffering": "no" } : {} });
684
747
  if (!response.body) {
@@ -727,6 +790,7 @@ export {
727
790
  deployWorker,
728
791
  loadManagedWorker,
729
792
  stopWorker,
793
+ repairWorker,
730
794
  BackendConnectionError,
731
795
  loadBackendConnectionConfig,
732
796
  createBackendHandshake,
@@ -3,7 +3,7 @@ import { createRequire as __0CreateRequire } from "node:module";
3
3
  const require = __0CreateRequire(import.meta.url);
4
4
  import {
5
5
  LlmApiRuntime
6
- } from "./chunk-IJ6UPW3H.js";
6
+ } from "./chunk-EIONVEFN.js";
7
7
 
8
8
  // packages/core/dist/stages/variant-candidates.js
9
9
  import { execFileSync } from "node:child_process";