impactus-swarm 0.1.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.

Potentially problematic release.


This version of impactus-swarm might be problematic. Click here for more details.

Files changed (332) hide show
  1. package/bin/cli.js +189 -0
  2. package/package.json +42 -0
  3. package/server/main.js +568 -0
  4. package/web/assets/abap-BdImnpbu.js +1 -0
  5. package/web/assets/actionscript-3-CoDkCxhg.js +1 -0
  6. package/web/assets/ada-bCR0ucgS.js +1 -0
  7. package/web/assets/andromeeda-C4gqWexZ.js +1 -0
  8. package/web/assets/angular-html-CU67Zn6k.js +1 -0
  9. package/web/assets/angular-ts-BwZT4LLn.js +1 -0
  10. package/web/assets/apache-Pmp26Uib.js +1 -0
  11. package/web/assets/apex-D8_7TLub.js +1 -0
  12. package/web/assets/apl-dKokRX4l.js +1 -0
  13. package/web/assets/applescript-Co6uUVPk.js +1 -0
  14. package/web/assets/ara-BRHolxvo.js +1 -0
  15. package/web/assets/asciidoc-Ve4PFQV2.js +1 -0
  16. package/web/assets/asm-D_Q5rh1f.js +1 -0
  17. package/web/assets/astro-CbQHKStN.js +1 -0
  18. package/web/assets/aurora-x-D-2ljcwZ.js +1 -0
  19. package/web/assets/awk-DMzUqQB5.js +1 -0
  20. package/web/assets/ayu-dark-DYE7WIF3.js +1 -0
  21. package/web/assets/ayu-light-BA47KaF1.js +1 -0
  22. package/web/assets/ayu-mirage-32ctXXKs.js +1 -0
  23. package/web/assets/ballerina-BFfxhgS-.js +1 -0
  24. package/web/assets/bat-BkioyH1T.js +1 -0
  25. package/web/assets/beancount-k_qm7-4y.js +1 -0
  26. package/web/assets/berry-uYugtg8r.js +1 -0
  27. package/web/assets/bibtex-CHM0blh-.js +1 -0
  28. package/web/assets/bicep-Bmn6On1c.js +1 -0
  29. package/web/assets/bird2-DPOp833l.js +1 -0
  30. package/web/assets/blade-D4QpJJKB.js +1 -0
  31. package/web/assets/bsl-BO_Y6i37.js +1 -0
  32. package/web/assets/c-BIGW1oBm.js +1 -0
  33. package/web/assets/c3-eo99z4R2.js +1 -0
  34. package/web/assets/cadence-Bv_4Rxtq.js +1 -0
  35. package/web/assets/cairo-KRGpt6FW.js +1 -0
  36. package/web/assets/catppuccin-frappe-DFWUc33u.js +1 -0
  37. package/web/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
  38. package/web/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
  39. package/web/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
  40. package/web/assets/clarity-D53aC0YG.js +1 -0
  41. package/web/assets/clojure-P80f7IUj.js +1 -0
  42. package/web/assets/cmake-D1j8_8rp.js +1 -0
  43. package/web/assets/cobol-nwyudZeR.js +1 -0
  44. package/web/assets/codeowners-Bp6g37R7.js +1 -0
  45. package/web/assets/codeql-DsOJ9woJ.js +1 -0
  46. package/web/assets/coffee-Ch7k5sss.js +1 -0
  47. package/web/assets/common-lisp-Cg-RD9OK.js +1 -0
  48. package/web/assets/coq-DkFqJrB1.js +1 -0
  49. package/web/assets/cpp-CofmeUqb.js +1 -0
  50. package/web/assets/crystal-tKQVLTB8.js +1 -0
  51. package/web/assets/csharp-COcwbKMJ.js +1 -0
  52. package/web/assets/css-DPfMkruS.js +1 -0
  53. package/web/assets/csv-fuZLfV_i.js +1 -0
  54. package/web/assets/cue-D82EKSYY.js +1 -0
  55. package/web/assets/cypher-COkxafJQ.js +1 -0
  56. package/web/assets/d-85-TOEBH.js +1 -0
  57. package/web/assets/dark-plus-C3mMm8J8.js +1 -0
  58. package/web/assets/dart-CF10PKvl.js +1 -0
  59. package/web/assets/dax-CEL-wOlO.js +1 -0
  60. package/web/assets/desktop-BmXAJ9_W.js +1 -0
  61. package/web/assets/diff-D97Zzqfu.js +1 -0
  62. package/web/assets/docker-BcOcwvcX.js +1 -0
  63. package/web/assets/dotenv-Da5cRb03.js +1 -0
  64. package/web/assets/dracula-BzJJZx-M.js +1 -0
  65. package/web/assets/dracula-soft-BXkSAIEj.js +1 -0
  66. package/web/assets/dream-maker-BtqSS_iP.js +1 -0
  67. package/web/assets/edge-BkV0erSs.js +1 -0
  68. package/web/assets/elixir-CDX3lj18.js +1 -0
  69. package/web/assets/elm-DbKCFpqz.js +1 -0
  70. package/web/assets/emacs-lisp-C9XAeP06.js +1 -0
  71. package/web/assets/erb-B12qg9BL.js +1 -0
  72. package/web/assets/erlang-DsQrWhSR.js +1 -0
  73. package/web/assets/everforest-dark-BgDCqdQA.js +1 -0
  74. package/web/assets/everforest-light-C8M2exoo.js +1 -0
  75. package/web/assets/fennel-BYunw83y.js +1 -0
  76. package/web/assets/fish-BvzEVeQv.js +1 -0
  77. package/web/assets/fluent-C4IJs8-o.js +1 -0
  78. package/web/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  79. package/web/assets/fortran-free-form-BxgE0vQu.js +1 -0
  80. package/web/assets/fsharp-CXgrBDvD.js +1 -0
  81. package/web/assets/gdresource-BOOCDP_w.js +1 -0
  82. package/web/assets/gdscript-C5YyOfLZ.js +1 -0
  83. package/web/assets/gdshader-DkwncUOv.js +1 -0
  84. package/web/assets/genie-D0YGMca9.js +1 -0
  85. package/web/assets/gherkin-DyxjwDmM.js +1 -0
  86. package/web/assets/git-commit-F4YmCXRG.js +1 -0
  87. package/web/assets/git-rebase-r7XF79zn.js +1 -0
  88. package/web/assets/github-dark-DHJKELXO.js +1 -0
  89. package/web/assets/github-dark-default-Cuk6v7N8.js +1 -0
  90. package/web/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  91. package/web/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  92. package/web/assets/github-light-DAi9KRSo.js +1 -0
  93. package/web/assets/github-light-default-D7oLnXFd.js +1 -0
  94. package/web/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  95. package/web/assets/gleam-BspZqrRM.js +1 -0
  96. package/web/assets/glimmer-js-Rg0-pVw9.js +1 -0
  97. package/web/assets/glimmer-ts-U6CK756n.js +1 -0
  98. package/web/assets/glsl-DplSGwfg.js +1 -0
  99. package/web/assets/gn-n2N0HUVH.js +1 -0
  100. package/web/assets/gnuplot-DdkO51Og.js +1 -0
  101. package/web/assets/go-CxLEBnE3.js +1 -0
  102. package/web/assets/graphql-ChdNCCLP.js +1 -0
  103. package/web/assets/groovy-gcz8RCvz.js +1 -0
  104. package/web/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  105. package/web/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  106. package/web/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  107. package/web/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  108. package/web/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  109. package/web/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  110. package/web/assets/hack-CaT9iCJl.js +1 -0
  111. package/web/assets/haml-B8DHNrY2.js +1 -0
  112. package/web/assets/handlebars-BL8al0AC.js +1 -0
  113. package/web/assets/haskell-Df6bDoY_.js +1 -0
  114. package/web/assets/haxe-CzTSHFRz.js +1 -0
  115. package/web/assets/hcl-BWvSN4gD.js +1 -0
  116. package/web/assets/hjson-D5-asLiD.js +1 -0
  117. package/web/assets/hlsl-D3lLCCz7.js +1 -0
  118. package/web/assets/horizon-BUw7H-hv.js +1 -0
  119. package/web/assets/horizon-bright-Cn-bp-IR.js +1 -0
  120. package/web/assets/houston-DnULxvSX.js +1 -0
  121. package/web/assets/html-GMplVEZG.js +1 -0
  122. package/web/assets/html-derivative-BFtXZ54Q.js +1 -0
  123. package/web/assets/http-jrhK8wxY.js +1 -0
  124. package/web/assets/hurl-irOxFIW8.js +1 -0
  125. package/web/assets/hxml-Bvhsp5Yf.js +1 -0
  126. package/web/assets/hy-DFXneXwc.js +1 -0
  127. package/web/assets/imba-DGztddWO.js +1 -0
  128. package/web/assets/index-B26PZgLN.css +32 -0
  129. package/web/assets/index-BPxuvrOD.js +66 -0
  130. package/web/assets/index-Bf7dLvcq.js +107 -0
  131. package/web/assets/index-Bt1qnI1D.css +32 -0
  132. package/web/assets/index-BtXLpAW0.js +107 -0
  133. package/web/assets/index-C7Xu173F.js +107 -0
  134. package/web/assets/index-CPRX44rP.js +106 -0
  135. package/web/assets/index-Cc3rknU0.css +32 -0
  136. package/web/assets/index-Cqp_OfVm.css +32 -0
  137. package/web/assets/index-D3wDU_n4.css +32 -0
  138. package/web/assets/index-DE7DcjO8.js +66 -0
  139. package/web/assets/index-DN1qYqDR.js +2019 -0
  140. package/web/assets/index-DV88b3Yn.js +107 -0
  141. package/web/assets/index-Db1DwSg_.css +32 -0
  142. package/web/assets/index-Dc20OqL5.js +58 -0
  143. package/web/assets/index-DePLYgQ1.js +66 -0
  144. package/web/assets/index-DgCe5Dtw.css +32 -0
  145. package/web/assets/index-DosPiAmQ.css +32 -0
  146. package/web/assets/index-DsgyEjGR.js +58 -0
  147. package/web/assets/index-SKqT9S_7.js +107 -0
  148. package/web/assets/index-u16BRiHR.css +32 -0
  149. package/web/assets/ini-BEwlwnbL.js +1 -0
  150. package/web/assets/java-CylS5w8V.js +1 -0
  151. package/web/assets/javascript-wDzz0qaB.js +1 -0
  152. package/web/assets/jinja-4LBKfQ-Z.js +1 -0
  153. package/web/assets/jison-wvAkD_A8.js +1 -0
  154. package/web/assets/json-Cp-IABpG.js +1 -0
  155. package/web/assets/json5-C9tS-k6U.js +1 -0
  156. package/web/assets/jsonc-Des-eS-w.js +1 -0
  157. package/web/assets/jsonl-DcaNXYhu.js +1 -0
  158. package/web/assets/jsonnet-DFQXde-d.js +1 -0
  159. package/web/assets/jssm-C2t-YnRu.js +1 -0
  160. package/web/assets/jsx-g9-lgVsj.js +1 -0
  161. package/web/assets/julia-CxzCAyBv.js +1 -0
  162. package/web/assets/just-Cw27pwNe.js +1 -0
  163. package/web/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
  164. package/web/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
  165. package/web/assets/kanagawa-wave-DWedfzmr.js +1 -0
  166. package/web/assets/kdl-DV7GczEv.js +1 -0
  167. package/web/assets/kotlin-BdnUsdx6.js +1 -0
  168. package/web/assets/kusto-DZf3V79B.js +1 -0
  169. package/web/assets/laserwave-DUszq2jm.js +1 -0
  170. package/web/assets/latex-CWtU0Tv5.js +1 -0
  171. package/web/assets/lean-BZvkOJ9d.js +1 -0
  172. package/web/assets/less-B1dDrJ26.js +1 -0
  173. package/web/assets/light-plus-B7mTdjB0.js +1 -0
  174. package/web/assets/liquid-DYVedYrR.js +1 -0
  175. package/web/assets/llvm-DjAJT7YJ.js +1 -0
  176. package/web/assets/log-2UxHyX5q.js +1 -0
  177. package/web/assets/logo-BtOb2qkB.js +1 -0
  178. package/web/assets/lua-BaeVxFsk.js +1 -0
  179. package/web/assets/luau-C-HG3fhB.js +1 -0
  180. package/web/assets/make-CHLpvVh8.js +1 -0
  181. package/web/assets/markdown-Cvjx9yec.js +1 -0
  182. package/web/assets/marko-CnJfTvn9.js +1 -0
  183. package/web/assets/material-theme-D5KoaKCx.js +1 -0
  184. package/web/assets/material-theme-darker-BfHTSMKl.js +1 -0
  185. package/web/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  186. package/web/assets/material-theme-ocean-CyktbL80.js +1 -0
  187. package/web/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  188. package/web/assets/matlab-D7o27uSR.js +1 -0
  189. package/web/assets/mdc-BMNejdWA.js +1 -0
  190. package/web/assets/mdx-Cmh6b_Ma.js +1 -0
  191. package/web/assets/mermaid-mWjccvbQ.js +1 -0
  192. package/web/assets/min-dark-CafNBF8u.js +1 -0
  193. package/web/assets/min-light-CTRr51gU.js +1 -0
  194. package/web/assets/mipsasm-CKIfxQSi.js +1 -0
  195. package/web/assets/mojo-rZm6bMo-.js +1 -0
  196. package/web/assets/monokai-D4h5O-jR.js +1 -0
  197. package/web/assets/moonbit-_H4v1dQx.js +1 -0
  198. package/web/assets/move-IF9eRakj.js +1 -0
  199. package/web/assets/narrat-DRg8JJMk.js +1 -0
  200. package/web/assets/nextflow-Zz6hmt5N.js +1 -0
  201. package/web/assets/nextflow-groovy-BeH2EWoN.js +1 -0
  202. package/web/assets/nginx-BpAMiNFr.js +1 -0
  203. package/web/assets/night-owl-C39BiMTA.js +1 -0
  204. package/web/assets/night-owl-light-CMTm3GFP.js +1 -0
  205. package/web/assets/nim-CVrawwO9.js +1 -0
  206. package/web/assets/nix-CwoSXNpI.js +1 -0
  207. package/web/assets/nord-Ddv68eIx.js +1 -0
  208. package/web/assets/nushell-Cz2AlsmD.js +1 -0
  209. package/web/assets/objective-c-DXmwc3jG.js +1 -0
  210. package/web/assets/objective-cpp-CLxacb5B.js +1 -0
  211. package/web/assets/ocaml-C0hk2d4L.js +1 -0
  212. package/web/assets/odin-BBf5iR-q.js +1 -0
  213. package/web/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  214. package/web/assets/one-light-C3Wv6jpd.js +1 -0
  215. package/web/assets/openscad-C4EeE6gA.js +1 -0
  216. package/web/assets/pascal-D93ZcfNL.js +1 -0
  217. package/web/assets/perl-C0TMdlhV.js +1 -0
  218. package/web/assets/php-Dhbhpdrm.js +1 -0
  219. package/web/assets/pierre-dark-ClCaJvdG.js +1 -0
  220. package/web/assets/pierre-light-zjGsWSiE.js +1 -0
  221. package/web/assets/pkl-u5AG7uiY.js +1 -0
  222. package/web/assets/plastic-3e1v2bzS.js +1 -0
  223. package/web/assets/plsql-ChMvpjG-.js +1 -0
  224. package/web/assets/po-BTJTHyun.js +1 -0
  225. package/web/assets/poimandres-CS3Unz2-.js +1 -0
  226. package/web/assets/polar-C0HS_06l.js +1 -0
  227. package/web/assets/postcss-CXtECtnM.js +1 -0
  228. package/web/assets/powerquery-CEu0bR-o.js +1 -0
  229. package/web/assets/powershell-Dpen1YoG.js +1 -0
  230. package/web/assets/prisma-Dd19v3D-.js +1 -0
  231. package/web/assets/prolog-CbFg5uaA.js +1 -0
  232. package/web/assets/proto-C7zT0LnQ.js +1 -0
  233. package/web/assets/pug-CGlum2m_.js +1 -0
  234. package/web/assets/puppet-BMWR74SV.js +1 -0
  235. package/web/assets/purescript-CklMAg4u.js +1 -0
  236. package/web/assets/python-B6aJPvgy.js +1 -0
  237. package/web/assets/qml-3beO22l8.js +1 -0
  238. package/web/assets/qmldir-C8lEn-DE.js +1 -0
  239. package/web/assets/qss-IeuSbFQv.js +1 -0
  240. package/web/assets/r-Dspwwk_N.js +1 -0
  241. package/web/assets/racket-BqYA7rlc.js +1 -0
  242. package/web/assets/raku-DXvB9xmW.js +1 -0
  243. package/web/assets/razor-Uh8Bk_45.js +1 -0
  244. package/web/assets/red-bN70gL4F.js +1 -0
  245. package/web/assets/reg-C-SQnVFl.js +1 -0
  246. package/web/assets/regexp-CDVJQ6XC.js +1 -0
  247. package/web/assets/rel-C3B-1QV4.js +1 -0
  248. package/web/assets/riscv-BM1_JUlF.js +1 -0
  249. package/web/assets/ron-D8l8udqQ.js +1 -0
  250. package/web/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
  251. package/web/assets/rose-pine-moon-D4_iv3hh.js +1 -0
  252. package/web/assets/rose-pine-qdsjHGoJ.js +1 -0
  253. package/web/assets/rosmsg-BJDFO7_C.js +1 -0
  254. package/web/assets/rst-BrH8l1NY.js +1 -0
  255. package/web/assets/ruby-Dw2BHqvy.js +1 -0
  256. package/web/assets/rust-B1yitclQ.js +1 -0
  257. package/web/assets/sas-cz2c8ADy.js +1 -0
  258. package/web/assets/sass-Cj5Yp3dK.js +1 -0
  259. package/web/assets/scala-C151Ov-r.js +1 -0
  260. package/web/assets/scheme-C98Dy4si.js +1 -0
  261. package/web/assets/scss-OYdSNvt2.js +1 -0
  262. package/web/assets/sdbl-DVxCFoDh.js +1 -0
  263. package/web/assets/shaderlab-Dg9Lc6iA.js +1 -0
  264. package/web/assets/shellscript-Yzrsuije.js +1 -0
  265. package/web/assets/shellsession-BADoaaVG.js +1 -0
  266. package/web/assets/slack-dark-BthQWCQV.js +1 -0
  267. package/web/assets/slack-ochin-DqwNpetd.js +1 -0
  268. package/web/assets/smalltalk-BERRCDM3.js +1 -0
  269. package/web/assets/snazzy-light-Bw305WKR.js +1 -0
  270. package/web/assets/solarized-dark-DXbdFlpD.js +1 -0
  271. package/web/assets/solarized-light-L9t79GZl.js +1 -0
  272. package/web/assets/solidity-rGO070M0.js +1 -0
  273. package/web/assets/soy-Brmx7dQM.js +1 -0
  274. package/web/assets/sparql-rVzFXLq3.js +1 -0
  275. package/web/assets/splunk-BtCnVYZw.js +1 -0
  276. package/web/assets/sql-BLtJtn59.js +1 -0
  277. package/web/assets/ssh-config-_ykCGR6B.js +1 -0
  278. package/web/assets/stata-BH5u7GGu.js +1 -0
  279. package/web/assets/stylus-BEDo0Tqx.js +1 -0
  280. package/web/assets/surrealql-Bq5Q-fJD.js +1 -0
  281. package/web/assets/svelte-C_ipcX3V.js +1 -0
  282. package/web/assets/swift-D82vCrfD.js +1 -0
  283. package/web/assets/synthwave-84-CbfX1IO0.js +1 -0
  284. package/web/assets/system-verilog-CnnmHF94.js +1 -0
  285. package/web/assets/systemd-4A_iFExJ.js +1 -0
  286. package/web/assets/talonscript-CkByrt1z.js +1 -0
  287. package/web/assets/tasl-QIJgUcNo.js +1 -0
  288. package/web/assets/tcl-dwOrl1Do.js +1 -0
  289. package/web/assets/templ-P3uqSqPl.js +1 -0
  290. package/web/assets/terraform-BETggiCN.js +1 -0
  291. package/web/assets/tex-idrVyKtj.js +1 -0
  292. package/web/assets/tokyo-night-hegEt444.js +1 -0
  293. package/web/assets/toml-vGWfd6FD.js +1 -0
  294. package/web/assets/ts-tags-zn1MmPIZ.js +1 -0
  295. package/web/assets/tsv-B_m7g4N7.js +1 -0
  296. package/web/assets/tsx-COt5Ahok.js +1 -0
  297. package/web/assets/turtle-BsS91CYL.js +1 -0
  298. package/web/assets/twig-DNn4PbVi.js +1 -0
  299. package/web/assets/typescript-BPQ3VLAy.js +1 -0
  300. package/web/assets/typespec-BGHnOYBU.js +1 -0
  301. package/web/assets/typst-DHCkPAjA.js +1 -0
  302. package/web/assets/v-BcVCzyr7.js +1 -0
  303. package/web/assets/vala-CsfeWuGM.js +1 -0
  304. package/web/assets/vb-D17OF-Vu.js +1 -0
  305. package/web/assets/vendor-DLeMxNCH.js +17 -0
  306. package/web/assets/vendor-DtzUpehM.js +17 -0
  307. package/web/assets/verilog-BQ8w6xss.js +1 -0
  308. package/web/assets/vesper-DU1UobuO.js +1 -0
  309. package/web/assets/vhdl-CeAyd5Ju.js +1 -0
  310. package/web/assets/viml-CJc9bBzg.js +1 -0
  311. package/web/assets/vitesse-black-Bkuqu6BP.js +1 -0
  312. package/web/assets/vitesse-dark-D0r3Knsf.js +1 -0
  313. package/web/assets/vitesse-light-CVO1_9PV.js +1 -0
  314. package/web/assets/vue-DN_0RTcg.js +1 -0
  315. package/web/assets/vue-html-AaS7Mt5G.js +1 -0
  316. package/web/assets/vue-vine-CQOfvN7w.js +1 -0
  317. package/web/assets/vyper-CDx5xZoG.js +1 -0
  318. package/web/assets/wasm-CG6Dc4jp.js +1 -0
  319. package/web/assets/wasm-MzD3tlZU.js +1 -0
  320. package/web/assets/wenyan-BV7otONQ.js +1 -0
  321. package/web/assets/wgsl-Dx-B1_4e.js +1 -0
  322. package/web/assets/wikitext-BhOHFoWU.js +1 -0
  323. package/web/assets/wit-5i3qLPDT.js +1 -0
  324. package/web/assets/wolfram-lXgVvXCa.js +1 -0
  325. package/web/assets/worker-CkgkkPqX.js +155 -0
  326. package/web/assets/xml-sdJ4AIDG.js +1 -0
  327. package/web/assets/xsl-CtQFsRM5.js +1 -0
  328. package/web/assets/xterm-C3JRPngT.js +66 -0
  329. package/web/assets/yaml-Buea-lGh.js +1 -0
  330. package/web/assets/zenscript-DVFEvuxE.js +1 -0
  331. package/web/assets/zig-VOosw3JB.js +1 -0
  332. package/web/index.html +15 -0
