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,15 +5,11 @@ import {
5
5
  isValidSessionId,
6
6
  listSessions,
7
7
  loadSession
8
- } from "./chunk-NOPBXZUV.js";
8
+ } from "./chunk-MICHDTBK.js";
9
9
  import {
10
- consolePresentationOutput,
11
10
  getSettings,
12
11
  maybeLoadCodexAuth
13
- } from "./chunk-YPOA3W4O.js";
14
- import {
15
- source_default
16
- } from "./chunk-HLFS6WV2.js";
12
+ } from "./chunk-YIQSGNAA.js";
17
13
  import {
18
14
  createConsoleJevRuntime,
19
15
  createConsoleSession,
@@ -25,49 +21,40 @@ import {
25
21
  retireArchetype,
26
22
  runLensSynthesisLoop,
27
23
  toToolContextJevRuntime
28
- } from "./chunk-FAH6V4QM.js";
24
+ } from "./chunk-EGZGZFAH.js";
25
+ import {
26
+ source_default
27
+ } from "./chunk-HLFS6WV2.js";
29
28
  import {
30
29
  harvestMissesFromLedgerEntry,
31
30
  mergeHarvestedMisses
32
- } from "./chunk-ANDKY54G.js";
31
+ } from "./chunk-SJBCK2EI.js";
33
32
  import {
34
33
  eventBus
35
- } from "./chunk-CXKDWFNO.js";
34
+ } from "./chunk-RE5EZDG2.js";
36
35
  import {
37
36
  listOsecRunDatabasePaths,
38
37
  osecDB,
39
38
  resolveOsecDbPath
40
- } from "./chunk-WZISK5VC.js";
39
+ } from "./chunk-VNRY6AWF.js";
41
40
  import {
42
41
  redactSensitiveHeaders
43
- } from "./chunk-W4JOXE4N.js";
44
- import {
45
- CloudAuthMissingError,
46
- CloudClient,
47
- CloudError,
48
- CloudForbiddenError,
49
- CloudNetworkError,
50
- CloudUnauthorizedError,
51
- DEFAULT_CLOUD_HOST,
52
- loadCloudCredentials
53
- } from "./chunk-BACXRTQ4.js";
42
+ } from "./chunk-UELXHK2Y.js";
54
43
  import {
55
44
  SEVERITY_RANK,
56
45
  VERSION,
57
- cloudStateDir,
58
46
  createAuditReportDocument,
59
47
  createReviewReportDocument,
60
48
  createScanReportDocument,
61
49
  findingSchema,
62
50
  formatZodError,
63
- homeStateDir,
64
51
  severityRank
65
- } from "./chunk-PC6RCKQV.js";
52
+ } from "./chunk-76KSBWOQ.js";
66
53
 
67
54
  // packages/cli/src/utils.ts
68
55
  import { gzipSync } from "zlib";
69
56
  async function getRuntimeAvailability() {
70
- const { detectAvailableRuntimes, LlmApiRuntime } = await import("./dist-F6X62TQK.js");
57
+ const { detectAvailableRuntimes, LlmApiRuntime } = await import("./dist-3FNZIBB4.js");
71
58
  const apiRuntimeDiagnostics = new LlmApiRuntime({ type: "api", timeout: 5e3 }).getConfigurationDiagnostics();
72
59
  const hasApiKey = apiRuntimeDiagnostics.valid;
73
60
  const availableRuntimes = [...await detectAvailableRuntimes()];
@@ -578,392 +565,12 @@ function registerLensSynthCommand(program) {
578
565
  });
579
566
  }
580
567
 
