0sec-cli 0.22.4 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/0.js +73 -68
  2. package/README.md +95 -61
  3. package/chunks/{adapt-loop-3CCOWE43.js → adapt-loop-TEJPXWFG.js} +4 -4
  4. package/chunks/{artifact-scraper-Z4UUIOH3.js → artifact-scraper-AJZ3LOQY.js} +2 -2
  5. package/chunks/{assumption-mining-2UAKQB6V.js → assumption-mining-EATDC4BB.js} +18 -18
  6. package/chunks/backend-connections-QE4NASAK.js +23 -0
  7. package/chunks/chunk-3XLEDCFX.js +566 -0
  8. package/chunks/{chunk-BGX53365.js → chunk-3XLFB46W.js} +5 -3
  9. package/chunks/{chunk-IXAHQICR.js → chunk-4TUR47H5.js} +8 -3
  10. package/chunks/{chunk-5WAJGLCW.js → chunk-4YRXIVPZ.js} +3 -3
  11. package/chunks/{chunk-4ZYYX5GY.js → chunk-52AWIBCT.js} +1 -1
  12. package/chunks/{chunk-TO35Y326.js → chunk-554D4AYM.js} +5 -2
  13. package/chunks/{chunk-GQ3DGHWE.js → chunk-5FHFG5P2.js} +174 -710
  14. package/chunks/chunk-5POT5OYF.js +733 -0
  15. package/chunks/chunk-62PGWN7Y.js +700 -0
  16. package/chunks/{chunk-H6Q2QAIY.js → chunk-A3EKBUEM.js} +1424 -859
  17. package/chunks/{chunk-6WQDXWQC.js → chunk-A6AZZ6XX.js} +2 -2
  18. package/chunks/{chunk-6YZE552K.js → chunk-AV5BF4V7.js} +1281 -2580
  19. package/chunks/{chunk-2WWAPKAW.js → chunk-BIJPMYFA.js} +6 -6
  20. package/chunks/{chunk-SCWWLABR.js → chunk-CIMN2AO6.js} +1 -1
  21. package/chunks/{chunk-H4DH7COV.js → chunk-CSPF47S3.js} +30 -20
  22. package/chunks/{chunk-RCRTSKQN.js → chunk-DNV3ZMPX.js} +1 -1
  23. package/chunks/{chunk-GVY3S5E5.js → chunk-E42XEJTK.js} +2 -2
  24. package/chunks/{chunk-VDOWARMJ.js → chunk-ESM447R6.js} +15 -1
  25. package/chunks/{chunk-WBRGXCU2.js → chunk-EXTN4SQV.js} +1 -1
  26. package/chunks/{chunk-QVIRWJ45.js → chunk-EYBMTELO.js} +108 -24
  27. package/chunks/chunk-FEOPHBMY.js +56 -0
  28. package/chunks/{chunk-IHPTOTLL.js → chunk-FKGFHLLS.js} +1 -1
  29. package/chunks/chunk-G2EJ3R5I.js +5198 -0
  30. package/chunks/chunk-GHEBZKUS.js +5417 -0
  31. package/chunks/chunk-GNR3APR6.js +295 -0
  32. package/chunks/{chunk-ELI3BVIK.js → chunk-H76JYUPE.js} +3 -3
  33. package/chunks/{chunk-E74LXQFY.js → chunk-HRBOZBMC.js} +1 -1
  34. package/chunks/{chunk-TM74SSHC.js → chunk-IIBNQTOK.js} +3 -2
  35. package/chunks/{chunk-UELXHK2Y.js → chunk-IK27KMVV.js} +16 -5
  36. package/chunks/{chunk-WHUAUFSX.js → chunk-J6G73WYF.js} +1 -1
  37. package/chunks/chunk-JSTLXPJS.js +284 -0
  38. package/chunks/{chunk-G2BE2FC7.js → chunk-O3ADFN2A.js} +1 -1
  39. package/chunks/chunk-O7Q2G2KW.js +117 -0
  40. package/chunks/{chunk-XODDLNBI.js → chunk-QEA2VHBD.js} +284 -33
  41. package/chunks/{chunk-C6JPA32H.js → chunk-RBOMXUYL.js} +3 -111
  42. package/chunks/{chunk-L2CCO4KE.js → chunk-RCHAFSWS.js} +838 -39
  43. package/chunks/{chunk-3BPX75OR.js → chunk-RD4FKFWR.js} +1 -1
  44. package/chunks/{chunk-DPUXXMJW.js → chunk-RPTO5FY2.js} +1 -1
  45. package/chunks/{chunk-6KFB6AYN.js → chunk-RZR2XXAK.js} +531 -17
  46. package/chunks/chunk-SGILXLR3.js +289 -0
  47. package/chunks/{chunk-E3OOBVOK.js → chunk-TOAAYJVN.js} +2 -2
  48. package/chunks/chunk-TOFIGQ63.js +83 -0
  49. package/chunks/{chunk-QWK4R3DB.js → chunk-TTDFBFNZ.js} +6 -6
  50. package/chunks/chunk-TZRHWP7R.js +736 -0
  51. package/chunks/chunk-UHUW45S3.js +164 -0
  52. package/chunks/{chunk-5JNTMWPK.js → chunk-V4BD7GSP.js} +2 -2
  53. package/chunks/{chunk-OAS5SAVZ.js → chunk-V5I5GAQH.js} +3226 -1683
  54. package/chunks/{chunk-PS5E7LUQ.js → chunk-W6IYTSZH.js} +79 -9
  55. package/chunks/{chunk-RTBZ36BD.js → chunk-WUPN3D37.js} +22 -248
  56. package/chunks/{chunk-CF3MNS3O.js → chunk-Y7KV7WV6.js} +2 -2
  57. package/chunks/{chunk-2OQOQ2FZ.js → chunk-YERUDEXT.js} +763 -688
  58. package/chunks/{chunk-CPCHLL6A.js → chunk-YJU7QACE.js} +1 -1
  59. package/chunks/{chunk-YED25PA4.js → chunk-YORL5S5V.js} +1 -1
  60. package/chunks/{chunk-YAZARMJY.js → chunk-YYOQADBB.js} +4 -3
  61. package/chunks/chunk-ZPFBQ3SD.js +127 -0
  62. package/chunks/{codex-models-Z43V3427.js → codex-models-FQPCWRPC.js} +7 -7
  63. package/chunks/{commands-EUGF4FUZ.js → commands-I5L3VD2A.js} +6187 -12196
  64. package/chunks/dashboard-B2AEGCFM.js +76 -0
  65. package/chunks/{db-NVAW4WWR.js → db-P5EIKMLP.js} +3 -3
  66. package/chunks/deep-review-I7RD5QSS.js +82 -0
  67. package/chunks/{disclose-LDNKAVRH.js → disclose-PFBWESVJ.js} +4 -2
  68. package/chunks/{dist-7RUOKPRJ.js → dist-3SWWY5FZ.js} +18 -2
  69. package/chunks/{dist-27BNG6WD.js → dist-AJU25UXA.js} +112 -63
  70. package/chunks/{dist-NG2HT5XU.js → dist-VK2M4HNW.js} +85 -1
  71. package/chunks/eval-runner-XVRX3R2Y.js +31 -0
  72. package/chunks/{exploit-agent-FCCR2HYX.js → exploit-agent-A4RTIJ4J.js} +1 -1
  73. package/chunks/{exploit-autoclimb-X5ZS5FAO.js → exploit-autoclimb-ABMMBC3M.js} +1 -1
  74. package/chunks/{exploit-climb-3JHGEO36.js → exploit-climb-BQ2SVU63.js} +2 -2
  75. package/chunks/{fix-NSNPU33B.js → fix-4YCLHFDT.js} +7 -7
  76. package/chunks/{harness-KXQOVIDQ.js → harness-DHWULEIZ.js} +3 -3
  77. package/chunks/{hunt-scan-ELTKGKC4.js → hunt-scan-DXV5H6YN.js} +16 -16
  78. package/chunks/{kernel-primitive-MT7YZSIG.js → kernel-primitive-SF4NALVR.js} +2 -2
  79. package/chunks/{kernel-vm-runner-YFRHYC6G.js → kernel-vm-runner-WEBEZEIC.js} +2 -2
  80. package/chunks/local-engine-XUG7XRKM.js +21 -0
  81. package/chunks/managed-operation-SQFMBWHG.js +60 -0
  82. package/chunks/{memsafety-scan-FCPAXIZE.js → memsafety-scan-L2Z7E7TE.js} +2 -2
  83. package/chunks/{native-loop-OFJDRHPI.js → native-loop-ZNAELJGB.js} +14 -13
  84. package/chunks/orchestrate-YHFJXGID.js +63 -0
  85. package/chunks/{prepare-72GWTRVI.js → prepare-SODWQN6O.js} +5 -5
  86. package/chunks/provider-model-discovery-QGUGL3XW.js +277 -0
  87. package/chunks/remote-workflow-runtime-XNNGI2PG.js +12 -0
  88. package/chunks/{run-WTJCZZHV.js → run-5T4Z3Q2D.js} +924 -327
  89. package/chunks/{runtime-LCJ4XSKE.js → runtime-HFFRUOPL.js} +4 -2
  90. package/chunks/{runtime-FCKOUB7V.js → runtime-MB4GEFBY.js} +7 -7
  91. package/chunks/{scan-stream-GT6GKQ3U.js → scan-stream-GXBJHCDF.js} +3 -2
  92. package/chunks/{scope-E5QZUOOH.js → scope-M7L3CD6X.js} +2 -2
  93. package/chunks/service-plugins-BGS6QKSZ.js +64 -0
  94. package/chunks/{session-store-H3Q7KCYG.js → session-store-K7I4GLNH.js} +2 -2
  95. package/chunks/{variant-candidates-SZKDCOLK.js → variant-candidates-2KSP5EHH.js} +7 -7
  96. package/chunks/{web-recon-prepass-IO3GXQMW.js → web-recon-prepass-RAXXTEWH.js} +5 -5
  97. package/chunks/workflow-runtime-V26HIJO3.js +178 -0
  98. package/dashboard/assets/abnfDiagram-VCTEODGH-CGCueOp5.js +1 -0
  99. package/dashboard/assets/arc-BjZaQcCc.js +1 -0
  100. package/dashboard/assets/architecture-7GRP2DOG-hcbO-9zX.js +1 -0
  101. package/dashboard/assets/architectureDiagram-5GKGNRK7-DReOXTSq.js +36 -0
  102. package/dashboard/assets/array-BifhSqXX.js +1 -0
  103. package/dashboard/assets/blockDiagram-I7D4REHJ-C-byT12_.js +129 -0
  104. package/dashboard/assets/c4Diagram-7LVT6UL2-DoYjz-Uv.js +38 -0
  105. package/dashboard/assets/channel-CUURBnpZ.js +1 -0
  106. package/dashboard/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  107. package/dashboard/assets/chunk-4HAMMTFA-NBNp2zdt.js +62 -0
  108. package/dashboard/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  109. package/dashboard/assets/chunk-75Z2AOVW-BHmkuP0B.js +2 -0
  110. package/dashboard/assets/chunk-DU6HZSFF-DgfLNaL2.js +127 -0
  111. package/dashboard/assets/chunk-F27PBJKO-3wwNFUgZ.js +1 -0
  112. package/dashboard/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
  113. package/dashboard/assets/chunk-GMAD6QVW-Btg7huZW.js +72 -0
  114. package/dashboard/assets/chunk-GVQU2GXP-ihCURK5O.js +1 -0
  115. package/dashboard/assets/chunk-IMKFNOWR-FsXj7slg.js +231 -0
  116. package/dashboard/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  117. package/dashboard/assets/chunk-L3NEJ4N5-DorFIxJY.js +1 -0
  118. package/dashboard/assets/chunk-OSK3NFVY-DKun_KfC.js +10 -0
  119. package/dashboard/assets/chunk-P2QGCYS3-XGgiU1Bz.js +1 -0
  120. package/dashboard/assets/chunk-POPQ4Y6H-BTXEnGhJ.js +1 -0
  121. package/dashboard/assets/chunk-PWAF6VOD-DYZcGkTL.js +1 -0
  122. package/dashboard/assets/chunk-SHT3W25Y-C4WQfwf8.js +168 -0
  123. package/dashboard/assets/chunk-SVP7TREG-C4nCh0-1.js +88 -0
  124. package/dashboard/assets/chunk-TICWLB2K-DSB-IiGc.js +206 -0
  125. package/dashboard/assets/chunk-XXDRQBXY-CS6fjUcj.js +1 -0
  126. package/dashboard/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  127. package/dashboard/assets/classDiagram-ZZMXUADV-CD1Buc26.js +1 -0
  128. package/dashboard/assets/classDiagram-v2-VYDZK3BY-CD1Buc26.js +1 -0
  129. package/dashboard/assets/common-BMdQBwfR.js +5 -0
  130. package/dashboard/assets/cose-bilkent-JH36ORCC-CUjQHTML.js +1 -0
  131. package/dashboard/assets/cynefin-OW5HDTMX-BC7zCtFq.js +1 -0
  132. package/dashboard/assets/cynefinDiagram-5FMLGOSQ-CgDOOY67.js +62 -0
  133. package/dashboard/assets/cytoscape.esm-CGd-uY3x.js +321 -0
  134. package/dashboard/assets/dagre-GXQ25YYZ-Dqc8FS9x.js +4 -0
  135. package/dashboard/assets/dagre-PrKaheQc.js +1 -0
  136. package/dashboard/assets/defaultLocale-BFoDCU3G.js +1 -0
  137. package/dashboard/assets/diagram-S7CK7UJ4-CrKqRXZb.js +30 -0
  138. package/dashboard/assets/diagram-UQ7AKVKN-Cu6Es0-v.js +41 -0
  139. package/dashboard/assets/diagram-VSXAHHWV-eK4d8FwS.js +3 -0
  140. package/dashboard/assets/diagram-VX7I27RA-bFxeFKOc.js +24 -0
  141. package/dashboard/assets/diagram-Z3DM3KII-C0ClmnhC.js +24 -0
  142. package/dashboard/assets/dist-BZh8Kb3O.js +1 -0
  143. package/dashboard/assets/ebnfDiagram-PWID7BFC-CUqxFPzf.js +1 -0
  144. package/dashboard/assets/erDiagram-RLTQ6QDP-CcYM7pLi.js +99 -0
  145. package/dashboard/assets/eventmodeling-NTZA5JFV-D8ZNnPkV.js +1 -0
  146. package/dashboard/assets/flowDiagram-HODETNUW-pDb1AYm8.js +1 -0
  147. package/dashboard/assets/ganttDiagram-EL5Y4UJY-UmZfbMyD.js +292 -0
  148. package/dashboard/assets/gitGraph-4MIJSDKK-mvNUo0ZA.js +1 -0
  149. package/dashboard/assets/gitGraphDiagram-WWUBYQGX-CvzeCxVy.js +106 -0
  150. package/dashboard/assets/graphlib-DS17s2tU.js +1 -0
  151. package/dashboard/assets/info-A6RAGUB7-DChKqZMi.js +1 -0
  152. package/dashboard/assets/infoDiagram-27XIBGKW-DjkpNtVW.js +2 -0
  153. package/dashboard/assets/init-C-OQMol4.js +1 -0
  154. package/dashboard/assets/ishikawaDiagram-5VMMS53U-8FhjJaWT.js +70 -0
  155. package/dashboard/assets/journeyDiagram-3NMN7TZE-DyNJ755f.js +139 -0
  156. package/dashboard/assets/kanban-definition-UXKFOSKX-_jCmtaY1.js +89 -0
  157. package/dashboard/assets/katex-BdBmVSus.js +257 -0
  158. package/dashboard/assets/line-Bf0nxyWf.js +1 -0
  159. package/dashboard/assets/linear-Bl6JKbf4.js +1 -0
  160. package/dashboard/assets/mermaid-parser.core-Cc6sgCzs.js +7 -0
  161. package/dashboard/assets/mermaid.core-B4yCwiN-.js +44 -0
  162. package/dashboard/assets/mindmap-definition-YA3MSWOX-D5DjWyXj.js +96 -0
  163. package/dashboard/assets/operations-B7JAWOi6.js +130 -0
  164. package/dashboard/assets/operations-QjKT0Hwi.css +1 -0
  165. package/dashboard/assets/ordinal-BDEzSJ7C.js +1 -0
  166. package/dashboard/assets/packet-AYTQ26CC-bQXLDhQC.js +1 -0
  167. package/dashboard/assets/path-fybaL0A-.js +1 -0
  168. package/dashboard/assets/pegDiagram-XKGWAZYB-Bf6a1vaf.js +1 -0
  169. package/dashboard/assets/pie-WAS4IAKB-DfzoABIi.js +1 -0
  170. package/dashboard/assets/pieDiagram-E7YTZNPT-D0L1qbch.js +39 -0
  171. package/dashboard/assets/quadrantDiagram-AXDQQJYC-CbFyy2Pe.js +7 -0
  172. package/dashboard/assets/radar-RG4KPBEZ-CZ2pyeUT.js +1 -0
  173. package/dashboard/assets/railroad-74A4TZTK-CP4Jazfd.js +1 -0
  174. package/dashboard/assets/railroad-abnf-HS5TGJTU-3MvEiHwD.js +1 -0
  175. package/dashboard/assets/railroad-ebnf-LZEXJU2U-BWto6cXE.js +1 -0
  176. package/dashboard/assets/railroad-peg-WCYAUIDC-DasEjbyf.js +1 -0
  177. package/dashboard/assets/railroadDiagram-O6MQD6OU-t7Gp9g2R.js +1 -0
  178. package/dashboard/assets/requirementDiagram-BXWQKSXE-LYmqeBXi.js +84 -0
  179. package/dashboard/assets/rough.esm-Dy-Kn_BL.js +1 -0
  180. package/dashboard/assets/sankeyDiagram-P5KCCOFB-DnpfA_94.js +40 -0
  181. package/dashboard/assets/sequenceDiagram-WJ2MYXX4-C8s3pTUE.js +162 -0
  182. package/dashboard/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  183. package/dashboard/assets/src-CaNUT1AQ.js +1 -0
  184. package/dashboard/assets/stateDiagram-D77RDMKH-BMzm6fK1.js +1 -0
  185. package/dashboard/assets/stateDiagram-v2-MP3YSRHH-B3REMjpY.js +1 -0
  186. package/dashboard/assets/swimlanes-42K2YHIH-uJE05Tt_.js +1 -0
  187. package/dashboard/assets/swimlanesDiagram-VR7AAH4N-CIaVMZEy.js +8 -0
  188. package/dashboard/assets/timeline-definition-24CTP7MA-BfLJMVeG.js +120 -0
  189. package/dashboard/assets/treeView-Q6P3EWNA-ZOE2enu2.js +1 -0
  190. package/dashboard/assets/treemap-WGGIJYW6-yIZoPBF5.js +1 -0
  191. package/dashboard/assets/vennDiagram-4TSXK5OY-BYJRHEaL.js +34 -0
  192. package/dashboard/assets/wardley-WFR3VGLG-D5V-jLbB.js +1 -0
  193. package/dashboard/assets/wardleyDiagram-VM6X3IG4-DgPN4nSe.js +78 -0
  194. package/dashboard/assets/xychartDiagram-S5SC5T6Z-BhkAMAOT.js +7 -0
  195. package/dashboard/index.html +3 -3
  196. package/package.json +3 -2
  197. package/worker-assets/demo-target/README.md +15 -0
  198. package/worker-assets/demo-target/include/decoder.h +27 -0
  199. package/worker-assets/demo-target/patched-decoder.c +40 -0
  200. package/worker-assets/demo-target/src/decoder.c +50 -0
  201. package/worker-assets/demo-target/witness-65537x1.bin +0 -0
  202. package/chunks/chunk-FFHRANYC.js +0 -547
  203. package/chunks/eval-runner-6Q3H52SP.js +0 -30
  204. package/chunks/orchestrate-DRZ2SVCP.js +0 -62
  205. package/chunks/service-plugins-MSK2EQP6.js +0 -62
  206. package/dashboard/assets/operations-BvB5Qpmk.css +0 -1
  207. package/dashboard/assets/operations-D8Ii01SV.js +0 -114
  208. package/dashboard/assets/zero-peek-Dzm3MT3X.png +0 -0
