0sec-cli 0.21.4 → 0.22.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 (251) hide show
  1. package/0.js +56 -56
  2. package/README.md +48 -63
  3. package/chunks/{adapt-loop-IGBRQAXO.js → adapt-loop-7I57LXXR.js} +4 -4
  4. package/chunks/{artifact-scraper-LNQJUORS.js → artifact-scraper-PYZ3RU3O.js} +2 -2
  5. package/chunks/{assumption-mining-4MJTP6H5.js → assumption-mining-MFLF43IR.js} +16 -16
  6. package/chunks/{chunk-Z3IKZX3X.js → chunk-23DG5YKS.js} +1 -1
  7. package/chunks/{chunk-BACXRTQ4.js → chunk-2GV4HQKE.js} +87 -767
  8. package/chunks/{chunk-QZVG3BG4.js → chunk-5IBCBQEH.js} +1 -2
  9. package/chunks/{chunk-NDJU5ZZ7.js → chunk-5MWAG3FT.js} +3 -3
  10. package/chunks/{chunk-PC6RCKQV.js → chunk-76KSBWOQ.js} +59 -26
  11. package/chunks/chunk-7DEHG7YT.js +2143 -0
  12. package/chunks/{chunk-CL5KAUM6.js → chunk-7UFUALR2.js} +274 -8
  13. package/chunks/{chunk-IMGWPNQM.js → chunk-CAYANSH6.js} +67 -574
  14. package/chunks/{chunk-P6YG6TEZ.js → chunk-DKSCN2AB.js} +1 -1
  15. package/chunks/{chunk-O6SD4A36.js → chunk-DM5C5L5D.js} +1 -1
  16. package/chunks/{chunk-FAH6V4QM.js → chunk-EGZGZFAH.js} +1116 -2291
  17. package/chunks/chunk-HR2TU42B.js +1228 -0
  18. package/chunks/{chunk-TF46UWFU.js → chunk-HUNAPTKV.js} +1 -1
  19. package/chunks/chunk-IO7R7WBM.js +114 -0
  20. package/chunks/{chunk-W4JOXE4N.js → chunk-IXT64DV5.js} +709 -1929
  21. package/chunks/{chunk-HBKCGJAV.js → chunk-LCRTAQN2.js} +1 -1
  22. package/chunks/{chunk-WPQLBN4S.js → chunk-LPTRPRZR.js} +1 -1
  23. package/chunks/{chunk-Y5H6E24H.js → chunk-LYUAM3TG.js} +1 -1
  24. package/chunks/{chunk-NOPBXZUV.js → chunk-MICHDTBK.js} +1 -1
  25. package/chunks/{chunk-CAJJRUTV.js → chunk-OAYUPGF6.js} +1 -1
  26. package/chunks/{chunk-FWAYJ2IV.js → chunk-OWLJYJ5O.js} +8 -8
  27. package/chunks/chunk-RE5EZDG2.js +5523 -0
  28. package/chunks/{chunk-RF5QGKLR.js → chunk-RRD4XXPU.js} +3 -3
  29. package/chunks/{chunk-2WSXFFJZ.js → chunk-RSIUX3RW.js} +2 -2
  30. package/chunks/{chunk-ANDKY54G.js → chunk-SJBCK2EI.js} +4019 -7299
  31. package/chunks/{chunk-G34QP2XW.js → chunk-TM74SSHC.js} +1 -1
  32. package/chunks/{chunk-VOAXLO4A.js → chunk-TO35Y326.js} +5 -721
  33. package/chunks/{chunk-SBMB4OL3.js → chunk-TZFIAMWZ.js} +62 -8
  34. package/chunks/chunk-UELXHK2Y.js +1950 -0
  35. package/chunks/{chunk-YHWWF4QY.js → chunk-UU7PQP6N.js} +3 -3
  36. package/chunks/{chunk-E2UOY5PJ.js → chunk-UV5QWZGE.js} +12 -70
  37. package/chunks/{chunk-YA4PUM4H.js → chunk-VMRRNRMR.js} +1 -1
  38. package/chunks/{chunk-WZISK5VC.js → chunk-VNRY6AWF.js} +53 -7
  39. package/chunks/{chunk-ER3SUMYJ.js → chunk-W6UWZFKL.js} +0 -195
  40. package/chunks/{chunk-5T6D5BVY.js → chunk-XFCTUKXR.js} +1 -1
  41. package/chunks/{chunk-YPOA3W4O.js → chunk-YIQSGNAA.js} +875 -108
  42. package/chunks/{codex-models-TYYV4JNN.js → codex-models-7TLJSY3L.js} +5 -3
  43. package/chunks/{commands-WF5RG4I2.js → commands-NEI7L3QA.js} +2151 -3642
  44. package/chunks/{db-U3WQZVAO.js → db-5AP3JB4W.js} +3 -3
  45. package/chunks/{disclose-67GZCDBO.js → disclose-LDNKAVRH.js} +10 -8
  46. package/chunks/{dist-F6X62TQK.js → dist-3FNZIBB4.js} +223 -192
  47. package/chunks/{dist-EVTN3UTT.js → dist-5YHYNLI3.js} +2 -2
  48. package/chunks/{dist-ACC3DZUZ.js → dist-DD4H6HMQ.js} +3 -1
  49. package/chunks/{eval-runner-SA6OUGHZ.js → eval-runner-43BO2C4T.js} +11 -11
  50. package/chunks/{exploit-agent-36Q7XQFP.js → exploit-agent-N4A5ELBK.js} +1 -1
  51. package/chunks/{exploit-autoclimb-J4OTSTZ6.js → exploit-autoclimb-N7P6KIF5.js} +1 -1
  52. package/chunks/{exploit-climb-PYEJDIC4.js → exploit-climb-WNEJUB5W.js} +2 -2
  53. package/chunks/fix-Z452M4EC.js +26 -0
  54. package/chunks/{harness-GDUMKGSE.js → harness-QJJJVSG4.js} +3 -3
  55. package/chunks/{hunt-scan-UDJSCISU.js → hunt-scan-K6D2V3PX.js} +14 -14
  56. package/chunks/{identity-JTIVJSV7.js → identity-62SVRW4H.js} +1 -1
  57. package/chunks/{kernel-primitive-F2IXUFAX.js → kernel-primitive-TKUACPKD.js} +2 -2
  58. package/chunks/{kernel-vm-runner-276LHIOV.js → kernel-vm-runner-RAAO2PGT.js} +2 -2
  59. package/chunks/{memsafety-scan-NHUOGTEX.js → memsafety-scan-FCPAXIZE.js} +2 -2
  60. package/chunks/{native-loop-3BSYVDUI.js → native-loop-2ZRJENZ3.js} +10 -10
  61. package/chunks/{npm-detectors-VIYJXKFQ.js → npm-detectors-Z2ZIQCN4.js} +2 -2
  62. package/chunks/orchestrate-2GWGNTBF.js +58 -0
  63. package/chunks/{process-PNMC36JI.js → process-N245QIQG.js} +1 -4
  64. package/chunks/{run-CBGE6DRQ.js → run-U3XU4CTC.js} +9940 -12572
  65. package/chunks/{runtime-PXO5G6UV.js → runtime-G75TEWQY.js} +4 -5
  66. package/chunks/{scope-NJHIDDTN.js → scope-WXI46UHJ.js} +4 -1
  67. package/chunks/{session-store-46WBZM22.js → session-store-27L3ZU73.js} +2 -2
  68. package/chunks/{variant-candidates-UH2WC2HA.js → variant-candidates-YWZORZMK.js} +3 -3
  69. package/chunks/{web-recon-prepass-SFXU44SS.js → web-recon-prepass-YVMFXCIK.js} +3 -3
  70. package/cli-path-traversal-fixture.js +352 -0
  71. package/dashboard/assets/bot-Bg1Tp9_d.js +1 -0
  72. package/dashboard/assets/dist-B_dDCPbu.js +1 -0
  73. package/dashboard/assets/findings-page-mayGhNx6.js +5 -0
  74. package/dashboard/assets/format--susmHX7.js +1 -0
  75. package/dashboard/assets/input-TuVPR3Zl.js +1 -0
  76. package/dashboard/assets/jsx-runtime-MGseXjj5.js +3 -0
  77. package/dashboard/assets/live-page-HWWHX99U.js +1 -0
  78. package/dashboard/assets/meta-tile-ckHo-w7k.js +1 -0
  79. package/dashboard/assets/operations-BxZ0OoXO.js +10 -0
  80. package/dashboard/assets/operations-app-D3d35rgo.js +46 -0
  81. package/dashboard/assets/overview-page-W_4IteEr.js +1 -0
  82. package/dashboard/assets/page-header-Bw9AJgBV.js +1 -0
  83. package/dashboard/assets/scans-page-CgzVXHnn.js +1 -0
  84. package/dashboard/assets/siren-KQj8QAnJ.js +1 -0
  85. package/dashboard/assets/table-8EDklulN.js +1 -0
  86. package/dashboard/assets/tabs-CFHPOwg8.js +1 -0
  87. package/dashboard/index.html +2 -3
  88. package/node_modules/node-addon-api/LICENSE.md +9 -0
  89. package/node_modules/node-addon-api/README.md +95 -0
  90. package/node_modules/node-addon-api/common.gypi +21 -0
  91. package/node_modules/node-addon-api/except.gypi +25 -0
  92. package/node_modules/node-addon-api/index.js +14 -0
  93. package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
  94. package/node_modules/node-addon-api/napi-inl.h +7250 -0
  95. package/node_modules/node-addon-api/napi.h +3463 -0
  96. package/node_modules/node-addon-api/node_addon_api.gyp +42 -0
  97. package/node_modules/node-addon-api/node_api.gyp +9 -0
  98. package/node_modules/node-addon-api/noexcept.gypi +26 -0
  99. package/node_modules/node-addon-api/nothing.c +0 -0
  100. package/node_modules/node-addon-api/package-support.json +21 -0
  101. package/node_modules/node-addon-api/package.json +481 -0
  102. package/node_modules/node-addon-api/tools/README.md +73 -0
  103. package/node_modules/node-addon-api/tools/check-napi.js +99 -0
  104. package/node_modules/node-addon-api/tools/clang-format.js +71 -0
  105. package/node_modules/node-addon-api/tools/conversion.js +301 -0
  106. package/node_modules/node-gyp-build/LICENSE +21 -0
  107. package/node_modules/node-gyp-build/README.md +58 -0
  108. package/node_modules/node-gyp-build/SECURITY.md +5 -0
  109. package/node_modules/node-gyp-build/bin.js +84 -0
  110. package/node_modules/node-gyp-build/build-test.js +19 -0
  111. package/node_modules/node-gyp-build/index.js +6 -0
  112. package/node_modules/node-gyp-build/node-gyp-build.js +207 -0
  113. package/node_modules/node-gyp-build/optional.js +7 -0
  114. package/node_modules/node-gyp-build/package.json +43 -0
  115. package/node_modules/tree-sitter/LICENSE +21 -0
  116. package/node_modules/tree-sitter/README.md +90 -0
  117. package/node_modules/tree-sitter/binding.gyp +76 -0
  118. package/node_modules/tree-sitter/index.js +895 -0
  119. package/node_modules/tree-sitter/package.json +62 -0
  120. package/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
  121. package/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
  122. package/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
  123. package/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
  124. package/node_modules/tree-sitter/src/addon_data.h +47 -0
  125. package/node_modules/tree-sitter/src/binding.cc +35 -0
  126. package/node_modules/tree-sitter/src/conversions.cc +140 -0
  127. package/node_modules/tree-sitter/src/conversions.h +22 -0
  128. package/node_modules/tree-sitter/src/language.cc +106 -0
  129. package/node_modules/tree-sitter/src/language.h +17 -0
  130. package/node_modules/tree-sitter/src/logger.cc +70 -0
  131. package/node_modules/tree-sitter/src/logger.h +19 -0
  132. package/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
  133. package/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
  134. package/node_modules/tree-sitter/src/node.cc +1056 -0
  135. package/node_modules/tree-sitter/src/node.h +30 -0
  136. package/node_modules/tree-sitter/src/parser.cc +298 -0
  137. package/node_modules/tree-sitter/src/parser.h +35 -0
  138. package/node_modules/tree-sitter/src/query.cc +383 -0
  139. package/node_modules/tree-sitter/src/query.h +39 -0
  140. package/node_modules/tree-sitter/src/tree.cc +307 -0
  141. package/node_modules/tree-sitter/src/tree.h +45 -0
  142. package/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
  143. package/node_modules/tree-sitter/src/tree_cursor.h +52 -0
  144. package/node_modules/tree-sitter/tree-sitter.d.ts +211 -0
  145. package/node_modules/tree-sitter/vendor/tree-sitter/LICENSE +21 -0
  146. package/node_modules/tree-sitter/vendor/tree-sitter/README.md +21 -0
  147. package/node_modules/tree-sitter/vendor/tree-sitter/lib/README.md +6 -0
  148. package/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1266 -0
  149. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
  150. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
  151. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +290 -0
  152. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
  153. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
  154. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
  155. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
  156. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
  157. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
  158. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +221 -0
  159. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +299 -0
  160. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
  161. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +419 -0
  162. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
  163. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +14 -0
  164. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +774 -0
  165. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2151 -0
  166. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +230 -0
  167. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
  168. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4134 -0
  169. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
  170. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
  171. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
  172. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
  173. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1060 -0
  174. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +382 -0
  175. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +165 -0
  176. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
  177. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +714 -0
  178. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
  179. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
  180. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
  181. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
  182. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
  183. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
  184. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
  185. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
  186. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
  187. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
  188. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +50 -0
  189. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +23 -0
  190. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
  191. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1294 -0
  192. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1823 -0
  193. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
  194. package/node_modules/tree-sitter/vendor/tree-sitter/test/fixtures/grammars/.gitkeep +0 -0
  195. package/node_modules/tree-sitter-c/LICENSE +21 -0
  196. package/node_modules/tree-sitter-c/README.md +18 -0
  197. package/node_modules/tree-sitter-c/binding.gyp +20 -0
  198. package/node_modules/tree-sitter-c/bindings/node/binding.cc +20 -0
  199. package/node_modules/tree-sitter-c/bindings/node/index.d.ts +28 -0
  200. package/node_modules/tree-sitter-c/bindings/node/index.js +7 -0
  201. package/node_modules/tree-sitter-c/grammar.js +1463 -0
  202. package/node_modules/tree-sitter-c/package.json +108 -0
  203. package/node_modules/tree-sitter-c/prebuilds/darwin-arm64/tree-sitter-c.node +0 -0
  204. package/node_modules/tree-sitter-c/prebuilds/darwin-x64/tree-sitter-c.node +0 -0
  205. package/node_modules/tree-sitter-c/prebuilds/linux-x64/tree-sitter-c.node +0 -0
  206. package/node_modules/tree-sitter-c/prebuilds/win32-x64/tree-sitter-c.node +0 -0
  207. package/node_modules/tree-sitter-c/queries/highlights.scm +81 -0
  208. package/node_modules/tree-sitter-c/queries/tags.scm +9 -0
  209. package/node_modules/tree-sitter-c/src/grammar.json +9682 -0
  210. package/node_modules/tree-sitter-c/src/node-types.json +4556 -0
  211. package/node_modules/tree-sitter-c/src/parser.c +113852 -0
  212. package/node_modules/tree-sitter-c/src/tree_sitter/alloc.h +54 -0
  213. package/node_modules/tree-sitter-c/src/tree_sitter/array.h +290 -0
  214. package/node_modules/tree-sitter-c/src/tree_sitter/parser.h +265 -0
  215. package/package.json +10 -3
  216. package/vendor/tree-sitter-0.21.1-node24.json +16 -0
  217. package/vendor/tree-sitter-0.21.1-node24.tgz +0 -0
  218. package/chunks/chunk-CGHCEN7W.js +0 -169
  219. package/chunks/chunk-CXKDWFNO.js +0 -102
  220. package/chunks/chunk-GIQKESMN.js +0 -687
  221. package/chunks/chunk-HPQZHOIU.js +0 -67
  222. package/chunks/chunk-PD2BBBKT.js +0 -245
  223. package/chunks/chunk-WF5W75WY.js +0 -1070
  224. package/chunks/fix-J2KBRJDV.js +0 -12
  225. package/chunks/orchestrate-DHBFRTSI.js +0 -59
  226. package/chunks/replay-runner-LK2XFIVG.js +0 -39
  227. package/dashboard/assets/bot-yILPnRgD.js +0 -1
  228. package/dashboard/assets/chevron-down-BeDJ-Vka.js +0 -1
  229. package/dashboard/assets/circle-alert-BEnMBMT-.js +0 -1
  230. package/dashboard/assets/client-DRYsuOGl.js +0 -9
  231. package/dashboard/assets/copy-Bi5vzoF9.js +0 -1
  232. package/dashboard/assets/desktop-BT7RkC4q.js +0 -32
  233. package/dashboard/assets/desktop-OaBI0E0e.css +0 -1
  234. package/dashboard/assets/dist-CmX-h7a4.js +0 -1
  235. package/dashboard/assets/dist-DAwYQmf_.js +0 -45
  236. package/dashboard/assets/findings-page-B4rwF6fZ.js +0 -5
  237. package/dashboard/assets/format-LNQSSpn6.js +0 -1
  238. package/dashboard/assets/jsx-runtime-C7oxC63R.js +0 -1
  239. package/dashboard/assets/live-page-DoNwpPAO.js +0 -1
  240. package/dashboard/assets/meta-tile-BMtBC-Qq.js +0 -1
  241. package/dashboard/assets/operations-app-ER0gg7GN.js +0 -2
  242. package/dashboard/assets/operations-e2CGYKB1.js +0 -4
  243. package/dashboard/assets/overview-page-CmeWH17A.js +0 -1
  244. package/dashboard/assets/page-header-CIJyycfz.js +0 -1
  245. package/dashboard/assets/play-Dwo-9xt6.js +0 -1
  246. package/dashboard/assets/scans-page-CuhzWhHx.js +0 -1
  247. package/dashboard/assets/search-CiooTLck.js +0 -1
  248. package/dashboard/assets/siren-CCBwTSuk.js +0 -1
  249. package/dashboard/assets/table-BgsSBdke.js +0 -1
  250. package/dashboard/assets/tabs-vn6v7Bk6.js +0 -1
  251. package/dashboard/desktop.html +0 -21