581
- // packages/cli/src/commands/auth.ts
582
- import { spawn } from "node:child_process";
583
- import { mkdirSync, writeFileSync, chmodSync, unlinkSync, existsSync as existsSync2 } from "node:fs";
584
- import { homedir, platform } from "node:os";
585
- import { join } from "node:path";
586
- import { randomBytes } from "node:crypto";
587
- import { setTimeout as delay } from "node:timers/promises";
588
- var EXIT_OK = 0;
589
- var EXIT_USER_ERROR = 1;
590
- var EXIT_AUTH = 2;
591
- var EXIT_NET = 3;
592
- function registerAuthCommand(program) {
593
- const auth = program.command("auth").description("0-cloud authentication");
594
- auth.command("login").description("Log in to 0-cloud (opens browser; --token to paste directly)").option("--host <url>", "Cloud host (defaults to ZERO_CLOUD_HOST or production)").option("--token <value>", "Skip the browser flow and persist this token directly").action(async (opts) => {
595
- await runLogin(opts);
596
- });
597
- auth.command("logout").description("Delete credentials for the current Cloud profile").action(() => {
598
- runLogout({});
599
- });
600
- auth.command("status").description("Verify 0-cloud credentials and account access").action(async () => {
601
- await runStatus({});
602
- });
603
- }
604
- async function hostedBrowserLoginFlow(opts = {}) {
605
- const host = normaliseHostArg(opts.host ?? process.env["ZERO_CLOUD_HOST"] ?? DEFAULT_CLOUD_HOST);
606
- if (host === null) {
607
- return { ok: false, error: "Cloud host must be an http(s) URL without credentials, query or fragment." };
608
- }
609
- const attempts = opts.pollAttempts ?? 150;
610
- const intervalMs = opts.pollIntervalMs ?? 2e3;
611
- if (!Number.isSafeInteger(attempts) || attempts <= 0 || !Number.isFinite(intervalMs) || intervalMs < 0) {
612
- return { ok: false, error: "Invalid sign-in polling budget." };
613
- }
614
- const cancelled = () => {
615
- opts.onStatus?.("cancelled", "Sign-in cancelled.");
616
- return { ok: false, error: "Sign-in cancelled.", recoverable: true, cancelled: true };
617
- };
618
- if (opts.signal?.aborted) return cancelled();
619
- const deadline = new AbortController();
620
- const timer = setTimeout(() => deadline.abort(), 3e5);
621
- const signal = opts.signal ? AbortSignal.any([opts.signal, deadline.signal]) : deadline.signal;
622
- const session = randomBytes(9).toString("base64url").slice(0, 12);
623
- const loginUrl = `${host}/cli-auth?session=${session}`;
624
- const pollUrl = `${host}/cli-auth/sessions/${session}`;
625
- const timedOut = () => {
626
- opts.onStatus?.("timeout", "Sign-in timed out. Try again.");
627
- return { ok: false, error: "Sign-in timed out. Try again.", recoverable: true };
628
- };
629
- try {
630
- opts.onStatus?.("opening", "Opening browser for 0cloud sign-in.", loginUrl);
631
- signal.throwIfAborted();
632
- try {
633
- await awaitLoginStep(Promise.resolve().then(() => {
634
- signal.throwIfAborted();
635
- return (opts.openBrowser ?? defaultOpenBrowser)(loginUrl);
636
- }), signal);
637
- } catch {
638
- signal.throwIfAborted();
639
- opts.onStatus?.("opener-failed", "Could not open a browser. Open this sign-in URL manually.", loginUrl);
640
- }
641
- const fetcher = opts.fetchImpl ?? fetch;
642
- for (let i = 0; i < attempts; i++) {
643
- signal.throwIfAborted();
644
- opts.onStatus?.("polling", "Waiting for browser sign-in.", loginUrl);
645
- signal.throwIfAborted();
646
- await awaitLoginStep(
647
- opts.sleep ? opts.sleep(intervalMs) : delay(intervalMs, void 0, { signal }),
648
- signal
649
- );
650
- signal.throwIfAborted();
651
- const request = new AbortController();
652
- const requestTimer = setTimeout(() => request.abort(), 1e4);
653
- const requestSignal = AbortSignal.any([signal, request.signal]);
654
- try {
655
- let res;
656
- try {
657
- res = await awaitLoginStep(fetcher(pollUrl, {
658
- method: "GET",
659
- headers: { Accept: "application/json" },
660
- signal: requestSignal,
661
- redirect: "error"
662
- }), requestSignal);
663
- } catch {
664
- signal.throwIfAborted();
665
- continue;
666
- }
667
- signal.throwIfAborted();
668
- if (res.status === 200) {
669
- let body;
670
- try {
671
- body = await awaitLoginStep(res.json(), requestSignal);
672
- } catch {
673
- signal.throwIfAborted();
674
- if (requestSignal.aborted) continue;
675
- return { ok: false, error: "Login response was not valid JSON." };
676
- }
677
- signal.throwIfAborted();
678
- const rawStatus = body && typeof body === "object" ? body.status : void 0;
679
- const status = sessionStatus(body);
680
- const token = extractToken(body);
681
- if (token) {
682
- if (rawStatus !== void 0 && status !== "ready") {
683
- return { ok: false, error: "Login returned credentials before the session was ready." };
684
- }
685
- try {
686
- persistCredentials(host, token, opts.homeDir);
687
- } catch {
688
- return { ok: false, error: "Could not save 0cloud credentials." };
689
- }
690
- opts.onStatus?.("ready", "Signed in to 0cloud.");
691
- return { ok: true, host };
692
- }
693
- if (status === "pending") continue;
694
- if (status === "expired") return { ok: false, error: "Sign-in request expired. Try again.", recoverable: true };
695
- return { ok: false, error: "Login response did not contain valid credentials." };
696
- }
697
- if ([202, 204, 404].includes(res.status)) continue;
698
- if (res.status === 410) return { ok: false, error: "Sign-in request expired. Try again.", recoverable: true };
699
- return {
700
- ok: false,
701
- error: `0cloud sign-in unavailable (HTTP ${res.status}). Use your own provider or try again later.`,
702
- recoverable: res.status === 429 || res.status >= 500
703
- };
704
- } finally {
705
- clearTimeout(requestTimer);
706
- request.abort();
707
- }
708
- }
709
- return timedOut();
710
- } catch (error) {
711
- if (opts.signal?.aborted) return cancelled();
712
- if (deadline.signal.aborted) return timedOut();
713
- throw error;
714
- } finally {
715
- clearTimeout(timer);
716
- }
717
- }
718
- async function awaitLoginStep(operation, signal) {
719
- return new Promise((resolve4, reject) => {
720
- const onAbort = () => {
721
- signal.removeEventListener("abort", onAbort);
722
- reject(signal.reason);
723
- };
724
- operation.then(
725
- (value) => {
726
- signal.removeEventListener("abort", onAbort);
727
- resolve4(value);
728
- },
729
- (error) => {
730
- signal.removeEventListener("abort", onAbort);
731
- reject(error);
732
- }
733
- );
734
- if (signal.aborted) onAbort();
735
- else signal.addEventListener("abort", onAbort, { once: true });
736
- });
737
- }
738
- async function runLogin(opts) {
739
- const host = normaliseHostArg(opts.host ?? process.env["ZERO_CLOUD_HOST"] ?? DEFAULT_CLOUD_HOST);
740
- if (host === null) {
741
- consolePresentationOutput.stderr(source_default.red("Error: Cloud host must be an http(s) URL without credentials, query or fragment."), "auth.login.host-error");
742
- process.exitCode = EXIT_USER_ERROR;
743
- return;
744
- }
745
- if (opts.token !== void 0) {
746
- const tok = opts.token.trim();
747
- if (!validCloudToken(tok)) {
748
- consolePresentationOutput.stderr(source_default.red("Error: --token must be a nonempty credential without whitespace."), "auth.login.token-empty");
749
- process.exitCode = EXIT_USER_ERROR;
750
- return;
751
- }
752
- try {
753
- persistCredentials(host, tok, opts.homeDir);
754
- } catch {
755
- consolePresentationOutput.stderr(source_default.red("Could not save 0cloud credentials."), "auth.login.save-error");
756
- process.exitCode = EXIT_USER_ERROR;
757
- return;
758
- }
759
- consolePresentationOutput.stdout(`Logged in (host=${host})`, "auth.login.logged-in");
760
- process.exitCode = EXIT_OK;
761
- return;
762
- }
763
- const result = await hostedBrowserLoginFlow({
764
- host,
765
- pollAttempts: opts.pollAttempts,
766
- pollIntervalMs: opts.pollIntervalMs,
767
- openBrowser: opts.openBrowser,
768
- fetchImpl: opts.fetchImpl,
769
- homeDir: opts.homeDir,
770
- sleep: opts.sleep,
771
- onStatus: (phase, msg, url) => {
772
- if (phase === "opening") {
773
- consolePresentationOutput.stdout(source_default.dim("Opening browser..."), "auth.login.opening");
774
- if (url) consolePresentationOutput.stdout(source_default.dim(` ${url}`), "auth.login.url");
775
- consolePresentationOutput.stdout("", "auth.login.empty-line");
776
- consolePresentationOutput.stdout(source_default.dim("Complete sign-in in the opened browser, then return here."), "auth.login.browser-hint");
777
- consolePresentationOutput.stdout("", "auth.login.empty-line");
778
- }
779
- if (phase === "opener-failed") {
780
- consolePresentationOutput.stderr(source_default.yellow(msg), "auth.login.browser-error");
781
- }
782
- }
783
- });
784
- if (result.ok) {
785
- consolePresentationOutput.stdout(`Logged in (host=${result.host})`, "auth.login.logged-in");
786
- process.exitCode = EXIT_OK;
787
- } else {
788
- consolePresentationOutput.stderr(source_default.red(result.error), "auth.login.error");
789
- process.exitCode = result.recoverable ? EXIT_NET : EXIT_USER_ERROR;
790
- }
791
- }
792
- function runLogout(opts) {
793
- const home = opts.homeDir ?? homedir();
794
- const stateDir = cloudStateDir(opts.homeDir);
795
- const osecPath = join(stateDir, "cloud.env");
796
- const cloudCredsPath = join(home, ".0cloud", "credentials.json");
797
- let deletedAny = false;
798
- try {
799
- unlinkSync(osecPath);
800
- deletedAny = true;
801
- } catch (err) {
802
- const code = err.code;
803
- if (code !== "ENOENT") {
804
- consolePresentationOutput.stderr(source_default.red(`Could not delete ${osecPath}: ${err instanceof Error ? err.message : String(err)}`), "auth.logout.delete-error");
805
- process.exitCode = EXIT_USER_ERROR;
806
- return;
807
- }
808
- }
809
- if (stateDir === homeStateDir(opts.homeDir)) {
810
- try {
811
- unlinkSync(cloudCredsPath);
812
- deletedAny = true;
813
- } catch (err) {
814
- const code = err !== null && typeof err === "object" && "code" in err ? err.code : void 0;
815
- if (code !== "ENOENT") {
816
- consolePresentationOutput.stderr(source_default.red(`Could not delete ${cloudCredsPath}: ${err instanceof Error ? err.message : String(err)}`), "auth.logout.delete-error");
817
- process.exitCode = EXIT_USER_ERROR;
818
- return;
819
- }
820
- }
821
- }
822
- if (deletedAny) {
823
- consolePresentationOutput.stdout("Logged out", "auth.logout.deleted");
824
- } else {
825
- consolePresentationOutput.stdout("Logged out (no credentials file was present)", "auth.logout.not-found");
826
- }
827
- process.exitCode = EXIT_OK;
828
- }
829
- async function runStatus(opts) {
830
- let creds;
831
- try {
832
- const c = loadCloudCredentials();
833
- creds = { host: c.host, token: c.token };
834
- } catch (err) {
835
- if (err instanceof CloudAuthMissingError) {
836
- consolePresentationOutput.stderr(source_default.red(err.message), "auth.status.auth-missing");
837
- process.exitCode = EXIT_AUTH;
838
- return;
839
- }
840
- consolePresentationOutput.stderr(source_default.red(err instanceof Error ? err.message : String(err)), "auth.status.load-error");
841
- process.exitCode = EXIT_AUTH;
842
- return;
843
- }
844
- const client = new CloudClient({ ...creds, fetchImpl: opts.fetchImpl });
845
- try {
846
- await client.getInferenceAccount();
847
- consolePresentationOutput.stdout(`OK (host=${creds.host})`, "auth.status.ok");
848
- process.exitCode = EXIT_OK;
849
- } catch (err) {
850
- handleStatusError(err);
851
- }
852
- }
853
- function handleStatusError(err) {
854
- if (err instanceof CloudUnauthorizedError) {
855
- consolePresentationOutput.stderr("FAIL (HTTP 401)", "auth.status.unauthorized");
856
- process.exitCode = EXIT_AUTH;
857
- return;
858
- }
859
- if (err instanceof CloudForbiddenError) {
860
- consolePresentationOutput.stderr(source_default.red(`FAIL (HTTP 403) \u2014 status: ${err.message}`), "auth.status.forbidden");
861
- process.exitCode = EXIT_AUTH;
862
- return;
863
- }
864
- if (err instanceof CloudNetworkError) {
865
- consolePresentationOutput.stderr(source_default.red(`FAIL (network) \u2014 status: ${err.message}`), "auth.status.network-error");
866
- process.exitCode = EXIT_NET;
867
- return;
868
- }
869
- if (err instanceof CloudError) {
870
- consolePresentationOutput.stderr(source_default.red(`FAIL (HTTP ${err.status ?? "?"}) \u2014 status`), "auth.status.cloud-error");
871
- process.exitCode = EXIT_USER_ERROR;
872
- return;
873
- }
874
- consolePresentationOutput.stderr(source_default.red(`FAIL \u2014 status: ${err instanceof Error ? err.message : String(err)}`), "auth.status.error");
875
- process.exitCode = EXIT_USER_ERROR;
876
- }
877
- function normaliseHostArg(host) {
878
- if (!host?.trim()) return null;
879
- try {
880
- const url = new URL(host.trim());
881
- if (!["http:", "https:"].includes(url.protocol) || url.username || url.password || url.search || url.hash) return null;
882
- return url.href.replace(/\/+$/, "");
883
- } catch {
884
- return null;
885
- }
886
- }
887
- function persistCredentials(host, token, homeDirOverride) {
888
- if (!validCloudToken(token)) throw new Error("Invalid Cloud credential");
889
- const home = homeDirOverride ?? homedir();
890
- const dir = cloudStateDir(homeDirOverride);
891
- mkdirSync(dir, { recursive: true, mode: 448 });
892
- const path = join(dir, "cloud.env");
893
- const body = `# 0-cloud credentials. Managed by \`0 auth\`.
894
- # DO NOT commit this file or share its contents.
895
- ZERO_CLOUD_HOST=${host}
896
- ZERO_CLOUD_TOKEN=${token}
897
- `;
898
- writeFileSync(path, body, { mode: 384 });
899
- chmodSync(path, 384);
900
- if (!existsSync2(path)) {
901
- return;
902
- }
903
- if (dir !== homeStateDir(homeDirOverride)) return;
904
- try {
905
- const cloudDir = join(home, ".0cloud");
906
- mkdirSync(cloudDir, { recursive: true });
907
- const cloudCredsPath = join(cloudDir, "credentials.json");
908
- const trimmedHost = host.replace(/\/+$/, "");
909
- const apiEndpoint = trimmedHost.endsWith("/api") ? trimmedHost : `${trimmedHost}/api`;
910
- const cloudCreds = JSON.stringify(
911
- {
912
- token,
913
- orgId: "",
914
- endpoint: apiEndpoint,
915
- dashboardUrl: host,
916
- createdAt: (/* @__PURE__ */ new Date()).toISOString()
917
- },
918
- null,
919
- 2
920
- ) + "\n";
921
- writeFileSync(cloudCredsPath, cloudCreds, { mode: 384 });
922
- chmodSync(cloudCredsPath, 384);
923
- } catch {
924
- }
925
- }
926
- function sessionStatus(body) {
927
- if (!body || typeof body !== "object") return void 0;
928
- const status = body.status;
929
- return status === "pending" || status === "ready" || status === "expired" ? status : void 0;
930
- }
931
- function validCloudToken(value) {
932
- return typeof value === "string" && value.trim().length > 0 && !/[\s\x00-\x1f\x7f]/.test(value.trim());
933
- }
934
- function extractToken(body) {
935
- if (!body || typeof body !== "object") return null;
936
- const obj = body;
937
- const candidates = [obj.token, obj.access_token];
938
- for (const c of candidates) {
939
- if (validCloudToken(c)) return c.trim();
940
- }
941
- return null;
942
- }
943
- function defaultOpenBrowser(url) {
944
- const plat = platform();
945
- return new Promise((resolve4, reject) => {
946
- const options = { detached: true, stdio: "ignore", shell: false };
947
- const child = plat === "darwin" ? spawn("open", [url], options) : plat === "win32" ? spawn("powershell.exe", [
948
- "-NoProfile",
949
- "-NonInteractive",
950
- "-Command",
951
- "Start-Process -FilePath $env:OSEC_BROWSER_LOGIN_URL"
952
- ], { ...options, env: { ...process.env, OSEC_BROWSER_LOGIN_URL: url } }) : spawn("xdg-open", [url], options);
953
- child.once("error", reject);
954
- child.once("spawn", () => {
955
- child.unref();
956
- resolve4();
957
- });
958
- });
959
- }
960
-
961
568
  // packages/cli/src/commands/run.ts