@@ -0,0 +1,289 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __0CreateRequire } from "node:module";
3
+ const require = __0CreateRequire(import.meta.url);
4
+ import {
5
+ spinnerGlyph
6
+ } from "./chunk-GNR3APR6.js";
7
+ import {
8
+ loadLayeredSettings
9
+ } from "./chunk-QEA2VHBD.js";
10
+ import {
11
+ homeStateDir
12
+ } from "./chunk-RZR2XXAK.js";
13
+
14
+ // packages/cli/src/utils/update-check.ts
15
+ import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
16
+ import { join } from "node:path";
17
+ import { spawn } from "node:child_process";
18
+
19
+ // packages/cli/src/utils/terminal-progress.ts
20
+ function terminalProgress(label, output = process.stderr, reduceMotion = false) {
21
+ const animated = Boolean(output.isTTY && process.env["TERM"] !== "dumb");
22
+ const started = Date.now();
23
+ let frame = 0;
24
+ let stage = label;
25
+ let finished = false;
26
+ const clean = (text) => text.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "").replace(/[\x00-\x1f\x7f-\x9f]/g, " ").trim();
27
+ const paint = () => {
28
+ const elapsed = Math.floor((Date.now() - started) / 1e3);
29
+ const line = `${spinnerGlyph(frame++, { reduceMotion })} ${stage} \xB7 ${elapsed}s`;
30
+ output.write(`\r\x1B[2K${Array.from(line).slice(0, Math.max(12, (output.columns ?? 80) - 1)).join("")}`);
31
+ };
32
+ if (animated) paint();
33
+ else output.write(`${clean(label)}\u2026
34
+ `);
35
+ const timer = animated && !reduceMotion ? setInterval(paint, 120) : void 0;
36
+ timer?.unref();
37
+ return {
38
+ update(text) {
39
+ if (finished) return;
40
+ stage = clean(text) || label;
41
+ if (animated) paint();
42
+ },
43
+ finish(text) {
44
+ if (finished) return;
45
+ finished = true;
46
+ clearInterval(timer);
47
+ if (animated) output.write("\r\x1B[2K");
48
+ if (text) output.write(`${clean(text)}
49
+ `);
50
+ }
51
+ };
52
+ }
53
+
54
+ // packages/cli/src/utils/update-check.ts
55
+ var REPO = "0sec-labs/0";
56
+ var INSTALL_URL = `https://raw.githubusercontent.com/${REPO}/main/install.sh`;
57
+ var CHECK_INTERVAL_MS = 24 * 60 * 60 * 1e3;
58
+ var FETCH_TIMEOUT_MS = 4e3;
59
+ var INSTALL_TIMEOUT_MS = 12e4;
60
+ function parseVersion(value) {
61
+ if (value.length > 128) return null;
62
+ const match = /^v?(0|[1-9]\d*)(?:\.(0|[1-9]\d*)(?:\.(0|[1-9]\d*))?)?(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/.exec(value);
63
+ if (!match) return null;
64
+ const parts = [Number(match[1]), Number(match[2] ?? 0), Number(match[3] ?? 0)];
65
+ if (!parts.every(Number.isSafeInteger)) return null;
66
+ const prerelease = match[4]?.split(".") ?? [];
67
+ if (prerelease.some((part) => /^\d+$/.test(part) && part.length > 1 && part.startsWith("0"))) return null;
68
+ return { parts, prerelease, complete: match[3] !== void 0 };
69
+ }
70
+ function compareVersions(a, b) {
71
+ const left = parseVersion(a);
72
+ const right = parseVersion(b);
73
+ if (!left || !right) return 0;
74
+ for (let i = 0; i < 3; i++) {
75
+ if (left.parts[i] !== right.parts[i]) return left.parts[i] < right.parts[i] ? -1 : 1;
76
+ }
77
+ if (!left.prerelease.length || !right.prerelease.length) {
78
+ return left.prerelease.length ? -1 : right.prerelease.length ? 1 : 0;
79
+ }
80
+ for (let i = 0; i < Math.max(left.prerelease.length, right.prerelease.length); i++) {
81
+ const l = left.prerelease[i];
82
+ const r = right.prerelease[i];
83
+ if (l === void 0) return -1;
84
+ if (r === void 0) return 1;
85
+ if (l === r) continue;
86
+ const ln = /^\d+$/.test(l);
87
+ const rn = /^\d+$/.test(r);
88
+ if (ln !== rn) return ln ? -1 : 1;
89
+ if (ln && l.length !== r.length) return l.length < r.length ? -1 : 1;
90
+ return l < r ? -1 : 1;
91
+ }
92
+ return 0;
93
+ }
94
+ function disabled(value) {
95
+ return value !== void 0 && value !== "" && value !== "0" && value.toLowerCase() !== "false";
96
+ }
97
+ function shouldRunCheck(env = process.env, isTty = Boolean(process.stdout.isTTY), policy) {
98
+ if (!isTty || disabled(env.CI) || disabled(env["ZERO_OFFLINE"]) || disabled(env["ZERO_NO_UPDATE_CHECK"])) return false;
99
+ if (policy !== void 0) return policy !== "off";
100
+ return env["ZERO_UPDATE_CHECK"] === "1";
101
+ }
102
+ function recent(timestamp, now) {
103
+ const age = now - Date.parse(timestamp ?? "");
104
+ return Number.isFinite(age) && age >= 0 && age < CHECK_INTERVAL_MS;
105
+ }
106
+ function readCache() {
107
+ try {
108
+ const raw = JSON.parse(readFileSync(join(homeStateDir(), "last-update-check"), "utf8"));
109
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) return null;
110
+ const value = raw;
111
+ if (typeof value.lastCheckedAt !== "string") return null;
112
+ return {
113
+ lastCheckedAt: value.lastCheckedAt,
114
+ latestVersion: typeof value.latestVersion === "string" ? value.latestVersion : void 0,
115
+ lastInstallAttemptAt: typeof value.lastInstallAttemptAt === "string" ? value.lastInstallAttemptAt : void 0,
116
+ lastInstallTag: typeof value.lastInstallTag === "string" ? value.lastInstallTag : void 0
117
+ };
118
+ } catch {
119
+ return null;
120
+ }
121
+ }
122
+ function writeCache(cache) {
123
+ try {
124
+ mkdirSync(homeStateDir(), { recursive: true });
125
+ writeFileSync(join(homeStateDir(), "last-update-check"), JSON.stringify(cache));
126
+ } catch {
127
+ }
128
+ }
129
+ async function fetchLatestTag() {
130
+ const controller = new AbortController();
131
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
132
+ try {
133
+ const response = await fetch(`https://api.github.com/repos/${REPO}/releases/latest`, {
134
+ headers: { Accept: "application/vnd.github+json", "User-Agent": "@0/cli/update-check" },
135
+ signal: controller.signal
136
+ });
137
+ if (!response.ok) return null;
138
+ const data = await response.json();
139
+ if (typeof data.tag_name !== "string" || data.prerelease === true || data.draft === true) return null;
140
+ const version = parseVersion(data.tag_name);
141
+ return version?.complete && version.prerelease.length === 0 ? data.tag_name : null;
142
+ } catch {
143
+ return null;
144
+ } finally {
145
+ clearTimeout(timer);
146
+ }
147
+ }
148
+ var installInProgress = false;
149
+ var attemptedAutomaticTags = /* @__PURE__ */ new Set();
150
+ async function performAutoUpdate(options = {}) {
151
+ if (process.platform === "win32") return { success: false, installed: false, error: "Automatic installation is unavailable on Windows; download a release from https://github.com/0sec-labs/0/releases/latest." };
152
+ if (disabled(process.env["ZERO_OFFLINE"]) || disabled(process.env["ZERO_NO_UPDATE_CHECK"])) {
153
+ return { success: false, installed: false, error: "Updates are disabled by the current offline/update policy." };
154
+ }
155
+ if (installInProgress) return { success: false, installed: false, error: "An update is already in progress." };
156
+ installInProgress = true;
157
+ try {
158
+ const tag = options.version ?? await fetchLatestTag();
159
+ const version = tag ? parseVersion(tag) : null;
160
+ if (!tag || !version?.complete) return { success: false, installed: false, error: "Could not resolve a valid release tag." };
161
+ const normalizedTag = tag.startsWith("v") ? tag : `v${tag}`;
162
+ const env = { ...process.env, RELEASE_BASE_URL: `https://github.com/${REPO}/releases/download/${normalizedTag}` };
163
+ const installDir = options.installDir ?? process.env["ZERO_INSTALL_DIR"];
164
+ if (installDir !== void 0) env.INSTALL_DIR = installDir;
165
+ const timeoutMs = Number.isFinite(options.timeoutMs) && options.timeoutMs > 0 ? Math.min(options.timeoutMs, INSTALL_TIMEOUT_MS) : INSTALL_TIMEOUT_MS;
166
+ return await new Promise((resolve) => {
167
+ const interactive = Boolean(process.stderr.isTTY && process.env["TERM"] !== "dumb");
168
+ const progress = interactive ? terminalProgress(`Updating 0 to ${normalizedTag}`, process.stderr, loadLayeredSettings().settings.reduceMotion) : void 0;
169
+ const child = spawn("bash", ["-o", "pipefail", "-c", `curl -fsSL --connect-timeout 10 --max-time 30 "${INSTALL_URL}" | bash`], {
170
+ stdio: interactive ? ["inherit", "pipe", "pipe"] : "inherit",
171
+ env,
172
+ detached: true
173
+ });
174
+ let details = "";
175
+ let pendingLine = "";
176
+ const report = (chunk) => {
177
+ const text = chunk.toString("utf8");
178
+ details = (details + text).slice(-16384);
179
+ const lines = (pendingLine + text).split(/[\r\n]/);
180
+ pendingLine = lines.pop().slice(-2048);
181
+ const stage = lines.filter((line) => line.trim()).at(-1);
182
+ if (stage) progress?.update(stage);
183
+ };
184
+ child.stdout?.on("data", report);
185
+ child.stderr?.on("data", report);
186
+ let timedOut = false;
187
+ let settled = false;
188
+ let parentSignal;
189
+ let killTimer;
190
+ const finish = (result) => {
191
+ if (settled) return;
192
+ settled = true;
193
+ progress?.finish(result.success ? `\u2713 Installed ${normalizedTag}` : result.signal ? "Update cancelled." : "Update failed.");
194
+ if (interactive && details && (!result.success || /0 installer:|Could not update/.test(details))) process.stderr.write(details.endsWith("\n") ? details : `${details}
195
+ `);
196
+ clearTimeout(timer);
197
+ clearTimeout(killTimer);
198
+ process.removeListener("SIGINT", onInterrupt);
199
+ process.removeListener("SIGTERM", onTerminate);
200
+ resolve(result);
201
+ };
202
+ const terminate = (signal) => {
203
+ if (child.pid === void 0) return;
204
+ try {
205
+ process.kill(-child.pid, signal);
206
+ } catch {
207
+ }
208
+ };
209
+ const interrupt = (signal) => {
210
+ if (parentSignal || settled) return;
211
+ parentSignal = signal;
212
+ clearTimeout(timer);
213
+ terminate(signal);
214
+ clearTimeout(killTimer);
215
+ killTimer = setTimeout(() => {
216
+ terminate("SIGKILL");
217
+ finish({ success: false, installed: false, signal, error: `Installer stopped by ${signal}.` });
218
+ }, 1e3);
219
+ };
220
+ const onInterrupt = () => interrupt("SIGINT");
221
+ const onTerminate = () => interrupt("SIGTERM");
222
+ const timer = setTimeout(() => {
223
+ timedOut = true;
224
+ terminate("SIGTERM");
225
+ killTimer = setTimeout(() => {
226
+ terminate("SIGKILL");
227
+ finish({ success: false, installed: false, exitCode: 1, error: `Installer exceeded its ${timeoutMs}ms deadline.` });
228
+ }, 1e3);
229
+ }, timeoutMs);
230
+ process.on("SIGINT", onInterrupt);
231
+ process.on("SIGTERM", onTerminate);
232
+ child.once("error", (error) => finish({ success: false, installed: false, exitCode: 1, error: `Could not start the installer: ${error.message}. Ensure bash and curl are available.` }));
233
+ child.once("close", (code, signal) => {
234
+ if (timedOut || parentSignal) return;
235
+ if (signal) finish({ success: false, installed: false, signal, error: `Installer stopped by ${signal}.` });
236
+ else if (code === 0) finish({ success: true, installed: true, installedVersion: normalizedTag, exitCode: 0 });
237
+ else finish({ success: false, installed: false, exitCode: code ?? 1, error: `Installer exited with code ${code ?? 1}.` });
238
+ });
239
+ });
240
+ } catch (error) {
241
+ return { success: false, installed: false, exitCode: 1, error: error instanceof Error ? error.message : "Update failed." };
242
+ } finally {
243
+ installInProgress = false;
244
+ }
245
+ }
246
+ async function maybeNotifyUpdate(currentVersion, options = {}) {
247
+ const policy = options.policy;
248
+ if (!shouldRunCheck(process.env, Boolean(process.stdout.isTTY), policy) || !parseVersion(currentVersion)) return;
249
+ const now = Date.now();
250
+ let cache = readCache();
251
+ if (!cache || !recent(cache.lastCheckedAt, now)) {
252
+ const tag2 = await fetchLatestTag();
253
+ cache = { ...cache, lastCheckedAt: new Date(now).toISOString(), latestVersion: tag2 ?? cache?.latestVersion };
254
+ writeCache(cache);
255
+ }
256
+ const tag = cache.latestVersion;
257
+ const candidate = tag ? parseVersion(tag) : null;
258
+ if (!tag || !candidate?.complete || candidate.prerelease.length > 0 || compareVersions(tag, currentVersion) <= 0) return;
259
+ if (policy !== "automatic") {
260
+ process.stderr.write(`[0] Update available: ${currentVersion} \u2192 ${tag}. Run 0 upgrade.
261
+ `);
262
+ return;
263
+ }
264
+ if (attemptedAutomaticTags.has(tag) || cache.lastInstallTag === tag && recent(cache.lastInstallAttemptAt, now)) return;
265
+ attemptedAutomaticTags.add(tag);
266
+ writeCache({ ...cache, lastInstallTag: tag, lastInstallAttemptAt: new Date(now).toISOString() });
267
+ if (!process.stderr.isTTY || process.env["TERM"] === "dumb") process.stderr.write(`[0] Updating to ${tag} before starting 0\u2026
268
+ `);
269
+ const result = await performAutoUpdate({ version: tag });
270
+ if (result.signal) {
271
+ process.kill(process.pid, result.signal);
272
+ return;
273
+ }
274
+ process.stderr.write(result.success ? `[0] Installed ${result.installedVersion}. This process is still ${currentVersion}; restart to use the update.
275
+ ` : `[0] Update not installed: ${result.error ?? "unknown error"} Continuing with ${currentVersion}.
276
+ `);
277
+ }
278
+ async function runStartupUpdate(version) {
279
+ if (!shouldRunCheck(process.env, Boolean(process.stdout.isTTY), "notify")) return;
280
+ const { settings, sources } = loadLayeredSettings();
281
+ const policy = sources.updatePolicy === "global" ? settings.updatePolicy : void 0;
282
+ if (policy === "automatic") await maybeNotifyUpdate(version, { policy });
283
+ else if (policy !== "off") void maybeNotifyUpdate(version, { policy });
284
+ }
285
+
286
+ export {
287
+ performAutoUpdate,
288
+ runStartupUpdate
289
+ };
@@ -3,10 +3,10 @@ import { createRequire as __0CreateRequire } from "node:module";
3
3
  const require = __0CreateRequire(import.meta.url);