package/server/main.js ADDED
@@ -0,0 +1,568 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{createServer as dn}from"node:http";import{readFileSync as ln,existsSync as bs}from"node:fs";import{join as yt,extname as un}from"node:path";import{WebSocketServer as zr,WebSocket as Jr}from"ws";import{homedir as bt}from"node:os";import{execSync as pe}from"node:child_process";import{readlinkSync as _s}from"node:fs";import{createRequire as Ds}from"node:module";import{chmod as Ns,mkdir as et,writeFile as tt}from"node:fs/promises";import{join as X}from"node:path";import{tmpdir as Os}from"node:os";var Q=class a{static getInitScript(e){switch(e){case"zsh":return`
3
+ # IMPACTUS Swarm Shell Integration (OSC 133)
4
+ __impactus_precmd() {
5
+ local exit_code=$?
6
+ printf '\\e]133;D;%d\\e\\\\' "$exit_code"
7
+ printf '\\e]133;A\\e\\\\'
8
+ }
9
+ __impactus_preexec() {
10
+ printf '\\e]133;C\\e\\\\'
11
+ }
12
+ if [[ -z "$__IMPACTUS_SHELL_INTEGRATION" ]]; then
13
+ export __IMPACTUS_SHELL_INTEGRATION=1
14
+ precmd_functions+=(__impactus_precmd)
15
+ preexec_functions+=(__impactus_preexec)
16
+ fi
17
+ `.trim();case"bash":return`
18
+ # IMPACTUS Swarm Shell Integration (OSC 133)
19
+ if [ -z "$__IMPACTUS_SHELL_INTEGRATION" ]; then
20
+ export __IMPACTUS_SHELL_INTEGRATION=1
21
+ __impactus_prompt_command() {
22
+ local exit_code=$?
23
+ printf '\\e]133;D;%d\\e\\\\' "$exit_code"
24
+ printf '\\e]133;A\\e\\\\'
25
+ }
26
+ trap 'printf "\\e]133;C\\e\\\\"' DEBUG
27
+ PROMPT_COMMAND="__impactus_prompt_command\${PROMPT_COMMAND:+;$PROMPT_COMMAND}"
28
+ fi
29
+ `.trim();case"fish":return`
30
+ # Fish 3.1.2+ has native OSC 133 support
31
+ # Just set TERM_PROGRAM for detection
32
+ set -gx TERM_PROGRAM impactus-swarm
33
+ `.trim();default:return""}}static detectShell(e){return e.includes("zsh")?"zsh":e.includes("bash")?"bash":e.includes("fish")?"fish":"unknown"}static getEnvVars(e){return{TERM_PROGRAM:"impactus-swarm",__IMPACTUS_SHELL_INTEGRATION:"1"}}static async createInjectionEnv(e){if(e==="unknown"||e==="fish")return a.getEnvVars(e);try{let t=X(Os(),"impactus-shell-integration");if(await et(t,{recursive:!0}),await Ns(t,448),e==="zsh"){let s=X(t,"zsh");await et(s,{recursive:!0});let r=["# IMPACTUS Swarm Shell Integration","# Source original zshrc",'if [[ -f "$HOME/.zshrc" ]]; then',' ZDOTDIR="$HOME" source "$HOME/.zshrc"',"fi","",a.getInitScript("zsh")].join(`
34
+ `);await tt(X(s,".zshrc"),r,"utf-8");let n=["# Source original zshenv",'if [[ -f "$HOME/.zshenv" ]]; then',' ZDOTDIR="$HOME" source "$HOME/.zshenv"',"fi"].join(`
35
+ `);return await tt(X(s,".zshenv"),n,"utf-8"),{...a.getEnvVars("zsh"),ZDOTDIR:s}}if(e==="bash"){let s=X(t,"bash");await et(s,{recursive:!0});let r=["# IMPACTUS Swarm Shell Integration","# Source original bashrc",'if [[ -f "$HOME/.bashrc" ]]; then',' source "$HOME/.bashrc"',"fi","",a.getInitScript("bash")].join(`
36
+ `),n=X(s,".bashrc_impactus");return await tt(n,r,"utf-8"),{...a.getEnvVars("bash"),BASH_ENV:n}}}catch{}return a.getEnvVars(e)}};var Ps=Ds(import.meta.url),xs=Ps("node-pty");async function kt(a){let e=process.platform==="win32",t=e?process.env.COMSPEC||"cmd.exe":process.env.SHELL||"/bin/zsh",s=e?[]:[],r=Q.detectShell(t),n=await Q.createInjectionEnv(r);return xs.spawn(t,s,{name:"xterm-256color",cols:a.cols,rows:a.rows,cwd:a.cwd,env:{...process.env,...n,...a.env}})}import{randomUUID as Us}from"node:crypto";var ee=class a{activeBlocks=new Map;lineCounters=new Map;partialBuffers=new Map;static OSC_PROMPT_START=/\x1b\]133;A(?:\x1b\\|\x07)/g;static OSC_COMMAND_EXEC=/\x1b\]133;C(?:\x1b\\|\x07)/g;static OSC_COMMAND_END=/\x1b\]133;D;?(\d*)(?:\x1b\\|\x07)/g;static PARTIAL_OSC=/\x1b(?:\](?:1(?:3(?:3(?:;(?:[A-D](?:;?\d*)?)?)?)?)?)?)?$/;parse(e,t){let s=[],n=(this.partialBuffers.get(t)||"")+e;this.partialBuffers.delete(t);let o=a.PARTIAL_OSC.exec(n),i;o?(this.partialBuffers.set(t,o[0]),i=n.slice(0,o.index)):i=n;let c=(i.match(/\n/g)||[]).length,d=this.lineCounters.get(t)||0,l=[];a.OSC_PROMPT_START.lastIndex=0,a.OSC_COMMAND_EXEC.lastIndex=0,a.OSC_COMMAND_END.lastIndex=0;let u;for(;(u=a.OSC_PROMPT_START.exec(i))!==null;)l.push({type:"A",index:u.index});for(;(u=a.OSC_COMMAND_EXEC.exec(i))!==null;)l.push({type:"C",index:u.index});for(;(u=a.OSC_COMMAND_END.exec(i))!==null;)l.push({type:"D",index:u.index,exitCode:u[1]?parseInt(u[1],10):0});l.sort((p,m)=>p.index-m.index);for(let p of l)switch(p.type){case"A":{let m={id:Us(),terminalId:t,status:"prompting",startTime:new Date().toISOString(),lineStart:d};this.activeBlocks.set(t,m),s.push({type:"block-start",terminalId:t,block:{...m}});break}case"C":{let m=this.activeBlocks.get(t);m&&(m.status="executing",s.push({type:"block-executing",terminalId:t,block:{...m}}));break}case"D":{let m=this.activeBlocks.get(t);m&&(m.status="completed",m.exitCode=p.exitCode,m.endTime=new Date().toISOString(),m.lineEnd=d+c,s.push({type:"block-end",terminalId:t,block:{...m}}),this.activeBlocks.delete(t));break}}return this.lineCounters.set(t,d+c),s}static stripOSC133(e){return e.replace(/\x1b\]133;[A-D];?\d*(?:\x1b\\|\x07)/g,"")}getActiveBlock(e){return this.activeBlocks.get(e)}cleanup(e){this.activeBlocks.delete(e),this.lineCounters.delete(e),this.partialBuffers.delete(e)}};var Fs=process.platform==="win32",st=new Set(["zsh","bash","sh","fish","dash","ksh","tcsh","csh","ps","grep","rg","cmd.exe","powershell.exe","pwsh.exe","conhost.exe","cmd","powershell","pwsh","conhost"]),me=class{terminals=new Map;pushHandler;commandBlockParser=new ee;processDetectionInterval;constructor(e){this.pushHandler=e,this.processDetectionInterval=setInterval(()=>{this.detectProcesses()},3e3)}detectProcesses(){for(let[,e]of this.terminals){let t=this.detectProcessForTerminal(e),s=e.lastProcessInfo;(!s||s.foregroundProcess!==t.foregroundProcess||s.isIdle!==t.isIdle)&&(e.lastProcessInfo=t,this.pushHandler("terminal.process",{id:e.id,process:t}))}}detectProcessForTerminal(e){let t=e.pty.pid,s;try{if(Fs){let n=pe(`wmic process where (ParentProcessId=${t}) get Name /format:list`,{stdio:"pipe",timeout:2e3}).toString().trim().split(`
37
+ `).map(o=>o.replace(/^Name=/,"").trim()).filter(o=>o&&!st.has(o)&&!st.has(o.replace(/\.exe$/i,"")));n.length>0&&(s=n[0].replace(/\.exe$/i,""))}else{let r=pe(`ps -p ${t} -o tty= 2>/dev/null`,{stdio:"pipe",timeout:2e3}).toString().trim();if(r&&r!=="?"){let o=pe(`ps -o comm= -t ${r} 2>/dev/null`,{stdio:"pipe",timeout:2e3}).toString().trim().split(`
38
+ `).map(i=>{let c=i.trim();return c.split("/").pop()||c}).filter(i=>i&&!st.has(i));o.length>0&&(s=o[0])}}}catch{}return{id:e.id,pid:t,foregroundProcess:s,isIdle:s===void 0}}dispose(){clearInterval(this.processDetectionInterval)}getProcessInfo(e){let t=this.terminals.get(e);return t?t.lastProcessInfo??this.detectProcessForTerminal(t):null}getAllProcessInfo(){return Array.from(this.terminals.values()).map(e=>e.lastProcessInfo??this.detectProcessForTerminal(e))}async open(e,t){this.terminals.has(e.id)&&this.close(e.id);let s=e.cwd==="~"?bt():e.cwd.replace(/^~\//,bt()+"/"),r;try{r=await kt({cols:e.cols,rows:e.rows,cwd:s,env:e.env})}catch(l){let u=l instanceof Error?l.message:"Failed to spawn PTY";this.pushHandler("terminal.error",{id:e.id,message:u});return}let n=new AbortController,o={pty:r,id:e.id,sequenceAbort:n,outputBuffer:""};this.terminals.set(e.id,o),r.onData(l=>{o.outputBuffer+=l,o.outputBuffer.length>1e5&&(o.outputBuffer=o.outputBuffer.slice(-5e4));let u=this.commandBlockParser.parse(l,e.id);for(let f of u)this.pushHandler("terminal.command-block",{terminalId:e.id,event:f});let p=u.length>0?ee.stripOSC133(l):l,m={id:e.id,data:p};this.pushHandler("terminal.output",m)}),r.onExit(({exitCode:l})=>{n.abort();let u={id:e.id,exitCode:l};this.pushHandler("terminal.exited",u),this.terminals.delete(e.id)});let i={id:e.id,pid:r.pid};this.pushHandler("terminal.started",i);let c=new Set(t?.completedSteps||[]),d=[];e.command&&d.push({command:e.command,delay:300}),e.commandSequence&&e.commandSequence.forEach((l,u)=>{l.runOnce&&c.has(u)||d.push({...l,originalIndex:u})}),d.length>0?this.executeSequence(r,d,n.signal,e.id,t?.onStepCompleted).catch(l=>{console.error("[terminal] executeSequence error:",l)}).then(()=>{e.closeAfterCommand&&!n.signal.aborted&&this.scheduleClose(e.id,e.closeDelay??1e3,e.closeWaitFor,n.signal)}):e.closeAfterCommand&&this.scheduleClose(e.id,e.closeDelay??1e3,e.closeWaitFor,n.signal)}async executeSequence(e,t,s,r,n){for(let o of t){if(s.aborted)return;let i=o.delay??500;if(await this.sleep(i,s),s.aborted)return;if(o.waitFor){if(await this.waitForOutput(r||"",o.waitFor,3e4,s),s.aborted)return;let c=o.respond||"",d=c.endsWith("\r")?c:c+"\r";e.write(d),o.runOnce&&o.originalIndex!==void 0&&r&&n&&n(r,o.originalIndex);continue}e.write(o.command+"\r"),o.runOnce&&o.originalIndex!==void 0&&r&&n&&n(r,o.originalIndex)}}async scheduleClose(e,t,s,r){r?.aborted||s&&(await this.waitForOutput(e,s,12e4,r||new AbortController().signal),r?.aborted)||(await this.sleep(Math.max(t,500),r||new AbortController().signal),!r?.aborted&&this.terminals.has(e)&&this.close(e))}sleep(e,t){return new Promise(s=>{let r=setTimeout(s,e);t.addEventListener("abort",()=>{clearTimeout(r),s()},{once:!0})})}stripAnsi(e){return e.replace(/\x1b\[[0-9;?]*[a-zA-Z]|\x1b\][^\x07]*\x07|\x1b[()][AB012]|\x1b[>=]/g," ").replace(/[\x00-\x08\x0b\x0c\x0e-\x1f]/g,"")}waitForOutput(e,t,s,r){return new Promise(n=>{let o=this.terminals.get(e);if(!o){n();return}let i=o.outputBuffer.length,c=setInterval(()=>{let l=o.outputBuffer;this.stripAnsi(l.slice(i)).includes(t)&&(clearInterval(c),clearTimeout(d),n())},200),d=setTimeout(()=>{clearInterval(c);let l=o.outputBuffer;n()},s);r.addEventListener("abort",()=>{clearInterval(c),clearTimeout(d),n()},{once:!0})})}write(e,t){let s=this.terminals.get(e);if(!s){this.pushHandler("terminal.error",{id:e,message:`Terminal ${e} not found`});return}try{s.pty.write(t)}catch(r){let n=r instanceof Error?r.message:"Failed to write to PTY";this.pushHandler("terminal.error",{id:e,message:n})}}resize(e,t,s){let r=this.terminals.get(e);r&&r.pty.resize(t,s)}close(e){let t=this.terminals.get(e);t&&(t.sequenceAbort?.abort(),t.pty.kill(),this.commandBlockParser.cleanup(e),this.terminals.delete(e))}closeAll(){this.dispose();for(let[e]of this.terminals)this.close(e)}getOutputBuffer(e){let t=this.terminals.get(e);return t?t.outputBuffer:null}outputContains(e,t){let s=this.terminals.get(e);return s?this.stripAnsi(s.outputBuffer).includes(t):!1}has(e){return this.terminals.has(e)}getCwd(e){let t=this.terminals.get(e);if(!t)return null;let s=t.pty.pid;try{if(process.platform==="darwin"){let n=pe(`lsof -a -p ${s} -d cwd -Fn 2>/dev/null`,{stdio:"pipe",timeout:3e3}).toString().trim().split(`
39
+ `);for(let o of n)if(o.startsWith("n"))return o.slice(1)}else if(process.platform==="linux")return _s(`/proc/${s}/cwd`)}catch{}return null}get size(){return this.terminals.size}listTerminals(){let e=[];for(let[t,s]of this.terminals)e.push({id:t,pid:s.pty.pid});return e}};import{randomUUID as Ws}from"node:crypto";var ge=class{db;areaManager;constructor(e,t){this.db=e,this.areaManager=t}list(){return this.db.prepare('SELECT * FROM workspaces ORDER BY "order" ASC, createdAt ASC').all().map(s=>this.hydrateWorkspace(s))}get(e){let s=this.db.prepare("SELECT * FROM workspaces WHERE id = ?").get(e);return s?this.hydrateWorkspace(s):null}create(e){let t=Ws(),s=new Date().toISOString(),r=e.icon||e.name.split(" ").map(p=>p[0]).join("").slice(0,2).toUpperCase(),i=this.db.prepare('SELECT MAX("order") as m FROM workspaces').get()?.m||0;this.db.prepare(`INSERT INTO workspaces (id, name, icon, color, rootDirectory, initGit, defaultCommand, terminalCount, layout, "order", createdAt, updatedAt)
40
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t,e.name,r,e.color||"#7C3AED",e.rootDirectory,e.initGit!==void 0?e.initGit?1:0:1,e.defaultCommand||"",e.terminalCount,e.layout||"auto",i+1,s,s),this.db.prepare("INSERT INTO workspace_state (workspaceId) VALUES (?)").run(t);let l=this.areaManager.create({workspaceId:t,name:"Principal",color:e.color||"#7C3AED",defaultCommand:e.defaultCommand,terminalCount:e.terminalCount,layout:e.layout,terminals:e.terminals});return this.db.prepare("UPDATE areas SET isDefault = 1 WHERE id = ?").run(l.id),this.get(t)}update(e){let t=this.get(e.id);if(!t)return null;let s=new Date().toISOString();if(this.db.prepare(`UPDATE workspaces SET
41
+ name = ?, icon = ?, color = ?, rootDirectory = ?, initGit = ?,
42
+ defaultCommand = ?, terminalCount = ?, layout = ?, updatedAt = ?
43
+ WHERE id = ?`).run(e.name??t.name,e.icon??t.icon,e.color??t.color,e.rootDirectory??t.rootDirectory,e.initGit!==void 0?e.initGit?1:0:t.initGit?1:0,e.defaultCommand??t.defaultCommand,e.terminalCount??t.terminalCount,e.layout??t.layout,s,e.id),e.terminals||e.terminalCount!==void 0||e.defaultCommand!==void 0||e.layout!==void 0){let n=this.areaManager.getDefaultArea(e.id);n&&this.areaManager.update({id:n.id,defaultCommand:e.defaultCommand,terminalCount:e.terminalCount,layout:e.layout,terminals:e.terminals})}return this.get(e.id)}delete(e){let t=this.areaManager.list(e);for(let o of t)this.areaManager.delete(o.id);return this.db.prepare("DELETE FROM workspace_state WHERE workspaceId = ?").run(e),this.db.prepare("DELETE FROM workspaces WHERE id = ?").run(e).changes>0}setRunning(e,t){this.db.prepare(`UPDATE workspace_state SET isRunning = ?, lastLaunchedAt = ?
44
+ WHERE workspaceId = ?`).run(t?1:0,t?new Date().toISOString():null,e)}isRunning(e){let t=this.areaManager.list(e);for(let n of t)if(this.areaManager.isRunning(n.id))return!0;return this.db.prepare("SELECT isRunning FROM workspace_state WHERE workspaceId = ?").get(e)?.isRunning===1}hydrateWorkspace(e){let t=this.areaManager.list(e.id),s=t.find(l=>l.isDefault)||t[0],r=s?.terminals??[],n=s?.terminalCount??e.terminalCount,o=s?.layout??e.layout,i=s?.defaultCommand??e.defaultCommand,d=this.db.prepare("SELECT isRunning FROM workspace_state WHERE workspaceId = ?").get(e.id);return{id:e.id,name:e.name,icon:e.icon,color:e.color,rootDirectory:e.rootDirectory,initGit:e.initGit===1,areas:t,defaultCommand:i,terminalCount:n,layout:o,terminals:r,createdAt:e.createdAt,updatedAt:e.updatedAt,isRunning:d?.isRunning===1}}};import{randomUUID as rt}from"node:crypto";import{join as Bs}from"node:path";var he=class{db;constructor(e){this.db=e}list(e){return this.db.prepare('SELECT * FROM areas WHERE workspaceId = ? ORDER BY "order" ASC, createdAt ASC').all(e).map(r=>this.hydrateArea(r))}get(e){let s=this.db.prepare("SELECT * FROM areas WHERE id = ?").get(e);return s?this.hydrateArea(s):null}create(e){let t=rt(),s=new Date().toISOString(),o=this.db.prepare('SELECT MAX("order") as m FROM areas WHERE workspaceId = ?').get(e.workspaceId)?.m??0,i=e.terminalCount??1;this.db.prepare(`INSERT INTO areas (id, workspaceId, name, color, directory, useWorktree, worktreeBranch, defaultCommand, terminalCount, layout, "order", isDefault, createdAt, updatedAt)
45
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t,e.workspaceId,e.name,e.color||"#7C3AED",e.directory||"",e.useWorktree?1:0,e.worktreeBranch||null,e.defaultCommand||"",i,e.layout||"auto",o+1,0,s,s);let d=this.db.prepare(`INSERT INTO terminal_configs (id, workspaceId, areaId, label, directory, command, env, position, commandSequence, runOnce, commandRunOnce, startDelay, startWaitFor, startRunOnce, closeAfterCommand, closeDelay, closeWaitFor, color)
46
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);for(let u=0;u<i;u++){let p=e.terminals?.[u],m=rt();d.run(m,e.workspaceId,t,p?.label||`Terminal ${u+1}`,p?.directory||"",p?.command||"",JSON.stringify(p?.env||{}),u,JSON.stringify(p?.commandSequence||[]),p?.runOnce?1:0,p?.commandRunOnce?1:0,p?.startDelay||0,p?.startWaitFor||"",p?.startRunOnce?1:0,p?.closeAfterCommand?1:0,p?.closeDelay??1e3,p?.closeWaitFor||"",p?.color||"default")}return this.db.prepare("INSERT INTO area_state (areaId) VALUES (?)").run(t),this.get(t)}update(e){let t=this.get(e.id);if(!t)return null;let s=new Date().toISOString();if(this.db.prepare(`UPDATE areas SET
47
+ name = ?, color = ?, directory = ?, useWorktree = ?,
48
+ worktreeBranch = ?, defaultCommand = ?, terminalCount = ?,
49
+ layout = ?, updatedAt = ?
50
+ WHERE id = ?`).run(e.name??t.name,e.color??t.color,e.directory??t.directory,e.useWorktree!==void 0?e.useWorktree?1:0:t.useWorktree?1:0,e.worktreeBranch!==void 0?e.worktreeBranch||null:t.worktreeBranch||null,e.defaultCommand??t.defaultCommand,e.terminalCount??t.terminalCount,e.layout??t.layout,s,e.id),e.terminals){this.db.prepare("DELETE FROM terminal_configs WHERE areaId = ?").run(e.id);let o=this.db.prepare(`INSERT INTO terminal_configs (id, workspaceId, areaId, label, directory, command, env, position, commandSequence, runOnce, commandRunOnce, startDelay, startWaitFor, startRunOnce, closeAfterCommand, closeDelay, closeWaitFor, color)
51
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`),i=e.terminalCount??t.terminalCount;for(let c=0;c<i;c++){let d=e.terminals[c],l=d?.id||rt();o.run(l,t.workspaceId,e.id,d?.label||`Terminal ${c+1}`,d?.directory||"",d?.command||"",JSON.stringify(d?.env||{}),c,JSON.stringify(d?.commandSequence||[]),d?.runOnce?1:0,d?.commandRunOnce?1:0,d?.startDelay||0,d?.startWaitFor||"",d?.startRunOnce?1:0,d?.closeAfterCommand?1:0,d?.closeDelay??1e3,d?.closeWaitFor||"",d?.color||"default")}}return this.get(e.id)}delete(e){return this.db.prepare("DELETE FROM terminal_configs WHERE areaId = ?").run(e),this.db.prepare("DELETE FROM area_state WHERE areaId = ?").run(e),this.db.prepare("DELETE FROM areas WHERE id = ?").run(e).changes>0}duplicate(e,t){let s=this.get(e);if(!s)throw new Error(`Area not found: ${e}`);return this.create({workspaceId:s.workspaceId,name:t,color:s.color,directory:s.directory,useWorktree:s.useWorktree,worktreeBranch:s.worktreeBranch,defaultCommand:s.defaultCommand,terminalCount:s.terminalCount,terminals:s.terminals.map(r=>({label:r.label,directory:r.directory,command:r.command,env:r.env,commandSequence:r.commandSequence,runOnce:r.runOnce,commandRunOnce:r.commandRunOnce,startDelay:r.startDelay,startWaitFor:r.startWaitFor,startRunOnce:r.startRunOnce,closeAfterCommand:r.closeAfterCommand,closeDelay:r.closeDelay,closeWaitFor:r.closeWaitFor,color:r.color})),layout:s.layout})}getDefaultArea(e){let s=this.db.prepare("SELECT * FROM areas WHERE workspaceId = ? AND isDefault = 1 LIMIT 1").get(e);return s?this.hydrateArea(s):null}resolveForLaunch(e,t){let s=e.directory||t;return e.terminals.filter(n=>!(n.runOnce&&this.db.prepare("SELECT hasLaunched FROM terminal_configs WHERE id = ?").get(n.id)?.hasLaunched===1)).map((n,o)=>{let i=n.directory||".",c=i.startsWith("/")?i:Bs(s,i),u=this.db.prepare("SELECT hasLaunched FROM terminal_configs WHERE id = ?").get(n.id)?.hasLaunched===1,p=n.commandRunOnce&&u,m=p?e.defaultCommand:n.command||e.defaultCommand,f=p?void 0:n.commandSequence;return{id:n.id,label:n.label||`Terminal ${o+1}`,cwd:c,command:m,commandSequence:f,env:{SWARM_WORKSPACE_ID:e.workspaceId,SWARM_WORKSPACE_NAME:"",SWARM_AREA_ID:e.id,SWARM_AREA_NAME:e.name,SWARM_TERMINAL_ID:n.id,SWARM_TERMINAL_LABEL:n.label,SWARM_TERMINAL_INDEX:String(o+1),SWARM_TERMINAL_COUNT:String(e.terminalCount),SWARM_MODE:"web",...n.env},position:o,startDelay:n.startDelay||0,startWaitFor:n.startWaitFor||"",startRunOnce:n.startRunOnce||!1,hasLaunched:u,closeAfterCommand:n.closeAfterCommand||!1,closeDelay:n.closeDelay??1e3,closeWaitFor:n.closeWaitFor||""}})}setRunning(e,t){this.db.prepare(`UPDATE area_state SET isRunning = ?, lastLaunchedAt = ?
52
+ WHERE areaId = ?`).run(t?1:0,t?new Date().toISOString():null,e)}isRunning(e){return this.db.prepare("SELECT isRunning FROM area_state WHERE areaId = ?").get(e)?.isRunning===1}setTerminalColor(e,t,s){this.db.prepare("UPDATE terminal_configs SET color = ? WHERE id = ? AND areaId = ?").run(s||"default",e,t)}markTerminalLaunched(e){this.db.prepare("UPDATE terminal_configs SET hasLaunched = 1 WHERE id = ?").run(e)}resetTerminalLaunched(e){this.db.prepare("UPDATE terminal_configs SET hasLaunched = 0, completedSteps = '[]' WHERE id = ?").run(e)}resetAllTerminals(e){this.db.prepare("UPDATE terminal_configs SET hasLaunched = 0, completedSteps = '[]' WHERE areaId = ?").run(e)}markStepCompleted(e,t){let r=this.db.prepare("SELECT completedSteps FROM terminal_configs WHERE id = ?").get(e),n=JSON.parse(r?.completedSteps||"[]");n.includes(t)||(n.push(t),this.db.prepare("UPDATE terminal_configs SET completedSteps = ? WHERE id = ?").run(JSON.stringify(n),e))}getCompletedSteps(e){let s=this.db.prepare("SELECT completedSteps FROM terminal_configs WHERE id = ?").get(e);return JSON.parse(s?.completedSteps||"[]")}saveRuntimeState(e,t){this.db.prepare("INSERT OR REPLACE INTO area_runtime_state (areaId, data, updatedAt) VALUES (?, ?, ?)").run(e,JSON.stringify(t),new Date().toISOString())}getRuntimeState(e){let s=this.db.prepare("SELECT data FROM area_runtime_state WHERE areaId = ?").get(e);return s?JSON.parse(s.data):null}clearRuntimeState(e){this.db.prepare("DELETE FROM area_runtime_state WHERE areaId = ?").run(e)}hydrateArea(e){let s=this.db.prepare("SELECT * FROM terminal_configs WHERE areaId = ? ORDER BY position ASC").all(e.id);return{id:e.id,workspaceId:e.workspaceId,name:e.name,color:e.color,directory:e.directory,useWorktree:e.useWorktree===1,worktreeBranch:e.worktreeBranch||void 0,worktreePath:e.worktreePath||void 0,defaultCommand:e.defaultCommand,terminalCount:e.terminalCount,layout:e.layout,order:e.order,isDefault:e.isDefault===1,createdAt:e.createdAt,updatedAt:e.updatedAt,terminals:s.map(r=>({id:r.id,label:r.label,directory:r.directory,command:r.command,env:JSON.parse(r.env),commandSequence:JSON.parse(r.commandSequence||"[]"),runOnce:r.runOnce===1,commandRunOnce:r.commandRunOnce===1,startDelay:r.startDelay||0,startWaitFor:r.startWaitFor||"",startRunOnce:r.startRunOnce===1,closeAfterCommand:r.closeAfterCommand===1,closeDelay:r.closeDelay??1e3,closeWaitFor:r.closeWaitFor||"",color:r.color||"default"}))}}};import{randomUUID as it}from"node:crypto";import{mkdirSync as K,writeFileSync as Zs}from"node:fs";import{join as O}from"node:path";import{randomUUID as $s}from"node:crypto";import{mkdirSync as qs,writeFileSync as It}from"node:fs";import{join as nt}from"node:path";var fe=class{registry;constructor(e){this.registry=e}async boot(e,t,s,r,n){let o=`swarm-${t.id}-agent-${e.id}-${$s().slice(0,8)}`,i=this.getCommandForCli(e.cli,t.mission,e.autoApprove||t.autoApprove),c=e.name.toLowerCase().replace(/\s+/g,"-"),d=nt(t.directory,".swarm","agents",c);qs(d,{recursive:!0});let l=this.generateClaudeMd(t,e);if(It(nt(d,"CLAUDE.md"),l),e.mcps&&e.mcps.length>0){let f={mcpServers:Object.fromEntries(e.mcps.map(w=>[w,{command:w}]))};It(nt(d,".mcp.json"),JSON.stringify(f,null,2))}let u,p,m=t.directory;if(t.useWorktrees&&n&&n.isGitRepo(t.directory))try{let f=n.createForAgent(t.directory,t.id,e.name);u=f.path,p=f.branch,m=f.path}catch(f){console.warn(`[WorktreeManager] Failed to create worktree for agent ${e.name}:`,f)}return await s.open({id:o,cwd:m,command:i,env:r,cols:120,rows:30}),{terminalId:o,worktreePath:u,worktreeBranch:p}}generateClaudeMd(e,t){let s=[`# Agent: ${t.name}`,`## Role: ${t.role}`,"","## Mission",e.mission,"","## Working Directory",e.directory,""];return t.systemPrompt&&s.push("## System Prompt",t.systemPrompt,""),t.workScope&&t.workScope.length>0&&s.push("## Work Scope",...t.workScope.map(r=>`- ${r}`),""),t.role==="coordinator"&&s.push("## Coordinator Instructions",`You are the coordinator of a swarm of ${e.agents.length} agents.`,"Your job is to orchestrate the other agents to complete the mission.","Monitor their outputs, delegate tasks, and ensure quality.","","## Agents in this Swarm",...e.agents.map(r=>`- ${r.name} (${r.role}): ${r.systemPrompt||"No specific prompt"}`),""),s.join(`
53
+ `)}getCommandForCli(e,t,s){let r=this.registry.get(e);return r?r.buildCommand({mission:t,cwd:"",autoApprove:s}):e}};import{randomUUID as js}from"node:crypto";import{query as Gs}from"@anthropic-ai/claude-agent-sdk";import{randomUUID as Hs}from"node:crypto";import{resolve as at}from"node:path";import{spawn as Xs}from"node:child_process";import{query as Ks}from"@anthropic-ai/claude-agent-sdk";var Rt=1024*1024,At=5e4,Ct=50,Mt=new Set(["PATH","HOME","USER","SHELL","LD_PRELOAD","LD_LIBRARY_PATH","DYLD_INSERT_LIBRARIES","DYLD_LIBRARY_PATH","NODE_OPTIONS","ELECTRON_RUN_AS_NODE","NODE_PATH"]),we=class{sessions=new Map;agentSessionCount=new Map;maxCLIsPerAgent;allowedBasePaths;claudeBinaryPath;onEvent;cleanupTimer=null;constructor(e){this.maxCLIsPerAgent=e.maxCLIsPerAgent??5,this.allowedBasePaths=e.allowedBasePaths??[process.cwd()],this.claudeBinaryPath=e.claudeBinaryPath??"claude",this.onEvent=e.onEvent,this.cleanupTimer=setInterval(()=>this.cleanup(3e5),6e4)}dispose(){this.cleanupTimer&&(clearInterval(this.cleanupTimer),this.cleanupTimer=null),this.killAll()}async spawn(e,t){this.validateConfig(t);let s=this.agentSessionCount.get(e)??0;if(s>=this.maxCLIsPerAgent)throw new Error(`Agent ${e} has reached the maximum of ${this.maxCLIsPerAgent} concurrent CLIs`);if([...this.sessions.values()].filter(i=>i.status==="running").length>=Ct)throw new Error(`Global CLI session limit (${Ct}) reached`);let n=Hs(),o={id:n,agentId:e,config:t,status:"running",outputBuffer:"",startedAt:new Date().toISOString()};return this.sessions.set(n,o),this.agentSessionCount.set(e,s+1),t.cli==="claude"?this.spawnClaudeSDK(o):this.spawnCLIProcess(o),n}validateConfig(e){if(!e.prompt||e.prompt.length===0)throw new Error("Prompt is required");if(e.prompt.length>At)throw new Error(`Prompt too long (max ${At} chars)`);if(e.prompt.includes("\0"))throw new Error("Prompt contains invalid characters");if(e.workDir){let t=at(e.workDir);if(!this.allowedBasePaths.some(r=>t===at(r)||t.startsWith(at(r)+"/")))throw new Error(`Working directory "${e.workDir}" is outside allowed paths`)}if(e.env){for(let t of Object.keys(e.env))if(Mt.has(t.toUpperCase()))throw new Error(`Environment variable "${t}" cannot be overridden`)}if(e.timeout!==void 0&&(e.timeout<=0||e.timeout>3600))throw new Error("Timeout must be between 1 and 3600 seconds");if(e.maxBudget!==void 0&&(e.maxBudget<=0||e.maxBudget>100))throw new Error("Max budget must be between $0.01 and $100")}sanitizeEnv(e){let t={...process.env};if(!e)return t;for(let[s,r]of Object.entries(e))Mt.has(s.toUpperCase())||(t[s]=r);return t}async spawnClaudeSDK(e){let t=e.config,s=new AbortController;e.sdkAbort=s;let r;t.timeout&&(r=setTimeout(()=>{s.abort(),this.completeSession(e.id,"timeout","CLI timed out")},t.timeout*1e3));try{let n=Ks({prompt:t.prompt,options:{model:t.model||"claude-sonnet-4-6",pathToClaudeCodeExecutable:this.claudeBinaryPath,cwd:t.workDir||process.cwd(),permissionMode:t.autoApprove?"bypassPermissions":"default",allowDangerouslySkipPermissions:t.autoApprove||void 0,maxBudgetUsd:t.maxBudget,abortController:s,env:this.sanitizeEnv(t.env)}}),o="",i;for await(let c of n){if(s.signal.aborted)break;if(c.type==="assistant"){let d=this.extractAssistantText(c);d&&(this.appendToBuffer(e,d),this.onEvent({type:"output",sessionId:e.id,agentId:e.agentId,data:d}))}if(c.type==="result"){let d=c;o=d.result??"",i=d.total_cost_usd}}r&&clearTimeout(r),s.signal.aborted||this.completeSession(e.id,"completed",void 0,o||e.outputBuffer,void 0,i)}catch(n){r&&clearTimeout(r);let o=n instanceof Error?n.message:String(n);this.completeSession(e.id,"error",o)}}extractAssistantText(e){if(e.type!=="assistant")return"";let s=e.message;return!s?.content||!Array.isArray(s.content)?"":s.content.filter(r=>r.type==="text").map(r=>typeof r.text=="string"?r.text:"").join("")}appendToBuffer(e,t){e.outputBuffer+=t,e.outputBuffer.length>Rt&&(e.outputBuffer=e.outputBuffer.slice(-Rt/2))}spawnCLIProcess(e){let t=e.config,{cmd:s,args:r}=this.buildCLICommand(t),n;try{let o=Xs(s,r,{cwd:t.workDir||process.cwd(),env:this.sanitizeEnv(t.env),stdio:["pipe","pipe","pipe"]});e.process=o,t.timeout&&(n=setTimeout(()=>{o.kill("SIGTERM"),this.completeSession(e.id,"timeout","CLI timed out")},t.timeout*1e3)),o.stdout?.on("data",i=>{let c=i.toString();this.appendToBuffer(e,c),this.onEvent({type:"output",sessionId:e.id,agentId:e.agentId,data:c})}),o.stderr?.on("data",i=>{this.appendToBuffer(e,i.toString())}),o.on("close",i=>{n&&clearTimeout(n),i===0?this.completeSession(e.id,"completed",void 0,e.outputBuffer,i):this.completeSession(e.id,"error",`Process exited with code ${i}`,e.outputBuffer,i??void 0)}),o.on("error",i=>{n&&clearTimeout(n),this.completeSession(e.id,"error",i.message)})}catch(o){let i=o instanceof Error?o.message:String(o);this.completeSession(e.id,"error",i)}}buildCLICommand(e){switch(e.cli){case"codex":{let t=["exec",e.prompt];return e.autoApprove&&t.push("--dangerously-bypass-approvals-and-sandbox"),t.push("--json"),e.model&&t.push("-m",e.model),{cmd:"codex",args:t}}case"gemini":{let t=["-p",e.prompt];return e.autoApprove&&t.push("--yolo"),t.push("--output-format",e.outputFormat||"json"),e.model&&t.push("-m",e.model),{cmd:"gemini",args:t}}case"opencode":return{cmd:"opencode",args:[e.prompt]};case"cursor":return{cmd:"cursor",args:["--prompt",e.prompt]};default:return{cmd:e.cli,args:[e.prompt]}}}completeSession(e,t,s,r,n,o){let i=this.sessions.get(e);if(!i)return;i.status=t;let c={id:e,cli:i.config.cli,status:t,output:r||i.outputBuffer,exitCode:n,startedAt:i.startedAt,completedAt:new Date().toISOString(),error:s,cost:o};i.result=c;let d=this.agentSessionCount.get(i.agentId)??1;this.agentSessionCount.set(i.agentId,Math.max(0,d-1)),this.onEvent({type:t==="completed"?"completed":"error",sessionId:e,agentId:i.agentId,data:s||r||"",result:c})}kill(e){let t=this.sessions.get(e);t&&(t.sdkAbort&&t.sdkAbort.abort(),t.process&&t.process.kill("SIGTERM"),this.completeSession(e,"error","Killed by user"))}killAllForAgent(e){for(let[,t]of this.sessions)t.agentId===e&&t.status==="running"&&this.kill(t.id)}killAll(){for(let[,e]of this.sessions)e.status==="running"&&this.kill(e.id)}getSessionsForAgent(e){let t=[];for(let s of this.sessions.values())s.agentId===e&&t.push(s);return t}getSession(e){return this.sessions.get(e)}getActiveCount(e){return this.agentSessionCount.get(e)??0}cleanup(e=36e5){let t=Date.now();for(let[s,r]of this.sessions)r.status!=="running"&&r.result?.completedAt&&t-new Date(r.result.completedAt).getTime()>e&&this.sessions.delete(s)}};var Ee=class{instances=new Map;cliProvider;config;escalations=new Map;escalationResolvers=new Map;running=!1;autoCaptureCount=new Map;constructor(e){this.config=e,this.cliProvider=new we({maxCLIsPerAgent:5,allowedBasePaths:[e.swarm.directory],claudeBinaryPath:e.claudeBinaryPath,onEvent:t=>{t.type==="output"&&this.config.onAgentOutput?.({swarmId:this.config.swarm.id,agentId:t.agentId,agentName:this.getAgentName(t.agentId),type:"tool_result",content:t.data}),t.type==="completed"&&t.result&&this.config.onCLICompleted?.({swarmId:this.config.swarm.id,agentId:t.agentId,sessionId:t.sessionId,result:t.result})}})}async start(){this.running=!0;let e=this.config.topology,t=this.config.swarm.agents;if(!e||t.length===0){await this.runParallel(t),this.finalize();return}if(e.executionMode==="dag"&&this.hasCycles(e.connections))throw new Error("Topology contains cycles \u2014 DAG mode requires acyclic connections");switch(e.executionMode){case"sequential":await this.runSequential(t,e);break;case"parallel":await this.runParallel(t);break;case"dag":await this.runDAG(t,e);break;case"loop":await this.runLoop(t,e);break}this.finalize()}finalize(){this.running&&(this.running=!1,this.cliProvider.dispose(),this.config.onSwarmCompleted?.({swarmId:this.config.swarm.id,results:new Map(Array.from(this.instances.entries()).map(([e,t])=>[e,t.result]))}))}stop(){this.running=!1;for(let e of this.instances.values())e.status==="running"&&(e.sessionAbort.abort(),e.status="completed",e.completedAt=new Date().toISOString());this.cliProvider.killAll(),this.cliProvider.dispose();for(let[e,t]of this.escalationResolvers)t("ORCHESTRATOR_STOPPED"),this.escalationResolvers.delete(e)}respondToEscalation(e,t){let s=this.escalations.get(e);if(!s)return;s.status="responded",s.response=t,s.resolvedAt=new Date().toISOString();let r=this.escalationResolvers.get(e);r&&(r(t),this.escalationResolvers.delete(e))}getInstances(){return Array.from(this.instances.values())}getEscalations(){return Array.from(this.escalations.values())}getCLIProvider(){return this.cliProvider}async runSequential(e,t){let s=t?this.orderByConnections(e,t.connections):e,r;for(let n of s){if(!this.running)break;let o=r?`
54
+
55
+ Context from previous agent:
56
+ ${r}`:"";r=await this.runAgent(n,o)}}async runParallel(e){let t=e.map(s=>this.runAgent(s));await Promise.allSettled(t)}async runDAG(e,t){let s=new Map(e.map(c=>[c.id,c])),r=new Set,n=new Map,o=new Map;for(let c of e)o.set(c.id,new Set);for(let c of t.connections)if(c.type==="trigger"||c.type==="pipe"){let d=o.get(c.to);d&&d.add(c.from)}let i=()=>{for(let[c,d]of o){if(r.has(c)||n.has(c)||![...d].every(w=>r.has(w)))continue;let u=s.get(c);if(!u)continue;let p=[];for(let w of t.connections)if(w.to===c&&w.type==="pipe"&&r.has(w.from)){let g=this.instances.get(w.from);if(g?.result){let h=s.get(w.from);p.push(`Result from ${h?.name??w.from}:
57
+ ${g.result}`)}}let m=p.length>0?`
58
+
59
+ Context from previous agents:
60
+ ${p.join(`
61
+
62
+ `)}`:"",f=this.runAgent(u,m).then(w=>(r.add(c),n.delete(c),this.running&&i(),w)).catch(()=>{r.add(c),n.delete(c),this.running&&i()});n.set(c,f)}};for(i();n.size>0&&this.running;){let c=[...n.values()];if(c.length===0)break;await Promise.race(c)}}async runLoop(e,t){let s=t.loopMaxIterations??10,r=0,n=!0;for(;n&&r<s&&this.running;){r++;for(let o of e){if(!this.running)break;let i=`
63
+
64
+ Loop iteration: ${r}/${s}`,c=await this.runAgent(o,i);if(c&&this.detectLoopCompletion(c)){n=!1;break}}for(let o of t.connections)if(o.type==="feedback"&&o.condition&&this.instances.get(o.from)?.result?.toLowerCase().includes(o.condition.toLowerCase())){n=!1;break}}}async runAgent(e,t=""){let s=new AbortController,r={id:e.id,swarmId:this.config.swarm.id,agent:e,status:"running",sessionAbort:s,output:[],cliSessionIds:[],startedAt:new Date().toISOString()};this.instances.set(e.id,r);let n=this.buildAgentPrompt(e,t);try{let o=e.autoApprove||this.config.swarm.autoApprove,i=Gs({prompt:n,options:{model:"claude-sonnet-4-6",pathToClaudeCodeExecutable:this.config.claudeBinaryPath||"claude",cwd:e.worktreePath||this.config.swarm.directory,permissionMode:o?"bypassPermissions":"default",allowDangerouslySkipPermissions:o||void 0,abortController:s,env:this.config.env}}),c="";for await(let d of i){if(s.signal.aborted)break;if(this.handleSDKMessage(r,d),d.type==="result"){let l=d;l.subtype==="success"&&l.result&&(c=l.result)}}r.status="completed",r.result=c||r.output.join(`
65
+ `),r.completedAt=new Date().toISOString();try{this.autoCapture(r.result,e.id,e.name,this.config.swarm.id)}catch{}return this.config.onAgentCompleted?.({swarmId:this.config.swarm.id,agentId:e.id,agentName:e.name,result:r.result}),r.result}catch(o){let i=o instanceof Error?o.message:String(o);r.status="error",r.error=i,r.completedAt=new Date().toISOString(),await this.escalate(e,"critical",`Agent error: ${i}`,"Agent execution failed"),this.config.onAgentCompleted?.({swarmId:this.config.swarm.id,agentId:e.id,agentName:e.name,error:i});return}}handleSDKMessage(e,t){let s=e.agent;switch(t.type){case"assistant":{let r=this.extractAssistantText(t);if(r&&(e.output.push(r),this.config.onAgentOutput?.({swarmId:this.config.swarm.id,agentId:s.id,agentName:s.name,type:"text",content:r}),r.length>50))try{this.autoCapture(r,s.id,s.name,this.config.swarm.id)}catch{}break}case"result":{let r=t;r.is_error&&r.errors&&this.config.onAgentOutput?.({swarmId:this.config.swarm.id,agentId:s.id,agentName:s.name,type:"error",content:r.errors.join(`
66
+ `)});break}}}extractAssistantText(e){if(e.type!=="assistant")return"";let t=e.message;return!t?.content||!Array.isArray(t.content)?"":t.content.filter(s=>s.type==="text"&&typeof s.text=="string").map(s=>s.text).join("")}buildAgentPrompt(e,t){let s=this.config.swarm,r=[];if(r.push(`# Agent: ${e.name}`),r.push(`## Role: ${e.role}`),r.push(""),r.push("## Mission"),r.push(s.mission),r.push(""),e.systemPrompt&&(r.push("## Instructions"),r.push(e.systemPrompt),r.push("")),e.workScope&&e.workScope.length>0&&(r.push("## Work Scope"),r.push(...e.workScope.map(n=>`- ${n}`)),r.push("")),r.push("## Autonomy Rules"),r.push("- Execute tasks autonomously without asking questions"),r.push("- If uncertain, choose the safest option and document your decision"),r.push('- If you encounter an impossible blocker, include "===NEEDS_HUMAN===" in your output'),r.push("- When done, ensure all changes are saved and tests pass"),r.push(""),t&&(r.push("## Additional Context"),r.push(t),r.push("")),s.agents.length>1){r.push("## Other Agents in Swarm");for(let n of s.agents)n.id!==e.id&&r.push(`- ${n.name} (${n.role}): ${n.systemPrompt||"No specific prompt"}`);r.push("")}if(this.config.knowledgeManager&&s.id)try{let n=this.config.knowledgeManager.getAllForSwarm(s.id,10);if(n&&n.length>0){r.push("## Shared Knowledge Base"),r.push(`The following insights have been discovered by your teammates:
67
+ `);for(let o of n){let i=o.isVerified?" \u2713":"",c=`[${o.confidence}%${i}]`,d=o.agentName?` (by ${o.agentName})`:"",l=o.content.length>200?o.content.slice(0,200)+"...":o.content;r.push(`- **[${o.category}] ${o.title}** ${c}${d}: ${l}`)}r.push(`
68
+ You can document your own discoveries for teammates to benefit from.`),r.push("")}}catch{}return r.join(`
69
+ `)}async escalate(e,t,s,r,n){let o={id:js(),swarmId:this.config.swarm.id,agentId:e.id,agentName:e.name,level:t,reason:s,context:r,suggestedAction:n?.suggestedAction,status:"pending",timeout:n?.timeout,autoResolve:n?.autoResolve,createdAt:new Date().toISOString()};if(this.escalations.set(o.id,o),this.config.onEscalation?.({swarmId:this.config.swarm.id,escalation:o}),n?.autoResolve&&setTimeout(()=>{if(o.status==="pending"){o.status="auto-resolved",o.response=n.autoResolve.action,o.resolvedAt=new Date().toISOString();let i=this.escalationResolvers.get(o.id);i&&(i(n.autoResolve.action),this.escalationResolvers.delete(o.id))}},n.autoResolve.afterMs),n?.timeout&&!n?.autoResolve&&setTimeout(()=>{if(o.status==="pending"){o.status="expired",o.resolvedAt=new Date().toISOString();let i=this.escalationResolvers.get(o.id);i&&(i("ESCALATION_EXPIRED"),this.escalationResolvers.delete(o.id))}},n.timeout),!n?.timeout&&!n?.autoResolve&&setTimeout(()=>{if(this.escalationResolvers.has(o.id)){let i=this.escalationResolvers.get(o.id);i&&i("ESCALATION_FAILSAFE_TIMEOUT"),this.escalationResolvers.delete(o.id),o.status==="pending"&&(o.status="expired",o.resolvedAt=new Date().toISOString())}},36e5),n?.waitForResponse)return new Promise(i=>{this.escalationResolvers.set(o.id,i)})}autoCapture(e,t,s,r){if(!this.config.knowledgeManager||!e)return;let n=this.autoCaptureCount.get(t)??0;if(n>=10)return;let o=[{regex:/(?:found|discovered|located|identified)\s+(?:file|module|class|function|component)\s+[`"']?([^\s`"'\n,]+)/gi,category:"file_path",titlePrefix:"Found"},{regex:/(?:error|bug|issue|exception|failure)[:\s]+(.{10,100})/gi,category:"error",titlePrefix:"Error"},{regex:/(?:fixed|resolved|solved|patched|corrected)[:\s]+(.{10,100})/gi,category:"solution",titlePrefix:"Fixed"},{regex:/(?:pattern|convention|standard|approach)[:\s]+(.{10,100})/gi,category:"pattern",titlePrefix:"Pattern"},{regex:/(?:installed|added|configured|setup)\s+(?:package|dependency|module)\s+[`"']?([^\s`"'\n,]+)/gi,category:"config",titlePrefix:"Configured"},{regex:/(?:root cause|caused by|because of)[:\s]+(.{10,100})/gi,category:"note",titlePrefix:"Root cause"}],i=new Set,c=n;for(let{regex:d,category:l,titlePrefix:u}of o){d.lastIndex=0;let p;for(;(p=d.exec(e))!==null&&!(c>=10);){let m=p[1]?.trim()||p[0].trim();if(!(m.length<5||i.has(m))){i.add(m);try{this.config.knowledgeManager.addEntry({swarmId:r,agentId:t,category:l,title:`${u}: ${m.slice(0,80)}`,content:p[0].trim(),confidence:35,metadata:{source:"auto-capture",agentName:s},tags:["auto-captured"]}),c++}catch{}}}if(c>=10)break}this.autoCaptureCount.set(t,c)}getAgentName(e){return this.instances.get(e)?.agent.name??e}orderByConnections(e,t){let s=new Map(e.map(c=>[c.id,c])),r=new Map,n=new Map;for(let c of e)r.set(c.id,0),n.set(c.id,[]);for(let c of t){let d=r.get(c.to)??0;r.set(c.to,d+1);let l=n.get(c.from)??[];l.push(c.to),n.set(c.from,l)}let o=[];for(let[c,d]of r)d===0&&o.push(c);let i=[];for(;o.length>0;){let c=o.shift(),d=s.get(c);d&&i.push(d);for(let l of n.get(c)??[]){let u=(r.get(l)??1)-1;r.set(l,u),u===0&&o.push(l)}}for(let c of e)i.find(d=>d.id===c.id)||i.push(c);return i}detectLoopCompletion(e){let t=e.toLowerCase();return t.includes("loop complete")||t.includes("iteration done")||t.includes("no more iterations needed")||t.includes("===loop_complete===")}hasCycles(e){let t=new Map;for(let o of e)if(o.type==="pipe"||o.type==="trigger"){let i=t.get(o.from)??[];i.push(o.to),t.set(o.from,i)}let s=new Set,r=new Set,n=o=>{if(r.has(o))return!0;if(s.has(o))return!1;s.add(o),r.add(o);for(let i of t.get(o)??[])if(n(i))return!0;return r.delete(o),!1};for(let o of t.keys())if(n(o))return!0;return!1}};var Te=class{running=!1;coordinatorId=null;swarmId=null;swarmManager=null;terminalManager=null;taskManager=null;broadcast=null;agents=new Map;terminalToAgent=new Map;coordinatorTerminalIds=[];outputBuffers=new Map;flushTimer=null;start(e,t,s,r,n,o){this.coordinatorId=e,this.swarmId=t,this.swarmManager=s,this.terminalManager=r,this.broadcast=n,this.taskManager=o??null,this.running=!0,this.refreshAgentRegistry(),this.flushTimer=setInterval(()=>this.flushAllBuffers(),3e3)}stop(){this.running=!1,this.coordinatorId=null,this.swarmId=null,this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.agents.clear(),this.terminalToAgent.clear(),this.coordinatorTerminalIds=[],this.outputBuffers.clear()}get isRunning(){return this.running}get activeCoordinatorId(){return this.coordinatorId}onTerminalOutput(e,t){if(!this.running)return;if(this.coordinatorTerminalIds.includes(e)){this.parseCoordinatorOutput(t);return}let s=this.terminalToAgent.get(e);!s||!this.agents.get(s)||(this.bufferAgentOutput(s,t),this.detectAgentStatus(s,t))}refreshAgentRegistry(){if(!this.swarmManager||!this.swarmId)return;let e=this.swarmManager.get(this.swarmId);if(e){this.agents.clear(),this.terminalToAgent.clear(),this.coordinatorTerminalIds=[];for(let t of e.agents){this.agents.set(t.id,{id:t.id,name:t.name,role:t.role,terminalIds:[...t.terminalIds]});for(let s of t.terminalIds)t.id===this.coordinatorId?this.coordinatorTerminalIds.push(s):this.terminalToAgent.set(s,t.id)}}}registerAgentTerminal(e,t,s){let r=this.agents.get(e)??{id:e,name:s.name,role:s.role,terminalIds:[]};r.terminalIds.push(t),this.agents.set(e,r),e===this.coordinatorId?this.coordinatorTerminalIds.push(t):this.terminalToAgent.set(t,e)}MAX_BUFFER_SIZE=5e3;bufferAgentOutput(e,t){let r=(this.outputBuffers.get(e)??"")+t,n=r.length>this.MAX_BUFFER_SIZE?r.slice(r.length-this.MAX_BUFFER_SIZE):r;this.outputBuffers.set(e,n),(t.includes(`
70
+ `)||t.includes("\r"))&&this.flushBuffer(e)}flushBuffer(e){let t=this.outputBuffers.get(e);if(!t||t.trim().length===0){this.outputBuffers.delete(e);return}let s=this.agents.get(e);if(!s){this.outputBuffers.delete(e);return}let r=this.truncateOutput(t.trim()),n=`[${s.name} (${s.role})]: ${r}`;this.writeToCoordinator(n),this.outputBuffers.delete(e)}flushAllBuffers(){for(let e of this.outputBuffers.keys())this.flushBuffer(e)}truncateOutput(e,t=500){return e.length<=t?e:e.slice(0,t)+"..."}writeToCoordinator(e){if(!(!this.terminalManager||this.coordinatorTerminalIds.length===0))for(let t of this.coordinatorTerminalIds)this.terminalManager.write(t,e+"\r")}coordinatorOutputBuffer="";parseCoordinatorOutput(e){this.coordinatorOutputBuffer+=e;let t=this.coordinatorOutputBuffer.split(/\r?\n/);this.coordinatorOutputBuffer=t.pop()??"";for(let s of t){let r=s.trim();if(!r)continue;this.detectSwarmCompletion(r);let n=r.match(/^\/send\s+@(\S+)\s+(.+)$/);if(n){this.handleSendCommand(n[1],n[2]);continue}let o=r.match(/^\/task\s+create\s+"([^"]+)"\s+@(\S+)$/);if(o){this.handleTaskCreate(o[1],o[2]);continue}let i=r.match(/^\/task\s+done\s+(\S+)$/);if(i){this.handleTaskMove(i[1],"done");continue}let c=r.match(/^\/task\s+block\s+(\S+)$/);if(c){this.handleTaskMove(c[1],"blocked");continue}let d=r.match(/^\/escalate\s+(.+)$/);if(d){this.handleEscalate(d[1]);continue}}}handleSendCommand(e,t){let s=this.findAgentByName(e);if(s&&this.terminalManager)for(let r of s.terminalIds)this.terminalManager.write(r,t+"\r")}handleTaskCreate(e,t){if(!this.taskManager||!this.swarmId||!this.swarmManager)return;let s=this.findAgentByName(t),r=this.swarmManager.get(this.swarmId);r&&this.taskManager.create({swarmId:this.swarmId,workspaceId:r.workspaceId,title:e,description:"",assignedAgentId:s?.id})}handleTaskMove(e,t){if(this.taskManager)try{this.taskManager.move(e,t)}catch{}}handleEscalate(e){if(!this.broadcast||!this.swarmId||!this.coordinatorId)return;let t=this.agents.get(this.coordinatorId);this.broadcast(`swarm.escalation.${this.swarmId}`,{swarmId:this.swarmId,agentId:this.coordinatorId,agentName:t?.name??"Coordinator",message:e,requiresResponse:!0})}detectAgentStatus(e,t){if(!this.broadcast||!this.swarmId)return;let s=t.toLowerCase(),r=null;s.includes("task completed")||s.includes("task done")||s.includes("finished")||s.includes("all tests passing")||s.includes("done")?r="done":s.includes("error:")||s.includes("fatal:")||s.includes("exception")?r="error":(s.includes("waiting for")||s.includes("blocked by"))&&(r="waiting"),r&&this.broadcast(`swarm.agent.status.${this.swarmId}`,{swarmId:this.swarmId,agentId:e,status:r}),r==="done"&&this.handleAgentTaskCompletion(e)}handleAgentTaskCompletion(e){if(!this.taskManager||!this.swarmId)return;let s=this.taskManager.list({swarmId:this.swarmId}).find(n=>n.assignedAgentId===e&&n.status==="running");if(!s)return;try{this.taskManager.move(s.id,"done")}catch{return}let r=this.findReviewerAgent();if(r){let o=this.agents.get(e)?.name??e;this.writeToCoordinator(`[SYSTEM]: Task "${s.title}" (${s.id}) assigned to ${o} has been marked as done. Reviewer agent "${r.name}" is available \u2014 consider using /send @${r.name} to assign a review.`)}}findReviewerAgent(){for(let e of this.agents.values())if(e.id!==this.coordinatorId&&e.role==="reviewer")return e}detectSwarmCompletion(e){if(!this.swarmId||!this.swarmManager)return;let t=e.toLowerCase();(t.includes("mission complete")||t.includes("all tasks done")||t.includes("swarm complete")||t.includes("mission accomplished")||t.includes("all agents done"))&&this.swarmManager.stop(this.swarmId)}findAgentByName(e){let t=e.toLowerCase();for(let s of this.agents.values())if(s.name.toLowerCase()===t)return s}};import{randomUUID as Vs}from"node:crypto";var Se=class{db;broadcast;constructor(e,t){this.db=e,this.broadcast=t}addMessage(e){let t=Vs(),s=new Date().toISOString(),r={...e,id:t,timestamp:s};return this.db.prepare(`INSERT INTO swarm_console (id, swarmId, agentId, agentName, agentRole, message, source, timestamp)
71
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(r.id,r.swarmId,r.agentId??null,r.agentName??null,r.agentRole??null,r.message,r.source,r.timestamp),this.broadcast(`swarm.console.${e.swarmId}`,{swarmId:e.swarmId,message:r}),r}getMessages(e,t=200){return this.db.prepare(`SELECT id, swarmId, agentId, agentName, agentRole, message, source, timestamp
72
+ FROM swarm_console WHERE swarmId = ? ORDER BY timestamp DESC LIMIT ?`).all(e,t).reverse().map(r=>({id:r.id,swarmId:r.swarmId,agentId:r.agentId??void 0,agentName:r.agentName??void 0,agentRole:r.agentRole??void 0,message:r.message,source:r.source,timestamp:r.timestamp}))}};import{execSync as M}from"node:child_process";import{existsSync as Ys}from"node:fs";import{join as ot}from"node:path";var ye=class{isGitRepo(e){try{return M("git rev-parse --is-inside-work-tree",{cwd:e,stdio:"pipe"}),!0}catch{return!1}}createForAgent(e,t,s){let r=s.toLowerCase().replace(/\s+/g,"-"),o=`swarm/${t.slice(0,8)}/${r}`,i=ot(e,".swarm","worktrees",r);try{M(`git branch "${o}" HEAD`,{cwd:e,stdio:"pipe"})}catch{}return M(`git worktree add -B "${o}" "${i}" HEAD`,{cwd:e,stdio:"pipe"}),{path:i,branch:o}}remove(e,t){try{M(`git worktree remove --force "${t}"`,{cwd:e,stdio:"pipe"})}catch{}}removeAllForSwarm(e,t){let s=t.slice(0,8),r=ot(e,".swarm","worktrees");if(Ys(r))try{let n=M("git worktree list --porcelain",{cwd:e,stdio:"pipe"}).toString(),o=[],i={};for(let c of n.split(`
73
+ `))c.startsWith("worktree ")?i={worktree:c.slice(9).trim()}:c.startsWith("branch ")&&(i.branch=c.slice(7).trim(),i.worktree&&i.branch&&o.push({worktree:i.worktree,branch:i.branch}));for(let c of o)c.branch.includes(`swarm/${s}/`)&&this.remove(e,c.worktree)}catch{}}createForArea(e,t,s,r){let n=s.toLowerCase().replace(/\s+/g,"-"),o=t.slice(0,8),i=r||`area/${o}/${n}`,c=ot(e,".areas","worktrees",n);try{M(`git branch "${i}" HEAD`,{cwd:e,stdio:"pipe"})}catch{}return M(`git worktree add -B "${i}" "${c}" HEAD`,{cwd:e,stdio:"pipe"}),{path:c,branch:i}}removeForArea(e,t){try{M(`git worktree remove --force "${t}"`,{cwd:e,stdio:"pipe"})}catch{}}initGitRepo(e){if(this.isGitRepo(e))return!1;try{return M("git init",{cwd:e,stdio:"pipe"}),!0}catch{return!1}}list(e){try{let t=M("git worktree list --porcelain",{cwd:e,stdio:"pipe"}).toString(),s=[],r={};for(let n of t.split(`
74
+ `))n.startsWith("worktree ")?r={path:n.slice(9).trim()}:n.startsWith("HEAD ")?r.head=n.slice(5).trim():n.startsWith("branch ")?r.branch=n.slice(7).trim():n===""&&r.path&&(s.push({path:r.path,branch:r.branch??"",head:r.head??""}),r={});return s}catch{return[]}}};import{randomUUID as zs}from"node:crypto";var ve=class{db;broadcast;constructor(e,t){this.db=e,this.broadcast=t}addEntry(e){let t=zs(),s=new Date().toISOString(),r=null;if(e.agentId&&(r=this.db.prepare("SELECT name FROM swarm_agents WHERE id = ?").get(e.agentId)?.name??null),this.db.prepare(`INSERT INTO swarm_knowledge_entries (id, swarmId, agentId, agentName, category, title, content, metadata, createdAt, updatedAt, confidence, relatedEntryIds, isVerified)
75
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, '[]', 0)`).run(t,e.swarmId,e.agentId??null,r,e.category,e.title,e.content,JSON.stringify(e.metadata??{}),s,s,e.confidence??50),e.tags&&e.tags.length>0){let o=this.db.prepare("INSERT INTO swarm_knowledge_tags (entryId, tag) VALUES (?, ?)");for(let i of e.tags)o.run(t,i)}let n=this.getEntry(t);return this.broadcast("knowledge.entry.added",{swarmId:e.swarmId,entry:n}),n}updateEntry(e){let t=this.getEntry(e.entryId);if(!t)return null;let s=new Date().toISOString(),r=["updatedAt = ?"],n=[s];if(e.title!==void 0&&(r.push("title = ?"),n.push(e.title)),e.content!==void 0&&(r.push("content = ?"),n.push(e.content)),e.metadata!==void 0&&(r.push("metadata = ?"),n.push(JSON.stringify(e.metadata))),e.confidence!==void 0&&(r.push("confidence = ?"),n.push(String(e.confidence))),e.isVerified!==void 0&&(r.push("isVerified = ?"),n.push(e.isVerified?"1":"0")),n.push(e.entryId),this.db.prepare(`UPDATE swarm_knowledge_entries SET ${r.join(", ")} WHERE id = ?`).run(...n),e.tags!==void 0&&(this.db.prepare("DELETE FROM swarm_knowledge_tags WHERE entryId = ?").run(e.entryId),e.tags.length>0)){let i=this.db.prepare("INSERT INTO swarm_knowledge_tags (entryId, tag) VALUES (?, ?)");for(let c of e.tags)i.run(e.entryId,c)}let o=this.getEntry(e.entryId);return this.broadcast("knowledge.entry.updated",{swarmId:t.swarmId,entry:o}),o}deleteEntry(e){let t=this.getEntry(e);return t&&this.db.prepare("DELETE FROM swarm_knowledge_entries WHERE id = ?").run(e).changes>0?(this.broadcast("knowledge.entry.deleted",{swarmId:t.swarmId,entryId:e}),!0):!1}verifyEntry(e,t){let s=this.getEntry(e);if(!s)return null;let r=new Date().toISOString();this.db.prepare("UPDATE swarm_knowledge_entries SET isVerified = ?, updatedAt = ? WHERE id = ?").run(t?1:0,r,e);let n=this.getEntry(e);return this.broadcast("knowledge.entry.updated",{swarmId:s.swarmId,entry:n}),n}search(e){let t=[],s=[];if(e.acrossSwarms?e.workspaceId&&(t.push("e.swarmId IN (SELECT id FROM swarms WHERE workspaceId = ?)"),s.push(e.workspaceId)):e.swarmId&&(t.push("e.swarmId = ?"),s.push(e.swarmId)),e.query){t.push("(e.title LIKE ? OR e.content LIKE ?)");let l=`%${e.query}%`;s.push(l,l)}e.category&&(t.push("e.category = ?"),s.push(e.category)),e.agentId&&(t.push("e.agentId = ?"),s.push(e.agentId)),e.minConfidence!==void 0&&(t.push("e.confidence >= ?"),s.push(String(e.minConfidence))),e.onlyVerified&&t.push("e.isVerified = 1");let r="";e.tags&&e.tags.length>0&&(r=`INNER JOIN swarm_knowledge_tags t ON t.entryId = e.id AND t.tag IN (${e.tags.map(()=>"?").join(", ")})`,s.push(...e.tags));let n=t.length>0?`WHERE ${t.join(" AND ")}`:"",o=e.limit??20,i=this.db.prepare(`SELECT COUNT(DISTINCT e.id) as total FROM swarm_knowledge_entries e ${r} ${n}`).get(...s);return{entries:this.db.prepare(`SELECT DISTINCT e.* FROM swarm_knowledge_entries e ${r} ${n} ORDER BY e.isVerified DESC, e.confidence DESC, e.createdAt DESC LIMIT ?`).all(...s,o).map(l=>this.rowToEntry(l)),total:i.total}}getAllForSwarm(e,t=20){return this.db.prepare("SELECT * FROM swarm_knowledge_entries WHERE swarmId = ? ORDER BY isVerified DESC, confidence DESC, createdAt DESC LIMIT ?").all(e,t).map(r=>this.rowToEntry(r))}getEntry(e){let t=this.db.prepare("SELECT * FROM swarm_knowledge_entries WHERE id = ?").get(e);return t?this.rowToEntry(t):null}rowToEntry(e){let t=this.getTagsForEntry(e.id);return{id:e.id,swarmId:e.swarmId,agentId:e.agentId??void 0,agentName:e.agentName??void 0,category:e.category,title:e.title,content:e.content,metadata:JSON.parse(e.metadata),createdAt:e.createdAt,updatedAt:e.updatedAt,confidence:e.confidence,relatedEntryIds:JSON.parse(e.relatedEntryIds),isVerified:e.isVerified===1,tags:t.length>0?t:void 0}}getTagsForEntry(e){return this.db.prepare("SELECT tag FROM swarm_knowledge_tags WHERE entryId = ?").all(e).map(s=>s.tag)}};import{randomUUID as Js}from"node:crypto";var ke=class{constructor(e,t){this.db=e;this.broadcast=t}post(e){let t=Js(),s=new Date().toISOString(),r=this.db.prepare("SELECT name, role FROM swarm_agents WHERE id = ?").get(e.agentId),n=r?.name??"Unknown",o=r?.role??"worker",i=JSON.stringify(e.tags??[]),c=JSON.stringify(e.attachments??[]),d=e.priority??"normal";this.db.prepare(`INSERT INTO swarm_mailbox (id, swarmId, agentId, agentName, agentRole, type, title, content, priority, tags, parentMessageId, attachments, timestamp, readBy, createdAt)
76
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, '[]', ?)`).run(t,e.swarmId,e.agentId,n,o,e.type,e.title,e.content,d,i,e.parentMessageId??null,c,s,s);let l={id:t,swarmId:e.swarmId,agentId:e.agentId,agentName:n,agentRole:o,type:e.type,title:e.title,content:e.content,priority:d,tags:e.tags??[],parentMessageId:e.parentMessageId,attachments:e.attachments??[],timestamp:s,readBy:[]};return this.broadcast("mailbox.new-message",{swarmId:e.swarmId,message:l}),l}list(e){let t=["swarmId = ?"],s=[e.swarmId];if(e.type&&(t.push("type = ?"),s.push(e.type)),e.priority&&(t.push("priority = ?"),s.push(e.priority)),e.tags&&e.tags.length>0)for(let u of e.tags){let p=u.replace(/%/g,"\\%").replace(/_/g,"\\_");t.push("tags LIKE ? ESCAPE '\\'"),s.push(`%"${p}"%`)}e.fromAgentId&&(t.push("agentId = ?"),s.push(e.fromAgentId)),e.since&&(t.push("timestamp >= ?"),s.push(e.since));let r=t.join(" AND "),o=this.db.prepare(`SELECT COUNT(*) as total FROM swarm_mailbox WHERE ${r}`).get(...s).total,i=e.limit??50,c=e.offset??0,l=this.db.prepare(`SELECT * FROM swarm_mailbox WHERE ${r} ORDER BY timestamp DESC LIMIT ? OFFSET ?`).all(...s,i,c).map(u=>this.rowToMessage(u));return{messages:l,total:o,hasMore:c+l.length<o}}markRead(e,t){let s=this.db.prepare("SELECT readBy FROM swarm_mailbox WHERE id = ?").get(e);if(!s)return;let r=JSON.parse(s.readBy);r.includes(t)||(r.push(t),this.db.prepare("UPDATE swarm_mailbox SET readBy = ? WHERE id = ?").run(JSON.stringify(r),e))}getThread(e){return this.db.prepare("SELECT * FROM swarm_mailbox WHERE parentMessageId = ? ORDER BY timestamp ASC").all(e).map(s=>this.rowToMessage(s))}rowToMessage(e){return{id:e.id,swarmId:e.swarmId,agentId:e.agentId,agentName:e.agentName,agentRole:e.agentRole,type:e.type,title:e.title,content:e.content,priority:e.priority,tags:JSON.parse(e.tags),parentMessageId:e.parentMessageId??void 0,attachments:JSON.parse(e.attachments),timestamp:e.timestamp,readBy:JSON.parse(e.readBy)}}};var be=class{db;terminalManager;broadcast;agentSession;worktreeManager;coordinatorLoops=new Map;agentTerminals=new Map;orchestrators=new Map;topologies=new Map;consoleManager;knowledgeManager;mailboxManager;taskManager=null;settingsManager=null;providerRegistry;constructor(e,t,s,r){this.db=e,this.terminalManager=t,this.broadcast=s,this.providerRegistry=r,this.consoleManager=new Se(e,s),this.knowledgeManager=new ve(e,s),this.mailboxManager=new ke(e,s),this.agentSession=new fe(r),this.worktreeManager=new ye}setTaskManager(e){this.taskManager=e}setSettingsManager(e){this.settingsManager=e}getKnowledgeManager(){return this.knowledgeManager}getMailboxManager(){return this.mailboxManager}getTaskManager(){return this.taskManager}onTerminalOutput(e,t){for(let[s,r]of this.coordinatorLoops)r.isRunning&&r.onTerminalOutput(e,t)}create(e){let t=it(),s=new Date().toISOString(),r=e.knowledge.map(o=>({...o,id:it()}));this.db.prepare(`INSERT INTO swarms (id, workspaceId, name, mission, directory, knowledge, status, presetSize, cliForAll, autoApprove, useWorktrees, createdAt)
77
+ VALUES (?, ?, ?, ?, ?, ?, 'draft', ?, ?, ?, ?, ?)`).run(t,e.workspaceId,e.name,e.mission,e.directory,JSON.stringify(r),e.presetSize??null,e.cliForAll??null,e.autoApprove?1:0,e.useWorktrees?1:0,s);for(let o of r)this.db.prepare("INSERT INTO swarm_knowledge (id, swarmId, name, path, type) VALUES (?, ?, ?, ?, ?)").run(o.id,t,o.name,o.path,o.type);let n=e.agents.map((o,i)=>this.insertAgent(t,o,i,s));return this.consoleManager.addMessage({swarmId:t,message:`Swarm "${e.name}" created with ${n.length} agents`,source:"system"}),this.buildSwarm(t)}insertAgent(e,t,s,r){let n=it();return this.db.prepare(`INSERT INTO swarm_agents (id, swarmId, "index", name, role, cli, status, autoApprove, systemPrompt, skills, mcps, workScope, createdAt)
78
+ VALUES (?, ?, ?, ?, ?, ?, 'idle', ?, ?, ?, ?, ?, ?)`).run(n,e,s,t.name,t.role,t.cli,t.autoApprove?1:0,t.systemPrompt??null,JSON.stringify(t.skills??[]),JSON.stringify(t.mcps??[]),t.workScope?JSON.stringify(t.workScope):null,r),this.rowToAgent({id:n,swarmId:e,index:s,name:t.name,role:t.role,cli:t.cli,status:"idle",autoApprove:t.autoApprove?1:0,systemPrompt:t.systemPrompt??null,skills:JSON.stringify(t.skills??[]),mcps:JSON.stringify(t.mcps??[]),workScope:t.workScope?JSON.stringify(t.workScope):null,worktreeBranch:null,worktreePath:null,createdAt:r})}async launch(e){let t=this.buildSwarm(e);if(!t)throw new Error(`Swarm ${e} not found`);let s=new Date().toISOString();this.db.prepare("UPDATE swarms SET status = 'active', launchedAt = ? WHERE id = ?").run(s,e);let r=O(t.directory,".swarm");K(O(r,"agents"),{recursive:!0}),K(O(r,"registry"),{recursive:!0}),K(O(r,"progress"),{recursive:!0});let n=this.settingsManager?.getEnvVarsForWorkspace(t.workspaceId)??{};for(let c of t.agents){this.db.prepare("UPDATE swarm_agents SET status = 'booting' WHERE id = ?").run(c.id);let d=this.buildSwarm(e),l=await this.agentSession.boot(c,d,this.terminalManager,Object.keys(n).length>0?n:void 0,this.worktreeManager),{terminalId:u,worktreePath:p,worktreeBranch:m}=l,f=this.agentTerminals.get(c.id)??[];f.push(u),this.agentTerminals.set(c.id,f),this.db.prepare("UPDATE swarm_agents SET status = 'running', worktreePath = ?, worktreeBranch = ? WHERE id = ?").run(p??null,m??null,c.id),this.consoleManager.addMessage({swarmId:e,agentId:c.id,agentName:c.name,agentRole:c.role,message:`Agent "${c.name}" (${c.role}) started on terminal ${u}`,source:"system"});let w=this.coordinatorLoops.get(e);if(w?.isRunning&&w.registerAgentTerminal(c.id,u,c),c.role==="coordinator"){let g=new Te;g.start(c.id,e,this,this.terminalManager,this.broadcast,this.taskManager??void 0),this.coordinatorLoops.set(e,g);for(let h of t.agents){let E=this.agentTerminals.get(h.id)??[];for(let T of E)g.registerAgentTerminal(h.id,T,h)}}}let o=this.buildSwarm(e),i={swarmId:e,status:o.status,launchedAt:o.launchedAt,agents:o.agents.map(c=>({id:c.id,name:c.name,role:c.role,status:c.status}))};if(Zs(O(r,"progress","status.json"),JSON.stringify(i,null,2)),this.taskManager){let c=this.taskManager.list({swarmId:e}),d=o.agents.filter(u=>u.role!=="coordinator"),l=0;for(let u of c)if(u.status==="todo"&&!u.assignedAgentId&&d.length>0){let p=d[l%d.length];this.taskManager.assign(u.id,p.id),l++}}this.broadcast(`swarm.status.${e}`,{swarmId:e,status:"active"})}stop(e){let t=this.buildSwarm(e);if(!t)throw new Error(`Swarm ${e} not found`);let s=this.orchestrators.get(e);s&&(s.stop(),this.orchestrators.delete(e));let r=this.coordinatorLoops.get(e);r&&(r.stop(),this.coordinatorLoops.delete(e));for(let o of t.agents){let i=this.agentTerminals.get(o.id)??[];for(let c of i)this.terminalManager.close(c);this.agentTerminals.delete(o.id),this.db.prepare("UPDATE swarm_agents SET status = 'idle' WHERE id = ?").run(o.id)}if(t.useWorktrees&&t.directory)try{this.worktreeManager.removeAllForSwarm(t.directory,e)}catch(o){console.warn(`[WorktreeManager] Cleanup failed for swarm ${e}:`,o)}let n=new Date().toISOString();this.db.prepare("UPDATE swarms SET status = 'completed', stoppedAt = ? WHERE id = ?").run(n,e),this.consoleManager.addMessage({swarmId:e,message:"Swarm stopped",source:"system"}),this.broadcast(`swarm.status.${e}`,{swarmId:e,status:"completed"})}pause(e){this.db.prepare("UPDATE swarms SET status = 'paused' WHERE id = ?").run(e),this.broadcast(`swarm.status.${e}`,{swarmId:e,status:"paused"})}resume(e){this.db.prepare("UPDATE swarms SET status = 'active' WHERE id = ?").run(e),this.broadcast(`swarm.status.${e}`,{swarmId:e,status:"active"})}list(e){return this.db.prepare("SELECT id FROM swarms WHERE workspaceId = ? ORDER BY createdAt DESC").all(e).map(s=>this.buildSwarm(s.id))}get(e){return this.db.prepare("SELECT id FROM swarms WHERE id = ?").get(e)?this.buildSwarm(e):null}delete(e){let t=this.get(e);return t&&t.status==="active"&&this.stop(e),this.db.prepare("DELETE FROM swarms WHERE id = ?").run(e).changes>0}message(e,t,s){if(t){let r=this.agentTerminals.get(t)??[];for(let n of r)this.terminalManager.write(n,s+"\r")}else{let r=this.buildSwarm(e);for(let n of r.agents){let o=this.agentTerminals.get(n.id)??[];for(let i of o)this.terminalManager.write(i,s+"\r")}}this.consoleManager.addMessage({swarmId:e,agentId:t,message:s,source:"user"})}addAgent(e){let t=new Date().toISOString(),r=(this.db.prepare('SELECT MAX("index") as maxIdx FROM swarm_agents WHERE swarmId = ?').get(e.swarmId)?.maxIdx??-1)+1;return this.insertAgent(e.swarmId,e.agent,r,t)}removeAgent(e){let t=this.agentTerminals.get(e.agentId)??[];for(let r of t)this.terminalManager.close(r);return this.agentTerminals.delete(e.agentId),this.db.prepare("DELETE FROM swarm_agents WHERE id = ? AND swarmId = ?").run(e.agentId,e.swarmId).changes>0}updateAgent(e){let{updates:t}=e,s=[],r=[];if(t.name!==void 0&&(s.push("name = ?"),r.push(t.name)),t.role!==void 0&&(s.push("role = ?"),r.push(t.role)),t.cli!==void 0&&(s.push("cli = ?"),r.push(t.cli)),t.autoApprove!==void 0&&(s.push("autoApprove = ?"),r.push(t.autoApprove?1:0)),t.systemPrompt!==void 0&&(s.push("systemPrompt = ?"),r.push(t.systemPrompt)),t.skills!==void 0&&(s.push("skills = ?"),r.push(JSON.stringify(t.skills))),t.mcps!==void 0&&(s.push("mcps = ?"),r.push(JSON.stringify(t.mcps))),t.workScope!==void 0&&(s.push("workScope = ?"),r.push(JSON.stringify(t.workScope))),s.length===0)return null;r.push(e.agentId,e.swarmId),this.db.prepare(`UPDATE swarm_agents SET ${s.join(", ")} WHERE id = ? AND swarmId = ?`).run(...r);let n=this.db.prepare("SELECT * FROM swarm_agents WHERE id = ?").get(e.agentId);return n?this.rowToAgent(n):null}getStats(e){let t=this.getAgents(e),s=t.filter(c=>c.status==="running"||c.status==="booting").length,r=t.filter(c=>c.status==="done").length,n=t.filter(c=>c.status==="error").length,o=this.db.prepare("SELECT launchedAt FROM swarms WHERE id = ?").get(e),i=0;return o?.launchedAt&&(i=Date.now()-new Date(o.launchedAt).getTime()),{activeAgents:s,completedTasks:r,errors:n,escalations:0,reviewsPending:0,elapsedTime:i}}setTopology(e,t){this.topologies.set(e,t),this.db.prepare("UPDATE swarms SET knowledge = json_set(knowledge, '$.topology', ?) WHERE id = ?").run(JSON.stringify(t),e)}launchOrchestrated(e){let t=this.buildSwarm(e);if(!t)throw new Error(`Swarm ${e} not found`);let s=new Date().toISOString();this.db.prepare("UPDATE swarms SET status = 'active', launchedAt = ? WHERE id = ?").run(s,e);let r=O(t.directory,".swarm");K(O(r,"agents"),{recursive:!0}),K(O(r,"registry"),{recursive:!0}),K(O(r,"progress"),{recursive:!0});let n=this.settingsManager?.getEnvVarsForWorkspace(t.workspaceId)??{},o=this.topologies.get(e)??t.topology,i=this.settingsManager?.get("providers.claude_binary_path")?.value??this.providerRegistry?.getClaudeBinaryPath()??"claude",c=new Ee({swarm:t,topology:o,claudeBinaryPath:i,env:Object.keys(n).length>0?n:void 0,onAgentOutput:d=>{this.broadcast(`orchestrator.agent.output.${e}`,d),this.consoleManager.addMessage({swarmId:e,agentId:d.agentId,agentName:d.agentName,message:`[${d.type}] ${d.content.slice(0,500)}`,source:"agent"})},onCLISpawned:d=>{this.broadcast(`orchestrator.cli.spawned.${e}`,d),this.consoleManager.addMessage({swarmId:e,agentId:d.agentId,message:`Spawned ${d.cli} CLI: ${d.prompt.slice(0,200)}`,source:"system"})},onCLICompleted:d=>{this.broadcast(`orchestrator.cli.completed.${e}`,d)},onEscalation:d=>{this.broadcast(`orchestrator.escalation.${e}`,d),this.broadcast(`swarm.escalation.${e}`,{swarmId:e,agentId:d.escalation.agentId,agentName:d.escalation.agentName,message:d.escalation.reason,requiresResponse:!0,escalation:d.escalation})},onAgentCompleted:d=>{this.broadcast(`swarm.agent.status.${e}`,{swarmId:e,agentId:d.agentId,status:d.error?"error":"done"}),this.db.prepare("UPDATE swarm_agents SET status = ? WHERE id = ?").run(d.error?"error":"done",d.agentId)},onSwarmCompleted:d=>{this.db.prepare("UPDATE swarms SET status = 'completed', stoppedAt = ? WHERE id = ?").run(new Date().toISOString(),e),this.broadcast(`swarm.status.${e}`,{swarmId:e,status:"completed"}),this.consoleManager.addMessage({swarmId:e,message:"Swarm orchestration completed",source:"system"}),this.orchestrators.delete(e)}});this.orchestrators.set(e,c);for(let d of t.agents)this.db.prepare("UPDATE swarm_agents SET status = 'running' WHERE id = ?").run(d.id);this.consoleManager.addMessage({swarmId:e,message:`Swarm "${t.name}" launched in orchestrated mode with ${t.agents.length} agents`,source:"system"}),this.broadcast(`swarm.status.${e}`,{swarmId:e,status:"active"}),c.start().catch(d=>{console.error(`[AgentOrchestrator] Swarm ${e} failed:`,d),this.db.prepare("UPDATE swarms SET status = 'error', stoppedAt = ? WHERE id = ?").run(new Date().toISOString(),e),this.broadcast(`swarm.status.${e}`,{swarmId:e,status:"error"})})}async spawnCLI(e,t,s){let r=this.orchestrators.get(e);if(!r)throw new Error(`No active orchestrator for swarm ${e}`);return{sessionId:await r.getCLIProvider().spawn(t,s)}}respondToEscalation(e,t){for(let s of this.orchestrators.values())s.respondToEscalation(e,t)}getOrchestrator(e){return this.orchestrators.get(e)}getAgents(e){return this.db.prepare('SELECT * FROM swarm_agents WHERE swarmId = ? ORDER BY "index" ASC').all(e).map(s=>this.rowToAgent(s))}buildSwarm(e){let t=this.db.prepare("SELECT * FROM swarms WHERE id = ?").get(e);if(!t)throw new Error(`Swarm ${e} not found`);let s=this.getAgents(e),r=this.getStats(e);return{id:t.id,workspaceId:t.workspaceId,name:t.name,mission:t.mission,directory:t.directory,knowledge:JSON.parse(t.knowledge),agents:s,status:t.status,presetSize:t.presetSize??void 0,cliForAll:t.cliForAll??void 0,autoApprove:t.autoApprove===1,useWorktrees:t.useWorktrees===1,stats:r,createdAt:t.createdAt,launchedAt:t.launchedAt??void 0,stoppedAt:t.stoppedAt??void 0}}rowToAgent(e){let t=this.agentTerminals.get(e.id)??[];return{id:e.id,swarmId:e.swarmId,index:e.index,name:e.name,role:e.role,cli:e.cli,status:e.status,autoApprove:e.autoApprove===1,terminalIds:t,systemPrompt:e.systemPrompt??void 0,skills:JSON.parse(e.skills),mcps:JSON.parse(e.mcps),workScope:e.workScope?JSON.parse(e.workScope):void 0,worktreeBranch:e.worktreeBranch??void 0,worktreePath:e.worktreePath??void 0,elapsedTime:0}}};import{randomUUID as Lt}from"node:crypto";import D from"node:fs";import _ from"node:path";import Nt from"node:os";var Ot={"frontend-design":{description:"Frontend design patterns and best practices"},shadcn:{description:"shadcn/ui component library integration"},"next-best-practices":{description:"Next.js best practices and patterns"},"systematic-debugging":{description:"Systematic debugging methodology"},"web-design-guidelines":{description:"Web design guidelines and principles"},"vercel-react-best-practices":{description:"Vercel + React best practices"},"supabase-postgres-best-practices":{description:"Supabase + Postgres best practices"},"expo-tailwind-setup":{description:"Expo + Tailwind CSS setup guide"},"nodejs-backend-patterns":{description:"Node.js backend architecture patterns"},"api-design-principles":{description:"API design principles and REST patterns"},"database-schema-design":{description:"Database schema design best practices"},"better-auth":{description:"Authentication best practices with Better Auth"},"skill-creator":{description:"Create custom skills for agents"},"building-native-ui":{description:"Building native UI components"},"expo-deployment":{description:"Expo deployment and distribution"}},Dt=[{id:"nextjs-convex-clerk",name:"Next.js + Convex + Clerk",description:"Full-stack Next.js with Convex backend and Clerk auth",skills:["next-best-practices","frontend-design","shadcn","better-auth"],mcps:[],stack:"nextjs"},{id:"react-native-expo",name:"React Native + Expo",description:"Mobile development with React Native and Expo",skills:["expo-tailwind-setup","expo-deployment","building-native-ui"],mcps:[],stack:"mobile"},{id:"fullstack-supabase",name:"Full Stack Supabase",description:"Full-stack app with Supabase backend and Postgres",skills:["supabase-postgres-best-practices","database-schema-design","api-design-principles","better-auth"],mcps:[],stack:"supabase"},{id:"vibe-coding",name:"Vibe Coding",description:"Generic vibe coding setup for rapid prototyping",skills:["frontend-design","web-design-guidelines","systematic-debugging","shadcn"],mcps:[],stack:"generic"},{id:"api-nodejs",name:"API + Node.js",description:"Backend API development with Node.js",skills:["nodejs-backend-patterns","api-design-principles","database-schema-design","systematic-debugging"],mcps:[],stack:"backend"}],Ie=class{projectSkillsDir(e){return _.join(e,".swarm","registry","skills")}projectMcpsDir(e){return _.join(e,".swarm","registry","mcps")}globalSkillsDir(){return _.join(Nt.homedir(),".swarm","registry","skills")}globalMcpsDir(){return _.join(Nt.homedir(),".swarm","registry","mcps")}readJsonFiles(e){return D.existsSync(e)?D.readdirSync(e).filter(s=>s.endsWith(".json")).map(s=>JSON.parse(D.readFileSync(_.join(e,s),"utf-8"))):[]}listSkills(e){let t=this.readJsonFiles(this.globalSkillsDir());return e?[...this.readJsonFiles(this.projectSkillsDir(e)),...t]:t}searchSkills(e){let t=e.toLowerCase();return Object.entries(Ot).filter(([s,r])=>s.includes(t)||r.description.toLowerCase().includes(t)).map(([s,r])=>({name:s,description:r.description,source:"skills.sh"}))}installSkill(e,t){let s=this.projectSkillsDir(t);D.mkdirSync(s,{recursive:!0});let r=Ot[e],n={id:Lt(),name:e,description:r?.description??`Custom skill: ${e}`,source:r?"skills.sh":"custom",installedAt:new Date().toISOString()};return D.writeFileSync(_.join(s,`${e}.json`),JSON.stringify(n,null,2)),n}removeSkill(e,t){let s=_.join(this.projectSkillsDir(t),`${e}.json`);return D.existsSync(s)?(D.unlinkSync(s),!0):!1}listBundles(){return Dt}installBundle(e,t){let s=Dt.find(r=>r.id===e);if(!s)throw new Error(`Bundle "${e}" not found`);for(let r of s.skills)this.installSkill(r,t)}listMcps(e){let t=this.readJsonFiles(this.globalMcpsDir());return e?[...this.readJsonFiles(this.projectMcpsDir(e)),...t]:t}configureMcp(e){let t=this.projectMcpsDir(e.projectDir);D.mkdirSync(t,{recursive:!0});let s={id:Lt(),name:e.name,command:e.command,args:e.args,env:e.env,enabled:!0};return D.writeFileSync(_.join(t,`${e.name}.json`),JSON.stringify(s,null,2)),s}};import{randomUUID as Pt}from"node:crypto";import{execSync as xt}from"node:child_process";var Re=class{db;broadcast;constructor(e,t){this.db=e,this.broadcast=t}create(e){let t=Pt(),s=new Date().toISOString();if(this.db.prepare(`INSERT INTO tasks (id, swarmId, workspaceId, title, description, assignedAgentId, useWorktree, status, approvalMode, createdAt, updatedAt)
79
+ VALUES (?, ?, ?, ?, ?, ?, ?, 'todo', ?, ?, ?)`).run(t,e.swarmId??null,e.workspaceId,e.title,e.description??"",e.assignedAgentId??null,e.useWorktree?1:0,e.approvalMode??"auto",s,s),e.attachments&&e.attachments.length>0){let n=this.db.prepare(`INSERT INTO task_attachments (id, taskId, type, data, width, height, label, createdAt)
80
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`);for(let o of e.attachments)n.run(Pt(),t,o.type,o.data,o.width,o.height,o.label??null,s)}if(e.dependencies&&e.dependencies.length>0){let n=this.db.prepare("INSERT INTO task_dependencies (taskId, dependsOnTaskId) VALUES (?, ?)");for(let o of e.dependencies)n.run(t,o)}let r=this.getById(t);return this.broadcast("task.created",{task:r}),r}update(e,t){let s=[],r=[];if(t.title!==void 0&&(s.push("title = ?"),r.push(t.title)),t.description!==void 0&&(s.push("description = ?"),r.push(t.description)),t.assignedAgentId!==void 0&&(s.push("assignedAgentId = ?"),r.push(t.assignedAgentId)),t.useWorktree!==void 0&&(s.push("useWorktree = ?"),r.push(t.useWorktree?1:0)),t.approvalMode!==void 0&&(s.push("approvalMode = ?"),r.push(t.approvalMode)),t.output!==void 0&&(s.push("output = ?"),r.push(t.output)),t.filesChanged!==void 0&&(s.push("filesChanged = ?"),r.push(JSON.stringify(t.filesChanged))),s.length===0)return this.getById(e);let n=new Date().toISOString();s.push("updatedAt = ?"),r.push(n),r.push(e),this.db.prepare(`UPDATE tasks SET ${s.join(", ")} WHERE id = ?`).run(...r);let o=this.getById(e);return this.broadcast("task.updated",{task:o}),o}get(e){return this.getById(e)}delete(e){return this.db.prepare("DELETE FROM tasks WHERE id = ?").run(e).changes>0}list(e){let t="SELECT * FROM tasks WHERE 1=1",s=[];return e.workspaceId&&(t+=" AND workspaceId = ?",s.push(e.workspaceId)),e.swarmId&&(t+=" AND swarmId = ?",s.push(e.swarmId)),t+=" ORDER BY createdAt ASC",this.db.prepare(t).all(...s).map(n=>this.rowToTask(n))}move(e,t){if(t==="running"&&!this.checkDependencies(e))throw new Error(`Task ${e} is blocked by unfinished dependencies`);let s=this.getById(e);if(!s)throw new Error(`Task ${e} not found`);let r=s.status,n=new Date().toISOString();if(t==="running"&&s.useWorktree&&s.swarmId){let i=this.getSwarmDirectory(s.swarmId);if(i){let c=`.swarm/worktrees/${s.id}`;try{xt(`git worktree add ${c} -b swarm/${s.id}`,{cwd:i,stdio:"pipe"}),this.db.prepare("UPDATE tasks SET worktreePath = ?, status = ?, updatedAt = ? WHERE id = ?").run(c,t,n,e);let d=this.getById(e);return this.broadcast("task.moved",{taskId:e,from:r,to:t}),d}catch{}}}if(t==="done"&&s.worktreePath&&s.swarmId){let i=this.getSwarmDirectory(s.swarmId);if(i)try{xt(`git worktree remove ${s.worktreePath}`,{cwd:i,stdio:"pipe"})}catch{}}this.db.prepare("UPDATE tasks SET status = ?, updatedAt = ? WHERE id = ?").run(t,n,e);let o=this.getById(e);return this.broadcast("task.moved",{taskId:e,from:r,to:t}),o}getSwarmDirectory(e){return this.db.prepare("SELECT directory FROM swarms WHERE id = ?").get(e)?.directory??null}updateTerminalId(e,t){let s=new Date().toISOString();this.db.prepare("UPDATE tasks SET terminalId = ?, updatedAt = ? WHERE id = ?").run(t,s,e)}assign(e,t){let s=new Date().toISOString();this.db.prepare("UPDATE tasks SET assignedAgentId = ?, updatedAt = ? WHERE id = ?").run(t,s,e);let r=this.getById(e);return this.broadcast("task.assigned",{taskId:e,agentId:t}),r}complete(e,t,s){let r=new Date().toISOString();this.db.prepare("UPDATE tasks SET status = 'done', output = ?, filesChanged = ?, updatedAt = ?, completedAt = ? WHERE id = ?").run(t??null,JSON.stringify(s??[]),r,r,e);let n=this.getById(e);return this.broadcast("task.completed",{task:n}),n}checkDependencies(e){let t=this.getBlockedBy(e);if(t.length===0)return!0;for(let s of t){let r=this.getById(s);if(!r||r.status!=="done")return!1}return!0}getBlockedBy(e){return this.db.prepare("SELECT dependsOnTaskId FROM task_dependencies WHERE taskId = ?").all(e).map(s=>s.dependsOnTaskId)}getById(e){let t=this.db.prepare("SELECT * FROM tasks WHERE id = ?").get(e);return t?this.rowToTask(t):null}getAttachments(e){return this.db.prepare("SELECT * FROM task_attachments WHERE taskId = ?").all(e).map(s=>({id:s.id,type:s.type,data:s.data,width:s.width,height:s.height,label:s.label??void 0,createdAt:s.createdAt}))}rowToTask(e){let t=this.getDependencies(e.id),s=this.getAllTerminalIds(e.id),r=this.getAttachments(e.id);return{id:e.id,swarmId:e.swarmId??void 0,workspaceId:e.workspaceId,title:e.title,description:e.description,dependencies:t,assignedAgentId:e.assignedAgentId??void 0,useWorktree:e.useWorktree===1,worktreePath:e.worktreePath??void 0,status:e.status,approvalMode:e.approvalMode,terminalId:e.terminalId??void 0,terminalIds:s,createdAt:e.createdAt,updatedAt:e.updatedAt,completedAt:e.completedAt??void 0,output:e.output??void 0,filesChanged:JSON.parse(e.filesChanged),attachments:r.length>0?r:void 0}}getDependencies(e){return this.db.prepare("SELECT dependsOnTaskId FROM task_dependencies WHERE taskId = ?").all(e).map(s=>s.dependsOnTaskId)}getTerminalIds(e){return this.db.prepare("SELECT terminalId FROM task_terminals WHERE taskId = ? AND status = 'running'").all(e).map(s=>s.terminalId)}getAllTerminalIds(e){return this.db.prepare("SELECT terminalId FROM task_terminals WHERE taskId = ?").all(e).map(s=>s.terminalId)}addTerminal(e,t,s,r,n){let o=new Date().toISOString();this.db.prepare(`INSERT INTO task_terminals (taskId, terminalId, cli, prompt, autoApprove, status, startedAt)
81
+ VALUES (?, ?, ?, ?, ?, 'running', ?)`).run(e,t,s,r,n?1:0,o)}getTaskTerminals(e){return this.db.prepare("SELECT * FROM task_terminals WHERE taskId = ?").all(e).map(s=>({taskId:s.taskId,terminalId:s.terminalId,cli:s.cli,prompt:s.prompt,autoApprove:s.autoApprove===1,status:s.status,exitCode:s.exitCode??void 0,startedAt:s.startedAt,exitedAt:s.exitedAt??void 0}))}getTaskByTerminalId(e){let t=this.db.prepare("SELECT taskId FROM task_terminals WHERE terminalId = ?").get(e);return t?this.getById(t.taskId):null}markTerminalExited(e,t,s){let r=new Date().toISOString(),n=s===0?"exited":"error";this.db.prepare("UPDATE task_terminals SET status = ?, exitCode = ?, exitedAt = ? WHERE taskId = ? AND terminalId = ?").run(n,s,r,e,t);let i=this.db.prepare("SELECT COUNT(*) as cnt FROM task_terminals WHERE taskId = ? AND status = 'running'").get(e).cnt===0,c=!1;return i&&(c=this.db.prepare("SELECT COUNT(*) as cnt FROM task_terminals WHERE taskId = ? AND status = 'error'").get(e).cnt>0),{allDone:i,hasError:c}}removeTaskTerminals(e){this.db.prepare("DELETE FROM task_terminals WHERE taskId = ?").run(e)}};import{execSync as ct}from"node:child_process";var Ut={id:"claude",name:"Claude Code",command:"claude",buildCommand({mission:a,autoApprove:e,claudeMdPath:t}){let s=a.replace(/'/g,"'\\''"),r=["claude"];return e&&r.push("--dangerously-skip-permissions"),t&&r.push(`--project ${t}`),r.push(`'${s}'`),r.join(" ")}};var _t={id:"codex",name:"Codex",command:"codex",buildCommand({mission:a,autoApprove:e}){let t=a.replace(/'/g,"'\\''"),s=["codex"];return e&&s.push("--full-auto"),s.push(`'${t}'`),s.join(" ")}};var Ft={id:"gemini",name:"Gemini",command:"gemini",buildCommand({mission:a}){return`gemini '${a.replace(/'/g,"'\\''")}'`}};var Wt={id:"opencode",name:"OpenCode",command:"opencode",buildCommand(){return"opencode"}};var Bt={id:"cursor",name:"Cursor",command:"cursor",buildCommand(){return"cursor"}};var Ae=class{providers=new Map;constructor(){this.register(Ut),this.register(_t),this.register(Ft),this.register(Wt),this.register(Bt)}register(e){this.providers.set(e.id,e)}get(e){return this.providers.get(e)}listRegistered(){return Array.from(this.providers.keys())}async detectInstalled(){let e=[];for(let[t,s]of this.providers)try{let r=ct(`which ${s.command}`,{encoding:"utf8",stdio:["pipe","pipe","pipe"]}).trim(),n={cli:t,installed:!0,path:r};t==="claude"&&(n.authenticated=this.checkClaudeAuth(r)),e.push(n)}catch{e.push({cli:t,installed:!1})}return e}checkClaudeAuth(e="claude"){try{let s=ct(`${e} auth status`,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).toLowerCase();return!s.includes("not logged in")&&!s.includes("login required")}catch{return!1}}getClaudeBinaryPath(e){if(e&&e!=="claude")return e;try{return ct("which claude",{encoding:"utf8"}).trim()}catch{return"claude"}}};import{randomUUID as jt}from"node:crypto";import{mkdirSync as er,writeFileSync as Le}from"node:fs";import{join as se}from"node:path";var Ce=[{id:"nextjs",name:"Next.js",category:"frontend"},{id:"react",name:"React",category:"frontend"},{id:"react-native",name:"React Native",category:"frontend"},{id:"expo",name:"Expo",category:"frontend"},{id:"vite",name:"Vite",category:"frontend"},{id:"nodejs",name:"Node.js",category:"backend"},{id:"express",name:"Express",category:"backend"},{id:"fastify",name:"Fastify",category:"backend"},{id:"clerk",name:"Clerk",category:"auth",requiredEnvVars:["CLERK_PUBLISHABLE_KEY","CLERK_SECRET_KEY"]},{id:"better-auth",name:"Better Auth",category:"auth"},{id:"convex",name:"Convex",category:"database",requiredEnvVars:["CONVEX_DEPLOYMENT_URL"]},{id:"supabase",name:"Supabase",category:"database",requiredEnvVars:["SUPABASE_URL","SUPABASE_ANON_KEY"]},{id:"prisma",name:"Prisma",category:"database"},{id:"drizzle",name:"Drizzle",category:"database"},{id:"stripe",name:"Stripe",category:"other",requiredEnvVars:["STRIPE_SECRET_KEY","STRIPE_WEBHOOK_SECRET"]},{id:"vercel",name:"Vercel",category:"deployment",requiredEnvVars:["VERCEL_TOKEN"]},{id:"tailwind",name:"Tailwind CSS",category:"frontend"},{id:"shadcn",name:"shadcn/ui",category:"frontend"}];var te=[{provider:"anthropic",envVar:"ANTHROPIC_API_KEY",label:"Anthropic API Key",required:!1,docsUrl:"https://console.anthropic.com/settings/keys",settingKey:"api_key.anthropic",description:"Optional \u2014 if not set, the system uses the Claude CLI's existing authentication (claude auth login)"},{provider:"openai",envVar:"OPENAI_API_KEY",label:"OpenAI API Key",required:!1,docsUrl:"https://platform.openai.com/api-keys",settingKey:"api_key.openai"},{provider:"google",envVar:"GOOGLE_API_KEY",label:"Google API Key",required:!1,docsUrl:"https://aistudio.google.com/apikey",settingKey:"api_key.google"},{provider:"clerk",envVar:"CLERK_SECRET_KEY",label:"Clerk Secret Key",required:!1,docsUrl:"https://dashboard.clerk.com",settingKey:"api_key.clerk"},{provider:"convex",envVar:"CONVEX_DEPLOYMENT_URL",label:"Convex Deployment URL",required:!1,docsUrl:"https://dashboard.convex.dev",settingKey:"api_key.convex"},{provider:"supabase",envVar:"SUPABASE_ANON_KEY",label:"Supabase Anon Key",required:!1,docsUrl:"https://supabase.com/dashboard",settingKey:"api_key.supabase"},{provider:"stripe",envVar:"STRIPE_SECRET_KEY",label:"Stripe Secret Key",required:!1,docsUrl:"https://dashboard.stripe.com/apikeys",settingKey:"api_key.stripe"},{provider:"vercel",envVar:"VERCEL_TOKEN",label:"Vercel Token",required:!1,docsUrl:"https://vercel.com/account/tokens",settingKey:"api_key.vercel"},{provider:"cloudflare",envVar:"CF_TUNNEL_TOKEN",label:"Cloudflare Tunnel Token",required:!1,docsUrl:"https://dash.cloudflare.com",settingKey:"api_key.cloudflare"}],$t=[{key:"general.theme",value:"system",category:"general",label:"Tema",description:"Aparencia do app (system/dark/light)"},{key:"general.default_cli",value:"claude",category:"general",label:"CLI Padrao",description:"CLI agent padrao para novos swarms"},{key:"general.auto_approve",value:"false",category:"general",label:"Auto-Approve",description:"Pular confirmacoes de permissao por padrao"},{key:"general.language",value:"pt",category:"general",label:"Idioma",description:"Idioma da interface (pt/en)"},{key:"providers.claude_binary_path",value:"claude",category:"providers",label:"Claude CLI Path",description:"Caminho para o binario do Claude CLI (usado para autenticacao via Agent SDK)"},{key:"advanced.server_port",value:"3773",category:"advanced",label:"Porta do Servidor",description:"Porta HTTP/WebSocket do servidor"}];var qt=[{name:"Claude Code",category:"ai_coding",command:"claude",healthCommand:"claude --version",healthSuccessKeywords:["claude"],versionCommand:"claude --version",authCommand:"claude auth status",authSuccessKeywords:["logged in","authenticated","isloggedin"],docsUrl:"https://docs.anthropic.com/en/docs/claude-code",enabled:!0,isBuiltIn:!0},{name:"Codex",category:"ai_coding",command:"codex",healthCommand:"codex --version",healthSuccessKeywords:["codex"],versionCommand:"codex --version",authCommand:"codex login status",authSuccessKeywords:["logged in"],docsUrl:"https://github.com/openai/codex",enabled:!0,isBuiltIn:!0},{name:"Gemini CLI",category:"ai_coding",command:"gemini",healthCommand:"gemini --version 2>&1",healthSuccessKeywords:["0.","1.","2."],versionCommand:"gemini --version",authCommand:"gemini --prompt exit 2>&1",authSuccessKeywords:["cached credentials","signed in with google"],docsUrl:"https://github.com/google-gemini/gemini-cli",enabled:!0,isBuiltIn:!0},{name:"OpenCode",category:"ai_coding",command:"opencode",healthCommand:"opencode --version",healthSuccessKeywords:["opencode"],versionCommand:"opencode --version",enabled:!0,isBuiltIn:!0},{name:"Cursor",category:"ai_coding",command:"cursor",healthCommand:"cursor --version",healthSuccessKeywords:["0.","1.","2.","3."],versionCommand:"cursor --version",docsUrl:"https://docs.cursor.com",enabled:!0,isBuiltIn:!0}];function Ht(a){let e=a.split(".").pop()?.toLowerCase()||"";return{ts:"typescript",tsx:"typescript",js:"javascript",jsx:"javascript",mjs:"javascript",py:"python",html:"html",htm:"html",css:"css",scss:"css",json:"json",md:"markdown",yaml:"yaml",yml:"yaml",rs:"rust",go:"go",sh:"shell",bash:"shell",zsh:"shell",sql:"sql",toml:"toml",xml:"xml",svg:"xml",c:"c",cpp:"cpp",h:"c",hpp:"cpp",java:"java",rb:"ruby",php:"php",swift:"swift",kt:"kotlin",lua:"lua",r:"r",dockerfile:"dockerfile",vue:"vue",svelte:"svelte"}[e]||"text"}var dt=[{id:"cursor",label:"Cursor",command:"cursor"},{id:"vscode",label:"VS Code",command:"code"},{id:"vscode-insiders",label:"VS Code Insiders",command:"code-insiders"},{id:"vscodium",label:"VSCodium",command:"codium"},{id:"zed",label:"Zed",command:"zed"},{id:"windsurf",label:"Windsurf",command:"windsurf"},{id:"fleet",label:"Fleet",command:"fleet"},{id:"sublime",label:"Sublime Text",command:"subl"},{id:"terminal",label:"Terminal",command:null},{id:"finder",label:"Finder",command:null}];var Xt={engine:"Qual motor de PRD voce gostaria de usar? (impactus-native / bmad / aiox / custom)",overview:"Descreva seu projeto em 2-3 frases. O que ele faz? Qual problema resolve?",features:"Liste as funcionalidades principais do seu projeto (uma por linha):",stack:"Selecione as tecnologias que serao usadas no projeto. (Use o seletor de stack no frontend)",screens:"Descreva as telas principais do seu aplicativo (nome e breve descricao de cada uma):",review:"",done:"PRD gerado com sucesso! Os arquivos foram salvos no diretorio .swarm/prd/"};function G(a,e){return a==="review"&&e?Qs(e):Xt[a]}function Me(a){let e=["engine","overview","features","stack","screens","review","done"],t=e.indexOf(a);return t===-1||t===e.length-1?"done":e[t+1]}function Qs(a){let e=j(a,"overview"),t=j(a,"features"),s=j(a,"screens"),r=a.stack.map(n=>Ce.find(o=>o.id===n)?.name??n).join(", ");return["--- Resumo do PRD ---","",`**Visao Geral:** ${e||"(nao informado)"}`,"","**Funcionalidades:**",t||"(nao informado)","",`**Stack:** ${r||"(nao selecionado)"}`,"","**Telas:**",s||"(nao informado)","","Tudo certo? Digite 'sim' para gerar o PRD ou descreva o que deseja alterar."].join(`
82
+ `)}function j(a,e){let s=["engine","overview","features","stack","screens","review","done"].indexOf(e),r=Xt[e],n=!1;for(let o of a.conversation){if(o.role==="system"&&o.content===r){n=!0;continue}if(n&&o.role==="user")return o.content}}function Kt(a){let e=j(a,"overview")??"",t=j(a,"features")??"",s=j(a,"screens")??"",r=a.stack.map(g=>Ce.find(h=>h.id===g)?.name??g),n=a.stack.map(g=>Ce.find(h=>h.id===g)).filter(Boolean),o=["# PRD - Product Requirements Document","","## Visao Geral","",e,"","## Funcionalidades","",...t.split(`
83
+ `).map(g=>{let h=g.trim();return h?h.startsWith("-")?h:`- ${h}`:""}),"","## Stack Tecnologica","",...r.map(g=>`- ${g}`),"","## Telas","",s,"","---",`Gerado em ${new Date().toISOString()}`].join(`
84
+ `),i=n.filter(g=>g.category==="frontend").map(g=>g.name),c=n.filter(g=>g.category==="backend").map(g=>g.name),d=n.filter(g=>g.category==="database").map(g=>g.name),l=n.filter(g=>g.category==="auth").map(g=>g.name),u=n.filter(g=>g.category==="deployment").map(g=>g.name),p=["# Arquitetura","","## Frontend",i.length>0?i.map(g=>`- ${g}`).join(`
85
+ `):"- A definir","","## Backend",c.length>0?c.map(g=>`- ${g}`).join(`
86
+ `):"- A definir","","## Banco de Dados",d.length>0?d.map(g=>`- ${g}`).join(`
87
+ `):"- A definir","","## Autenticacao",l.length>0?l.map(g=>`- ${g}`).join(`
88
+ `):"- A definir","","## Deploy",u.length>0?u.map(g=>`- ${g}`).join(`
89
+ `):"- A definir","","## Variaveis de Ambiente Necessarias","",...n.filter(g=>g.requiredEnvVars&&g.requiredEnvVars.length>0).flatMap(g=>[`### ${g.name}`,...g.requiredEnvVars.map(h=>`- \`${h}\``),""])].join(`
90
+ `),m=["# Telas","",s].join(`
91
+ `),f=t.split(`
92
+ `).map(g=>g.trim().replace(/^[-*]\s*/,"")).filter(Boolean),w=f.map((g,h)=>({title:`Implementar: ${g}`,description:`Implementar a funcionalidade "${g}" conforme descrito no PRD.`,dependencies:h>0?[f[h-1]]:[]}));return{prdMd:o,architectureMd:p,screensMd:m,tasksJson:w}}var Ne=class{sessions=new Map;broadcast;constructor(e){this.broadcast=e}startSession(e){let t=jt(),s=new Date().toISOString(),r="engine",n=this.createMessage("system",G(r)),o={id:t,projectDir:e.projectDir,engine:e.engine??"impactus-native",step:r,conversation:[n],stack:[],status:"active",createdAt:s};return this.sessions.set(t,o),this.broadcast("prd.message",{sessionId:t,message:n}),o}sendMessage(e,t){let s=this.getSessionOrThrow(e),r=this.createMessage("user",t);if(s.conversation.push(r),this.broadcast("prd.message",{sessionId:e,message:r}),s.step==="review"){let i=t.toLowerCase().trim();if(i==="sim"||i==="yes"||i==="ok"){s.step="done";let d=this.createMessage("system",G("done"));return s.conversation.push(d),this.broadcast("prd.message",{sessionId:e,message:d}),this.broadcast("prd.step-changed",{sessionId:e,step:s.step}),s}let c=this.createMessage("system","Entendido. Descreva as alteracoes desejadas e depois confirme com 'sim'.");return s.conversation.push(c),this.broadcast("prd.message",{sessionId:e,message:c}),s}let n=Me(s.step);s.step=n;let o=this.createMessage("system",G(n,s));return s.conversation.push(o),this.broadcast("prd.message",{sessionId:e,message:o}),this.broadcast("prd.step-changed",{sessionId:e,step:n}),s}selectEngine(e,t){let s=this.getSessionOrThrow(e);s.engine=t;let r=this.createMessage("user",`Motor selecionado: ${t}`);s.conversation.push(r),this.broadcast("prd.message",{sessionId:e,message:r});let n=Me(s.step);s.step=n;let o=this.createMessage("system",G(n,s));return s.conversation.push(o),this.broadcast("prd.message",{sessionId:e,message:o}),this.broadcast("prd.step-changed",{sessionId:e,step:n}),s}selectStack(e,t){let s=this.getSessionOrThrow(e);s.stack=t;let r=this.createMessage("user",`Stack selecionada: ${t.join(", ")}`);s.conversation.push(r),this.broadcast("prd.message",{sessionId:e,message:r});let n=Me(s.step);s.step=n;let o=this.createMessage("system",G(n,s));return s.conversation.push(o),this.broadcast("prd.message",{sessionId:e,message:o}),this.broadcast("prd.step-changed",{sessionId:e,step:n}),s}generate(e){let t=this.getSessionOrThrow(e),s=Kt(t),r=se(t.projectDir,".swarm","prd");return er(r,{recursive:!0}),Le(se(r,"prd.md"),s.prdMd,"utf-8"),Le(se(r,"architecture.md"),s.architectureMd,"utf-8"),Le(se(r,"screens.md"),s.screensMd,"utf-8"),Le(se(r,"tasks.json"),JSON.stringify(s.tasksJson,null,2),"utf-8"),t.status="completed",this.broadcast("prd.completed",{sessionId:e,output:s}),s}getSession(e){return this.sessions.get(e)??null}getSessionOrThrow(e){let t=this.sessions.get(e);if(!t)throw new Error(`PRD session ${e} not found`);return t}createMessage(e,t){return{id:jt(),role:e,content:t,timestamp:new Date().toISOString()}}};import{createCipheriv as tr,createDecipheriv as sr,randomBytes as Gt}from"node:crypto";var V=class{masterKey;constructor(e){this.masterKey=e}encrypt(e){let t=Gt(12),s=tr("aes-256-gcm",this.masterKey,t),r=Buffer.concat([s.update(e,"utf8"),s.final()]),n=s.getAuthTag();return`${t.toString("base64")}:${r.toString("base64")}:${n.toString("base64")}`}decrypt(e){let[t,s,r]=e.split(":"),n=Buffer.from(t,"base64"),o=Buffer.from(s,"base64"),i=Buffer.from(r,"base64"),c=sr("aes-256-gcm",this.masterKey,n);return c.setAuthTag(i),c.update(o).toString("utf8")+c.final("utf8")}static generateMasterKey(){return Gt(32)}};import{execSync as lt}from"node:child_process";import{pbkdf2Sync as rr}from"node:crypto";import{hostname as nr,userInfo as ar}from"node:os";var Oe=class{static SERVICE="impactus-swarm";static ACCOUNT="master-key";static isAvailable(){try{return lt("which security",{stdio:"pipe"}),!0}catch{return!1}}static getMasterKey(){if(!this.isAvailable())return this.deriveFallbackKey();try{let e=lt(`security find-generic-password -s "${this.SERVICE}" -a "${this.ACCOUNT}" -w`,{stdio:"pipe",encoding:"utf8"}).trim();return Buffer.from(e,"base64")}catch{return null}}static setMasterKey(e){if(!this.isAvailable())return;let t=e.toString("base64");try{lt(`security add-generic-password -s "${this.SERVICE}" -a "${this.ACCOUNT}" -w "${t}" -U`,{stdio:"pipe"})}catch{}}static getOrCreateMasterKey(){let e=this.getMasterKey();return e||(e=V.generateMasterKey(),this.setMasterKey(e)),e}static deriveFallbackKey(){let e=`${nr()}-${ar().username}-impactus-swarm-vault`;return rr(e,"impactus-swarm-salt",1e5,32,"sha256")}};var De=class{db;vault;constructor(e){this.db=e;let t=Oe.getOrCreateMasterKey();this.vault=new V(t),this.initializeDefaults()}list(e){return(e?this.db.prepare("SELECT * FROM settings WHERE category = ? ORDER BY key").all(e):this.db.prepare("SELECT * FROM settings ORDER BY key").all()).map(s=>this.rowToSetting(s,!0))}get(e){let t=this.db.prepare("SELECT * FROM settings WHERE key = ?").get(e);return t?this.rowToSetting(t,!0):null}set(e){let t=new Date().toISOString(),s=e.isSecret??!1,r=s?this.vault.encrypt(e.value):e.value,n=this.db.prepare("SELECT * FROM settings WHERE key = ?").get(e.key),o=e.category??n?.category??"general",i=e.label??n?.label??e.key,c=e.description??n?.description??void 0;return this.db.prepare(`INSERT OR REPLACE INTO settings (key, value, isSecret, category, label, description, updatedAt)
93
+ VALUES (?, ?, ?, ?, ?, ?, ?)`).run(e.key,r,s?1:0,o,i,c??null,t),this.rowToSetting({key:e.key,value:r,isSecret:s?1:0,category:o,label:i,description:c??null,updatedAt:t},!0)}delete(e){return this.db.prepare("DELETE FROM settings WHERE key = ?").run(e).changes>0}getSecret(e){let t=this.db.prepare("SELECT * FROM settings WHERE key = ?").get(e);if(!t)throw new Error(`Setting "${e}" not found`);return t.isSecret?this.vault.decrypt(t.value):t.value}getEnvVarsForAgent(){let e={};for(let t of te){let s=this.db.prepare("SELECT * FROM settings WHERE key = ?").get(t.settingKey);if(s&&s.value){let r=s.isSecret?this.vault.decrypt(s.value):s.value;r&&(e[t.envVar]=r)}}return e}listWorkspaceSettings(e){let t=this.db.prepare("SELECT * FROM workspace_settings WHERE workspaceId = ? ORDER BY key").all(e),s=new Map;for(let n of t)s.set(n.key,n);let r=[];for(let n of te){let o=s.get(n.settingKey);if(o)r.push({workspaceId:e,key:o.key,value:o.isSecret?"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022":o.value,isSecret:o.isSecret===1,label:o.label||n.label,source:"workspace",updatedAt:o.updatedAt});else{let i=this.db.prepare("SELECT * FROM settings WHERE key = ?").get(n.settingKey);r.push({workspaceId:e,key:n.settingKey,value:i?i.isSecret?"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022":i.value:"",isSecret:i?i.isSecret===1:!0,label:n.label,source:"system",updatedAt:i?.updatedAt??""})}}return r}setWorkspaceSetting(e){let t=new Date().toISOString(),s=e.isSecret??!0,r=s?this.vault.encrypt(e.value):e.value,n=e.label??e.key;return this.db.prepare(`INSERT OR REPLACE INTO workspace_settings (workspaceId, key, value, isSecret, label, updatedAt)
94
+ VALUES (?, ?, ?, ?, ?, ?)`).run(e.workspaceId,e.key,r,s?1:0,n,t),{workspaceId:e.workspaceId,key:e.key,value:s?"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022":e.value,isSecret:s,label:n,source:"workspace",updatedAt:t}}deleteWorkspaceSetting(e,t){return this.db.prepare("DELETE FROM workspace_settings WHERE workspaceId = ? AND key = ?").run(e,t).changes>0}getWorkspaceSecret(e,t){let s=this.db.prepare("SELECT * FROM workspace_settings WHERE workspaceId = ? AND key = ?").get(e,t);if(!s)throw new Error(`Workspace setting "${t}" not found for workspace "${e}"`);return s.isSecret?this.vault.decrypt(s.value):s.value}getResolvedApiKeys(e){return te.map(t=>{let s=this.db.prepare("SELECT * FROM workspace_settings WHERE workspaceId = ? AND key = ?").get(e,t.settingKey);if(s&&s.value)return{provider:t.provider,envVar:t.envVar,label:t.label,source:"workspace",configured:!0};let r=this.db.prepare("SELECT * FROM settings WHERE key = ?").get(t.settingKey);return{provider:t.provider,envVar:t.envVar,label:t.label,source:"system",configured:!!(r&&r.value)}})}getEnvVarsForWorkspace(e){let t={};for(let s of te){let r=this.db.prepare("SELECT * FROM workspace_settings WHERE workspaceId = ? AND key = ?").get(e,s.settingKey);if(r&&r.value){let o=r.isSecret?this.vault.decrypt(r.value):r.value;if(o){t[s.envVar]=o;continue}}let n=this.db.prepare("SELECT * FROM settings WHERE key = ?").get(s.settingKey);if(n&&n.value){let o=n.isSecret?this.vault.decrypt(n.value):n.value;o&&(t[s.envVar]=o)}}return t}initializeDefaults(){let e=this.db.prepare(`INSERT OR IGNORE INTO settings (key, value, isSecret, category, label, description, updatedAt)
95
+ VALUES (?, ?, 0, ?, ?, ?, ?)`),t=new Date().toISOString();for(let s of $t)e.run(s.key,s.value,s.category,s.label,s.description??null,t)}rowToSetting(e,t){return{key:e.key,value:t&&e.isSecret?"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022":e.value,isSecret:e.isSecret===1,category:e.category,label:e.label,description:e.description??void 0,updatedAt:e.updatedAt}}};import{randomUUID as or}from"node:crypto";import{execSync as ut}from"node:child_process";var Pe=class{db;constructor(e){this.db=e,this.initializeDefaults()}initializeDefaults(){let e=new Date().toISOString(),t=this.db.prepare(`
96
+ INSERT OR IGNORE INTO cli_tools
97
+ (id, name, logo, category, command, healthCommand, healthSuccessKeywords,
98
+ versionCommand, authCommand, authSuccessKeywords, docsUrl, envVars, notes,
99
+ enabled, isBuiltIn, createdAt, updatedAt)
100
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
101
+ `),s=this.db.prepare(`
102
+ UPDATE cli_tools SET
103
+ authCommand = ?, authSuccessKeywords = ?, healthCommand = ?,
104
+ healthSuccessKeywords = ?, updatedAt = ?
105
+ WHERE id = ? AND isBuiltIn = 1
106
+ `);for(let r of qt){let o=`builtin-${r.command.toLowerCase().replace(/[^a-z0-9]/g,"-")}`;t.run(o,r.name,r.logo??null,r.category,r.command,r.healthCommand,JSON.stringify(r.healthSuccessKeywords??[]),r.versionCommand??null,r.authCommand??null,r.authSuccessKeywords?JSON.stringify(r.authSuccessKeywords):null,r.docsUrl??null,JSON.stringify(r.envVars??{}),r.notes??null,r.enabled?1:0,r.isBuiltIn?1:0,e,e),s.run(r.authCommand??null,r.authSuccessKeywords?JSON.stringify(r.authSuccessKeywords):null,r.healthCommand,JSON.stringify(r.healthSuccessKeywords??[]),e,o)}}rowToCliTool(e){return{id:e.id,name:e.name,logo:e.logo??void 0,category:e.category,command:e.command,healthCommand:e.healthCommand,healthSuccessKeywords:JSON.parse(e.healthSuccessKeywords),versionCommand:e.versionCommand??void 0,authCommand:e.authCommand??void 0,authSuccessKeywords:e.authSuccessKeywords?JSON.parse(e.authSuccessKeywords):void 0,docsUrl:e.docsUrl??void 0,envVars:JSON.parse(e.envVars),notes:e.notes??void 0,enabled:e.enabled===1,isBuiltIn:e.isBuiltIn===1,createdAt:e.createdAt,updatedAt:e.updatedAt}}list(e){return(e?this.db.prepare("SELECT * FROM cli_tools WHERE category = ? ORDER BY name").all(e):this.db.prepare("SELECT * FROM cli_tools ORDER BY name").all()).map(s=>this.rowToCliTool(s))}get(e){let t=this.db.prepare("SELECT * FROM cli_tools WHERE id = ?").get(e);return t?this.rowToCliTool(t):null}create(e){let t=new Date().toISOString(),s=or();return this.db.prepare(`INSERT INTO cli_tools
107
+ (id, name, logo, category, command, healthCommand, healthSuccessKeywords,
108
+ versionCommand, authCommand, authSuccessKeywords, docsUrl, envVars, notes,
109
+ enabled, isBuiltIn, createdAt, updatedAt)
110
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, ?, ?)`).run(s,e.name,e.logo??null,e.category,e.command,e.healthCommand,JSON.stringify(e.healthSuccessKeywords??[]),e.versionCommand??null,e.authCommand??null,e.authSuccessKeywords?JSON.stringify(e.authSuccessKeywords):null,e.docsUrl??null,JSON.stringify(e.envVars??{}),e.notes??null,e.enabled!==!1?1:0,t,t),this.get(s)}update(e){let t=this.get(e.id);if(!t)throw new Error(`CLI tool not found: ${e.id}`);let s=new Date().toISOString(),r=[],n=[];return e.name!==void 0&&(r.push("name = ?"),n.push(e.name)),e.logo!==void 0&&(r.push("logo = ?"),n.push(e.logo)),e.category!==void 0&&(r.push("category = ?"),n.push(e.category)),e.command!==void 0&&(r.push("command = ?"),n.push(e.command)),e.healthCommand!==void 0&&(r.push("healthCommand = ?"),n.push(e.healthCommand)),e.healthSuccessKeywords!==void 0&&(r.push("healthSuccessKeywords = ?"),n.push(JSON.stringify(e.healthSuccessKeywords))),e.versionCommand!==void 0&&(r.push("versionCommand = ?"),n.push(e.versionCommand)),e.authCommand!==void 0&&(r.push("authCommand = ?"),n.push(e.authCommand)),e.authSuccessKeywords!==void 0&&(r.push("authSuccessKeywords = ?"),n.push(JSON.stringify(e.authSuccessKeywords))),e.docsUrl!==void 0&&(r.push("docsUrl = ?"),n.push(e.docsUrl)),e.envVars!==void 0&&(r.push("envVars = ?"),n.push(JSON.stringify(e.envVars))),e.notes!==void 0&&(r.push("notes = ?"),n.push(e.notes)),e.enabled!==void 0&&(r.push("enabled = ?"),n.push(e.enabled?1:0)),r.length===0?t:(r.push("updatedAt = ?"),n.push(s),n.push(e.id),this.db.prepare(`UPDATE cli_tools SET ${r.join(", ")} WHERE id = ?`).run(...n),this.get(e.id))}delete(e){let t=this.get(e);if(!t)return!1;if(t.isBuiltIn)throw new Error("Cannot delete built-in CLI tools");return this.db.prepare("DELETE FROM cli_tools WHERE id = ?").run(e),!0}async healthCheck(e){let t=this.get(e);if(!t)throw new Error(`CLI tool not found: ${e}`);let s=new Date().toISOString(),r={id:t.id,name:t.name,installed:!1,healthy:!1,checkedAt:s};try{let n=ut(t.healthCommand,{timeout:1e4,encoding:"utf-8",stdio:"pipe",shell:"/bin/sh"}).toLowerCase();r.installed=!0,t.healthSuccessKeywords.length>0?r.healthy=t.healthSuccessKeywords.some(o=>n.includes(o.toLowerCase())):r.healthy=!0}catch(n){return r.installed=!1,r.healthy=!1,r.error=n instanceof Error?n.message:String(n),r}if(t.versionCommand)try{let n=ut(t.versionCommand,{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();r.version=n}catch{}if(t.authCommand){let n="";try{n=ut(t.authCommand,{timeout:15e3,encoding:"utf-8",stdio:"pipe",shell:"/bin/sh"}).toLowerCase()}catch(o){if(o&&typeof o=="object"){let i=o;n=((i.stdout??"")+" "+(i.stderr??"")).toLowerCase()}}t.authSuccessKeywords&&t.authSuccessKeywords.length>0?r.authenticated=t.authSuccessKeywords.some(o=>n.includes(o.toLowerCase())):r.authenticated=n.length>0}return r}async healthCheckAll(e){let t=this.list(e).filter(r=>r.enabled),s=[];for(let r of t)s.push(await this.healthCheck(r.id));return s}};import{randomUUID as xe}from"node:crypto";var Ue=class{browser=null;sessions=new Map;broadcast;playwright=null;constructor(e){this.broadcast=e}async ensurePlaywright(){if(this.playwright)return this.playwright;try{return this.playwright=await import("playwright"),this.playwright}catch{throw new Error("Playwright not installed. Run: pnpm add playwright")}}async ensureBrowser(){if(this.browser)return this.browser;let e=await this.ensurePlaywright();return this.browser=await e.chromium.launch({headless:!0}),this.browser}getSession(e){let t=this.sessions.get(e);if(!t)throw new Error(`Browser session ${e} not found`);return t}getTab(e,t){let s=e.tabs.get(t);if(!s)throw new Error(`Browser tab ${t} not found in session ${e.id}`);return s}async getNavigationState(e){try{let t=await e.send("Page.getNavigationHistory");return{canGoBack:t.currentIndex>0,canGoForward:t.currentIndex<t.entries.length-1}}catch{return{canGoBack:!1,canGoForward:!1}}}async startScreencast(e,t,s){await e.send("Page.startScreencast",{format:"jpeg",quality:70,maxWidth:1920,maxHeight:1080,everyNthFrame:1}),e.on("Page.screencastFrame",r=>{this.broadcast("browser.frame",{sessionId:t,tabId:s,data:r.data,frameNumber:r.sessionId,metadata:r.metadata})})}async stopScreencast(e){try{await e.send("Page.stopScreencast")}catch{}}async setupPageEvents(e,t,s){let r=t.id,n=t.tabs.get(s),o=n.cdpSession;await o.send("Runtime.enable"),o.on("Runtime.consoleAPICalled",i=>{let c=i.args?.map(d=>d.type==="string"?d.value:d.type==="number"||d.type==="boolean"?String(d.value):d.type==="undefined"?"undefined":d.value===null?"null":d.preview?.description?d.preview.description:d.description?d.description:d.type)??[];this.broadcast("browser.console",{sessionId:r,tabId:s,type:i.type,args:c,text:c.join(" "),timestamp:Date.now()})}),o.on("Runtime.exceptionThrown",i=>{let c=i.exceptionDetails?.text||i.exceptionDetails?.exception?.description||"Unknown error";this.broadcast("browser.console",{sessionId:r,tabId:s,type:"error",args:[c],text:c,timestamp:Date.now()})}),e.on("framenavigated",async i=>{if(i===e.mainFrame())try{let c=e.url(),d=await e.title().catch(()=>"");n.url=c,n.title=d;let l=await this.getNavigationState(n.cdpSession);this.broadcast("browser.tab.updated",{sessionId:r,tabId:s,url:c,title:d,loading:!0,...l})}catch{}}),e.on("load",async()=>{try{let i=await e.title().catch(()=>"");n.title=i;let c=await this.getNavigationState(n.cdpSession);this.broadcast("browser.tab.updated",{sessionId:r,tabId:s,title:i,loading:!1,...c})}catch{}}),e.on("popup",async i=>{try{let c=xe(),d=await i.context().newCDPSession(i),l=i.url(),u=await i.title().catch(()=>""),p={page:i,cdpSession:d,url:l,title:u};t.tabs.set(c,p),this.setupPageEvents(i,t,c),this.broadcast("browser.tab.created",{sessionId:r,tabId:c,url:l,title:u})}catch{}})}async openSession(e){let s=await(await this.ensureBrowser()).newContext({viewport:{width:1280,height:720}}),r=xe(),n=xe(),o=await s.newPage(),i=await s.newCDPSession(o);e&&await o.goto(e);let c=o.url(),d=await o.title().catch(()=>""),l={page:o,cdpSession:i,url:c,title:d},u={id:r,context:s,tabs:new Map([[n,l]]),activeTabId:n};return this.sessions.set(r,u),await this.setupPageEvents(o,u,n),await this.startScreencast(i,r,n),{sessionId:r,tabId:n}}async closeSession(e){let t=this.getSession(e);for(let[,s]of t.tabs){await this.stopScreencast(s.cdpSession);try{await s.cdpSession.detach()}catch{}}try{await t.context.close()}catch{}this.sessions.delete(e)}async openTab(e,t){let s=this.getSession(e),r=xe(),n=await s.context.newPage(),o=await s.context.newCDPSession(n);t&&await n.goto(t);let i=n.url(),c=await n.title().catch(()=>""),d={page:n,cdpSession:o,url:i,title:c};return s.tabs.set(r,d),await this.setupPageEvents(n,s,r),this.broadcast("browser.tab.created",{sessionId:e,tabId:r,url:i,title:c}),{tabId:r}}async closeTab(e,t){let s=this.getSession(e),r=this.getTab(s,t);s.activeTabId===t&&await this.stopScreencast(r.cdpSession);try{await r.cdpSession.detach()}catch{}try{await r.page.close()}catch{}if(s.tabs.delete(t),this.broadcast("browser.tab.closed",{sessionId:e,tabId:t}),s.activeTabId===t&&s.tabs.size>0){let n=s.tabs.keys().next().value;await this.activateTab(e,n)}}async navigateTab(e,t,s){let r=this.getSession(e),n=this.getTab(r,t),o=s.trim();o&&!o.startsWith("http://")&&!o.startsWith("https://")&&!o.startsWith("about:")&&(o="https://"+o),await n.page.goto(o).catch(i=>{this.broadcast("browser.console",{sessionId:e,tabId:t,type:"error",args:[`Navigation failed: ${i.message}`],text:`Navigation failed: ${i.message}`,timestamp:Date.now()})})}async activateTab(e,t){let s=this.getSession(e),r=this.getTab(s,t);if(s.activeTabId!==t){let o=s.tabs.get(s.activeTabId);o&&await this.stopScreencast(o.cdpSession)}s.activeTabId=t,await this.startScreencast(r.cdpSession,e,t);let n=await this.getNavigationState(r.cdpSession);this.broadcast("browser.tab.updated",{sessionId:e,tabId:t,url:r.url,title:r.title,loading:!1,...n})}async goBack(e,t){let s=this.getSession(e);await this.getTab(s,t).page.goBack()}async goForward(e,t){let s=this.getSession(e);await this.getTab(s,t).page.goForward()}async refresh(e,t){let s=this.getSession(e);await this.getTab(s,t).page.reload()}async sendInput(e,t,s){let r=this.getSession(e),o=this.getTab(r,t).cdpSession,i=["mousePressed","mouseReleased","mouseMoved","mouseWheel"].includes(s.type),c=["keyDown","keyUp","char"].includes(s.type);i?await o.send("Input.dispatchMouseEvent",{type:s.type,x:s.x??0,y:s.y??0,button:s.button||"left",buttons:s.buttons??0,clickCount:s.clickCount||1,deltaX:s.deltaX??0,deltaY:s.deltaY??0,modifiers:s.modifiers||0}):c&&await o.send("Input.dispatchKeyEvent",{type:s.type,key:s.key,code:s.code,text:s.text,windowsVirtualKeyCode:s.windowsVirtualKeyCode||0,nativeVirtualKeyCode:s.windowsVirtualKeyCode||0,modifiers:s.modifiers||0})}async ackFrame(e,t,s){let r=this.getSession(e),n=this.getTab(r,t);try{await n.cdpSession.send("Page.screencastFrameAck",{sessionId:s})}catch{}}async inspectElementAt(e,t,s,r){let n=this.getSession(e),i=this.getTab(n,t).cdpSession;try{await i.send("DOM.enable");let{nodeId:c}=await i.send("DOM.getNodeForLocation",{x:s,y:r,includeUserAgentShadowDOM:!1});if(!c)return{found:!1};let{model:d}=await i.send("DOM.getBoxModel",{nodeId:c}),l=d.border,u={x:l[0],y:l[1],width:l[2]-l[0],height:l[5]-l[1]},{node:p}=await i.send("DOM.describeNode",{nodeId:c}),m=(p.attributes||[]).reduce((w,g,h,E)=>g==="class"&&E[h+1]?E[h+1]:w,""),f=(p.attributes||[]).reduce((w,g,h,E)=>g==="id"&&E[h+1]?E[h+1]:w,"");return{found:!0,boundingBox:u,tagName:p.localName||p.nodeName?.toLowerCase(),className:m,id:f,textContent:(p.nodeValue||"").slice(0,200)}}catch{return{found:!1}}}async highlightElementAt(e,t,s,r,n){let o=this.getSession(e),c=this.getTab(o,t).cdpSession;try{if(!n){await c.send("DOM.hideHighlight");return}await c.send("DOM.enable");let{nodeId:d}=await c.send("DOM.getNodeForLocation",{x:s,y:r,includeUserAgentShadowDOM:!1});if(!d)return;await c.send("DOM.highlightNode",{nodeId:d,highlightConfig:{contentColor:{r:111,g:168,b:220,a:.3},paddingColor:{r:147,g:196,b:125,a:.3},borderColor:{r:255,g:229,b:153,a:.7},marginColor:{r:246,g:178,b:107,a:.3}}})}catch{}}async screenshotRegion(e,t,s){let r=this.getSession(e),o=this.getTab(r,t).cdpSession;try{await o.send("DOM.hideHighlight")}catch{}let i={format:"png"};return s&&(i.clip={x:s.x,y:s.y,width:s.width,height:s.height,scale:1}),{data:(await o.send("Page.captureScreenshot",i)).data,width:s?.width??1280,height:s?.height??720}}async stopAll(){let e=[...this.sessions.keys()];if(await Promise.all(e.map(t=>this.closeSession(t))),this.browser){try{await this.browser.close()}catch{}this.browser=null}}};import{exec as ir}from"node:child_process";import{promisify as cr}from"node:util";var Vt=cr(ir),_e=class{monitors=new Map;portCache=new Map;workspaceTerminals=new Map;broadcast;resolvePid;scanIntervalMs=3e3;constructor(e,t){this.broadcast=e,this.resolvePid=t}async startMonitoring(e,t){this.stopMonitoring(e),this.workspaceTerminals.set(e,t),await this.scan(e);let s=setInterval(()=>{this.scan(e).catch(console.error)},this.scanIntervalMs);this.monitors.set(e,s)}stopMonitoring(e){let t=this.monitors.get(e);t&&(clearInterval(t),this.monitors.delete(e)),this.portCache.delete(e),this.workspaceTerminals.delete(e)}listPorts(e){return this.portCache.get(e)||[]}listAllWorkspacePorts(){let e=new Set,t=[];for(let s of this.portCache.values())for(let r of s){let n=`${r.port}:${r.pid}`;e.has(n)||(e.add(n),t.push(r))}return t.sort((s,r)=>s.port-r.port),t}async listSystemPorts(){return this.detectListeningPorts()}async killPort(e,t){try{process.kill(t,"SIGTERM"),await new Promise(s=>setTimeout(s,2e3));try{process.kill(t,0),process.kill(t,"SIGKILL")}catch{}return{success:!0}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}async scan(e){try{let t=this.workspaceTerminals.get(e)||[],s=[];for(let l of t){let u=this.resolvePid(l);u&&u>0&&s.push(u)}if(s.length===0){(this.portCache.get(e)||[]).length>0&&(this.portCache.set(e,[]),this.broadcast("ports.update",{workspaceId:e,ports:[],timestamp:Date.now()}));return}let{allDescendantPids:r,pidToTerminal:n}=await this.buildProcessTree(s,t),i=(await this.detectListeningPorts()).filter(l=>r.has(l.pid));for(let l of i){let u=n.get(l.pid);u&&(l.terminalId=u)}let c=this.portCache.get(e)||[],d=this.portsChanged(c,i);if(this.portCache.set(e,i),d){let l={workspaceId:e,ports:i,timestamp:Date.now()};this.broadcast("ports.update",l)}}catch(t){console.error("[PortMonitor] scan error:",t)}}async buildProcessTree(e,t){let s=new Set(e),r=new Map;try{let{stdout:n}=await Vt("ps -eo ppid=,pid= 2>/dev/null || true",{timeout:3e3}),o=new Map;for(let i of n.trim().split(`
111
+ `)){let c=i.trim().split(/\s+/);if(c.length<2)continue;let d=parseInt(c[0],10),l=parseInt(c[1],10);if(isNaN(d)||isNaN(l))continue;let u=o.get(d);u||(u=[],o.set(d,u)),u.push(l)}for(let i of t){let c=this.resolvePid(i);if(!c||c<=0)continue;let d=[c];for(r.set(c,i);d.length>0;){let l=d.pop(),u=o.get(l);if(u)for(let p of u)s.has(p)||(s.add(p),r.set(p,i),d.push(p))}}}catch{}return{allDescendantPids:s,pidToTerminal:r}}async detectListeningPorts(){let e=process.platform;try{if(e==="darwin"||e==="linux"){let{stdout:t}=await Vt("lsof -i -P -n -sTCP:LISTEN 2>/dev/null || true",{timeout:5e3});return this.parseLsofOutput(t)}return[]}catch{return[]}}parseLsofOutput(e){let t=e.trim().split(`
112
+ `);if(t.length<2)return[];let s=[],r=new Set;for(let n=1;n<t.length;n++){let o=t[n].split(/\s+/);if(o.length<9)continue;let i=o[0],c=parseInt(o[1],10),d=o[8];if(i==="launchd"||i==="systemd")continue;let l=d.lastIndexOf(":");if(l===-1)continue;let u=d.substring(0,l),p=parseInt(d.substring(l+1),10);if(isNaN(p)||p<=0)continue;let m=`${p}:${c}`;if(r.has(m))continue;r.add(m);let f=u==="*"?"0.0.0.0":u;s.push({port:p,protocol:"tcp",pid:c,process:i,localAddress:f,detectedAt:Date.now()})}return s.sort((n,o)=>n.port-o.port),s}portsChanged(e,t){if(e.length!==t.length)return!0;let s=new Set(e.map(r=>`${r.port}:${r.pid}`));return t.some(r=>!s.has(`${r.port}:${r.pid}`))}dispose(){for(let[e]of this.monitors)this.stopMonitoring(e)}};import{spawn as dr}from"node:child_process";import{exec as lr}from"node:child_process";import{promisify as ur}from"node:util";import{randomBytes as pr}from"node:crypto";var mr=ur(lr),gr=/https:\/\/[a-zA-Z0-9-]+\.trycloudflare\.com/,Fe=class{process=null;url=null;active=!1;startedAt=null;lastError=null;authToken=null;broadcast;constructor(e){this.broadcast=e}async isCloudflaredInstalled(){try{return await mr("which cloudflared"),!0}catch{return!1}}async startTunnel(e){if(this.active)return;if(!await this.isCloudflaredInstalled()){let o="cloudflared is not installed. Install it from https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation/";throw this.lastError=o,this.broadcast("tunnel.status",{active:!1,error:o}),new Error(o)}let s=e?.port??3773,r=["tunnel","--url",`${e?.protocol??"http"}://localhost:${s}`];e?.hostname&&r.push("--hostname",e.hostname),this.process=dr("cloudflared",r,{stdio:["ignore","pipe","pipe"]}),this.active=!0,this.startedAt=new Date().toISOString(),this.lastError=null,this.authToken=pr(32).toString("hex");let n=o=>{let c=o.toString().match(gr);c&&!this.url&&(this.url=c[0],this.broadcast("tunnel.url",{url:this.url}),this.broadcast("tunnel.status",{active:!0,url:this.url}))};this.process.stdout?.on("data",n),this.process.stderr?.on("data",n),this.process.on("exit",o=>{let i=this.active;if(this.active=!1,this.url=null,this.startedAt=null,this.process=null,i){let c=o!==0?`cloudflared exited with code ${o}`:void 0;c&&(this.lastError=c),this.broadcast("tunnel.status",{active:!1,error:c})}}),this.process.on("error",o=>{this.active=!1,this.url=null,this.startedAt=null,this.process=null,this.lastError=o.message,this.broadcast("tunnel.status",{active:!1,error:o.message})}),this.broadcast("tunnel.status",{active:!0})}stopTunnel(){this.process&&(this.process.kill(),this.active=!1,this.url=null,this.startedAt=null,this.process=null,this.authToken=null,this.broadcast("tunnel.status",{active:!1}))}async getStatus(){let e=await this.isCloudflaredInstalled();return{active:this.active,url:this.url??void 0,pid:this.process?.pid,startedAt:this.startedAt??void 0,error:this.lastError??void 0,isInstalled:e,token:this.authToken??void 0}}getUrl(){return this.url}getToken(){return this.authToken}isActive(){return this.active}validateToken(e){return!this.active||!this.authToken?!0:e===this.authToken}};import{spawn as hr}from"node:child_process";import{exec as fr}from"node:child_process";import{promisify as wr}from"node:util";var Er=wr(fr),Tr=/https:\/\/[a-zA-Z0-9-]+\.trycloudflare\.com/,Yt=10,We=class{tunnels=new Map;broadcast;constructor(e){this.broadcast=e}async startTunnel(e,t){if(this.tunnels.has(e))return;if(this.tunnels.size>=Yt)throw new Error(`Maximum of ${Yt} port tunnels reached`);try{await Er("which cloudflared")}catch{throw new Error("cloudflared is not installed. Install it from https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation/")}let s=`${t??"http"}://localhost:${e}`,r=hr("cloudflared",["tunnel","--url",s],{stdio:["ignore","pipe","pipe"]}),n={process:r,url:null,active:!0,startedAt:new Date().toISOString(),error:null};this.tunnels.set(e,n),this.broadcastUpdate();let o=i=>{let d=i.toString().match(Tr);d&&!n.url&&(n.url=d[0],this.broadcastUpdate())};r.stdout?.on("data",o),r.stderr?.on("data",o),r.on("exit",i=>{let c=this.tunnels.get(e);c&&c.process===r&&(i!==0&&(c.error=`cloudflared exited with code ${i}`),c.active=!1,this.tunnels.delete(e),this.broadcastUpdate())}),r.on("error",i=>{let c=this.tunnels.get(e);c&&c.process===r&&(c.error=i.message,c.active=!1,this.tunnels.delete(e),this.broadcastUpdate())})}stopTunnel(e){let t=this.tunnels.get(e);if(t){try{t.process.kill()}catch{}this.tunnels.delete(e),this.broadcastUpdate()}}stopAll(){for(let[,e]of this.tunnels)try{e.process.kill()}catch{}this.tunnels.clear(),this.broadcastUpdate()}getTunnels(){let e=[];for(let[t,s]of this.tunnels)e.push({port:t,url:s.url??void 0,active:s.active,startedAt:s.startedAt,error:s.error??void 0});return e}getTunnelForPort(e){let t=this.tunnels.get(e);if(t)return{port:e,url:t.url??void 0,active:t.active,startedAt:t.startedAt,error:t.error??void 0}}cleanupStaleTunnels(e){let t=new Set(e);for(let s of this.tunnels.keys())t.has(s)||this.stopTunnel(s)}broadcastUpdate(){this.broadcast("portTunnels.update",{tunnels:this.getTunnels()})}};import{readFileSync as Sr,writeFileSync as zt,readdirSync as yr,unlinkSync as vr,mkdirSync as kr,existsSync as Jt,statSync as br}from"node:fs";import{join as Y,basename as Ir}from"node:path";function Rr(a){return a.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9\-_]/g,"")}function Be(a){return Y(a,".swarm","prd","wireframes")}function $e(a,e){let t=Sr(a,"utf-8"),s=br(a),r=e.replace(/-/g," ").replace(/\b\w/g,n=>n.toUpperCase());return{id:e,name:r,content:t,updatedAt:s.mtime.toISOString()}}function Ar(a){let e=a.toLowerCase();return/login|signup|register|auth/.test(e)?`\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
113
+ \u2502 LOGIN \u2502
114
+ \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524
115
+ \u2502 \u2502
116
+ \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502
117
+ \u2502 \u2502 Email \u2502 \u2502
118
+ \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502
119
+ \u2502 \u2502
120
+ \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502
121
+ \u2502 \u2502 Password \u2502 \u2502
122
+ \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502
123
+ \u2502 \u2502
124
+ \u2502 [ ] Remember me \u2502
125
+ \u2502 \u2502
126
+ \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502
127
+ \u2502 \u2502 ENTER / LOGIN \u2502 \u2502
128
+ \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502
129
+ \u2502 \u2502
130
+ \u2502 Forgot password? Create account \u2502
131
+ \u2502 \u2502
132
+ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518`:/form/.test(e)?`\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
133
+ \u2502 FORM \u2502
134
+ \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524
135
+ \u2502 \u2502
136
+ \u2502 Field 1 \u2502
137
+ \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502
138
+ \u2502 \u2502 \u2502 \u2502
139
+ \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502
140
+ \u2502 \u2502
141
+ \u2502 Field 2 \u2502
142
+ \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502
143
+ \u2502 \u2502 \u2502 \u2502
144
+ \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502
145
+ \u2502 \u2502
146
+ \u2502 Field 3 \u2502
147
+ \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502
148
+ \u2502 \u2502 \u2502 \u2502
149
+ \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502
150
+ \u2502 \u2502
151
+ \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502
152
+ \u2502 \u2502 Cancel \u2502 \u2502 Submit \u2502 \u2502
153
+ \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502
154
+ \u2502 \u2502
155
+ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518`:/table|list/.test(e)?`\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
156
+ \u2502 LIST / TABLE \u2502
157
+ \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524
158
+ \u2502 [ Search... ] [+] \u2502
159
+ \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524
160
+ \u2502 ID \u2502 Name \u2502 Status \u2502 Actions \u2502
161
+ \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524
162
+ \u2502 1 \u2502 Item A \u2502 Active \u2502 Edit Del \u2502
163
+ \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524
164
+ \u2502 2 \u2502 Item B \u2502 Pending \u2502 Edit Del \u2502
165
+ \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524
166
+ \u2502 3 \u2502 Item C \u2502 Done \u2502 Edit Del \u2502
167
+ \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524
168
+ \u2502 4 \u2502 Item D \u2502 Active \u2502 Edit Del \u2502
169
+ \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524
170
+ \u2502 < Prev Page 1 of 5 Next > \u2502
171
+ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518`:/dashboard/.test(e)?`\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
172
+ \u2502 DASHBOARD \u2502
173
+ \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524
174
+ \u2502 \u2502
175
+ \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502
176
+ \u2502 \u2502 METRIC 1 \u2502 \u2502 METRIC 2 \u2502 \u2502 METRIC 3 \u2502 \u2502
177
+ \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502
178
+ \u2502 \u2502 1,234 \u2502 \u2502 567 \u2502 \u2502 89% \u2502 \u2502
179
+ \u2502 \u2502 +12% \u25B2 \u2502 \u2502 -3% \u25BC \u2502 \u2502 +5% \u25B2 \u2502 \u2502
180
+ \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502
181
+ \u2502 \u2502
182
+ \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502
183
+ \u2502 \u2502 Chart / Graph \u2502 \u2502 Recent Activity \u2502 \u2502
184
+ \u2502 \u2502 \u2502 \u2502 \u2502 \u2502
185
+ \u2502 \u2502 \u2581\u2582\u2584\u2586\u2587\u2588\u2587\u2586\u2584\u2582\u2581 \u2502 \u2502 \u2022 Event 1 \u2502 \u2502
186
+ \u2502 \u2502 \u2502 \u2502 \u2022 Event 2 \u2502 \u2502
187
+ \u2502 \u2502 \u2502 \u2502 \u2022 Event 3 \u2502 \u2502
188
+ \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502
189
+ \u2502 \u2502
190
+ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518`:/modal|dialog/.test(e)?`\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
191
+ \u2502 (background content \u2014 dimmed) \u2502
192
+ \u2502 \u2502
193
+ \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502
194
+ \u2502 \u2502 MODAL TITLE [x] \u2502 \u2502
195
+ \u2502 \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502
196
+ \u2502 \u2502 \u2502 \u2502
197
+ \u2502 \u2502 Modal body content goes here. \u2502 \u2502
198
+ \u2502 \u2502 Additional information or form \u2502 \u2502
199
+ \u2502 \u2502 fields can be placed in this area. \u2502 \u2502
200
+ \u2502 \u2502 \u2502 \u2502
201
+ \u2502 \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2502
202
+ \u2502 \u2502 \u2502 Cancel \u2502 \u2502 Confirm \u2502 \u2502 \u2502
203
+ \u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2502
204
+ \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502
205
+ \u2502 \u2502
206
+ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518`:/sidebar|nav|navigation/.test(e)?`\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
207
+ \u2502 SIDEBAR \u2502 MAIN CONTENT \u2502
208
+ \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502
209
+ \u2502 Logo / Brand\u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502
210
+ \u2502 \u2502 \u2502 Page Title \u2502 \u2502
211
+ \u2502 \u25B6 Home \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502
212
+ \u2502 \u25B6 Section 1 \u2502 \u2502
213
+ \u2502 \u25B8 Item A \u2502 Content area... \u2502
214
+ \u2502 \u25B8 Item B \u2502 \u2502
215
+ \u2502 \u25B6 Section 2 \u2502 \u2502
216
+ \u2502 \u25B8 Item C \u2502 \u2502
217
+ \u2502 \u25B8 Item D \u2502 \u2502
218
+ \u2502 \u25B6 Section 3 \u2502 \u2502
219
+ \u2502 \u2502 \u2502
220
+ \u2502 \u2502 \u2502
221
+ \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502
222
+ \u2502 User \u2502 \u2502
223
+ \u2502 Settings \u2502 \u2502
224
+ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518`:`\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
225
+ \u2502 HEADER [Nav] [User] \u2502
226
+ \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524
227
+ \u2502 \u2502
228
+ \u2502 Page Title \u2502
229
+ \u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502
230
+ \u2502 \u2502
231
+ \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502
232
+ \u2502 \u2502 \u2502 \u2502
233
+ \u2502 \u2502 Main Content Area \u2502 \u2502
234
+ \u2502 \u2502 \u2502 \u2502
235
+ \u2502 \u2502 Lorem ipsum dolor sit amet... \u2502 \u2502
236
+ \u2502 \u2502 \u2502 \u2502
237
+ \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502
238
+ \u2502 \u2502
239
+ \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502
240
+ \u2502 \u2502 Action 1 \u2502 \u2502 Action 2 \u2502 \u2502
241
+ \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502
242
+ \u2502 \u2502
243
+ \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524
244
+ \u2502 FOOTER \u2502
245
+ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518`}var qe=class{broadcast;constructor(e){this.broadcast=e}ensureDir(e){let t=Be(e);return kr(t,{recursive:!0}),t}list(e){let t=this.ensureDir(e);return yr(t).filter(r=>r.endsWith(".txt")).map(r=>{let n=Ir(r,".txt");return $e(Y(t,r),n)})}get(e,t){let s=Be(e),r=Y(s,`${t}.txt`);return Jt(r)?$e(r,t):null}create(e,t){let s=this.ensureDir(e),r=Rr(t.name),n=Y(s,`${r}.txt`),o;t.content?o=t.content:t.description?o=`# ${t.name}
246
+ # ${t.description}
247
+
248
+ `:o=`# ${t.name}
249
+
250
+ `,zt(n,o,"utf-8");let i=$e(n,r);return this.broadcast("wireframe.created",{wireframe:i}),i}update(e,t,s){let r=Be(e),n=Y(r,`${t}.txt`);zt(n,s,"utf-8");let o=$e(n,t);return this.broadcast("wireframe.updated",{wireframe:o}),o}delete(e,t){let s=Be(e),r=Y(s,`${t}.txt`);Jt(r)&&vr(r),this.broadcast("wireframe.deleted",{id:t})}generate(e,t,s){let r=Ar(s);return this.update(e,t,r)}};import{randomUUID as Cr}from"node:crypto";var He=class{db;constructor(e){this.db=e}list(){return this.db.prepare("SELECT * FROM command_templates ORDER BY name ASC").all().map(s=>this.hydrate(s))}get(e){let s=this.db.prepare("SELECT * FROM command_templates WHERE id = ?").get(e);return s?this.hydrate(s):null}create(e){let t=Cr(),s=new Date().toISOString();return this.db.prepare(`INSERT INTO command_templates (id, name, description, command, steps, createdAt, updatedAt)
251
+ VALUES (?, ?, ?, ?, ?, ?, ?)`).run(t,e.name,e.description||"",e.command||"",JSON.stringify(e.steps),s,s),this.get(t)}update(e){let t=this.get(e.id);if(!t)return null;let s=new Date().toISOString();return this.db.prepare("UPDATE command_templates SET name = ?, description = ?, command = ?, steps = ?, updatedAt = ? WHERE id = ?").run(e.name??t.name,e.description??t.description,e.command??t.command,e.steps?JSON.stringify(e.steps):JSON.stringify(t.steps),s,e.id),this.get(e.id)}delete(e){return this.db.prepare("DELETE FROM command_templates WHERE id = ?").run(e).changes>0}hydrate(e){return{id:e.id,name:e.name,description:e.description,command:e.command,steps:JSON.parse(e.steps),createdAt:e.createdAt,updatedAt:e.updatedAt}}};import{randomUUID as Mr}from"node:crypto";var Xe=class{db;constructor(e){this.db=e}list(e,t){return t?this.db.prepare("SELECT * FROM saved_layouts WHERE areaId = ? ORDER BY createdAt ASC").all(t).map(i=>this.hydrate(i)):this.db.prepare("SELECT * FROM saved_layouts WHERE workspaceId = ? ORDER BY createdAt ASC").all(e).map(n=>this.hydrate(n))}get(e){let s=this.db.prepare("SELECT * FROM saved_layouts WHERE id = ?").get(e);return s?this.hydrate(s):null}save(e){let t=e.areaId||e.workspaceId,s=e.areaId?"areaId":"workspaceId",r=this.db.prepare(`SELECT COUNT(*) as count FROM saved_layouts WHERE ${s} = ?`),{count:n}=r.get(t);if(n>=5)throw new Error(`Maximum of ${5} saved layouts reached`);let o=Mr(),i=new Date().toISOString(),c={tree:e.tree,panels:e.panels,promotedBrowser:e.promotedBrowser};return this.db.prepare(`INSERT INTO saved_layouts (id, workspaceId, areaId, name, isDefault, version, data, createdAt, updatedAt)
252
+ VALUES (?, ?, ?, ?, ?, 1, ?, ?, ?)`).run(o,e.workspaceId,e.areaId||null,e.name,e.isDefault?1:0,JSON.stringify(c),i,i),e.isDefault&&this.clearDefaultExcept(e.workspaceId,o,e.areaId),this.get(o)}update(e,t){let s=this.get(e);if(!s)return null;let r=new Date().toISOString(),n={tree:t.tree??s.tree,panels:t.panels??s.panels,promotedBrowser:t.promotedBrowser!==void 0?t.promotedBrowser:s.promotedBrowser};return this.db.prepare("UPDATE saved_layouts SET name = ?, data = ?, updatedAt = ? WHERE id = ?").run(t.name??s.name,JSON.stringify(n),r,e),this.get(e)}delete(e){return this.db.prepare("DELETE FROM saved_layouts WHERE id = ?").run(e).changes>0}setDefault(e,t,s){this.clearDefaultExcept(e,t,s),s?this.db.prepare("UPDATE saved_layouts SET isDefault = 1 WHERE id = ? AND areaId = ?").run(t,s):this.db.prepare("UPDATE saved_layouts SET isDefault = 1 WHERE id = ? AND workspaceId = ?").run(t,e)}getDefault(e,t){if(t){let o=this.db.prepare("SELECT * FROM saved_layouts WHERE areaId = ? AND isDefault = 1 LIMIT 1").get(t);return o?this.hydrate(o):null}let r=this.db.prepare("SELECT * FROM saved_layouts WHERE workspaceId = ? AND isDefault = 1 LIMIT 1").get(e);return r?this.hydrate(r):null}clearDefaultExcept(e,t,s){s?this.db.prepare("UPDATE saved_layouts SET isDefault = 0 WHERE areaId = ? AND id != ?").run(s,t):this.db.prepare("UPDATE saved_layouts SET isDefault = 0 WHERE workspaceId = ? AND id != ?").run(e,t)}hydrate(e){let t=JSON.parse(e.data);return{id:e.id,workspaceId:e.workspaceId,...e.areaId?{areaId:e.areaId}:{},name:e.name,isDefault:e.isDefault===1,version:e.version,tree:t.tree,panels:t.panels,promotedBrowser:t.promotedBrowser,createdAt:e.createdAt,updatedAt:e.updatedAt}}};import{execSync as pt}from"node:child_process";var Lr=300*1e3,Nr=2e3,mt=5e3,Qt=[{cli:"claude",command:"claude",authCommand:"claude auth status",versionCommand:"claude --version",parseAuth:a=>{let e=a.toLowerCase();return e.includes("not logged in")||e.includes("login required")?!1:(e.includes("loggedin")||e.includes("logged in")||e.includes("authenticated")||e.includes("isloggedin"),!0)}},{cli:"codex",command:"codex",authCommand:"codex login status",versionCommand:"codex --version",parseAuth:a=>{let e=a.toLowerCase();return e.includes("not logged in")||e.includes("run `codex login`")?!1:(e.includes("logged in"),!0)}},{cli:"gemini",command:"gemini",authCommand:"gemini auth status",versionCommand:"gemini --version",parseAuth:a=>{let e=a.toLowerCase();return e.includes("not logged in")||e.includes("login required")||e.includes("not authenticated")?!1:(e.includes("logged in")||e.includes("authenticated"),!0)}}],Ke=class{interval=null;startupTimer=null;lastResult=null;previousStates=new Map;broadcast;constructor(e){this.broadcast=e,this.startupTimer=setTimeout(()=>{this.checkAll(),this.startupTimer=null},Nr),this.interval=setInterval(()=>{this.checkAll()},Lr)}async checkAll(){let e=[];for(let s of Qt){let r=await this.checkOne(s.cli);e.push(r)}let t={providers:e,checkedAt:new Date().toISOString()};for(let s of e){let r=this.previousStates.get(s.cli);r&&r==="connected"&&s.state==="disconnected"&&this.broadcast("notification.new",{type:"warning",title:`${s.cli} disconnected`,message:`${s.cli} CLI lost authentication. Re-authenticate to continue using it.`,source:"health-check"}),this.previousStates.set(s.cli,s.state)}return this.lastResult=t,this.broadcast("health.status",t),t}async checkOne(e){let t=Qt.find(c=>c.cli===e);if(!t)return{cli:e,state:"not_installed",installed:!1,authenticated:!1,lastCheckedAt:new Date().toISOString()};let s;try{s=pt(`which ${t.command}`,{encoding:"utf8",timeout:mt,stdio:["pipe","pipe","pipe"]}).trim()}catch{return{cli:e,state:"not_installed",installed:!1,authenticated:!1,lastCheckedAt:new Date().toISOString()}}let r;try{r=pt(t.versionCommand,{encoding:"utf8",timeout:mt,stdio:["pipe","pipe","pipe"]}).trim()}catch{}let n=!1,o="disconnected",i;try{let c=pt(t.authCommand,{encoding:"utf8",timeout:mt,stdio:["pipe","pipe","pipe"]});n=t.parseAuth(c),o=n?"connected":"disconnected"}catch(c){o="disconnected",i=c instanceof Error?c.message:"Auth check failed"}return{cli:e,state:o,installed:!0,version:r,path:s,authenticated:n,lastCheckedAt:new Date().toISOString(),error:i}}getLastResult(){return this.lastResult}dispose(){this.interval&&(clearInterval(this.interval),this.interval=null),this.startupTimer&&(clearTimeout(this.startupTimer),this.startupTimer=null)}};import{randomUUID as Or}from"node:crypto";var es=100,je=class{notifications=[];broadcast;constructor(e){this.broadcast=e}add(e,t,s,r){let n={id:Or(),type:e,title:t,message:s,source:r,read:!1,createdAt:new Date().toISOString()};return this.notifications.unshift(n),this.notifications.length>es&&(this.notifications=this.notifications.slice(0,es)),this.broadcast("notification.new",n),n}list(){return this.notifications}markRead(e){let t=this.notifications.find(s=>s.id===e);return t?(t.read=!0,!0):!1}clear(e){if(e){let t=this.notifications.findIndex(s=>s.id===e);return t===-1?!1:(this.notifications.splice(t,1),!0)}return this.clearAll(),!0}clearAll(){this.notifications=[]}};import{execFile as Dr}from"node:child_process";import{promisify as Pr}from"node:util";var xr=Pr(Dr),Ge=class{async exec(e,t){return xr("git",e,{cwd:t,maxBuffer:10*1024*1024})}async isGitRepo(e){try{return await this.exec(["rev-parse","--is-inside-work-tree"],e),!0}catch{return!1}}async init(e){let{stdout:t}=await this.exec(["init"],e);return{ok:!0,message:t.trim()}}async status(e){let{stdout:t}=await this.exec(["status","--porcelain=v2","--branch"],e),s=null,r=0,n=0,o=!1,i=[],c=[],d=[];for(let l of t.split(`
253
+ `))if(l.startsWith("# branch.head "))s=l.slice(14);else if(l.startsWith("# branch.ab ")){o=!0;let u=l.match(/\+(\d+) -(\d+)/);u&&(r=parseInt(u[1],10),n=parseInt(u[2],10))}else if(l.startsWith("1 ")||l.startsWith("2 ")){let u=l.split(" "),p=u[1],m=l.startsWith("2 ")&&l.split(" ")[1]||u[u.length-1],f=p[0],w=p[1];f!=="."&&i.push({path:m,status:this.mapStatus(f,l.startsWith("2 ")),insertions:0,deletions:0}),w!=="."&&c.push({path:m,status:this.mapStatus(w,!1),insertions:0,deletions:0})}else l.startsWith("? ")&&d.push(l.slice(2));try{let{stdout:l}=await this.exec(["diff","--numstat","--cached"],e);this.applyNumstat(l,i)}catch{}try{let{stdout:l}=await this.exec(["diff","--numstat"],e);this.applyNumstat(l,c)}catch{}return{branch:s,hasChanges:i.length>0||c.length>0||d.length>0,staged:i,unstaged:c,untracked:d,aheadCount:r,behindCount:n,hasUpstream:o}}async diff(e,t){if(t!==void 0){let c=["diff"];t&&c.push("--cached");let{stdout:d}=await this.exec(c,e);return{...this.parseDiff(d),rawPatch:d}}let s="";try{let{stdout:c}=await this.exec(["diff","HEAD"],e);s=c}catch{let[c,d]=await Promise.all([this.exec(["diff"],e).then(l=>l.stdout).catch(()=>""),this.exec(["diff","--cached"],e).then(l=>l.stdout).catch(()=>"")]);s=[c,d].filter(Boolean).join(`
254
+ `)}let r=await this.exec(["ls-files","--others","--exclude-standard"],e).then(c=>c.stdout.trim().split(`
255
+ `).filter(Boolean)).catch(()=>[]),n="";for(let c of r)try{let{stdout:d}=await this.exec(["diff","--no-index","--","/dev/null",c],e);n+=d}catch(d){let l=d;l.stdout&&(n+=l.stdout)}let o=[s,n].filter(Boolean).join(`
256
+ `);return{...this.parseDiff(o),rawPatch:o}}async commit(e){e.files&&e.files.length>0?await this.exec(["add",...e.files],e.cwd):await this.exec(["add","-A"],e.cwd);let{stdout:t}=await this.exec(["commit","-m",e.message],e.cwd),s=t.match(/\[[\w/.-]+ ([a-f0-9]+)\]/);return{hash:s?s[1]:"",message:e.message}}async push(e){let t=["push"];return e.setUpstream&&e.branch&&t.push("-u","origin",e.branch),await this.exec(t,e.cwd),{ok:!0,remote:"origin",branch:e.branch||"HEAD"}}async branches(e){let{stdout:t}=await this.exec(["branch","-a","--format=%(refname:short) %(HEAD) %(upstream:short)"],e),s=[];for(let r of t.trim().split(`
257
+ `)){if(!r.trim())continue;let n=r.trim().split(" "),o=n[0],i=n[1]==="*",c=n[2]||void 0;s.push({name:o,current:i,remote:c})}return s}async log(e,t){let s=t??20,{stdout:r}=await this.exec(["log","--format=%H||%s||%an||%aI","-n",`${s}`],e),n=[];for(let o of r.trim().split(`
258
+ `)){if(!o.trim())continue;let[i,c,d,l]=o.split("||");n.push({hash:i,message:c,author:d,date:l})}return n}async createBranch(e,t){return await this.exec(["checkout","-b",t],e),{ok:!0,branch:t}}async checkoutBranch(e,t){return await this.exec(["checkout",t],e),{ok:!0,branch:t}}mapStatus(e,t){if(t)return"renamed";switch(e){case"A":return"added";case"D":return"deleted";case"M":case"T":return"modified";case"R":return"renamed";default:return"modified"}}applyNumstat(e,t){for(let s of e.trim().split(`
259
+ `)){if(!s.trim())continue;let[r,n,o]=s.split(" "),i=t.find(c=>c.path===o);i&&(i.insertions=r==="-"?0:parseInt(r,10),i.deletions=n==="-"?0:parseInt(n,10))}}parseDiff(e){let t=[],s=0,r=0,n=e.split(/^diff --git /m).filter(Boolean);for(let o of n){let i=o.split(`
260
+ `),c,d="",l="modified",u=0;for(let h=0;h<i.length;h++){let E=i[h];if(E.startsWith("--- ")){let T=E.slice(4);T==="/dev/null"?l="added":c=T.replace(/^a\//,"")}else if(E.startsWith("+++ ")){let T=E.slice(4);T==="/dev/null"?(l="deleted",d=c||""):d=T.replace(/^b\//,"")}else if(E.startsWith("@@ ")){u=h;break}else E.startsWith("rename from ")?(c=E.slice(12),l="renamed"):E.startsWith("rename to ")&&(d=E.slice(10),l="renamed")}if(!d&&!c)continue;d||(d=c||"");let p=[],m=null,f=0,w=0;for(let h=u;h<i.length;h++){let E=i[h];if(E.startsWith("@@ ")){let T=E.match(/@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/);T&&(f=parseInt(T[1],10),w=parseInt(T[2],10),m={header:E,lines:[]},p.push(m))}else if(m){if(E.startsWith("+")){let T={type:"add",content:E.slice(1),newLineNumber:w};m.lines.push(T),w++,s++}else if(E.startsWith("-")){let T={type:"delete",content:E.slice(1),oldLineNumber:f};m.lines.push(T),f++,r++}else if(E.startsWith(" ")){let T={type:"context",content:E.slice(1),oldLineNumber:f,newLineNumber:w};m.lines.push(T),f++,w++}}}let g={path:d,status:l,hunks:p};c&&c!==d&&(g.oldPath=c),t.push(g)}return{files:t,stats:{filesChanged:t.length,insertions:s,deletions:r}}}};import{execFile as Ur}from"node:child_process";import{promisify as _r}from"node:util";var Fr=_r(Ur),Ve=class{constructor(e){this.db=e}async exec(e,t){let s={maxBuffer:10485760};return t&&(s.cwd=t),Fr("gh",e,s)}async checkAuth(){try{let{stdout:e,stderr:t}=await this.exec(["auth","status"]),s=e+t,r=s.match(/Logged in to github\.com.*?(?:as|account) (\S+)/i);if(r){let n=s.match(/Token scopes:[\s]*(.+)/i),o=n?n[1].split(",").map(i=>i.trim()).filter(Boolean):void 0;return{authenticated:!0,username:r[1],scopes:o}}return{authenticated:!1}}catch{return{authenticated:!1}}}async listRepos(e){let t=e?.limit??30,s=["repo","list"];e?.owner&&s.push(e.owner),s.push("--json","nameWithOwner,url,sshUrl,isPrivate","--limit",`${t}`);let{stdout:r}=await this.exec(s);return JSON.parse(r).map(o=>({nameWithOwner:o.nameWithOwner,url:o.url,sshUrl:o.sshUrl,isPrivate:o.isPrivate,defaultBranch:"main"}))}async createRepo(e,t){await this.exec(["repo","create",e,t?"--private":"--public","--add-readme"]);let{stdout:s}=await this.exec(["repo","view",e,"--json","nameWithOwner,url,sshUrl,isPrivate"]),r=JSON.parse(s);return{nameWithOwner:r.nameWithOwner,url:r.url,sshUrl:r.sshUrl,isPrivate:r.isPrivate,defaultBranch:"main"}}async createPR(e){let t=["pr","create","--title",e.title,"--body",e.body];e.base&&t.push("--base",e.base),e.head&&t.push("--head",e.head);let{stdout:s}=await this.exec(t,e.cwd),r=s.trim().split(`
261
+ `).pop()||"",n=r.match(/\/pull\/(\d+)/);return{number:n?parseInt(n[1],10):0,url:r,title:e.title}}async listPRs(e){let{stdout:t}=await this.exec(["pr","list","--json","number,title,url,state"],e);return JSON.parse(t)}async getDefaultBranch(e){let{stdout:t}=await this.exec(["repo","view","--json","defaultBranchRef","--jq",".defaultBranchRef.name"],e);return t.trim()||"main"}getConfig(e){let t=this.db.prepare("SELECT * FROM workspace_github WHERE workspaceId = ?").get(e);return t?{workspaceId:t.workspaceId,repoNameWithOwner:t.repoNameWithOwner,repoUrl:t.repoUrl,defaultBranch:t.defaultBranch,connectedAt:t.connectedAt}:null}saveConfig(e){this.db.prepare(`INSERT OR REPLACE INTO workspace_github (workspaceId, repoNameWithOwner, repoUrl, defaultBranch, connectedAt)
262
+ VALUES (?, ?, ?, ?, ?)`).run(e.workspaceId,e.repoNameWithOwner,e.repoUrl,e.defaultBranch,e.connectedAt)}removeConfig(e){this.db.prepare("DELETE FROM workspace_github WHERE workspaceId = ?").run(e)}};function ts(){return{"terminal.open":async(a,e)=>{let t=a;return await e.services.terminalManager.open(t),{ok:!0}},"terminal.write":(a,e)=>{let t=a;return e.services.terminalManager.write(t.id,t.data),{ok:!0}},"terminal.resize":(a,e)=>{let t=a;return e.services.terminalManager.resize(t.id,t.cols,t.rows),{ok:!0}},"terminal.close":(a,e)=>{let t=a;return e.services.terminalManager.close(t.id),{ok:!0}},"terminal.list":(a,e)=>({ok:!0,terminals:e.services.terminalManager.listTerminals()}),"terminal.processes":(a,e)=>({ok:!0,processes:e.services.terminalManager.getAllProcessInfo()}),"terminal.replay":(a,e)=>{let t=a;return{ok:!0,data:e.services.terminalManager.getOutputBuffer(t.id)||""}},"terminal.restart":async(a,e)=>{let t=a;return e.services.terminalManager.close(t.id),await e.services.terminalManager.open(t),{ok:!0}},"terminal.upload":async(a,e)=>{let t=a,s=50*1024*1024;if(Math.ceil(t.fileData.length*3/4)>s)return e.respondError("File too large (max 50MB)"),null;let n=e.services.terminalManager.getCwd(t.terminalId);if(!n)return e.respondError(`Terminal ${t.terminalId} not found or CWD unavailable`),null;let o=await import("node:fs"),i=await import("node:path"),c=i.basename(t.fileName);if(!c||c==="."||c==="..")return e.respondError("Invalid file name"),null;let d=i.resolve(n,c);if(!d.startsWith(n+i.sep)&&d!==n)return e.respondError("Invalid file path"),null;if(o.existsSync(d)){let p=i.extname(c),m=c.slice(0,c.length-p.length),f=1;for(;o.existsSync(d);)d=i.resolve(n,`${m} (${f})${p}`),f++}let l=Buffer.from(t.fileData,"base64");o.writeFileSync(d,l);let u="'"+d.replace(/'/g,"'\\''")+"'";return e.services.terminalManager.write(t.terminalId,u+" "),{ok:!0,path:d}},"terminal.set-color":(a,e)=>{let t=a;if(t.areaId)e.services.areaManager.setTerminalColor(t.terminalId,t.areaId,t.color);else if(e.services.workspaceManager.get(t.workspaceId)){let r=e.services.areaManager.getDefaultArea(t.workspaceId);r&&e.services.areaManager.setTerminalColor(t.terminalId,r.id,t.color)}return{ok:!0}}}}import{WebSocket as Wr}from"ws";function z(a,e){a.readyState===Wr.OPEN&&a.send(JSON.stringify(e))}function Br(a,e,t,s){return new Promise(r=>{let n=Date.now(),o=setInterval(()=>{if(a.outputContains(e,t)){clearInterval(o),r();return}Date.now()-n>s&&(clearInterval(o),r())},200)})}async function re(a,e,t,s){let{terminalManager:r,areaManager:n}=e,o=null;for(let i of a){if(o){let c=!s?.ignoreRunOnce&&i.startRunOnce&&i.hasLaunched;!c&&i.startDelay&&i.startDelay>0&&await new Promise(d=>setTimeout(d,i.startDelay)),!c&&i.startWaitFor&&await Br(r,o,i.startWaitFor,6e4)}await r.open({id:i.id,cwd:i.cwd,command:i.command||void 0,commandSequence:i.commandSequence,env:i.env,cols:120,rows:30,closeAfterCommand:i.closeAfterCommand||void 0,closeDelay:i.closeDelay,closeWaitFor:i.closeWaitFor||void 0},s?.completedStepsProvider?{completedSteps:s.completedStepsProvider(i.id),onStepCompleted:(c,d)=>{s.onStepCompleted?.(c,d)}}:void 0),o=i.id}for(let i of a)n.markTerminalLaunched(i.id)}function ss(){return{"workspace.list":(a,e)=>e.services.workspaceManager.list(),"workspace.get":(a,e)=>{let t=a,s=e.services.workspaceManager.get(t.id);return s||(e.respondError(`Workspace ${t.id} not found`),null)},"workspace.create":(a,e)=>{let t=a;return e.services.workspaceManager.create(t)},"workspace.update":(a,e)=>{let t=a;return e.services.workspaceManager.update(t)},"workspace.delete":(a,e)=>{let t=a;return{deleted:e.services.workspaceManager.delete(t.id)}},"workspace.launch":async(a,e)=>{let t=a,{workspaceManager:s,areaManager:r,portMonitor:n}=e.services,o=s.get(t.id);if(!o)return e.respondError(`Workspace ${t.id} not found`),null;let i=r.getDefaultArea(o.id);if(!i)return e.respondError(`No default area found for workspace ${t.id}`),null;let c=r.resolveForLaunch(i,o.rootDirectory),d=new Map(i.terminals.map(u=>[u.id,u.color||"default"])),l={ok:!0,terminals:c.map(u=>({id:u.id,label:u.label,cwd:u.cwd,position:u.position,color:d.get(u.id)||"default"}))};return e.respond(l),(async()=>{try{await re(c,e.services,i.id,{completedStepsProvider:u=>r.getCompletedSteps(u),onStepCompleted:(u,p)=>{r.markStepCompleted(u,p)}}),r.setRunning(i.id,!0),e.services.broadcast("area.status",{id:i.id,workspaceId:t.id,state:"running"}),s.setRunning(t.id,!0),e.services.broadcast("workspace.status",{id:t.id,state:"running"}),n.startMonitoring(t.id,c.map(u=>u.id)).catch(console.error)}catch(u){console.error("[server] workspace.launch async error:",u)}})(),null},"workspace.getSetupConfig":(a,e)=>{let t=a,{workspaceManager:s,areaManager:r}=e.services,n=s.get(t.id);if(!n)return e.respondError(`Workspace ${t.id} not found`),null;let o=r.getDefaultArea(t.id);return{workspace:{id:n.id,name:n.name,color:n.color,rootDirectory:n.rootDirectory,defaultCommand:n.defaultCommand,terminalCount:n.terminalCount,initGit:n.initGit,createdAt:n.createdAt},area:o?{id:o.id,name:o.name,terminalCount:o.terminalCount,layout:o.layout,defaultCommand:o.defaultCommand}:null,terminals:o?o.terminals.map(i=>({id:i.id,label:i.label,directory:i.directory,command:i.command,commandSequence:i.commandSequence,startDelay:i.startDelay,startWaitFor:i.startWaitFor,startRunOnce:i.startRunOnce,closeAfterCommand:i.closeAfterCommand,closeDelay:i.closeDelay,closeWaitFor:i.closeWaitFor,runOnce:i.runOnce,commandRunOnce:i.commandRunOnce,color:i.color})):[]}},"workspace.relaunch":async(a,e)=>{let t=a,{workspaceManager:s,areaManager:r,terminalManager:n,portMonitor:o}=e.services,i=s.get(t.id);if(!i)return e.respondError(`Workspace ${t.id} not found`),null;let c=r.getDefaultArea(i.id);if(!c)return e.respondError(`No default area found for workspace ${t.id}`),null;let d=r.list(t.id);for(let m of d){for(let f of m.terminals)n.close(f.id);r.setRunning(m.id,!1)}s.setRunning(t.id,!1),o.stopMonitoring(t.id),r.resetAllTerminals(c.id);let l=r.resolveForLaunch(c,i.rootDirectory),u=new Map(c.terminals.map(m=>[m.id,m.color||"default"])),p={ok:!0,terminals:l.map(m=>({id:m.id,label:m.label,cwd:m.cwd,position:m.position,color:u.get(m.id)||"default"}))};return e.respond(p),(async()=>{try{await re(l,e.services,c.id,{ignoreRunOnce:!0,completedStepsProvider:m=>r.getCompletedSteps(m),onStepCompleted:(m,f)=>{r.markStepCompleted(m,f)}}),r.setRunning(c.id,!0),e.services.broadcast("area.status",{id:c.id,workspaceId:t.id,state:"running"}),s.setRunning(t.id,!0),e.services.broadcast("workspace.status",{id:t.id,state:"running"}),o.startMonitoring(t.id,l.map(m=>m.id)).catch(console.error)}catch(m){console.error("[server] workspace.relaunch async error:",m)}})(),null},"workspace.stop":(a,e)=>{let t=a,{workspaceManager:s,areaManager:r,terminalManager:n,portMonitor:o}=e.services,i=s.get(t.id);if(!i)return e.respondError(`Workspace ${t.id} not found`),null;let c=r.list(t.id);for(let d of c){for(let l of d.terminals)n.close(l.id);r.setRunning(d.id,!1),e.services.broadcast("area.status",{id:d.id,workspaceId:t.id,state:"stopped"})}for(let d of i.terminals)n.close(d.id);return s.setRunning(t.id,!1),e.services.broadcast("workspace.status",{id:t.id,state:"stopped"}),o.stopMonitoring(t.id),{ok:!0}}}}function rs(){return{"area.list":(a,e)=>{let t=a;return e.services.areaManager.list(t.workspaceId)},"area.create":(a,e)=>{let t=a;return e.services.areaManager.create(t)},"area.update":(a,e)=>{let t=a;return e.services.areaManager.update(t)},"area.delete":(a,e)=>{let t=a;return{deleted:e.services.areaManager.delete(t.id)}},"area.duplicate":(a,e)=>{let t=a;return e.services.areaManager.duplicate(t.id,t.name)},"area.launch":async(a,e)=>{let t=a,{areaManager:s,workspaceManager:r}=e.services,n=s.get(t.areaId);if(!n)return e.respondError(`Area ${t.areaId} not found`),null;let o=r.get(t.workspaceId);if(!o)return e.respondError(`Workspace ${t.workspaceId} not found`),null;let i=s.resolveForLaunch(n,o.rootDirectory),c=new Map(n.terminals.map(l=>[l.id,l.color||"default"])),d={ok:!0,terminals:i.map(l=>({id:l.id,label:l.label,cwd:l.cwd,position:l.position,color:c.get(l.id)||"default"}))};return e.respond(d),(async()=>{try{await re(i,e.services,t.areaId,{completedStepsProvider:l=>s.getCompletedSteps(l),onStepCompleted:(l,u)=>{s.markStepCompleted(l,u)}}),s.setRunning(t.areaId,!0),r.setRunning(t.workspaceId,!0),e.services.broadcast("area.status",{id:t.areaId,workspaceId:t.workspaceId,state:"running"}),e.services.broadcast("workspace.status",{id:t.workspaceId,state:"running"})}catch(l){console.error("[server] area.launch async error:",l)}})(),null},"area.stop":(a,e)=>{let t=a,{areaManager:s,workspaceManager:r,terminalManager:n}=e.services,o=s.get(t.areaId);if(!o)return e.respondError(`Area ${t.areaId} not found`),null;for(let d of o.terminals)n.close(d.id);return s.setRunning(t.areaId,!1),s.clearRuntimeState(t.areaId),s.list(t.workspaceId).some(d=>d.id!==t.areaId&&s.isRunning(d.id))||(r.setRunning(t.workspaceId,!1),e.services.broadcast("workspace.status",{id:t.workspaceId,state:"stopped"})),e.services.broadcast("area.status",{id:t.areaId,workspaceId:t.workspaceId,state:"stopped"}),{ok:!0}},"area.save-runtime-state":(a,e)=>{let t=a;return e.services.areaManager.saveRuntimeState(t.areaId,t.data),{ok:!0}},"area.get-runtime-state":(a,e)=>{let t=a;return{data:e.services.areaManager.getRuntimeState(t.areaId)}},"area.clear-runtime-state":(a,e)=>{let t=a;return e.services.areaManager.clearRuntimeState(t.areaId),{ok:!0}}}}function ns(){return{"swarm.create":(a,e)=>{let t=a;return e.services.swarmManager.create(t)},"swarm.launch":async(a,e)=>{let t=a;return await e.services.swarmManager.launch(t.id),{ok:!0}},"swarm.stop":(a,e)=>{let t=a;return e.services.swarmManager.stop(t.id),{ok:!0}},"swarm.pause":(a,e)=>{let t=a;return e.services.swarmManager.pause(t.id),{ok:!0}},"swarm.resume":(a,e)=>{let t=a;return e.services.swarmManager.resume(t.id),{ok:!0}},"swarm.status":(a,e)=>{let t=a,s=e.services.swarmManager.get(t.id);return s?{...s,stats:e.services.swarmManager.getStats(t.id)}:(e.respondError(`Swarm ${t.id} not found`),null)},"swarm.list":(a,e)=>{let t=a;return e.services.swarmManager.list(t.workspaceId)},"swarm.delete":(a,e)=>{let t=a;return{deleted:e.services.swarmManager.delete(t.id)}},"swarm.message":(a,e)=>{let t=a;return e.services.swarmManager.message(t.swarmId,t.agentId,t.message),{ok:!0}},"swarm.agent.add":(a,e)=>{let t=a;return e.services.swarmManager.addAgent(t)},"swarm.agent.remove":(a,e)=>{let t=a;return{removed:e.services.swarmManager.removeAgent(t)}},"swarm.agent.update":(a,e)=>{let t=a;return e.services.swarmManager.updateAgent(t)},"orchestrator.topology.set":(a,e)=>{let t=a;return e.services.swarmManager.setTopology(t.swarmId,t.topology),{ok:!0}},"orchestrator.spawn-cli":async(a,e)=>{let t=a;return await e.services.swarmManager.spawnCLI(t.swarmId,t.agentId,t.config)},"orchestrator.escalation.respond":(a,e)=>{let t=a;return e.services.swarmManager.respondToEscalation(t.escalationId,t.response),{ok:!0}}}}import{mkdir as gt,writeFile as Ye,cp as $r}from"node:fs/promises";import{basename as qr,join as F,resolve as Hr}from"node:path";var ne=class{async buildContext(e){let{task:t,agent:s,swarm:r,knowledgeEntries:n,dependencyTasks:o,workspaceDir:i}=e,c=F(i,".swarm","tasks",t.id);await gt(c,{recursive:!0});let d=this.assemblePrompt(t,s,n,o),l=F(c,"CLAUDE.md"),u=this.generateClaudeMd(t,s,r);await Ye(l,u,"utf-8");let p=this.generateTaskMd(t,o);if(await Ye(F(c,"TASK.md"),p,"utf-8"),r?.knowledge&&r.knowledge.length>0){let m=F(c,"knowledge");await gt(m,{recursive:!0});for(let f of r.knowledge)try{let w=qr(f.name),g=Hr(f.path),h=F(m,w);await $r(g,h)}catch{}}return{contextDir:c,prompt:d,claudeMdPath:l}}assemblePrompt(e,t,s,r){let n=[];if(n.push(`# Task: ${e.title}`,""),n.push(e.description,""),n.push("## Agent",""),n.push(`- **Name:** ${t.name}`),n.push(`- **Role:** ${t.role}`),n.push(""),t.workScope&&t.workScope.length>0){n.push("## Work Scope","");for(let o of t.workScope)n.push(`- ${o}`);n.push("")}if(r&&r.length>0){n.push("## Dependencies","");for(let o of r)n.push(`### ${o.title} (${o.status})`),o.output&&n.push("","Output:","",o.output),n.push("")}if(s&&s.length>0){n.push("## Knowledge Base","");for(let o of s)n.push(`- ${o.name} (${o.type}): \`${o.path}\``);n.push("")}switch(n.push(`## Approval Mode: ${e.approvalMode}`,""),e.approvalMode){case"auto":n.push("You may proceed autonomously without waiting for human approval.");break;case"semi":n.push("Proceed with implementation but pause before destructive or irreversible actions.");break;case"manual":n.push("Wait for explicit human approval before making any changes.");break}return n.push(""),n.join(`
263
+ `)}generateClaudeMd(e,t,s){let r=[`# Agent: ${t.name}`,`## Role: ${t.role}`,"","## Mission",e.description,""];return s&&r.push("## Working Directory",s.directory,""),t.systemPrompt&&r.push("## System Prompt",t.systemPrompt,""),t.workScope&&t.workScope.length>0&&r.push("## Work Scope",...t.workScope.map(n=>`- ${n}`),""),r.push("## Current Task",""),r.push(`- **ID:** ${e.id}`),r.push(`- **Title:** ${e.title}`),r.push(`- **Approval Mode:** ${e.approvalMode}`),r.push(""),t.role==="coordinator"&&s&&r.push("## Coordinator Instructions",`You are the coordinator of a swarm of ${s.agents.length} agents.`,"Your job is to orchestrate the other agents to complete the mission.","Monitor their outputs, delegate tasks, and ensure quality.","","## Agents in this Swarm",...s.agents.map(n=>`- ${n.name} (${n.role}): ${n.systemPrompt||"No specific prompt"}`),""),r.join(`
264
+ `)}async buildStandaloneContext(e){let{task:t,prompt:s,workspaceDir:r}=e,n=F(r,".swarm","tasks",t.id);await gt(n,{recursive:!0});let o=this.generateTaskMd(t);await Ye(F(n,"TASK.md"),o,"utf-8");let i=F(n,"CLAUDE.md"),c=[`# Task: ${t.title}`,"","## Mission",s,"","## Current Task",`- **ID:** ${t.id}`,`- **Title:** ${t.title}`,`- **Approval Mode:** ${t.approvalMode}`,""].join(`
265
+ `);return await Ye(i,c,"utf-8"),{contextDir:n,prompt:s,claudeMdPath:i}}generateTaskMd(e,t){let s=[`# Task: ${e.title}`,"",`- **ID:** ${e.id}`,`- **Status:** ${e.status}`,`- **Approval Mode:** ${e.approvalMode}`,`- **Created:** ${e.createdAt}`,"","## Description","",e.description,""];if(t&&t.length>0){s.push("## Dependencies","");for(let r of t){if(s.push(`### ${r.title}`),s.push(`- **ID:** ${r.id}`),s.push(`- **Status:** ${r.status}`),r.output&&s.push("- **Output:**","",r.output),r.filesChanged&&r.filesChanged.length>0){s.push("- **Files Changed:**");for(let n of r.filesChanged)s.push(` - ${n}`)}s.push("")}}return s.join(`
266
+ `)}};function as(){return{"task.create":(a,e)=>{let t=a;return e.services.taskManager.create(t)},"task.update":(a,e)=>{let t=a;return e.services.taskManager.update(t.id,t.updates)},"task.delete":(a,e)=>{let t=a;return{deleted:e.services.taskManager.delete(t.id)}},"task.list":(a,e)=>{let t=a;return e.services.taskManager.list(t)},"task.move":(a,e)=>{let t=a;return e.services.taskManager.move(t.id,t.status)},"task.assign":(a,e)=>{let t=a;return e.services.taskManager.assign(t.id,t.agentId)},"task.run":async(a,e)=>{let t=a,{taskManager:s,terminalManager:r,workspaceManager:n,swarmManager:o,providerRegistry:i}=e.services,c=s.get(t.taskId);if(!c)return e.respondError(`Task ${t.taskId} not found`),null;if(t.terminals&&t.terminals.length>0){let N=c.workspaceId?n.get(c.workspaceId):null,$=t.workspaceDir||N?.rootDirectory||process.cwd(),J=[];for(let q=0;q<t.terminals.length;q++){let v=t.terminals[q],x=`task-${c.id}-${q}-${Date.now()}`,C;if(v.command)C=v.command;else if(v.cli){let B=await new ne().buildStandaloneContext({task:c,cli:v.cli,prompt:v.prompt,workspaceDir:$}),U=i.get(v.cli);C=U?U.buildCommand({mission:B.prompt,cwd:"",autoApprove:v.autoApprove??!1}):v.cli,v.cli==="claude"&&C.startsWith("claude")&&(C=C.replace(/^claude/,"claude -p"))}else C="bash";if(await r.open({id:x,cwd:$,command:C,env:t.env,cols:120,rows:30}),v.command){let Z=v.promptDelay??3e3;if(v.commandSequence&&v.commandSequence.length>0){let B=0;for(let U of v.commandSequence)B+=U.delay,setTimeout(()=>{r.write(x,U.command+"\r")},B);v.prompt&&setTimeout(()=>{r.write(x,v.prompt+"\r")},B+Z)}else v.prompt&&setTimeout(()=>{r.write(x,v.prompt+"\r")},Z)}let de=v.cli||v.command||"shell";s.addTerminal(c.id,x,de,v.prompt,v.autoApprove??!1),J.push(x)}return s.move(c.id,"running"),{taskId:c.id,terminalIds:J,workDir:$}}let d=t.agentId||c.assignedAgentId;if(!d)return e.respondError(`No agent assigned to task ${t.taskId}`),null;if(!c.swarmId)return e.respondError(`Task ${t.taskId} has no swarm`),null;let l=o.get(c.swarmId);if(!l)return e.respondError(`Swarm ${c.swarmId} not found`),null;let u=l.agents.find(N=>N.id===d);if(!u)return e.respondError(`Agent ${d} not found in swarm`),null;let m=t.includeKnowledge!==!1?l.knowledge:void 0,f;t.includeDependencies&&c.dependencies.length>0&&(f=c.dependencies.map(N=>s.get(N)).filter(N=>N!==null));let g=await new ne().buildContext({task:c,agent:u,swarm:l,knowledgeEntries:m,dependencyTasks:f,workspaceDir:l.directory}),h=i.get(u.cli),E=h?h.buildCommand({mission:g.prompt,cwd:"",autoApprove:u.autoApprove||l.autoApprove}):u.cli,T=`task-${c.id}-${d.slice(0,8)}`,L=u.worktreePath||l.directory;return await r.open({id:T,cwd:L,command:E,env:t.env,cols:120,rows:30}),s.update(c.id,{}),s.move(c.id,"running"),s.updateTerminalId(c.id,T),{terminalId:T,terminalIds:[T],taskId:c.id,agentId:d,workDir:l.directory,cwd:L}},"task.stop":(a,e)=>{let t=a,{taskManager:s,terminalManager:r}=e.services,n=s.getTaskTerminals(t.taskId),o=[];for(let i of n)if(i.status==="running"){try{r.close(i.terminalId)}catch{}s.markTerminalExited(t.taskId,i.terminalId,-1),o.push(i.terminalId)}return s.move(t.taskId,"blocked"),e.services.broadcast("task.stopped",{taskId:t.taskId,terminalIds:o}),{taskId:t.taskId,killedTerminals:o}},"task.archive":(a,e)=>{let t=a;return e.services.taskManager.move(t.taskId,"archived")},"task.terminals":(a,e)=>{let t=a;return e.services.taskManager.getTaskTerminals(t.taskId)}}}function os(){return{"knowledge.add":(a,e)=>{let t=a;return e.services.swarmManager.getKnowledgeManager().addEntry(t)},"knowledge.update":(a,e)=>{let t=a;return e.services.swarmManager.getKnowledgeManager().updateEntry(t)},"knowledge.delete":(a,e)=>{let t=a;return e.services.swarmManager.getKnowledgeManager().deleteEntry(t.entryId)},"knowledge.verify":(a,e)=>{let t=a;return e.services.swarmManager.getKnowledgeManager().verifyEntry(t.entryId,t.verified)},"knowledge.search":(a,e)=>{let t=a;return e.services.swarmManager.getKnowledgeManager().search(t)},"knowledge.get-all":(a,e)=>{let t=a;return e.services.swarmManager.getKnowledgeManager().getAllForSwarm(t.swarmId,t.limit)},"mailbox.post":(a,e)=>{let t=a;return e.services.swarmManager.getMailboxManager().post(t)},"mailbox.list":(a,e)=>{let t=a;return e.services.swarmManager.getMailboxManager().list(t)},"mailbox.mark-read":(a,e)=>{let t=a;return e.services.swarmManager.getMailboxManager().markRead(t.messageId,t.agentId),{ok:!0}},"mailbox.get-thread":(a,e)=>{let t=a;return e.services.swarmManager.getMailboxManager().getThread(t.parentMessageId)}}}function is(){return{"settings.list":(a,e)=>{let t=a;return e.services.settingsManager.list(t.category)},"settings.get":(a,e)=>{let t=a;return e.services.settingsManager.get(t.key)},"settings.set":(a,e)=>{let t=a;return e.services.settingsManager.set(t)},"settings.delete":(a,e)=>{let t=a;return{deleted:e.services.settingsManager.delete(t.key)}},"settings.get-secret":(a,e)=>{let t=a;return{value:e.services.settingsManager.getSecret(t.key)}},"workspace.settings.list":(a,e)=>{let t=a;return e.services.settingsManager.listWorkspaceSettings(t.workspaceId)},"workspace.settings.set":(a,e)=>{let t=a;return e.services.settingsManager.setWorkspaceSetting(t)},"workspace.settings.delete":(a,e)=>{let t=a;return{deleted:e.services.settingsManager.deleteWorkspaceSetting(t.workspaceId,t.key)}},"workspace.settings.get-secret":(a,e)=>{let t=a;return{value:e.services.settingsManager.getWorkspaceSecret(t.workspaceId,t.key)}},"workspace.settings.resolved":(a,e)=>{let t=a;return e.services.settingsManager.getResolvedApiKeys(t.workspaceId)},"cli-tools.list":(a,e)=>{let t=a;return e.services.cliToolsManager.list(t.category)},"cli-tools.create":(a,e)=>{let t=a;return e.services.cliToolsManager.create(t)},"cli-tools.update":(a,e)=>{let t=a;return e.services.cliToolsManager.update(t)},"cli-tools.delete":(a,e)=>{let t=a;return{deleted:e.services.cliToolsManager.delete(t.id)}},"cli-tools.health-check":async(a,e)=>{let t=a;return await e.services.cliToolsManager.healthCheck(t.id)},"cli-tools.health-check-all":async(a,e)=>{let t=a;return await e.services.cliToolsManager.healthCheckAll(t.category)}}}function cs(){return{"registry.list-skills":(a,e)=>{let t=a;return e.services.skillsRegistry.listSkills(t.projectDir)},"registry.search-skills":(a,e)=>{let t=a;return e.services.skillsRegistry.searchSkills(t.query)},"registry.install-skill":(a,e)=>{let t=a;return e.services.skillsRegistry.installSkill(t.name,t.projectDir)},"registry.remove-skill":(a,e)=>{let t=a;return e.services.skillsRegistry.removeSkill(t.name,t.projectDir)},"registry.list-bundles":(a,e)=>e.services.skillsRegistry.listBundles(),"registry.install-bundle":(a,e)=>{let t=a;return e.services.skillsRegistry.installBundle(t.bundleId,t.projectDir),{ok:!0}},"registry.list-mcps":(a,e)=>{let t=a;return e.services.skillsRegistry.listMcps(t.projectDir)},"registry.configure-mcp":(a,e)=>{let t=a;return e.services.skillsRegistry.configureMcp(t)}}}function ds(){return{"prd.start":(a,e)=>{let t=a;return e.services.prdBuilder.startSession(t)},"prd.send-message":(a,e)=>{let t=a;return e.services.prdBuilder.sendMessage(t.sessionId,t.message)},"prd.select-engine":(a,e)=>{let t=a;return e.services.prdBuilder.selectEngine(t.sessionId,t.engine)},"prd.select-stack":(a,e)=>{let t=a;return e.services.prdBuilder.selectStack(t.sessionId,t.techs)},"prd.generate":(a,e)=>{let t=a;return e.services.prdBuilder.generate(t.sessionId)},"prd.get":(a,e)=>{let t=a;return e.services.prdBuilder.getSession(t.sessionId)}}}function ls(){return{"browser.session.open":async(a,e)=>{let t=a;return await e.services.browserManager.openSession(t.url)},"browser.session.close":async(a,e)=>{let t=a;return await e.services.browserManager.closeSession(t.sessionId),{ok:!0}},"browser.tab.open":async(a,e)=>{let t=a;return await e.services.browserManager.openTab(t.sessionId,t.url)},"browser.tab.close":async(a,e)=>{let t=a;return await e.services.browserManager.closeTab(t.sessionId,t.tabId),{ok:!0}},"browser.tab.navigate":async(a,e)=>{let t=a;return await e.services.browserManager.navigateTab(t.sessionId,t.tabId,t.url),{ok:!0}},"browser.tab.activate":async(a,e)=>{let t=a;return await e.services.browserManager.activateTab(t.sessionId,t.tabId),{ok:!0}},"browser.tab.back":async(a,e)=>{let t=a;return await e.services.browserManager.goBack(t.sessionId,t.tabId),{ok:!0}},"browser.tab.forward":async(a,e)=>{let t=a;return await e.services.browserManager.goForward(t.sessionId,t.tabId),{ok:!0}},"browser.tab.refresh":async(a,e)=>{let t=a;return await e.services.browserManager.refresh(t.sessionId,t.tabId),{ok:!0}},"browser.input":async(a,e)=>{let t=a;return await e.services.browserManager.sendInput(t.sessionId,t.tabId,t.event),{ok:!0}},"browser.screencast.ack":async(a,e)=>{let t=a;return await e.services.browserManager.ackFrame(t.sessionId,t.tabId,t.frameNumber),{ok:!0}}}}import*as W from"node:fs";import*as ze from"node:os";import*as b from"node:path";import us from"node:fs";import ps from"node:path";import{spawn as Xr}from"node:child_process";var Kr={"Cursor.app":"cursor","Visual Studio Code.app":"vscode","Visual Studio Code - Insiders.app":"vscode-insiders","VSCodium.app":"vscodium","Zed.app":"zed","Windsurf.app":"windsurf","Sublime Text.app":"sublime"},ht=class{detectInstalledEditors(){let e=new Set,t=(process.env.PATH||"").split(ps.delimiter),s=process.platform==="darwin";for(let r of dt){if(r.command===null){r.id==="finder"&&s&&e.add("finder"),r.id==="terminal"&&e.add("terminal");continue}for(let n of t)try{if(us.existsSync(ps.join(n,r.command))){e.add(r.id);break}}catch{}}if(s)try{let r=us.readdirSync("/Applications");for(let n of r){let o=Kr[n];o&&!e.has(o)&&e.add(o)}}catch{}return Array.from(e)}openInEditor(e,t){try{let s=dt.find(i=>i.id===e);if(!s)return{ok:!1,error:`Unknown editor: ${e}`};let r,n;return e==="finder"?(r="open",n=[t]):e==="terminal"?(r="open",n=["-a","Terminal",t]):(r=s.command,n=[t]),Xr(r,n,{detached:!0,stdio:"ignore"}).unref(),{ok:!0}}catch(s){return{ok:!1,error:s instanceof Error?s.message:String(s)}}}},ft=new ht;function ms(){return{"tunnel.status":async(a,e)=>await e.services.tunnel.getStatus(),"tunnel.start":async(a,e)=>{let t=a;return await e.services.tunnel.startTunnel(t.config),{ok:!0}},"tunnel.stop":(a,e)=>(e.services.tunnel.stopTunnel(),{ok:!0}),"tunnel.url":(a,e)=>({url:e.services.tunnel.getUrl()}),"portTunnels.start":async(a,e)=>{let t=a;return await e.services.portTunnelManager.startTunnel(t.port,t.protocol),{ok:!0}},"portTunnels.stop":(a,e)=>{let t=a;return e.services.portTunnelManager.stopTunnel(t.port),{ok:!0}},"portTunnels.list":(a,e)=>({tunnels:e.services.portTunnelManager.getTunnels()}),"ports.list":(a,e)=>{let t=a;return e.services.portMonitor.listPorts(t.workspaceId)},"ports.list-all":(a,e)=>e.services.portMonitor.listAllWorkspacePorts(),"ports.list-system":async(a,e)=>await e.services.portMonitor.listSystemPorts(),"ports.kill":async(a,e)=>{let t=a;return await e.services.portMonitor.killPort(t.port,t.pid)},"ports.start-monitor":async(a,e)=>{let t=a;return await e.services.portMonitor.startMonitoring(t.workspaceId,t.terminalIds||[]),{ok:!0}},"ports.stop-monitor":(a,e)=>{let t=a;return e.services.portMonitor.stopMonitoring(t.workspaceId),{ok:!0}},"system.listDir":a=>{let e=a,t=ze.homedir(),s=e.path||t;s==="~"?s=t:s.startsWith("~/")&&(s=b.join(t,s.slice(2))),s=b.resolve(s);try{let r=W.readdirSync(s),n=[];for(let o of r){if(!e.showHidden&&o.startsWith("."))continue;let i=b.join(s,o);try{W.statSync(i).isDirectory()&&n.push({name:o,path:i})}catch{}}return n.sort((o,i)=>o.name.localeCompare(i.name)),{current:s,parent:b.dirname(s),home:t,dirs:n}}catch(r){return{current:s,parent:b.dirname(s),home:t,dirs:[],error:r.message}}},"system.createDir":a=>{let t=a.path,s=ze.homedir();t.startsWith("~/")&&(t=b.join(s,t.slice(2))),t=b.resolve(t);try{return W.mkdirSync(t,{recursive:!0}),{ok:!0,path:t}}catch(r){return{ok:!1,error:r.message}}},"system.homeDir":()=>{let a=ze.homedir(),e=[{name:"Home",path:a},{name:"Desktop",path:b.join(a,"Desktop")},{name:"Documents",path:b.join(a,"Documents")},{name:"Downloads",path:b.join(a,"Downloads")},{name:"Development",path:b.join(a,"Development")},{name:"Development",path:b.join(a,"Documents","Development")},{name:"Projects",path:b.join(a,"Projects")},{name:"/",path:"/"}],t=[],s=new Set;for(let r of e){if(s.has(r.name)){if(!t.find(n=>n.name===r.name))try{W.statSync(r.path),t.push(r),s.add(r.name)}catch{}continue}try{W.statSync(r.path),t.push(r),s.add(r.name)}catch{}}return t.find(r=>r.path==="/")||t.push({name:"/",path:"/"}),{home:a,shortcuts:t}},"system.detect-clis":async(a,e)=>await e.services.providerRegistry.detectInstalled(),"system.health-check":async(a,e)=>{let t=a;return t?.cli?{providers:[await e.services.healthCheckService.checkOne(t.cli)],checkedAt:new Date().toISOString()}:await e.services.healthCheckService.checkAll()},"notifications.list":(a,e)=>e.services.notificationService.list(),"notifications.clear":(a,e)=>{let t=a;return e.services.notificationService.clear(t?.id),{ok:!0}},"notifications.mark-read":(a,e)=>{let t=a;return e.services.notificationService.markRead(t.id),{ok:!0}},"ide.list":()=>({editors:ft.detectInstalledEditors()}),"ide.open":a=>{let e=a;return ft.openInEditor(e.editor,e.cwd)},ping:()=>({ok:!0,ts:Date.now()})}}function gs(){return{"wireframe.list":(a,e)=>{let t=a;return e.services.wireframeManager.list(t.projectDir)},"wireframe.get":(a,e)=>{let t=a;return e.services.wireframeManager.get(t.projectDir,t.id)},"wireframe.create":(a,e)=>{let t=a;return e.services.wireframeManager.create(t.projectDir,{name:t.name,content:t.content,description:t.description})},"wireframe.update":(a,e)=>{let t=a;return e.services.wireframeManager.update(t.projectDir,t.id,t.content)},"wireframe.delete":(a,e)=>{let t=a;return e.services.wireframeManager.delete(t.projectDir,t.id),{ok:!0}},"wireframe.generate":(a,e)=>{let t=a;return e.services.wireframeManager.generate(t.projectDir,t.id,t.description)},"template.list":(a,e)=>e.services.templateManager.list(),"template.create":(a,e)=>{let t=a;return e.services.templateManager.create(t)},"template.update":(a,e)=>{let t=a;return e.services.templateManager.update(t)},"template.delete":(a,e)=>{let t=a;return{deleted:e.services.templateManager.delete(t.id)}},"layout.list":(a,e)=>{let t=a;return e.services.layoutManager.list(t.areaId||t.workspaceId)},"layout.save":(a,e)=>{let t=a;return e.services.layoutManager.save(t.areaId?{...t,workspaceId:t.areaId}:t)},"layout.update":(a,e)=>{let t=a;return e.services.layoutManager.update(t.id,t)},"layout.delete":(a,e)=>{let t=a;return{ok:e.services.layoutManager.delete(t.id)}},"layout.setDefault":(a,e)=>{let t=a;return e.services.layoutManager.setDefault(t.areaId||t.workspaceId,t.layoutId),{ok:!0}}}}import{readdir as hs,stat as wt,readFile as jr,writeFile as Gr,mkdir as Vr}from"node:fs/promises";import{join as Et,resolve as P,relative as Yr}from"node:path";function fs(){return{"workspace.file.glob":async(a,e)=>{let t=a,s=e.services.workspaceManager.get(t.workspaceId);if(!s)return e.respondError("Workspace not found"),null;let r=s.rootDirectory,n=new Set(["node_modules",".git","dist","build",".swarm","__pycache__",".next",".turbo"]),o=new Set([".png",".jpg",".jpeg",".gif",".ico",".woff",".woff2",".ttf",".eot",".pdf",".zip",".tar",".gz",".bz2",".mp3",".mp4",".mov",".avi",".webm",".webp",".svg"]),i=t.limit??50,c=t.pattern?.toLowerCase()||"",d=[];async function l(u){if(d.length>=i*5)return;let p;try{p=await hs(u,{withFileTypes:!0})}catch{return}for(let m of p){if(d.length>=i*5)return;if(n.has(m.name)||m.isSymbolicLink())continue;let f=Et(u,m.name);if(m.isDirectory())await l(f);else if(m.isFile()){let w="."+(m.name.split(".").pop()?.toLowerCase()||"");if(o.has(w))continue;let g=Yr(r,f);if(c&&!g.toLowerCase().includes(c)&&!m.name.toLowerCase().includes(c))continue;try{let h=await wt(f);d.push({path:g,basename:m.name,size:h.size,modifiedAt:h.mtime.toISOString()})}catch{}}}}return await l(r),d.sort((u,p)=>p.modifiedAt.localeCompare(u.modifiedAt)),{files:d.slice(0,i)}},"workspace.file.read":async(a,e)=>{let t=a,s=e.services.workspaceManager.get(t.workspaceId);if(!s)return e.respondError("Workspace not found"),null;let r=s.rootDirectory,n=t.maxSize??1048576,o=P(r,t.filePath);if(!o.startsWith(P(r)+"/")&&o!==P(r))return e.respondError("Path traversal not allowed"),null;try{let i=await wt(o);if(i.size>n)return e.respondError(`File too large: ${i.size} bytes (max ${n})`),null;let c=await jr(o,"utf-8"),d=Ht(o);return{content:c,language:d,size:i.size,path:t.filePath}}catch(i){let c=i instanceof Error?i.message:"Failed to read file";return e.respondError(c),null}},"workspace.file.tree":async(a,e)=>{let t=a,s=e.services.workspaceManager.get(t.workspaceId);if(!s)return e.respondError("Workspace not found"),null;let r=s.rootDirectory,n=t.path??".",o=t.depth??3,i=P(r,n);if(!i.startsWith(P(r)+"/")&&i!==P(r))return e.respondError("Path traversal not allowed"),null;let c=new Set(["node_modules",".git","dist","build","coverage",".next","__pycache__",".cache",".turbo",".DS_Store"]);async function d(l,u,p){if(p<=0)return[];let m;try{m=await hs(l,{withFileTypes:!0})}catch{return[]}let f=[],w=[],g=[];for(let h of m)c.has(h.name)||h.isSymbolicLink()||(h.isDirectory()?w.push(h):h.isFile()&&g.push(h));w.sort((h,E)=>h.name.toLowerCase().localeCompare(E.name.toLowerCase())),g.sort((h,E)=>h.name.toLowerCase().localeCompare(E.name.toLowerCase()));for(let h of[...w,...g]){let E=Et(l,h.name),T=u?`${u}/${h.name}`:h.name;if(h.isDirectory()){let L=await d(E,T,p-1);f.push({name:h.name,path:T,type:"directory",children:L})}else{let L;try{L=(await wt(E)).size}catch{}f.push({name:h.name,path:T,type:"file",size:L})}}return f}try{let l=n==="."?"":n.replace(/^\/+/,"");return{entries:await d(i,l,o)}}catch(l){let u=l instanceof Error?l.message:"Failed to read directory";return e.respondError(u),null}},"workspace.file.write":async(a,e)=>{let t=a,s=e.services.workspaceManager.get(t.workspaceId);if(!s)return e.respondError("Workspace not found"),null;let r=s.rootDirectory,n=P(r,t.filePath);if(!n.startsWith(P(r)+"/")&&n!==P(r))return e.respondError("Path traversal not allowed"),null;let o=5242880;if(t.content.length>o)return e.respondError(`Content too large: ${t.content.length} bytes (max ${o})`),null;try{let i=Et(n,"..");return await Vr(i,{recursive:!0}),await Gr(n,t.content,"utf-8"),{ok:!0,size:t.content.length,path:t.filePath}}catch(i){let c=i instanceof Error?i.message:"Failed to write file";return e.respondError(c),null}}}}function ws(){return{"git.isGitRepo":async(a,e)=>{let t=a;return{isGitRepo:await e.services.gitManager.isGitRepo(t.cwd)}},"git.init":async(a,e)=>{let t=a;return e.services.gitManager.init(t.cwd)},"git.status":async(a,e)=>{let t=a;return e.services.gitManager.status(t.cwd)},"git.diff":async(a,e)=>{let t=a;return e.services.gitManager.diff(t.cwd,t.staged)},"git.commit":async(a,e)=>{let t=a;return e.services.gitManager.commit(t)},"git.push":async(a,e)=>{let t=a;return e.services.gitManager.push(t)},"git.branches":async(a,e)=>{let t=a;return e.services.gitManager.branches(t.cwd)},"git.createBranch":async(a,e)=>{let t=a;return e.services.gitManager.createBranch(t.cwd,t.name)},"git.checkout":async(a,e)=>{let t=a;return e.services.gitManager.checkoutBranch(t.cwd,t.name)},"git.log":async(a,e)=>{let t=a;return e.services.gitManager.log(t.cwd,t.limit)},"github.authStatus":async(a,e)=>e.services.gitHubCliManager.checkAuth(),"github.listRepos":async(a,e)=>{let t=a;return e.services.gitHubCliManager.listRepos(t)},"github.createRepo":async(a,e)=>{let t=a;return e.services.gitHubCliManager.createRepo(t.name,t.isPrivate)},"github.createPR":async(a,e)=>{let t=a;return e.services.gitHubCliManager.createPR(t)},"github.listPRs":async(a,e)=>{let t=a;return e.services.gitHubCliManager.listPRs(t.cwd)},"github.getConfig":(a,e)=>{let t=a;return e.services.gitHubCliManager.getConfig(t.workspaceId)},"github.saveConfig":(a,e)=>{let t=a;return e.services.gitHubCliManager.saveConfig({workspaceId:t.workspaceId,repoNameWithOwner:t.repoNameWithOwner,repoUrl:t.repoUrl,defaultBranch:t.defaultBranch,connectedAt:new Date().toISOString()}),{ok:!0}},"github.removeConfig":(a,e)=>{let t=a;return e.services.gitHubCliManager.removeConfig(t.workspaceId),{ok:!0}}}}function Es(){return{"browser.design.inspect":async(a,e)=>{let t=a;return await e.services.browserManager.inspectElementAt(t.sessionId,t.tabId,t.x,t.y)},"browser.design.highlight":async(a,e)=>{let t=a;return await e.services.browserManager.highlightElementAt(t.sessionId,t.tabId,t.x,t.y,t.enabled),{ok:!0}},"browser.design.screenshot":async(a,e)=>{let t=a;return await e.services.browserManager.screenshotRegion(t.sessionId,t.tabId,t.clip)}}}function Ts(){return{...ts(),...ss(),...rs(),...ns(),...as(),...os(),...is(),...cs(),...ds(),...ls(),...ms(),...gs(),...fs(),...ws(),...Es()}}var Zr=new Set(["127.0.0.1","::1","::ffff:127.0.0.1","localhost"]);function Qr(a){let e=a.socket.remoteAddress;return e?Zr.has(e):!1}function en(a){try{return new URL(a.url||"/",`http://${a.headers.host||"localhost"}`).searchParams.get("token")}catch{return null}}function Ss(a,e){let t={fn:()=>{}},s={mgr:null},r=new Fe((S,k)=>t.fn(S,k)),n=new zr({server:a,path:"/ws",verifyClient:(S,k)=>{if(Qr(S.req)){k(!0);return}if(r.isActive()){let A=en(S.req);r.validateToken(A)?k(!0):k(!1,401,"Unauthorized: invalid or missing token");return}k(!1,403,"Remote connections not allowed without tunnel")}}),o=[],i=new Set,c=new WeakMap,d,l,u=setInterval(()=>{for(let S of i){if(!c.get(S)){S.terminate();continue}c.set(S,!1),S.ping()}},3e4);n.on("close",()=>{clearInterval(u),de.dispose()});function p(S,k){let le=JSON.stringify({type:"push",channel:S,data:k});for(let y of i)y.readyState===Jr.OPEN&&y.send(le);for(let y of o)try{y(le)}catch{}if(S==="terminal.output"){let y=k;T.onTerminalOutput(y.id,y.data)}if(S==="terminal.exited"){let y=k,I=R.getTaskByTerminalId(y.id);if(I&&I.status==="running"){let{allDone:Qe,hasError:ue}=R.markTerminalExited(I.id,y.id,y.exitCode);if(p("task.terminal.exited",{taskId:I.id,terminalId:y.id,exitCode:y.exitCode,allDone:Qe}),Qe){let H=ue?"blocked":"waiting";R.move(I.id,H)}}}if(S==="ports.update"&&s.mgr)try{let y=k;s.mgr.cleanupStaleTunnels(y.ports.map(I=>I.port))}catch(y){console.error("[PortTunnelManager] cleanup error:",y)}if(S==="terminal.process"){let y=k;if(y.process.isIdle){let I=R.getTaskByTerminalId(y.id);if(I&&I.status==="running"){let ue=R.getTaskTerminals(I.id).find(H=>H.terminalId===y.id);if(ue&&ue.status==="running"){let{allDone:H,hasError:Ms}=R.markTerminalExited(I.id,y.id,0);if(p("task.terminal.exited",{taskId:I.id,terminalId:y.id,exitCode:0,allDone:H}),H){let Ls=Ms?"blocked":"waiting";R.move(I.id,Ls)}}}}}}e.prepare("UPDATE workspace_state SET isRunning = 0").run();let m=new me(p),f=new he(e),w=new ge(e,f),g=new Ae,h=new De(e),E=new Pe(e),T=new be(e,m,p,g),L=new Ie,R=new Re(e,p),N=new Ne(p),$=new Ue(p),J=new _e(p,S=>{let k=m.getProcessInfo(S);return k&&k.pid>0?k.pid:null});t.fn=p;let ce=new We((S,k)=>t.fn(S,k));s.mgr=ce;let q=new qe(p),v=new He(e),x=new Xe(e),C=new je(p),de=new Ke((S,k)=>{if(p(S,k),S==="notification.new"){let A=k;C.add(A.type,A.title,A.message,A.source)}}),Z=new Ge,B=new Ve(e);T.setTaskManager(R),T.setSettingsManager(h);let U={terminalManager:m,workspaceManager:w,areaManager:f,swarmManager:T,skillsRegistry:L,taskManager:R,providerRegistry:g,prdBuilder:N,settingsManager:h,cliToolsManager:E,browserManager:$,tunnel:r,portTunnelManager:ce,wireframeManager:q,templateManager:v,layoutManager:x,healthCheckService:de,notificationService:C,portMonitor:J,gitManager:Z,gitHubCliManager:B,broadcast:p},Ze=Ts();return n.on("connection",(S,k)=>{i.add(S),c.set(S,!0),S.on("pong",()=>{c.set(S,!0)});let A=!1;d&&(clearTimeout(d),d=void 0,A=!0),l&&(clearTimeout(l),l=void 0,A=!0),A&&console.log("[server] Client reconnected \u2014 cancelling cleanup timers"),S.on("message",le=>{let y;try{y=JSON.parse(le.toString())}catch{return}Tt(y,S,U,Ze)}),S.on("close",()=>{i.delete(S),i.size===0&&(console.log("[server] All clients disconnected \u2014 starting grace periods"),d=setTimeout(()=>{console.log("[server] 30s grace expired \u2014 cleaning up non-critical resources"),$.stopAll(),J.dispose(),ce.stopAll(),d=void 0},3e4),l=setTimeout(()=>{console.log("[server] 4h timeout \u2014 closing all terminals"),m.closeAll(),e.prepare("UPDATE workspace_state SET isRunning = 0").run(),e.prepare("UPDATE area_state SET isRunning = 0").run(),e.prepare("DELETE FROM area_runtime_state").run(),l=void 0},14400*1e3))})}),{wss:n,terminalManager:m,workspaceManager:w,swarmManager:T,settingsManager:h,broadcast:p,externalSenders:o,services:U,routes:Ze}}async function Tt(a,e,t,s){let{id:r,method:n,params:o}=a,i=s[n];if(!i){z(e,{id:r,error:{message:`Unknown method: ${n}`}});return}let c=!1,d={ws:e,id:r,services:t,respond:l=>{c=!0,z(e,{id:r,result:l})},respondError:l=>{c=!0,z(e,{id:r,error:{message:l}})}};try{let l=await i(o,d);!c&&l!==null&&l!==void 0&&z(e,{id:r,result:l})}catch(l){if(!c){let u=l instanceof Error?l.message.replace(/\/Users\/[^\s]+/g,"[path]").replace(/\/home\/[^\s]+/g,"[path]"):"Unknown error";z(e,{id:r,error:{message:u}})}}}import{DatabaseSync as tn}from"node:sqlite";import{mkdirSync as sn,existsSync as rn}from"node:fs";import{join as ys}from"node:path";import{homedir as nn}from"node:os";import{randomUUID as an}from"node:crypto";var St=ys(nn(),".impactus-swarm"),on=ys(St,"swarm.db");function vs(){rn(St)||sn(St,{recursive:!0});let a=new tn(on);a.exec("PRAGMA journal_mode = WAL"),a.exec("PRAGMA foreign_keys = ON"),a.exec(`
267
+ CREATE TABLE IF NOT EXISTS workspaces (
268
+ id TEXT PRIMARY KEY,
269
+ name TEXT NOT NULL,
270
+ icon TEXT NOT NULL DEFAULT '',
271
+ color TEXT NOT NULL DEFAULT '#7C3AED',
272
+ rootDirectory TEXT NOT NULL,
273
+ defaultCommand TEXT NOT NULL DEFAULT '',
274
+ terminalCount INTEGER NOT NULL DEFAULT 1,
275
+ layout TEXT NOT NULL DEFAULT 'auto',
276
+ "order" INTEGER NOT NULL DEFAULT 0,
277
+ createdAt TEXT NOT NULL,
278
+ updatedAt TEXT NOT NULL
279
+ )
280
+ `),a.exec(`
281
+ CREATE TABLE IF NOT EXISTS terminal_configs (
282
+ id TEXT PRIMARY KEY,
283
+ workspaceId TEXT NOT NULL,
284
+ label TEXT NOT NULL DEFAULT '',
285
+ directory TEXT NOT NULL DEFAULT '',
286
+ command TEXT NOT NULL DEFAULT '',
287
+ env TEXT NOT NULL DEFAULT '{}',
288
+ position INTEGER NOT NULL DEFAULT 0,
289
+ commandSequence TEXT NOT NULL DEFAULT '[]',
290
+ runOnce INTEGER NOT NULL DEFAULT 0,
291
+ hasLaunched INTEGER NOT NULL DEFAULT 0,
292
+ completedSteps TEXT NOT NULL DEFAULT '[]',
293
+ FOREIGN KEY (workspaceId) REFERENCES workspaces(id) ON DELETE CASCADE
294
+ )
295
+ `);try{a.exec("ALTER TABLE terminal_configs ADD COLUMN commandSequence TEXT NOT NULL DEFAULT '[]'")}catch{}try{a.exec("ALTER TABLE terminal_configs ADD COLUMN runOnce INTEGER NOT NULL DEFAULT 0")}catch{}try{a.exec("ALTER TABLE terminal_configs ADD COLUMN hasLaunched INTEGER NOT NULL DEFAULT 0")}catch{}try{a.exec("ALTER TABLE terminal_configs ADD COLUMN completedSteps TEXT NOT NULL DEFAULT '[]'")}catch{}try{a.exec("ALTER TABLE terminal_configs ADD COLUMN startDelay INTEGER NOT NULL DEFAULT 0")}catch{}try{a.exec("ALTER TABLE terminal_configs ADD COLUMN startWaitFor TEXT NOT NULL DEFAULT ''")}catch{}try{a.exec("ALTER TABLE terminal_configs ADD COLUMN startRunOnce INTEGER NOT NULL DEFAULT 0")}catch{}try{a.exec("ALTER TABLE terminal_configs ADD COLUMN commandRunOnce INTEGER NOT NULL DEFAULT 0")}catch{}try{a.exec("ALTER TABLE terminal_configs ADD COLUMN closeAfterCommand INTEGER NOT NULL DEFAULT 0")}catch{}try{a.exec("ALTER TABLE terminal_configs ADD COLUMN closeDelay INTEGER NOT NULL DEFAULT 1000")}catch{}try{a.exec("ALTER TABLE terminal_configs ADD COLUMN closeWaitFor TEXT NOT NULL DEFAULT ''")}catch{}try{a.exec("ALTER TABLE terminal_configs ADD COLUMN color TEXT NOT NULL DEFAULT 'default'")}catch{}a.exec(`
296
+ CREATE TABLE IF NOT EXISTS workspace_state (
297
+ workspaceId TEXT PRIMARY KEY,
298
+ isRunning INTEGER NOT NULL DEFAULT 0,
299
+ lastLaunchedAt TEXT,
300
+ FOREIGN KEY (workspaceId) REFERENCES workspaces(id) ON DELETE CASCADE
301
+ )
302
+ `),a.exec(`
303
+ CREATE TABLE IF NOT EXISTS command_templates (
304
+ id TEXT PRIMARY KEY,
305
+ name TEXT NOT NULL,
306
+ description TEXT NOT NULL DEFAULT '',
307
+ command TEXT NOT NULL DEFAULT '',
308
+ steps TEXT NOT NULL DEFAULT '[]',
309
+ createdAt TEXT NOT NULL,
310
+ updatedAt TEXT NOT NULL
311
+ )
312
+ `),a.exec(`
313
+ CREATE TABLE IF NOT EXISTS swarms (
314
+ id TEXT PRIMARY KEY,
315
+ workspaceId TEXT NOT NULL,
316
+ name TEXT NOT NULL,
317
+ mission TEXT NOT NULL,
318
+ directory TEXT NOT NULL,
319
+ knowledge TEXT NOT NULL DEFAULT '[]',
320
+ status TEXT NOT NULL DEFAULT 'draft',
321
+ presetSize TEXT,
322
+ cliForAll TEXT,
323
+ autoApprove INTEGER NOT NULL DEFAULT 0,
324
+ useWorktrees INTEGER NOT NULL DEFAULT 0,
325
+ createdAt TEXT NOT NULL,
326
+ launchedAt TEXT,
327
+ stoppedAt TEXT,
328
+ FOREIGN KEY (workspaceId) REFERENCES workspaces(id) ON DELETE CASCADE
329
+ )
330
+ `);try{a.exec("ALTER TABLE swarms ADD COLUMN useWorktrees INTEGER NOT NULL DEFAULT 0")}catch{}a.exec(`
331
+ CREATE TABLE IF NOT EXISTS swarm_agents (
332
+ id TEXT PRIMARY KEY,
333
+ swarmId TEXT NOT NULL,
334
+ "index" INTEGER NOT NULL,
335
+ name TEXT NOT NULL,
336
+ role TEXT NOT NULL,
337
+ cli TEXT NOT NULL,
338
+ status TEXT NOT NULL DEFAULT 'idle',
339
+ autoApprove INTEGER NOT NULL DEFAULT 0,
340
+ systemPrompt TEXT,
341
+ skills TEXT NOT NULL DEFAULT '[]',
342
+ mcps TEXT NOT NULL DEFAULT '[]',
343
+ workScope TEXT,
344
+ worktreeBranch TEXT,
345
+ worktreePath TEXT,
346
+ createdAt TEXT NOT NULL,
347
+ FOREIGN KEY (swarmId) REFERENCES swarms(id) ON DELETE CASCADE
348
+ )
349
+ `);try{a.exec("ALTER TABLE swarm_agents ADD COLUMN worktreeBranch TEXT")}catch{}try{a.exec("ALTER TABLE swarm_agents ADD COLUMN worktreePath TEXT")}catch{}a.exec(`
350
+ CREATE TABLE IF NOT EXISTS swarm_knowledge (
351
+ id TEXT PRIMARY KEY,
352
+ swarmId TEXT NOT NULL,
353
+ name TEXT NOT NULL,
354
+ path TEXT NOT NULL,
355
+ type TEXT NOT NULL,
356
+ FOREIGN KEY (swarmId) REFERENCES swarms(id) ON DELETE CASCADE
357
+ )
358
+ `),a.exec(`
359
+ CREATE TABLE IF NOT EXISTS swarm_console (
360
+ id TEXT PRIMARY KEY,
361
+ swarmId TEXT NOT NULL,
362
+ agentId TEXT,
363
+ agentName TEXT,
364
+ agentRole TEXT,
365
+ message TEXT NOT NULL,
366
+ source TEXT NOT NULL DEFAULT 'system',
367
+ timestamp TEXT NOT NULL,
368
+ FOREIGN KEY (swarmId) REFERENCES swarms(id) ON DELETE CASCADE
369
+ )
370
+ `),a.exec(`
371
+ CREATE TABLE IF NOT EXISTS swarm_knowledge_entries (
372
+ id TEXT PRIMARY KEY,
373
+ swarmId TEXT NOT NULL,
374
+ agentId TEXT,
375
+ agentName TEXT,
376
+ category TEXT NOT NULL,
377
+ title TEXT NOT NULL,
378
+ content TEXT NOT NULL,
379
+ metadata TEXT NOT NULL DEFAULT '{}',
380
+ createdAt TEXT NOT NULL,
381
+ updatedAt TEXT NOT NULL,
382
+ confidence INTEGER NOT NULL DEFAULT 50,
383
+ relatedEntryIds TEXT NOT NULL DEFAULT '[]',
384
+ isVerified INTEGER NOT NULL DEFAULT 0,
385
+ FOREIGN KEY (swarmId) REFERENCES swarms(id) ON DELETE CASCADE
386
+ )
387
+ `),a.exec("CREATE INDEX IF NOT EXISTS idx_ke_swarm_cat ON swarm_knowledge_entries(swarmId, category)"),a.exec("CREATE INDEX IF NOT EXISTS idx_ke_created ON swarm_knowledge_entries(createdAt DESC)"),a.exec(`
388
+ CREATE TABLE IF NOT EXISTS swarm_knowledge_tags (
389
+ entryId TEXT NOT NULL,
390
+ tag TEXT NOT NULL,
391
+ PRIMARY KEY (entryId, tag),
392
+ FOREIGN KEY (entryId) REFERENCES swarm_knowledge_entries(id) ON DELETE CASCADE
393
+ )
394
+ `),a.exec("CREATE INDEX IF NOT EXISTS idx_kt_tag ON swarm_knowledge_tags(tag)"),a.exec(`
395
+ CREATE TABLE IF NOT EXISTS swarm_mailbox (
396
+ id TEXT PRIMARY KEY,
397
+ swarmId TEXT NOT NULL,
398
+ agentId TEXT NOT NULL,
399
+ agentName TEXT NOT NULL,
400
+ agentRole TEXT NOT NULL,
401
+ type TEXT NOT NULL,
402
+ title TEXT NOT NULL,
403
+ content TEXT NOT NULL,
404
+ priority TEXT NOT NULL DEFAULT 'normal',
405
+ tags TEXT NOT NULL DEFAULT '[]',
406
+ parentMessageId TEXT,
407
+ attachments TEXT NOT NULL DEFAULT '[]',
408
+ timestamp TEXT NOT NULL,
409
+ readBy TEXT NOT NULL DEFAULT '[]',
410
+ createdAt TEXT NOT NULL,
411
+ FOREIGN KEY (swarmId) REFERENCES swarms(id) ON DELETE CASCADE
412
+ )
413
+ `),a.exec("CREATE INDEX IF NOT EXISTS idx_mb_swarm ON swarm_mailbox(swarmId, timestamp DESC)"),a.exec("CREATE INDEX IF NOT EXISTS idx_mb_type ON swarm_mailbox(swarmId, type)"),a.exec("CREATE INDEX IF NOT EXISTS idx_mb_agent ON swarm_mailbox(agentId)"),a.exec("CREATE INDEX IF NOT EXISTS idx_mb_parent ON swarm_mailbox(parentMessageId)"),a.exec(`
414
+ CREATE TABLE IF NOT EXISTS tasks (
415
+ id TEXT PRIMARY KEY,
416
+ swarmId TEXT,
417
+ workspaceId TEXT NOT NULL,
418
+ title TEXT NOT NULL,
419
+ description TEXT NOT NULL DEFAULT '',
420
+ assignedAgentId TEXT,
421
+ useWorktree INTEGER NOT NULL DEFAULT 0,
422
+ status TEXT NOT NULL DEFAULT 'todo',
423
+ approvalMode TEXT NOT NULL DEFAULT 'auto',
424
+ terminalId TEXT,
425
+ output TEXT,
426
+ filesChanged TEXT NOT NULL DEFAULT '[]',
427
+ createdAt TEXT NOT NULL,
428
+ updatedAt TEXT NOT NULL,
429
+ completedAt TEXT
430
+ )
431
+ `),a.exec(`
432
+ CREATE TABLE IF NOT EXISTS task_attachments (
433
+ id TEXT PRIMARY KEY,
434
+ taskId TEXT NOT NULL,
435
+ type TEXT NOT NULL DEFAULT 'screenshot',
436
+ data TEXT NOT NULL,
437
+ width INTEGER NOT NULL,
438
+ height INTEGER NOT NULL,
439
+ label TEXT,
440
+ createdAt TEXT NOT NULL,
441
+ FOREIGN KEY (taskId) REFERENCES tasks(id) ON DELETE CASCADE
442
+ )
443
+ `),a.exec(`
444
+ CREATE TABLE IF NOT EXISTS task_dependencies (
445
+ taskId TEXT NOT NULL,
446
+ dependsOnTaskId TEXT NOT NULL,
447
+ PRIMARY KEY (taskId, dependsOnTaskId),
448
+ FOREIGN KEY (taskId) REFERENCES tasks(id) ON DELETE CASCADE,
449
+ FOREIGN KEY (dependsOnTaskId) REFERENCES tasks(id) ON DELETE CASCADE
450
+ )
451
+ `),a.exec(`
452
+ CREATE TABLE IF NOT EXISTS task_terminals (
453
+ taskId TEXT NOT NULL,
454
+ terminalId TEXT NOT NULL,
455
+ cli TEXT NOT NULL,
456
+ prompt TEXT NOT NULL,
457
+ autoApprove INTEGER NOT NULL DEFAULT 0,
458
+ status TEXT NOT NULL DEFAULT 'running',
459
+ exitCode INTEGER,
460
+ startedAt TEXT NOT NULL,
461
+ exitedAt TEXT,
462
+ PRIMARY KEY (taskId, terminalId),
463
+ FOREIGN KEY (taskId) REFERENCES tasks(id) ON DELETE CASCADE
464
+ )
465
+ `),a.exec(`
466
+ CREATE TABLE IF NOT EXISTS settings (
467
+ key TEXT PRIMARY KEY,
468
+ value TEXT NOT NULL,
469
+ isSecret INTEGER NOT NULL DEFAULT 0,
470
+ category TEXT NOT NULL DEFAULT 'general',
471
+ label TEXT NOT NULL,
472
+ description TEXT,
473
+ updatedAt TEXT NOT NULL
474
+ )
475
+ `),a.exec(`
476
+ CREATE TABLE IF NOT EXISTS workspace_settings (
477
+ workspaceId TEXT NOT NULL,
478
+ key TEXT NOT NULL,
479
+ value TEXT NOT NULL,
480
+ isSecret INTEGER NOT NULL DEFAULT 0,
481
+ label TEXT NOT NULL DEFAULT '',
482
+ updatedAt TEXT NOT NULL,
483
+ PRIMARY KEY (workspaceId, key),
484
+ FOREIGN KEY (workspaceId) REFERENCES workspaces(id) ON DELETE CASCADE
485
+ )
486
+ `),a.exec(`
487
+ CREATE TABLE IF NOT EXISTS cli_tools (
488
+ id TEXT PRIMARY KEY,
489
+ name TEXT NOT NULL,
490
+ logo TEXT,
491
+ category TEXT NOT NULL DEFAULT 'other',
492
+ command TEXT NOT NULL,
493
+ healthCommand TEXT NOT NULL,
494
+ healthSuccessKeywords TEXT NOT NULL DEFAULT '[]',
495
+ versionCommand TEXT,
496
+ authCommand TEXT,
497
+ authSuccessKeywords TEXT,
498
+ docsUrl TEXT,
499
+ envVars TEXT NOT NULL DEFAULT '{}',
500
+ notes TEXT,
501
+ enabled INTEGER NOT NULL DEFAULT 1,
502
+ isBuiltIn INTEGER NOT NULL DEFAULT 0,
503
+ createdAt TEXT NOT NULL,
504
+ updatedAt TEXT NOT NULL
505
+ )
506
+ `),a.exec(`
507
+ CREATE TABLE IF NOT EXISTS saved_layouts (
508
+ id TEXT PRIMARY KEY,
509
+ workspaceId TEXT NOT NULL,
510
+ name TEXT NOT NULL,
511
+ isDefault INTEGER NOT NULL DEFAULT 0,
512
+ version INTEGER NOT NULL DEFAULT 1,
513
+ data TEXT NOT NULL,
514
+ createdAt TEXT NOT NULL,
515
+ updatedAt TEXT NOT NULL,
516
+ FOREIGN KEY (workspaceId) REFERENCES workspaces(id) ON DELETE CASCADE
517
+ )
518
+ `),a.exec(`
519
+ CREATE TABLE IF NOT EXISTS areas (
520
+ id TEXT PRIMARY KEY,
521
+ workspaceId TEXT NOT NULL,
522
+ name TEXT NOT NULL,
523
+ color TEXT NOT NULL DEFAULT '#7C3AED',
524
+ directory TEXT NOT NULL DEFAULT '',
525
+ useWorktree INTEGER NOT NULL DEFAULT 0,
526
+ worktreeBranch TEXT,
527
+ worktreePath TEXT,
528
+ defaultCommand TEXT NOT NULL DEFAULT '',
529
+ terminalCount INTEGER NOT NULL DEFAULT 1,
530
+ layout TEXT NOT NULL DEFAULT 'auto',
531
+ "order" INTEGER NOT NULL DEFAULT 0,
532
+ isDefault INTEGER NOT NULL DEFAULT 0,
533
+ createdAt TEXT NOT NULL,
534
+ updatedAt TEXT NOT NULL,
535
+ FOREIGN KEY (workspaceId) REFERENCES workspaces(id) ON DELETE CASCADE
536
+ )
537
+ `),a.exec(`
538
+ CREATE TABLE IF NOT EXISTS area_state (
539
+ areaId TEXT PRIMARY KEY,
540
+ isRunning INTEGER NOT NULL DEFAULT 0,
541
+ lastLaunchedAt TEXT,
542
+ FOREIGN KEY (areaId) REFERENCES areas(id) ON DELETE CASCADE
543
+ )
544
+ `),a.exec(`
545
+ CREATE TABLE IF NOT EXISTS area_runtime_state (
546
+ areaId TEXT PRIMARY KEY,
547
+ data TEXT NOT NULL DEFAULT '{}',
548
+ updatedAt TEXT NOT NULL DEFAULT '',
549
+ FOREIGN KEY (areaId) REFERENCES areas(id) ON DELETE CASCADE
550
+ )
551
+ `),a.exec(`
552
+ CREATE TABLE IF NOT EXISTS workspace_github (
553
+ workspaceId TEXT PRIMARY KEY,
554
+ repoNameWithOwner TEXT NOT NULL,
555
+ repoUrl TEXT NOT NULL,
556
+ defaultBranch TEXT NOT NULL DEFAULT 'main',
557
+ connectedAt TEXT NOT NULL,
558
+ FOREIGN KEY (workspaceId) REFERENCES workspaces(id) ON DELETE CASCADE
559
+ )
560
+ `);try{a.exec("ALTER TABLE workspaces ADD COLUMN initGit INTEGER NOT NULL DEFAULT 1")}catch{}try{a.exec("ALTER TABLE terminal_configs ADD COLUMN areaId TEXT")}catch{}try{a.exec("ALTER TABLE saved_layouts ADD COLUMN areaId TEXT")}catch{}try{a.exec("ALTER TABLE swarms ADD COLUMN areaId TEXT")}catch{}return cn(a),a}function cn(a){let t=a.prepare(`
561
+ SELECT w.id, w.name, w.color, w.defaultCommand, w.terminalCount, w.layout
562
+ FROM workspaces w
563
+ LEFT JOIN areas a ON a.workspaceId = w.id
564
+ WHERE a.id IS NULL
565
+ `).all();if(t.length===0)return;let s=new Date().toISOString(),r=a.prepare(`
566
+ INSERT INTO areas (id, workspaceId, name, color, directory, useWorktree, defaultCommand, terminalCount, layout, "order", isDefault, createdAt, updatedAt)
567
+ VALUES (?, ?, ?, ?, '', 0, ?, ?, ?, 0, 1, ?, ?)
568
+ `),n=a.prepare("INSERT OR IGNORE INTO area_state (areaId) VALUES (?)"),o=a.prepare("UPDATE terminal_configs SET areaId = ? WHERE workspaceId = ? AND (areaId IS NULL OR areaId = '')"),i=a.prepare("UPDATE saved_layouts SET areaId = ? WHERE workspaceId = ? AND (areaId IS NULL OR areaId = '')"),c=a.prepare("UPDATE swarms SET areaId = ? WHERE workspaceId = ? AND (areaId IS NULL OR areaId = '')");for(let d of t){let l=an();r.run(l,d.id,"Principal",d.color,d.defaultCommand,d.terminalCount,d.layout,s,s),n.run(l),o.run(l,d.id),i.run(l,d.id),c.run(l,d.id)}}import ae from"ws";var Je=class{ws=null;_code=null;relayUrl;allowedIps;reconnectDelay=1e3;maxReconnectDelay=3e4;shouldReconnect=!0;onMessage;onCodeChange;constructor(e,t=[]){this.relayUrl=e,this.allowedIps=t}get code(){return this._code}get connected(){return this.ws?.readyState===ae.OPEN}connect(){return new Promise((e,t)=>{let s=`${this.relayUrl.replace(/^http/,"ws")}/ws/server`;this.ws=new ae(s),this.ws.on("open",()=>{this.reconnectDelay=1e3,this.ws.send(JSON.stringify({type:"register",allowed_ips:this.allowedIps}))}),this.ws.on("message",r=>{let n=r.toString();try{let o=JSON.parse(n);if(o.type==="registered"&&o.code){this._code=o.code,this.reconnectDelay=1e3,e(o.code),this.onCodeChange?.(o.code);return}}catch{}if(this.onMessage&&this.ws){let o=this.createVirtualWs();this.onMessage(n,o)}}),this.ws.on("close",()=>{this.handleDisconnect()}),this.ws.on("error",r=>{console.error("[relay] Connection error:",r.message)})})}createVirtualWs(){let e=this;return{readyState:ae.OPEN,send(t){e.ws?.readyState===ae.OPEN&&e.ws.send(t)}}}send(e){this.ws?.readyState===ae.OPEN&&this.ws.send(e)}close(){this.shouldReconnect=!1,this.ws?.close()}handleDisconnect(){this._code=null,this.shouldReconnect&&(console.log(`[relay] Disconnected. Reconnecting in ${this.reconnectDelay}ms...`),setTimeout(async()=>{try{let e=await this.connect();console.log(`[relay] Reconnected. New code: ${e}`)}catch{console.error("[relay] Reconnection failed")}},this.reconnectDelay),this.reconnectDelay=Math.min(this.reconnectDelay*2,this.maxReconnectDelay))}};function ks(){return process.env.PORT?parseInt(process.env.PORT):process.env.ELECTRON_RUN_AS_NODE?process.platform==="win32"?"\\\\.\\pipe\\impactus-swarm":"/tmp/impactus-swarm.sock":3773}var pn={".html":"text/html",".js":"application/javascript",".css":"text/css",".json":"application/json",".png":"image/png",".svg":"image/svg+xml",".ico":"image/x-icon"},oe=ks(),Is=process.env.IMPACTUS_WEB_DIR||yt(import.meta.dirname,"../../web/dist"),vt=dn((a,e)=>{let t=a.url||"/",s=yt(Is,t==="/"?"index.html":t);if(bs(s)||(s=yt(Is,"index.html")),!bs(s)){e.writeHead(404),e.end("Not found");return}let r=un(s),n=pn[r]||"application/octet-stream";try{let o=ln(s);e.writeHead(200,{"Content-Type":n}),e.end(o)}catch{e.writeHead(500),e.end("Internal server error")}}),As=vs(),{terminalManager:mn,broadcast:ad,externalSenders:gn,services:hn,routes:fn}=Ss(vt,As),Rs=process.env.RELAY_URL,wn=process.env.RELAY_ALLOWED_IPS?process.env.RELAY_ALLOWED_IPS.split(",").map(a=>a.trim()):[],ie=null;Rs&&(ie=new Je(Rs,wn),gn.push(a=>ie.send(a)),ie.onMessage=(a,e)=>{let t;try{t=JSON.parse(a)}catch{return}Tt(t,e,hn,fn)},ie.connect().then(a=>console.log(`[relay] Code: ${a}`)).catch(a=>console.error("[relay] Failed to connect:",a)));function Cs(){ie?.close(),mn.closeAll(),As.close(),process.exit(0)}process.on("SIGINT",Cs);process.on("SIGTERM",Cs);var En=process.argv.includes("--open");typeof oe=="number"?vt.listen(oe,async()=>{let a=`http://localhost:${oe}`;console.log(`Impactus Swarm server running on ${a}`),En&&(await import("open")).default(a)}):vt.listen(oe,()=>{console.log(`Impactus Swarm server running on ${oe}`)});