962
569
  import { writeFile } from "node:fs/promises";
963
- import { join as join2, resolve as resolve3 } from "node:path";
570
+ import { join, resolve as resolve3 } from "node:path";
964
571
  import { tmpdir } from "node:os";
965
572
  import { execFile } from "node:child_process";
966
- import { existsSync as existsSync3 } from "node:fs";
573
+ import { existsSync as existsSync2 } from "node:fs";
967
574
  import { fileURLToPath } from "node:url";
968
575
 
969
576
  // packages/cli/src/formatters/terminal.ts
@@ -2532,8 +2139,8 @@ var coreModulePromise = null;
2532
2139
  async function loadCoreModule() {
2533
2140
  if (!coreModulePromise) {
2534
2141
  const srcUrl = new URL("../../../core/src/index.ts", import.meta.url);
2535
- const srcExists = process.versions.bun && existsSync3(fileURLToPath(srcUrl));
2536
- coreModulePromise = srcExists ? import(srcUrl.href) : import("./dist-F6X62TQK.js");
2142
+ const srcExists = process.versions.bun && existsSync2(fileURLToPath(srcUrl));
2143
+ coreModulePromise = srcExists ? import(srcUrl.href) : import("./dist-3FNZIBB4.js");
2537
2144
  }
2538
2145
  return coreModulePromise;
2539
2146
  }