4
4
  import {
5
5
  jitterFor
6
- } from "./chunk-SCWWLABR.js";
6
+ } from "./chunk-CIMN2AO6.js";
7
7
  import {
8
8
  scanExecutionSignal
9
- } from "./chunk-YAZARMJY.js";
9
+ } from "./chunk-YYOQADBB.js";
10
10
 
11
11
  // packages/core/dist/scope/rate-limit.js
12
12
  var TokenBucket = class {
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __0CreateRequire } from "node:module";
3
+ const require = __0CreateRequire(import.meta.url);
4
+ import {
5
+ executeWorkflow
6
+ } from "./chunk-V5I5GAQH.js";
7
+ import {
8
+ SecurityWorkflowStore
9
+ } from "./chunk-RCHAFSWS.js";
10
+
11
+ // packages/cli/src/managed-operation.ts
12
+ async function executeManagedOperation(options, dependencies = { store: (path) => new SecurityWorkflowStore(path) }) {
13
+ const costCapUsd = options.costCapUsd ?? 1e3;
14
+ const workflow = {
15
+ id: `cli-${options.type}`,
16
+ revision: 1,
17
+ name: options.name,
18
+ instructions: "",
19
+ target: options.target,
20
+ nodes: [
21
+ { id: "start", type: "trigger", label: "Start", enabled: true },
22
+ {
23
+ id: "operation",
24
+ type: options.type,
25
+ label: options.name,
26
+ enabled: true,
27
+ ...options.type === "fix" ? { fix: { mode: options.fixMode ?? "candidate" } } : {},
28
+ plan: {
29
+ goal: "unknown-vulnerabilities",
30
+ depth: "default",
31
+ runCount: 1,
32
+ executionMode: "sequential",
33
+ timeCapMs: Math.min(options.timeCapMs, 864e5),
34
+ costCapUsd: Math.min(costCapUsd, 1e3)
35
+ }
36
+ }
37
+ ],
38
+ edges: [{ source: "start", target: "operation" }]
39
+ };
40
+ const store = dependencies.store(options.controlDbPath);
41
+ let id;
42
+ let value;
43
+ let produced = false;
44
+ let engineStatus = "completed";
45
+ try {
46
+ id = store.createExecutionFromSnapshot(workflow, "cli").id;
47
+ store.updateExecution(id, { status: "running", nodeResults: { start: { status: "completed" }, operation: { status: "running" } } });
48
+ const result = await executeWorkflow({
49
+ workflow,
50
+ inputs: options.inputs,
51
+ signal: options.signal,
52
+ timeCapMs: options.timeCapMs,
53
+ costCapUsd,
54
+ executors: { [options.type]: async (context) => {
55
+ value = await options.execute(context);
56
+ produced = true;
57
+ engineStatus = options.status?.(value) ?? "completed";
58
+ return { status: engineStatus, ...options.reports ? { reports: options.reports(value) } : {}, outputs: [{ kind: options.type === "fix" ? "source-fix-result" : options.type === "verify" ? "verification-result" : `${options.type}-result`, value: options.output ? options.output(value) : value }] };
59
+ } }
60
+ });
61
+ const nodeResults = Object.fromEntries(Object.entries(result.nodeResults).map(([nodeId, node]) => [nodeId, { status: node.status, ...node.error ? { error: node.error.slice(0, 16e3) } : {} }]));
62
+ try {
63
+ store.saveExecutionResults(id, result);
64
+ } catch (error) {
65
+ const message = `Run ${result.status}, but result retention failed: ${error instanceof Error ? error.message : String(error)}`;
66
+ store.updateExecution(id, { status: result.status, nodeResults, error: message.slice(0, 16e3) });
67
+ throw new Error(message);
68
+ }
69
+ store.updateExecution(id, { status: result.status, nodeResults, ...result.error ? { error: result.error.slice(0, 16e3) } : {} });
70
+ if (!produced || result.status !== "completed" && engineStatus === "completed") throw new Error(result.error ?? "Operation did not complete.");
71
+ return value;
72
+ } catch (error) {
73
+ const current = id ? store.getExecution(id) : void 0;
74
+ if (id && (current?.status === "queued" || current?.status === "running")) store.updateExecution(id, { status: "failed", error: (error instanceof Error ? error.message : String(error)).slice(0, 16e3) });
75
+ throw error;
76
+ } finally {
77
+ store.close();
78
+ }
79
+ }
80
+
81
+ export {
82
+ executeManagedOperation
83
+ };
@@ -6,22 +6,22 @@ import {
6
6
  } from "./chunk-HLFS6WV2.js";
7
7
  import {
8
8
  agenticScan
9
- } from "./chunk-OAS5SAVZ.js";
9
+ } from "./chunk-V5I5GAQH.js";
10
10
  import {
11
11
  runAgentLoop
12
- } from "./chunk-H4DH7COV.js";
12
+ } from "./chunk-CSPF47S3.js";
13
13
  import {
14
14
  getToolsForRole
15
- } from "./chunk-H6Q2QAIY.js";
15
+ } from "./chunk-A3EKBUEM.js";
16
16
  import {
17
17
  createRuntime
18
- } from "./chunk-WBRGXCU2.js";
18
+ } from "./chunk-EXTN4SQV.js";
19
19
  import {
20
20
  osecDB
21
- } from "./chunk-L2CCO4KE.js";
21
+ } from "./chunk-RCHAFSWS.js";
22
22
  import {
23
23
  LlmApiRuntime
24
- } from "./chunk-QVIRWJ45.js";
24
+ } from "./chunk-EYBMTELO.js";
25
25
 
26
26
  // packages/cli/src/commands/orchestrate.ts
27
27
  import { randomUUID } from "node:crypto";