@@ -5,13 +5,13 @@ import {
5
5
  makeSkepticVerifier,
6
6
  runHuntScan,
7
7
  scoreGeometry
8
- } from "./chunk-E2UOY5PJ.js";
8
+ } from "./chunk-UV5QWZGE.js";
9
9
  import {
10
10
  runReproducerInKernelVm
11
- } from "./chunk-5T6D5BVY.js";
11
+ } from "./chunk-XFCTUKXR.js";
12
12
  import {
13
13
  LlmApiRuntime
14
- } from "./chunk-BACXRTQ4.js";
14
+ } from "./chunk-2GV4HQKE.js";
15
15
  import {
16
16
  __commonJS,
17
17
  __require,
@@ -5,46 +5,46 @@ import {
5
5
  BUDGET_WARNING_HARD,
6
6
  BUDGET_WARNING_SOFT,
7
7
  ToolExecutor,
8
- analyticsPipeline,
9
8
  buildToolCallLogEntry,
10
9
  buildToolCallsPayload,
11
10
  computeBudgetWarningTurns,
12
11
  formatJitSkillsInstruction,
13
- getCloudSinkConfig,
14
12
  getToolsForRole,
15
13
  newCorrelationId,
16
14
  parseFindingsFromCliOutput,
17
- postFinding,
18
15
  registerSignalCleanup,
19
- reportUnsupportedContributionMode,
20
16
  runNativeAgentLoop,
21
17
  toolCallPreview
22
- } from "./chunk-ANDKY54G.js";
18
+ } from "./chunk-SJBCK2EI.js";
23
19
  import {
24
20
  WafDetector
25
- } from "./chunk-SBMB4OL3.js";
21
+ } from "./chunk-TZFIAMWZ.js";
26
22
  import {
27
23
  RECIPE_LIBRARY
28
24
  } from "./chunk-UEX7PFSE.js";