@@ -2577,17 +2184,9 @@ function getTargetType(report, opts) {
2577
2184
  return report?.targetType ?? opts.targetType;
2578
2185
  }
2579
2186
  function emitResultLine(payload) {
2580
- if (process.env["ZERO_EMIT_RESULT_LINE"] !== "1" && !process.env["ZERO_CLOUD_SINK"]) return;
2187
+ if (process.env["ZERO_EMIT_RESULT_LINE"] !== "1") return;
2581
2188
  console.log(`ZERO_RESULT=${JSON.stringify(payload)}`);
2582
2189
  }
2583
- function getCloudFinalSinkConfig() {
2584
- if (process.env["ZERO_FEATURE_CLOUD_SINK"] === "0") return null;
2585
- const sinkUrl = process.env["ZERO_CLOUD_SINK"]?.trim();
2586
- const scanId = process.env["ZERO_CLOUD_SCAN_ID"]?.trim();
2587
- if (!sinkUrl || !scanId) return null;
2588
- const token = process.env["ZERO_CLOUD_TOKEN"]?.trim() || void 0;
2589
- return { sinkUrl, scanId, token };
2590
- }
2591
2190
  function isCostBreakdownEntry(value) {
2592
2191
  if (!value || typeof value !== "object") return false;
2593
2192
  const entry = value;
@@ -2659,34 +2258,6 @@ function printCrossValidatedLeads(summary) {
2659
2258
  console.log(source_default.gray(` +${summary.moreCount} more`));
2660
2259
  }
2661
2260
  }
2662
- async function postFinalResultToCloud(report) {
2663
- const config = getCloudFinalSinkConfig();
2664
- if (!config) return;
2665
- const url = `${config.sinkUrl.replace(/\/+$/, "")}/scans/${encodeURIComponent(config.scanId)}/findings`;
2666
- const headers = {
2667
- "Content-Type": "application/json",
2668
- "X-0-Scan-Id": config.scanId
2669
- };
2670
- if (config.token) headers.Authorization = `Bearer ${config.token}`;
2671
- try {
2672
- const res = await fetch(url, {
2673
- method: "POST",
2674
- headers,
2675
- body: JSON.stringify({ report, final: true })
2676
- });
2677
- if (!res.ok) {
2678
- const text = await res.text().catch(() => "");
2679
- process.stderr.write(
2680
- `[0 cloud-sink] report POST ${url} returned ${res.status}: ${text.slice(0, 200)}
2681
- `
2682
- );
2683
- }
2684
- } catch (err) {
2685
- const msg = err instanceof Error ? err.message : String(err);
2686
- process.stderr.write(`[0 cloud-sink] report POST ${url} failed: ${msg}
2687
- `);
2688
- }
2689
- }
2690
2261
  async function runUnified(opts) {
2691
2262
  const { target, depth, format, runtime, timeout } = opts;
2692
2263
  const core = await loadCoreModule();
@@ -2696,7 +2267,7 @@ async function runUnified(opts) {
2696
2267
  console.error(source_default.red("--branch-from requires --resume <run-id>"));
2697
2268
  process.exit(2);
2698
2269
  }
2699
- const { branchJournal } = await import("./dist-F6X62TQK.js");
2270
+ const { branchJournal } = await import("./dist-3FNZIBB4.js");
2700
2271
  const result = branchJournal({
2701
2272
  runId: effectiveResumeScanId,
2702
2273
  fromEntry: opts.branchFromEntry
@@ -2753,7 +2324,7 @@ async function runUnified(opts) {
2753
2324
  } else {
2754
2325
  const { isBunRuntime } = await import("./runtime-XFWJTBUO.js");
2755
2326
  if (isBunRuntime()) {
2756
- const { createOpenTuiSession } = await import("./run-CBGE6DRQ.js");
2327
+ const { createOpenTuiSession } = await import("./run-U3XU4CTC.js");
2757
2328
  const availability = await getRuntimeAvailability();
2758
2329
  inkUI = await createOpenTuiSession({
2759
2330
  target,
@@ -2842,16 +2413,13 @@ async function runUnified(opts) {
2842
2413
  }
2843
2414
  const reportAny = report;
2844
2415
  const canonicalReport = toScanReport(report);
2845
- if (opts.targetType !== "url" && opts.targetType !== "web-app") {
2846
- await postFinalResultToCloud(reportAny);
2847
- }
2848
2416
  if (inkUI) {
2849
2417
  inkUI.setReport(report);
2850
2418
  await inkUI.waitForExit();
2851
2419
  } else {
2852
2420
  if (format === "html" || format === "pdf") {
2853
2421
  const extension = format === "pdf" ? "pdf" : "html";
2854
- const filePath = opts.reportPath ? resolve3(opts.reportPath) : join2(tmpdir(), `0-report-${Date.now()}.${extension}`);
2422
+ const filePath = opts.reportPath ? resolve3(opts.reportPath) : join(tmpdir(), `0-report-${Date.now()}.${extension}`);
2855
2423
  if (format === "pdf") {
2856
2424
  await generatePdfReport(toScanReport(reportAny), filePath);
2857
2425
  } else {
@@ -2887,8 +2455,8 @@ async function runUnified(opts) {
2887
2455
  if (opts.emit === "pr") {
2888
2456
  const findings = report.findings ?? [];
2889
2457
  const core2 = await loadCoreModule();
2890
- const repoRoot = opts.targetType === "source-code" && existsSync3(target) ? resolve3(target) : process.cwd();
2891
- const outDir = opts.emitOutDir ?? join2(tmpdir(), `0-emit-${Date.now()}`);
2458
+ const repoRoot = opts.targetType === "source-code" && existsSync2(target) ? resolve3(target) : process.cwd();
2459
+ const outDir = opts.emitOutDir ?? join(tmpdir(), `0-emit-${Date.now()}`);
2892
2460
  console.log(source_default.blue(`[emit pr] ${findings.length} finding(s); repo=${repoRoot} base=${opts.emitPrBase ?? "main"}${opts.emitPrDryRun ? " (dry-run)" : ""}`));
2893
2461
  const emitReport = await core2.emitFindingsAsPRs(findings, {
2894
2462
  repoRoot,
@@ -2999,13 +2567,18 @@ var DEFAULT_ENCODED_RUN_MAX = 140;
2999
2567
  var ENCODED_RUN_MAX_CAP = 1e6;
3000
2568
  var ELLIPSIS = "...";
3001
2569
  var ENCODED_PLACEHOLDER = "[encoded payload omitted]";
2570
+ var DEFAULT_ENCODED_SEGMENT = new RegExp(`[A-Za-z0-9+_-]{${DEFAULT_ENCODED_RUN_MAX},}={0,2}`, "g");
2571
+ var DEFAULT_ENCODED_DATA_URI = new RegExp(`(data:[^\\s,]*;base64,)[A-Za-z0-9+/_-]{${DEFAULT_ENCODED_RUN_MAX},}={0,2}`, "gi");
3002
2572
  function stripTerminalControl(text) {
3003
2573
  return text.replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g, "").replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "").replace(/[\x00-\x08\x0b-\x1f\x7f]/g, "");
3004
2574
  }
3005
2575
  function replaceLargeEncodedChunks(text, maxEncodedRun) {
3006
2576
  const normalized = Number.isFinite(maxEncodedRun) ? Math.trunc(maxEncodedRun) : DEFAULT_ENCODED_RUN_MAX;
3007
2577
  const minRun = Math.min(Math.max(32, normalized), ENCODED_RUN_MAX_CAP);
3008
- return text.replace(new RegExp(`[A-Za-z0-9+/_-]{${minRun},}={0,2}`, "g"), ENCODED_PLACEHOLDER);
2578
+ if (text.length < minRun) return text;
2579
+ const segment = minRun === DEFAULT_ENCODED_RUN_MAX ? DEFAULT_ENCODED_SEGMENT : new RegExp(`[A-Za-z0-9+_-]{${minRun},}={0,2}`, "g");
2580
+ const dataUri = minRun === DEFAULT_ENCODED_RUN_MAX ? DEFAULT_ENCODED_DATA_URI : new RegExp(`(data:[^\\s,]*;base64,)[A-Za-z0-9+/_-]{${minRun},}={0,2}`, "gi");
2581
+ return text.replace(dataUri, `$1${ENCODED_PLACEHOLDER}`).replace(segment, ENCODED_PLACEHOLDER);
3009
2582
  }
3010
2583
  function sanitizeTuiText(value, options = {}) {
3011
2584
  return stripTerminalControl(replaceLargeEncodedChunks(String(value ?? ""), options.maxEncodedRun ?? DEFAULT_ENCODED_RUN_MAX)).replace(/\s+/g, " ").trim();
@@ -3143,20 +2716,6 @@ var SLASH_COMMANDS = [
3143
2716
  category: "info",
3144
2717
  description: "List available tools"
3145
2718
  },
3146
- {
3147
- name: "agents",
3148
- aliases: [],
3149
- category: "info",
3150
- description: "List available agents",
3151
- tuiOnly: true
3152
- },
3153
- {
3154
- name: "harness",
3155
- aliases: [],
3156
- category: "navigation",
3157
- description: "Live harness: views, commands, settings, rollback and workspace trust",
3158
- tuiOnly: true
3159
- },
3160
2719
  {
3161
2720
  name: "new-chat",
3162
2721
  aliases: ["new"],
@@ -3164,13 +2723,6 @@ var SLASH_COMMANDS = [
3164
2723
  description: "Create an independent audit using the staged model and connection",
3165
2724
  tuiOnly: true
3166
2725
  },
3167
- {
3168
- name: "audits",
3169
- aliases: [],
3170
- category: "navigation",
3171
- description: "Switch between live audits without stopping their work",
3172
- tuiOnly: true
3173
- },
3174
2726
  {
3175
2727
  name: "onboard",
3176
2728
  aliases: [],
@@ -3178,14 +2730,6 @@ var SLASH_COMMANDS = [
3178
2730
  description: "Reopen guided setup without replacing the current audit",
3179
2731
  tuiOnly: true
3180
2732
  },
3181
- {
3182
- name: "stop",
3183
- aliases: [],
3184
- category: "session",
3185
- description: "Stop this audit's work or one owned worker and its descendants",
3186
- usage: "/stop audit | /stop worker <exact name or id>",
3187
- tuiOnly: true
3188
- },
3189
2733
  // ── session ─────────────────────────────────────────────────────────────
3190
2734
  {
3191
2735
  name: "clear",
@@ -3200,13 +2744,6 @@ var SLASH_COMMANDS = [
3200
2744
  description: "Browse previous scan runs and their results",
3201
2745
  tuiOnly: true
3202
2746
  },
3203
- {
3204
- name: "transcript",
3205
- aliases: ["review"],
3206
- category: "session",
3207
- description: "Show this conversation, including tool details",
3208
- tuiOnly: true
3209
- },
3210
2747
  {
3211
2748
  name: "findings",
3212
2749
  aliases: ["finds"],
@@ -3215,11 +2752,11 @@ var SLASH_COMMANDS = [
3215
2752
  tuiOnly: true
3216
2753
  },
3217
2754
  {
3218
- name: "finding",
3219
- aliases: ["finding-detail"],
2755
+ name: "fix",
2756
+ aliases: [],
3220
2757
  category: "session",
3221
- description: "Open one finding in full detail to read and act on it",
3222
- usage: "/finding [id]",
2758
+ description: "Generate a verified local source fix; review before explicitly publishing a draft PR",
2759
+ usage: "/fix [finding-id] | /fix publish <finding-id> | /fix cancel",
3223
2760
  tuiOnly: true
3224
2761
  },
3225
2762
  {
@@ -3239,25 +2776,11 @@ var SLASH_COMMANDS = [
3239
2776
  tuiOnly: true
3240
2777
  },
3241
2778
  {
3242
- name: "replay",
2779
+ name: "sessions",
3243
2780
  aliases: [],
3244
2781
  category: "session",
3245
- description: "Replay a previous turn or session",
3246
- tuiOnly: true
3247
- },
3248
- {
3249
- name: "resume",
3250
- aliases: ["sessions"],
3251
- category: "session",
3252
- description: "Find and resume saved conversations",
3253
- usage: "/resume"
3254
- },
3255
- {
3256
- name: "providers",
3257
- aliases: [],
3258
- category: "system",
3259
- description: "Connection: 0cloud, API keys, or provider subscriptions",
3260
- usage: "/providers",
2782
+ description: "Switch open sessions or resume saved conversations",
2783
+ usage: "/sessions",
3261
2784
  tuiOnly: true
3262
2785
  },
3263
2786
  {
@@ -3326,13 +2849,6 @@ var SLASH_COMMANDS = [
3326
2849
  description: "View active and recent operations",
3327
2850
  tuiOnly: true
3328
2851
  },
3329
- {
3330
- name: "herd",
3331
- aliases: ["workers"],
3332
- category: "navigation",
3333
- description: "Inspect the active harness worker herd",
3334
- tuiOnly: true
3335
- },
3336
2852
  {
3337
2853
  name: "comms",
3338
2854
  aliases: ["messages"],
@@ -3349,9 +2865,9 @@ var SLASH_COMMANDS = [
3349
2865
  },
3350
2866
  {
3351
2867
  name: "connect",
3352
- aliases: ["login", "auth"],
2868
+ aliases: [],
3353
2869
  category: "navigation",
3354
- description: "Connect to 0cloud, or use your own API key or provider subscription",
2870
+ description: "Connect your API key or provider subscription",
3355
2871
  usage: "/connect",
3356
2872
  tuiOnly: true
3357
2873
  },
@@ -3528,7 +3044,7 @@ import { execFile as execFile2 } from "node:child_process";
3528
3044
  import { createHash as createHash2 } from "node:crypto";
3529
3045
  import { appendFileSync, readFileSync as readFileSync2, readdirSync, realpathSync, statSync } from "node:fs";
3530
3046
  import { mkdir, mkdtemp, rm } from "node:fs/promises";
3531
- import { isAbsolute, join as join3, relative, sep } from "node:path";
3047
+ import { isAbsolute, join as join2, relative, sep } from "node:path";
3532
3048
  import { pathToFileURL } from "node:url";
3533
3049
  import { isDeepStrictEqual, promisify } from "node:util";
3534
3050
  var execute = promisify(execFile2);
@@ -3561,7 +3077,7 @@ function sourceDigest(root) {
3561
3077
  const entries = readdirSync(directory, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));
3562
3078
  for (const entry of entries) {
3563
3079
  if (entry.name.startsWith(".") || Object.hasOwn(ignoredSourceNames, entry.name)) continue;
3564
- const path = join3(directory, entry.name);
3080
+ const path = join2(directory, entry.name);
3565
3081
  if (entry.isDirectory()) {
3566
3082
  visit(path);
3567
3083
  continue;
@@ -3584,7 +3100,7 @@ function sourceDigest(root) {
3584
3100
  function withDevEngineUpdates(initial, config, closeStore) {
3585
3101
  const requestedRoot = process.env["ZERO_DEV_SOURCE_ROOT"];
3586
3102
  const root = requestedRoot ? realpathSync(requestedRoot) : void 0;
3587
- if (root && JSON.parse(readFileSync2(join3(root, "packages/core/package.json"), "utf8")).name !== "@0/core") {
3103
+ if (root && JSON.parse(readFileSync2(join2(root, "packages/core/package.json"), "utf8")).name !== "@0/core") {
3588
3104
  throw new Error("ZERO_DEV_SOURCE_ROOT must identify a 0 development checkout");
3589
3105
  }
3590
3106
  let current = initial;
@@ -3611,15 +3127,15 @@ function withDevEngineUpdates(initial, config, closeStore) {
3611
3127
  let committed = false;
3612
3128
  let pendingHarnessSnapshot;
3613
3129
  try {
3614
- const source = join3(root, "packages/core/src");
3130
+ const source = join2(root, "packages/core/src");
3615
3131
  const digest = sourceDigest(source);
3616
3132
  if (digest === activeDigest || digest === rejectedDigest) return;
3617
3133
  rejectedDigest = digest;
3618
3134
  notify("Building changed development engine source; the current session remains active until handoff.");
3619
- const generationRoot = join3(root, "packages/core/.0/dev-engines");
3135
+ const generationRoot = join2(root, "packages/core/.0/dev-engines");
3620
3136
  await mkdir(generationRoot, { recursive: true, mode: 448 });
3621
- directory = await mkdtemp(join3(generationRoot, "generation-"));
3622
- const result = await execute(process.execPath, [join3(root, "scripts/build-dev-engine.mjs"), source, directory], {
3137
+ directory = await mkdtemp(join2(generationRoot, "generation-"));
3138
+ const result = await execute(process.execPath, [join2(root, "scripts/build-dev-engine.mjs"), source, directory], {
3623
3139
  cwd: root,
3624
3140
  timeout: 12e4,
3625
3141
  maxBuffer: 2 * 1024 * 1024,
@@ -3649,7 +3165,7 @@ function withDevEngineUpdates(initial, config, closeStore) {
3649
3165
  if (!isDeepStrictEqual(comparableCheckpoint(candidate.exportCheckpoint()), comparableCheckpoint(checkpoint))) {
3650
3166
  throw new Error("Candidate engine did not preserve the session checkpoint");
3651
3167
  }
3652
- const candidateBus = await import(pathToFileURL(join3(directory, "runtime/events/bus.js")).href);
3168
+ const candidateBus = await import(pathToFileURL(join2(directory, "runtime/events/bus.js")).href);
3653
3169
  signal?.throwIfAborted();
3654
3170
  if (closingStarted || !getSettings().allowDevSourceUpdates) throw new Error("Development engine update cancelled before handoff");
3655
3171
  if (!isDeepStrictEqual(current.exportCheckpoint(), checkpoint)) throw new Error("Session changed during candidate preparation; keeping the current engine");
@@ -3849,48 +3365,31 @@ function createLocalConsoleSession(config, dbPath) {
3849
3365
  }
3850
3366
  }
3851
3367
 
3852
- // packages/cli/src/tui/hosted-balance.ts
3853
- function fmtUsd(usd) {
3854
- return usd === null ? "unavailable" : `$${usd}`;
3855
- }
3856
- function hostedBalanceState(account) {
3857
- if (!account) return { status: "unavailable" };
3858
- const { included, prepaid } = account;
3859
- const parts = [included.state === "none" ? "no included allowance" : included.state !== "unavailable" && included.usedPercent !== null ? `${included.usedPercent}% used` : "unavailable"];
3860
- if (included.state !== "unavailable" && included.resetsAt) {
3861
- parts.push(`resets ${included.resetsAt.slice(0, 10)}`);
3862
- }
3863
- if (prepaid.fallbackEnabled) parts.push(`prepaid ${fmtUsd(prepaid.balanceUsd)}`);
3864
- if (account.state !== "ready") {
3865
- parts.push(`${account.state}${account.reason ? `: ${account.reason}` : ""}`);
3866
- } else if (!account.admission.eligible) {
3867
- parts.push("access blocked");
3868
- }
3869
- return { status: "ready", display: parts.join(" \xB7 ") };
3870
- }
3871
- function formatHostedBalance(state) {
3872
- if (state.status === "loading") return "Usage: Loading\u2026";
3873
- if (state.status === "unavailable") return "Usage: unavailable";
3874
- return `Usage: ${state.display}`;
3875
- }
3876
- function formatBalanceDetail(account) {
3877
- if (!account) return " Usage unavailable (unsupported account data).\n";
3878
- const { included, prepaid } = account;
3879
- const lines = [included.state === "none" ? " Usage: no included allowance" : included.state !== "unavailable" && included.usedPercent !== null ? ` Usage: ${included.usedPercent}% used` : " Usage: unavailable"];
3880
- if (included.state !== "unavailable" && included.resetsAt) {
3881
- lines.push(` Resets: ${included.resetsAt}`);
3882
- }
3883
- if (prepaid.fallbackEnabled) lines.push(` Prepaid balance: ${fmtUsd(prepaid.balanceUsd)}`);
3884
- if (account.state !== "ready" || !account.admission.eligible) {
3885
- lines.push(` Access: ${account.state === "ready" ? "blocked" : account.state}`);
3886
- const reason = account.admission.reason ?? account.reason;
3887
- if (reason) lines.push(` Reason: ${reason}`);
3888
- }
3889
- return lines.join("\n") + "\n";
3368
+ // packages/cli/src/tui/codex-device-auth.ts
3369
+ import { spawn as spawn2 } from "node:child_process";
3370
+
3371
+ // packages/cli/src/open-browser.ts
3372
+ import { spawn } from "node:child_process";
3373
+ import { platform } from "node:os";
3374
+ function defaultOpenBrowser(url) {
3375
+ const plat = platform();
3376
+ return new Promise((resolve4, reject) => {
3377
+ const options = { detached: true, stdio: "ignore", shell: false };
3378
+ const child = plat === "darwin" ? spawn("open", [url], options) : plat === "win32" ? spawn("powershell.exe", [
3379
+ "-NoProfile",
3380
+ "-NonInteractive",
3381
+ "-Command",
3382
+ "Start-Process -FilePath $env:OSEC_BROWSER_LOGIN_URL"
3383
+ ], { ...options, env: { ...process.env, OSEC_BROWSER_LOGIN_URL: url } }) : spawn("xdg-open", [url], options);
3384
+ child.once("error", reject);
3385
+ child.once("spawn", () => {
3386
+ child.unref();
3387
+ resolve4();
3388
+ });
3389
+ });
3890
3390
  }
3891
3391
 
3892
3392
  // packages/cli/src/tui/codex-device-auth.ts
3893
- import { spawn as spawn2 } from "node:child_process";
3894
3393
  var MAX_VISIBLE_LINES = 8;
3895
3394
  function defaultSpawnCodexDeviceAuth(command, args, options) {
3896
3395
  const child = spawn2(command, args, {
@@ -4019,12 +3518,6 @@ export {
4019
3518
  watchLensSynthCommand,
4020
3519
  registerLensSynthCommand,
4021
3520
  createLocalConsoleSession,
4022
- hostedBalanceState,
4023
- formatHostedBalance,
4024
- formatBalanceDetail,
4025
- registerAuthCommand,
4026
- hostedBrowserLoginFlow,
4027
- runLogin,
4028
3521
  defaultOpenBrowser,
4029
3522
  startCodexDeviceAuth,
4030
3523
  runUnified