25
+ import {
26
+ analyticsPipeline,
27
+ reportUnsupportedContributionMode
28
+ } from "./chunk-RE5EZDG2.js";
29
29
  import {
30
30
  createRuntime,
31
31
  detectAvailableRuntimes,
32
32
  pickRuntimeForStage
33
- } from "./chunk-NDJU5ZZ7.js";
33
+ } from "./chunk-5MWAG3FT.js";
34
34
  import {
35
35
  osecDB
36
- } from "./chunk-WZISK5VC.js";
36
+ } from "./chunk-VNRY6AWF.js";
37
37
  import {
38
38
  CLI_RUNTIME_TYPES
39
39
  } from "./chunk-4VGLO2YS.js";
40
40
  import {
41
41
  LlmApiRuntime,
42
42
  features
43
- } from "./chunk-BACXRTQ4.js";
43
+ } from "./chunk-2GV4HQKE.js";
44
44
  import {
45
45
  estimateCost,
46
46
  modelProvider
47
- } from "./chunk-PC6RCKQV.js";
47
+ } from "./chunk-76KSBWOQ.js";
48
48
  import {
49
49
  external_exports
50
50
  } from "./chunk-VIT5ALXF.js";
@@ -3919,59 +3919,6 @@ function persistSession(db, state, config, sessionId, status) {
3919
3919
  });
3920
3920
  }
3921
3921
 
3922
- // packages/core/dist/agent/cloud-inbox.js
3923
- var POLL_MS = 3e3;
3924
- function startCloudInboxPoller(config) {
3925
- const buffer = [];
3926
- let stopped = false;
3927
- const headers = {
3928
- "X-0-Scan-Id": config.scanId
3929
- };
3930
- if (config.token)
3931
- headers["Authorization"] = `Bearer ${config.token}`;
3932
- const url = `${config.sinkUrl.replace(/\/+$/, "")}/scans/${encodeURIComponent(config.scanId)}/inbox`;
3933
- const poll = async () => {
3934
- if (stopped)
3935
- return;
3936
- try {
3937
- const res = await fetch(url, { headers });
3938
- if (!res.ok)
3939
- return;
3940
- const rows = await res.json();
3941
- if (!Array.isArray(rows))
3942
- return;
3943
- for (const r of rows) {
3944
- if (r.role === "human" && typeof r.body === "string" && r.body.trim().length > 0) {
3945
- const prefix = r.kind === "approval" ? "[Operator approval]" : "[Operator steer]";
3946
- buffer.push(`${prefix}: ${r.body.trim()}`);
3947
- }
3948
- }
3949
- } catch {
3950
- }
3951
- };
3952
- const handle = setInterval(() => void poll(), POLL_MS);
3953
- if (typeof handle.unref === "function") {
3954
- handle.unref();
3955
- }
3956
- return {
3957
- drain() {
3958
- if (buffer.length === 0)
3959
- return [];
3960
- return buffer.splice(0, buffer.length);
3961
- },
3962
- stop() {
3963
- stopped = true;
3964
- clearInterval(handle);
3965
- }
3966
- };
3967
- }
3968
- function maybeStartCloudInboxPoller() {
3969
- const cfg = getCloudSinkConfig();
3970
- if (!cfg)
3971
- return null;
3972
- return startCloudInboxPoller(cfg);
3973
- }
3974
-
3975
3922
  // packages/core/dist/secure/project-context.js
3976
3923
  import { createHash as createHash2 } from "node:crypto";
3977
3924
  import { execFileSync as execFileSync2 } from "node:child_process";
@@ -4207,7 +4154,7 @@ async function runAnalysisAgent(opts) {
4207
4154
  },
4208
4155
  required: ["findings", "summary"]
4209
4156
  };
4210
- const { ProcessRuntime } = await import("./process-PNMC36JI.js");
4157
+ const { ProcessRuntime } = await import("./process-N245QIQG.js");
4211
4158
  const codexHome = runtimeType === "codex" && isEphemeralScope(scopePath) ? createEphemeralCodexHome() : void 0;
4212
4159
  const cliRuntime = new ProcessRuntime({
4213
4160
  type: runtimeType,
@@ -4316,7 +4263,6 @@ async function runAnalysisAgent(opts) {
4316
4263
  if (supportsNative) {
4317
4264
  const turnBudget = getMaxTurns(role, config.depth, "native", purpose);
4318
4265
  const maxTurns2 = Math.min(opts.maxTurns ?? turnBudget, opts.singleAgent ? 20 : turnBudget);
4319
- const cloudInbox = maybeStartCloudInboxPoller();
4320
4266
  const agentState2 = await runNativeAgentLoop({
4321
4267
  config: {
4322
4268
  role,
@@ -4329,7 +4275,7 @@ async function runAnalysisAgent(opts) {
4329
4275
  target,
4330
4276
  scanId,
4331
4277
  scopePath,
4332
- codebaseLearning: !!getCloudSinkConfig() && scopedSourceAudit && purpose === "research",
4278
+ codebaseLearning: scopedSourceAudit && purpose === "research",
4333
4279
  sessionId,
4334
4280
  costCeilingUsd: config.costCeilingUsd,
4335
4281
  costModel: config.model,
@@ -4337,7 +4283,6 @@ async function runAnalysisAgent(opts) {
4337
4283
  },
4338
4284
  runtime: apiRuntime,
4339
4285
  db,
4340
- getPendingUserMessages: cloudInbox?.drain,
4341
4286
  onFindingSaved: (finding) => {
4342
4287
  if (purpose === "verify" && opts.singleAgent)
4343
4288
  return;
@@ -4346,7 +4291,6 @@ async function runAnalysisAgent(opts) {
4346
4291
  message: `[${finding.severity}] ${finding.title}`,
4347
4292
  data: finding
4348
4293
  });
4349
- void postFinding(finding, getCloudSinkConfig());
4350
4294
  try {
4351
4295
  analyticsPipeline.recordFinding({
4352
4296
  severity: finding.severity,
@@ -4477,7 +4421,6 @@ async function runAnalysisAgent(opts) {
4477
4421
  message: `[${finding.severity}] ${finding.title}`,
4478
4422
  data: finding
4479
4423
  });
4480
- void postFinding(finding, getCloudSinkConfig());
4481
4424
  try {
4482
4425
  analyticsPipeline.recordFinding({
4483
4426
  severity: finding.severity,
@@ -5908,7 +5851,6 @@ export {
5908
5851
  describeRefuterChoice,
5909
5852
  scoreGeometry,
5910
5853
  runAgentLoop,
5911
- maybeStartCloudInboxPoller,
5912
5854
  prepareProjectContext,
5913
5855
  PROJECT_OBSERVATION_PROMPT,
5914
5856
  captureProjectSuggestions,
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-UEX7PFSE.js";
11
11
  import {
12
12
  runReproducerInKernelVm
13
- } from "./chunk-5T6D5BVY.js";
13
+ } from "./chunk-XFCTUKXR.js";
14
14
 
15
15
  // packages/core/dist/kernel/exploit/harness.js
16
16
  import { existsSync } from "node:fs";
@@ -4,7 +4,7 @@ const require = __0CreateRequire(import.meta.url);
4
4
  import {
5
5
  homeStateDir,
6
6
  runStateDir
7
- } from "./chunk-PC6RCKQV.js";
7
+ } from "./chunk-76KSBWOQ.js";
8
8
  import {
9
9
  __export
10
10
  } from "./chunk-VCSFCHAJ.js";
@@ -409,6 +409,12 @@ var findings = sqliteTable("findings", {
409
409
  * `verificationSpec`: the blob is read and written whole.
410
410
  */
411
411
  verificationResult: text("verificationResult"),
412
+ /**
413
+ * JSON-stringified safe code-only source-verification summary. NULL when
414
+ * no scoped source workspace/spec was available or data is unusable; it
415
+ * never carries canonical replay status.
416
+ */
417
+ sourceVerification: text("sourceVerification"),
412
418
  /**
413
419
  * JSON-stringified Finding["reviewAnnotation"] — the scoped source
414
420
  * reference (`path` + line range, optional suggestion / knownMarker)
@@ -873,6 +879,9 @@ var osecDB = class {
873
879
  if (!colNames.has("reviewAnnotation")) {
874
880
  this.sqlite.exec("ALTER TABLE findings ADD COLUMN reviewAnnotation TEXT");
875
881
  }
882
+ if (!colNames.has("sourceVerification")) {
883
+ this.sqlite.exec("ALTER TABLE findings ADD COLUMN sourceVerification TEXT");
884
+ }
876
885
  this.sqlite.exec("UPDATE findings SET fingerprint = id WHERE fingerprint IS NULL OR fingerprint = ''");
877
886
  this.sqlite.exec("UPDATE findings SET triageStatus = 'new' WHERE triageStatus IS NULL OR triageStatus = ''");
878
887
  this.sqlite.exec(`
@@ -1364,6 +1373,7 @@ var osecDB = class {
1364
1373
  const semanticDedupeJson = finding.semanticDedupe ? JSON.stringify(finding.semanticDedupe) : null;
1365
1374
  const verificationResultJson = serializeFindingVerificationResult(finding.verification_result);
1366
1375
  const reviewAnnotationJson = serializeFindingReviewAnnotation(finding.reviewAnnotation);
1376
+ const sourceVerificationJson = serializeFindingSourceVerification(finding.sourceVerification);
1367
1377
  const candidateFindingRank = finding.findingRank;
1368
1378
  const findingRank = typeof candidateFindingRank === "number" && Number.isSafeInteger(candidateFindingRank) && candidateFindingRank > 0 ? candidateFindingRank : null;
1369
1379
  const derivedEvidence = deriveEvidenceFromPocSteps(finding);
@@ -1400,6 +1410,7 @@ var osecDB = class {
1400
1410
  findingRank,
1401
1411
  verificationResult: verificationResultJson,
1402
1412
  reviewAnnotation: reviewAnnotationJson,
1413
+ sourceVerification: sourceVerificationJson,
1403
1414
  timestamp: finding.timestamp
1404
1415
  }).onConflictDoUpdate({
1405
1416
  target: findings.id,
@@ -1431,6 +1442,7 @@ var osecDB = class {
1431
1442
  findingRank,
1432
1443
  verificationResult: verificationResultJson,
1433
1444
  reviewAnnotation: reviewAnnotationJson,
1445
+ sourceVerification: sourceVerificationJson,
1434
1446
  timestamp: finding.timestamp
1435
1447
  }
1436
1448
  }).run();
@@ -1440,11 +1452,10 @@ var osecDB = class {
1440
1452
  return this.db.select().from(findings).where(eq(findings.id, findingId)).get();
1441
1453
  }
1442
1454
  /**
1443
- * Read path for the two source-fix gate fields. Returns the hydrated
1444
- * `verification_result` / `reviewAnnotation` for a finding, with each key
1445
- * omitted when the finding has none (including rows written before the
1446
- * columns existed). Callers building a `Finding` spread this over the row:
1447
- * `{ ...mapped, ...db.getFindingReviewFields(id) }`.
1455
+ * Read path for the persisted `verification_result`, `reviewAnnotation`,
1456
+ * and `sourceVerification` fields. The first two retain their existing
1457
+ * source-fix gate semantics; a source-only check is never replay evidence.
1458
+ * Each key is omitted when absent, including for pre-migration rows.
1448
1459
  */
1449
1460
  getFindingReviewFields(findingId) {
1450
1461
  return restoreFindingReviewFields(this.getFinding(findingId));
@@ -2169,6 +2180,38 @@ function parseFindingReviewAnnotation(value) {
2169
2180
  return void 0;
2170
2181
  return parsed;
2171
2182
  }
2183
+ function parseFindingSourceVerification(value) {
2184
+ const parsed = parseJsonObjectColumn(value);
2185
+ if (!parsed)
2186
+ return void 0;
2187
+ const status = parsed.status;
2188
+ const totalPredicates = parsed.totalPredicates;
2189
+ const matchedPredicates = parsed.matchedPredicates;
2190
+ const notMatchedPredicates = parsed.notMatchedPredicates;
2191
+ const inconclusivePredicates = parsed.inconclusivePredicates;
2192
+ const behaviorPending = parsed.behaviorPending;
2193
+ if (status !== "matched" && status !== "not_confirmed" && status !== "inconclusive" || typeof totalPredicates !== "number" || !Number.isSafeInteger(totalPredicates) || totalPredicates < 0 || typeof matchedPredicates !== "number" || !Number.isSafeInteger(matchedPredicates) || matchedPredicates < 0 || typeof notMatchedPredicates !== "number" || !Number.isSafeInteger(notMatchedPredicates) || notMatchedPredicates < 0 || typeof inconclusivePredicates !== "number" || !Number.isSafeInteger(inconclusivePredicates) || inconclusivePredicates < 0 || typeof behaviorPending !== "boolean") {
2194
+ return void 0;
2195
+ }
2196
+ const countSum = matchedPredicates + notMatchedPredicates + inconclusivePredicates;
2197
+ if (!Number.isSafeInteger(countSum) || countSum !== totalPredicates)
2198
+ return void 0;
2199
+ if (status === "matched" && (totalPredicates === 0 || matchedPredicates !== totalPredicates || notMatchedPredicates !== 0 || inconclusivePredicates !== 0) || status === "not_confirmed" && (notMatchedPredicates === 0 || inconclusivePredicates !== 0) || status === "inconclusive" && inconclusivePredicates === 0 && totalPredicates !== 0) {
2200
+ return void 0;
2201
+ }
2202
+ return {
2203
+ status,
2204
+ totalPredicates,
2205
+ matchedPredicates,
2206
+ notMatchedPredicates,
2207
+ inconclusivePredicates,
2208
+ behaviorPending
2209
+ };
2210
+ }
2211
+ function serializeFindingSourceVerification(value) {
2212
+ const usable = parseFindingSourceVerification(value);
2213
+ return usable ? JSON.stringify(usable) : null;
2214
+ }
2172
2215
  function serializeFindingVerificationResult(value) {
2173
2216
  const usable = parseFindingVerificationResult(value);
2174
2217
  return usable ? JSON.stringify(usable) : null;
@@ -2182,9 +2225,11 @@ function restoreFindingReviewFields(row) {
2182
2225
  return {};
2183
2226
  const verificationResult = parseFindingVerificationResult(row.verificationResult);
2184
2227
  const reviewAnnotation = parseFindingReviewAnnotation(row.reviewAnnotation);
2228
+ const sourceVerification = parseFindingSourceVerification(row.sourceVerification);
2185
2229
  return {
2186
2230
  ...verificationResult ? { verification_result: verificationResult } : {},
2187
- ...reviewAnnotation ? { reviewAnnotation } : {}
2231
+ ...reviewAnnotation ? { reviewAnnotation } : {},
2232
+ ...sourceVerification ? { sourceVerification } : {}
2188
2233
  };
2189
2234
  }
2190
2235
  function deriveEvidenceFromPocSteps(finding) {
@@ -2278,6 +2323,7 @@ CREATE TABLE IF NOT EXISTS findings (
2278
2323
  findingRank INTEGER,
2279
2324
  verificationResult TEXT,
2280
2325
  reviewAnnotation TEXT,
2326
+ sourceVerification TEXT,
2281
2327
  timestamp INTEGER NOT NULL
2282
2328
  );
2283
2329
 
@@ -1,10 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __0CreateRequire } from "node:module";
3
3
  const require = __0CreateRequire(import.meta.url);
4
- import {
5
- eventBus,
6
- isCloudEventSinkActive
7
- } from "./chunk-CXKDWFNO.js";
8
4
 
9
5
  // packages/core/dist/runtime/process.js
10
6
  import { spawn } from "node:child_process";
@@ -76,21 +72,6 @@ function buildOsecMcpCommandArgs(context) {
76
72
  }
77
73
  return args;
78
74
  }
79
- function numericField(obj, key) {
80
- const v = obj[key];
81
- if (typeof v === "number" && Number.isFinite(v))
82
- return v;
83
- if (typeof v === "string" && /^\d+$/.test(v))
84
- return Number(v);
85
- return void 0;
86
- }
87
- function safeJsonStringify(v) {
88
- try {
89
- return JSON.stringify(v) ?? "";
90
- } catch {
91
- return "(unserialisable)";
92
- }
93
- }
94
75
  function buildClaudeMcpConfig(context) {
95
76
  return JSON.stringify({
96
77
  mcpServers: {
@@ -124,180 +105,6 @@ var ProcessRuntime = class {
124
105
  const args = this.buildArgs(prompt, context);
125
106
  const env = this.buildEnv(context);
126
107
  const onToolCall = this.config.onToolCall;
127
- const scanId = context?.scanId;
128
- const emitScanEvents = this.type === "codex" && isCloudEventSinkActive();
129
- const maxTurnsHint = 40;
130
- let turnNumber = 0;
131
- let toolCallSeq = 0;
132
- let deltaSeq = 0;
133
- let turnStartedAt = 0;
134
- const toolCallStartedAt = /* @__PURE__ */ new Map();
135
- const seenSequenceNumbers = /* @__PURE__ */ new Set();
136
- const isSeenSequence = (event) => {
137
- const seq = event.sequence_number;
138
- if (typeof seq !== "number" && typeof seq !== "string")
139
- return false;
140
- const key = `${event.type ?? "?"}|${seq}`;
141
- if (seenSequenceNumbers.has(key))
142
- return true;
143
- seenSequenceNumbers.add(key);
144
- return false;
145
- };
146
- const emitCodexCloudEvents = (event) => {
147
- if (isSeenSequence(event))
148
- return;
149
- const eventType = typeof event.type === "string" ? event.type : "";
150
- switch (eventType) {
151
- case "thread.started": {
152
- eventBus.emit("llm_planner_invoked", {
153
- turn: 0,
154
- model: this.config.model,
155
- role: "attack"
156
- });
157
- return;
158
- }
159
- case "turn.started": {
160
- turnNumber += 1;
161
- turnStartedAt = Date.now();
162
- deltaSeq = 0;
163
- eventBus.emit("agent_turn_started", {
164
- turn: turnNumber,
165
- max_turns: maxTurnsHint,
166
- role: "attack"
167
- });
168
- eventBus.emit("llm_planner_invoked", {
169
- turn: turnNumber,
170
- model: this.config.model,
171
- role: "attack"
172
- });
173
- return;
174
- }
175
- case "turn.completed": {
176
- const usage = event.usage ?? {};
177
- const inputTokens = numericField(usage, "input_tokens");
178
- const cachedInputTokens = numericField(usage, "cached_input_tokens");
179
- const outputTokens = numericField(usage, "output_tokens");
180
- const reasoningTokens = numericField(usage, "reasoning_output_tokens");
181
- const durationMs = turnStartedAt > 0 ? Date.now() - turnStartedAt : 0;
182
- eventBus.emit("agent_turn_completed", {
183
- turn: turnNumber,
184
- duration_ms: durationMs,
185
- reason: "continue",
186
- role: "attack"
187
- });
188
- eventBus.emit("cost_update", {
189
- turn: turnNumber,
190
- cost_usd: 0,
191
- input_tokens: inputTokens,
192
- output_tokens: outputTokens,
193
- token_input: inputTokens,
194
- token_output: outputTokens,
195
- cached_input_tokens: cachedInputTokens,
196
- reasoning_output_tokens: reasoningTokens
197
- });
198
- return;
199
- }
200
- case "item.started": {
201
- const item = event.item ?? {};
202
- const itemType = typeof item.type === "string" ? item.type : "";
203
- if (itemType === "command_execution" && typeof item.command === "string") {
204
- toolCallSeq += 1;
205
- toolCallStartedAt.set(toolCallSeq, Date.now());
206
- eventBus.emit("tool_call_started", {
207
- tool: "shell",
208
- turn: turnNumber,
209
- args_preview: item.command.slice(0, 200),
210
- ts: Date.now()
211
- });
212
- } else if (itemType === "mcp_tool_call") {
213
- toolCallSeq += 1;
214
- toolCallStartedAt.set(toolCallSeq, Date.now());
215
- const server = typeof item.server === "string" ? item.server : "?";
216
- const tool = typeof item.tool === "string" ? item.tool : "?";
217
- const argsRaw = item.arguments ?? {};
218
- const argsPreview = typeof argsRaw === "string" ? argsRaw : safeJsonStringify(argsRaw);
219
- eventBus.emit("tool_call_started", {
220
- tool: `${server}__${tool}`,
221
- turn: turnNumber,
222
- args_preview: argsPreview.slice(0, 200),
223
- ts: Date.now()
224
- });
225
- }
226
- return;
227
- }
228
- case "item.completed": {
229
- const item = event.item ?? {};
230
- const itemType = typeof item.type === "string" ? item.type : "";
231
- if (itemType === "command_execution") {
232
- const startedAt = toolCallStartedAt.get(toolCallSeq);
233
- const durationMs = startedAt != null ? Date.now() - startedAt : 0;
234
- toolCallStartedAt.delete(toolCallSeq);
235
- eventBus.emit("tool_call_completed", {
236
- tool: "shell",
237
- turn: turnNumber,
238
- duration_ms: durationMs,
239
- status: "ok",
240
- ts: Date.now()
241
- });
242
- } else if (itemType === "mcp_tool_call") {
243
- const startedAt = toolCallStartedAt.get(toolCallSeq);
244
- const durationMs = startedAt != null ? Date.now() - startedAt : 0;
245
- toolCallStartedAt.delete(toolCallSeq);
246
- const server = typeof item.server === "string" ? item.server : "?";
247
- const tool = typeof item.tool === "string" ? item.tool : "?";
248
- const status = item.status === "success" || item.status === "completed" ? "ok" : "error";
249
- const errorMsg = status === "error" ? typeof item.error === "string" ? item.error : safeJsonStringify(item.error ?? null) : void 0;
250
- eventBus.emit("tool_call_completed", {
251
- tool: `${server}__${tool}`,
252
- turn: turnNumber,
253
- duration_ms: durationMs,
254
- status,
255
- ...errorMsg ? { error: errorMsg.slice(0, 400) } : {},
256
- ts: Date.now()
257
- });
258
- } else if (itemType === "function_call" || itemType === "tool_call") {
259
- toolCallSeq += 1;
260
- const toolName = typeof item.tool_name === "string" && item.tool_name || typeof item.name === "string" && item.name || "mcp_tool";
261
- const argsField = item.arguments ?? item.input ?? "";
262
- const detail = typeof argsField === "string" ? argsField : safeJsonStringify(argsField);
263
- eventBus.emit("tool_call_started", {
264
- tool: toolName,
265
- turn: turnNumber,
266
- args_preview: detail.slice(0, 200),
267
- ts: Date.now()
268
- });
269
- eventBus.emit("tool_call_completed", {
270
- tool: toolName,
271
- turn: turnNumber,
272
- duration_ms: 0,
273
- status: "ok",
274
- ts: Date.now()
275
- });
276
- } else if (itemType === "reasoning") {
277
- const reasoningText = typeof item.text === "string" && item.text || typeof item.summary === "string" && item.summary || "";
278
- if (reasoningText.length > 0) {
279
- eventBus.emit("reasoning_summary", {
280
- turn: turnNumber,
281
- summary: reasoningText.slice(0, 2e3)
282
- });
283
- }
284
- } else if (itemType === "agent_message") {
285
- const messageText = typeof item.text === "string" ? item.text : "";
286
- if (messageText.length > 0) {
287
- deltaSeq += 1;
288
- eventBus.emit("delta", {
289
- turn: turnNumber,
290
- scope: "assistant_response",
291
- text: messageText.slice(0, 2e3),
292
- seq: deltaSeq,
293
- role: "attack"
294
- });
295
- }
296
- }
297
- return;
298
- }
299
- }
300
- };
301
108
  return new Promise((resolve2) => {
302
109
  let stdout = "";
303
110
  let stderr = "";
@@ -352,8 +159,6 @@ var ProcessRuntime = class {
352
159
  } else if (event.item.type === "command_execution" && event.item.command) {
353
160
  }
354
161
  }
355
- if (emitScanEvents)
356
- emitCodexCloudEvents(event);
357
162
  } catch {
358
163
  }
359
164
  }
@@ -3,7 +3,7 @@ import { createRequire as __0CreateRequire } from "node:module";
3
3
  const require = __0CreateRequire(import.meta.url);
4
4
  import {
5
5
  homeStateDir
6
- } from "./chunk-PC6RCKQV.js";
6
+ } from "./chunk-76KSBWOQ.js";
7
7
 
8
8
  // packages/core/dist/triage/kernel-vm-runner.js
9
9
  import { execFileSync, spawn } from "node:child_process";