@axhub/genie 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/README.md +1 -1
  2. package/dist/api-docs.html +6 -6
  3. package/dist/assets/App-BfaNALgf.js +504 -0
  4. package/dist/assets/App-qxJ8_QYu.css +32 -0
  5. package/dist/assets/ReviewApp-DIT2yWk-.js +1 -0
  6. package/dist/assets/_basePickBy-Dz3NcIVK.js +1 -0
  7. package/dist/assets/_baseUniq-DON_Sg7x.js +1 -0
  8. package/dist/assets/abap-BdImnpbu.js +1 -0
  9. package/dist/assets/actionscript-3-CoDkCxhg.js +1 -0
  10. package/dist/assets/ada-bCR0ucgS.js +1 -0
  11. package/dist/assets/andromeeda-C4gqWexZ.js +1 -0
  12. package/dist/assets/angular-html-CU67Zn6k.js +1 -0
  13. package/dist/assets/angular-ts-BwZT4LLn.js +1 -0
  14. package/dist/assets/apache-Pmp26Uib.js +1 -0
  15. package/dist/assets/apex-D8_7TLub.js +1 -0
  16. package/dist/assets/apl-dKokRX4l.js +1 -0
  17. package/dist/assets/applescript-Co6uUVPk.js +1 -0
  18. package/dist/assets/ara-BRHolxvo.js +1 -0
  19. package/dist/assets/arc-Y4G80q-l.js +1 -0
  20. package/dist/assets/architectureDiagram-2XIMDMQ5-D_qR4657.js +36 -0
  21. package/dist/assets/asciidoc-Ve4PFQV2.js +1 -0
  22. package/dist/assets/asm-D_Q5rh1f.js +1 -0
  23. package/dist/assets/astro-CbQHKStN.js +1 -0
  24. package/dist/assets/aurora-x-D-2ljcwZ.js +1 -0
  25. package/dist/assets/awk-DMzUqQB5.js +1 -0
  26. package/dist/assets/ayu-dark-DYE7WIF3.js +1 -0
  27. package/dist/assets/ayu-light-BA47KaF1.js +1 -0
  28. package/dist/assets/ayu-mirage-32ctXXKs.js +1 -0
  29. package/dist/assets/ballerina-BFfxhgS-.js +1 -0
  30. package/dist/assets/bat-BkioyH1T.js +1 -0
  31. package/dist/assets/beancount-k_qm7-4y.js +1 -0
  32. package/dist/assets/berry-uYugtg8r.js +1 -0
  33. package/dist/assets/bibtex-CHM0blh-.js +1 -0
  34. package/dist/assets/bicep-Bmn6On1c.js +1 -0
  35. package/dist/assets/bird2-DPOp833l.js +1 -0
  36. package/dist/assets/blade-D4QpJJKB.js +1 -0
  37. package/dist/assets/blockDiagram-WCTKOSBZ-NsmAlV5_.js +132 -0
  38. package/dist/assets/bsl-BO_Y6i37.js +1 -0
  39. package/dist/assets/c-BIGW1oBm.js +1 -0
  40. package/dist/assets/c3-eo99z4R2.js +1 -0
  41. package/dist/assets/c4Diagram-IC4MRINW-cbOJM4yr.js +10 -0
  42. package/dist/assets/cadence-Bv_4Rxtq.js +1 -0
  43. package/dist/assets/cairo-KRGpt6FW.js +1 -0
  44. package/dist/assets/catppuccin-frappe-DFWUc33u.js +1 -0
  45. package/dist/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
  46. package/dist/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
  47. package/dist/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
  48. package/dist/assets/channel-C6KNnXlA.js +1 -0
  49. package/dist/assets/chunk-4BX2VUAB-bLBhl74J.js +1 -0
  50. package/dist/assets/chunk-55IACEB6-D8kNkDUO.js +1 -0
  51. package/dist/assets/chunk-FMBD7UC4-BjR6UbXB.js +15 -0
  52. package/dist/assets/chunk-JSJVCQXG-luNqWn64.js +1 -0
  53. package/dist/assets/chunk-KX2RTZJC-CNnKm6dK.js +1 -0
  54. package/dist/assets/chunk-NQ4KR5QH-Cp9gb43u.js +220 -0
  55. package/dist/assets/chunk-QZHKN3VN-HlVYo2Oq.js +1 -0
  56. package/dist/assets/chunk-WL4C6EOR-CjSZoOGO.js +189 -0
  57. package/dist/assets/clarity-D53aC0YG.js +1 -0
  58. package/dist/assets/classDiagram-VBA2DB6C-BQlzzlH7.js +1 -0
  59. package/dist/assets/classDiagram-v2-RAHNMMFH-BQlzzlH7.js +1 -0
  60. package/dist/assets/clojure-P80f7IUj.js +1 -0
  61. package/dist/assets/clone-DMxS3qWP.js +1 -0
  62. package/dist/assets/cmake-D1j8_8rp.js +1 -0
  63. package/dist/assets/cobol-nwyudZeR.js +1 -0
  64. package/dist/assets/codeowners-Bp6g37R7.js +1 -0
  65. package/dist/assets/codeql-DsOJ9woJ.js +1 -0
  66. package/dist/assets/coffee-Ch7k5sss.js +1 -0
  67. package/dist/assets/common-lisp-Cg-RD9OK.js +1 -0
  68. package/dist/assets/coq-DkFqJrB1.js +1 -0
  69. package/dist/assets/cose-bilkent-S5V4N54A-DZWRjeEd.js +1 -0
  70. package/dist/assets/cpp-CofmeUqb.js +1 -0
  71. package/dist/assets/crystal-tKQVLTB8.js +1 -0
  72. package/dist/assets/csharp-COcwbKMJ.js +1 -0
  73. package/dist/assets/css-DPfMkruS.js +1 -0
  74. package/dist/assets/csv-fuZLfV_i.js +1 -0
  75. package/dist/assets/cue-D82EKSYY.js +1 -0
  76. package/dist/assets/cypher-COkxafJQ.js +1 -0
  77. package/dist/assets/cytoscape.esm-2ZfV8NB5.js +331 -0
  78. package/dist/assets/d-85-TOEBH.js +1 -0
  79. package/dist/assets/dagre-KLK3FWXG-yAzUmqI7.js +4 -0
  80. package/dist/assets/dark-plus-C3mMm8J8.js +1 -0
  81. package/dist/assets/dart-CF10PKvl.js +1 -0
  82. package/dist/assets/dax-CEL-wOlO.js +1 -0
  83. package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  84. package/dist/assets/desktop-BmXAJ9_W.js +1 -0
  85. package/dist/assets/diagram-E7M64L7V-CvzlIvDJ.js +24 -0
  86. package/dist/assets/diagram-IFDJBPK2-DFMIJpuM.js +43 -0
  87. package/dist/assets/diagram-P4PSJMXO-KL-J3gyb.js +24 -0
  88. package/dist/assets/diff-D97Zzqfu.js +1 -0
  89. package/dist/assets/docker-BcOcwvcX.js +1 -0
  90. package/dist/assets/dotenv-Da5cRb03.js +1 -0
  91. package/dist/assets/dracula-BzJJZx-M.js +1 -0
  92. package/dist/assets/dracula-soft-BXkSAIEj.js +1 -0
  93. package/dist/assets/dream-maker-BtqSS_iP.js +1 -0
  94. package/dist/assets/edge-BkV0erSs.js +1 -0
  95. package/dist/assets/elixir-CDX3lj18.js +1 -0
  96. package/dist/assets/elm-DbKCFpqz.js +1 -0
  97. package/dist/assets/emacs-lisp-C9XAeP06.js +1 -0
  98. package/dist/assets/erDiagram-INFDFZHY-BXszHbTM.js +70 -0
  99. package/dist/assets/erb-B12qg9BL.js +1 -0
  100. package/dist/assets/erlang-DsQrWhSR.js +1 -0
  101. package/dist/assets/everforest-dark-BgDCqdQA.js +1 -0
  102. package/dist/assets/everforest-light-C8M2exoo.js +1 -0
  103. package/dist/assets/fennel-BYunw83y.js +1 -0
  104. package/dist/assets/fish-BvzEVeQv.js +1 -0
  105. package/dist/assets/flowDiagram-PKNHOUZH-Ba43NVp6.js +162 -0
  106. package/dist/assets/fluent-C4IJs8-o.js +1 -0
  107. package/dist/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  108. package/dist/assets/fortran-free-form-BxgE0vQu.js +1 -0
  109. package/dist/assets/fsharp-CXgrBDvD.js +1 -0
  110. package/dist/assets/ganttDiagram-A5KZAMGK-uLHfhCrg.js +292 -0
  111. package/dist/assets/gdresource-BOOCDP_w.js +1 -0
  112. package/dist/assets/gdscript-C5YyOfLZ.js +1 -0
  113. package/dist/assets/gdshader-DkwncUOv.js +1 -0
  114. package/dist/assets/genie-D0YGMca9.js +1 -0
  115. package/dist/assets/gherkin-DyxjwDmM.js +1 -0
  116. package/dist/assets/git-commit-F4YmCXRG.js +1 -0
  117. package/dist/assets/git-rebase-r7XF79zn.js +1 -0
  118. package/dist/assets/gitGraphDiagram-K3NZZRJ6-BTEuFaiL.js +65 -0
  119. package/dist/assets/github-dark-DHJKELXO.js +1 -0
  120. package/dist/assets/github-dark-default-Cuk6v7N8.js +1 -0
  121. package/dist/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  122. package/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  123. package/dist/assets/github-light-DAi9KRSo.js +1 -0
  124. package/dist/assets/github-light-default-D7oLnXFd.js +1 -0
  125. package/dist/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  126. package/dist/assets/gleam-BspZqrRM.js +1 -0
  127. package/dist/assets/glimmer-js-Rg0-pVw9.js +1 -0
  128. package/dist/assets/glimmer-ts-U6CK756n.js +1 -0
  129. package/dist/assets/glsl-DplSGwfg.js +1 -0
  130. package/dist/assets/gn-n2N0HUVH.js +1 -0
  131. package/dist/assets/gnuplot-DdkO51Og.js +1 -0
  132. package/dist/assets/go-CxLEBnE3.js +1 -0
  133. package/dist/assets/graph-h2nuWjx4.js +1 -0
  134. package/dist/assets/graphql-ChdNCCLP.js +1 -0
  135. package/dist/assets/groovy-gcz8RCvz.js +1 -0
  136. package/dist/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  137. package/dist/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  138. package/dist/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  139. package/dist/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  140. package/dist/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  141. package/dist/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  142. package/dist/assets/hack-CaT9iCJl.js +1 -0
  143. package/dist/assets/haml-B8DHNrY2.js +1 -0
  144. package/dist/assets/handlebars-BL8al0AC.js +1 -0
  145. package/dist/assets/haskell-Df6bDoY_.js +1 -0
  146. package/dist/assets/haxe-CzTSHFRz.js +1 -0
  147. package/dist/assets/hcl-BWvSN4gD.js +1 -0
  148. package/dist/assets/highlighted-body-TPN3WLV5-C6BY7XZJ.js +1 -0
  149. package/dist/assets/hjson-D5-asLiD.js +1 -0
  150. package/dist/assets/hlsl-D3lLCCz7.js +1 -0
  151. package/dist/assets/horizon-BUw7H-hv.js +1 -0
  152. package/dist/assets/horizon-bright-Cn-bp-IR.js +1 -0
  153. package/dist/assets/houston-DnULxvSX.js +1 -0
  154. package/dist/assets/html-GMplVEZG.js +1 -0
  155. package/dist/assets/html-derivative-BFtXZ54Q.js +1 -0
  156. package/dist/assets/http-jrhK8wxY.js +1 -0
  157. package/dist/assets/hurl-irOxFIW8.js +1 -0
  158. package/dist/assets/hxml-Bvhsp5Yf.js +1 -0
  159. package/dist/assets/hy-DFXneXwc.js +1 -0
  160. package/dist/assets/imba-DGztddWO.js +1 -0
  161. package/dist/assets/index-2198VgsK.css +1 -0
  162. package/dist/assets/index-C6Bb2jGF.js +2 -0
  163. package/dist/assets/infoDiagram-LFFYTUFH-BOLfvCIq.js +2 -0
  164. package/dist/assets/ini-BEwlwnbL.js +1 -0
  165. package/dist/assets/init-Gi6I4Gst.js +1 -0
  166. package/dist/assets/ishikawaDiagram-PHBUUO56-BRzQ1ee5.js +70 -0
  167. package/dist/assets/java-CylS5w8V.js +1 -0
  168. package/dist/assets/javascript-wDzz0qaB.js +1 -0
  169. package/dist/assets/jinja-4LBKfQ-Z.js +1 -0
  170. package/dist/assets/jison-wvAkD_A8.js +1 -0
  171. package/dist/assets/journeyDiagram-4ABVD52K-DXm_VcMy.js +139 -0
  172. package/dist/assets/json-Cp-IABpG.js +1 -0
  173. package/dist/assets/json5-C9tS-k6U.js +1 -0
  174. package/dist/assets/jsonc-Des-eS-w.js +1 -0
  175. package/dist/assets/jsonl-DcaNXYhu.js +1 -0
  176. package/dist/assets/jsonnet-DFQXde-d.js +1 -0
  177. package/dist/assets/jssm-C2t-YnRu.js +1 -0
  178. package/dist/assets/jsx-g9-lgVsj.js +1 -0
  179. package/dist/assets/julia-CxzCAyBv.js +1 -0
  180. package/dist/assets/just-Cw27pwNe.js +1 -0
  181. package/dist/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
  182. package/dist/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
  183. package/dist/assets/kanagawa-wave-DWedfzmr.js +1 -0
  184. package/dist/assets/kanban-definition-K7BYSVSG-D_oyzopl.js +89 -0
  185. package/dist/assets/kdl-DV7GczEv.js +1 -0
  186. package/dist/assets/kotlin-BdnUsdx6.js +1 -0
  187. package/dist/assets/kusto-DZf3V79B.js +1 -0
  188. package/dist/assets/laserwave-DUszq2jm.js +1 -0
  189. package/dist/assets/latex-CWtU0Tv5.js +1 -0
  190. package/dist/assets/layout-Q8YoR_E1.js +1 -0
  191. package/dist/assets/lean-BZvkOJ9d.js +1 -0
  192. package/dist/assets/less-B1dDrJ26.js +1 -0
  193. package/dist/assets/light-plus-B7mTdjB0.js +1 -0
  194. package/dist/assets/linear-B3qNg7di.js +1 -0
  195. package/dist/assets/liquid-DYVedYrR.js +1 -0
  196. package/dist/assets/llvm-DjAJT7YJ.js +1 -0
  197. package/dist/assets/log-2UxHyX5q.js +1 -0
  198. package/dist/assets/logo-BtOb2qkB.js +1 -0
  199. package/dist/assets/lua-BaeVxFsk.js +1 -0
  200. package/dist/assets/luau-C-HG3fhB.js +1 -0
  201. package/dist/assets/make-CHLpvVh8.js +1 -0
  202. package/dist/assets/markdown-Cvjx9yec.js +1 -0
  203. package/dist/assets/marko-CnJfTvn9.js +1 -0
  204. package/dist/assets/material-theme-D5KoaKCx.js +1 -0
  205. package/dist/assets/material-theme-darker-BfHTSMKl.js +1 -0
  206. package/dist/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  207. package/dist/assets/material-theme-ocean-CyktbL80.js +1 -0
  208. package/dist/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  209. package/dist/assets/matlab-D7o27uSR.js +1 -0
  210. package/dist/assets/mdc-BMNejdWA.js +1 -0
  211. package/dist/assets/mdx-Cmh6b_Ma.js +1 -0
  212. package/dist/assets/mermaid-O7DHMXV3-BVZ_4MKo.js +988 -0
  213. package/dist/assets/mermaid-mWjccvbQ.js +1 -0
  214. package/dist/assets/min-dark-CafNBF8u.js +1 -0
  215. package/dist/assets/min-light-CTRr51gU.js +1 -0
  216. package/dist/assets/mindmap-definition-YRQLILUH-CjulgYdi.js +68 -0
  217. package/dist/assets/mipsasm-CKIfxQSi.js +1 -0
  218. package/dist/assets/mojo-rZm6bMo-.js +1 -0
  219. package/dist/assets/monokai-D4h5O-jR.js +1 -0
  220. package/dist/assets/moonbit-_H4v1dQx.js +1 -0
  221. package/dist/assets/move-IF9eRakj.js +1 -0
  222. package/dist/assets/narrat-DRg8JJMk.js +1 -0
  223. package/dist/assets/nextflow-Zz6hmt5N.js +1 -0
  224. package/dist/assets/nextflow-groovy-BeH2EWoN.js +1 -0
  225. package/dist/assets/nginx-BpAMiNFr.js +1 -0
  226. package/dist/assets/night-owl-C39BiMTA.js +1 -0
  227. package/dist/assets/night-owl-light-CMTm3GFP.js +1 -0
  228. package/dist/assets/nim-CVrawwO9.js +1 -0
  229. package/dist/assets/nix-CwoSXNpI.js +1 -0
  230. package/dist/assets/nord-Ddv68eIx.js +1 -0
  231. package/dist/assets/nushell-Cz2AlsmD.js +1 -0
  232. package/dist/assets/objective-c-DXmwc3jG.js +1 -0
  233. package/dist/assets/objective-cpp-CLxacb5B.js +1 -0
  234. package/dist/assets/ocaml-C0hk2d4L.js +1 -0
  235. package/dist/assets/odin-BBf5iR-q.js +1 -0
  236. package/dist/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  237. package/dist/assets/one-light-C3Wv6jpd.js +1 -0
  238. package/dist/assets/openscad-C4EeE6gA.js +1 -0
  239. package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  240. package/dist/assets/pascal-D93ZcfNL.js +1 -0
  241. package/dist/assets/perl-C0TMdlhV.js +1 -0
  242. package/dist/assets/php-Dhbhpdrm.js +1 -0
  243. package/dist/assets/pieDiagram-SKSYHLDU-8VzrefxA.js +30 -0
  244. package/dist/assets/pkl-u5AG7uiY.js +1 -0
  245. package/dist/assets/plastic-3e1v2bzS.js +1 -0
  246. package/dist/assets/plsql-ChMvpjG-.js +1 -0
  247. package/dist/assets/po-BTJTHyun.js +1 -0
  248. package/dist/assets/poimandres-CS3Unz2-.js +1 -0
  249. package/dist/assets/polar-C0HS_06l.js +1 -0
  250. package/dist/assets/postcss-CXtECtnM.js +1 -0
  251. package/dist/assets/powerquery-CEu0bR-o.js +1 -0
  252. package/dist/assets/powershell-Dpen1YoG.js +1 -0
  253. package/dist/assets/prisma-Dd19v3D-.js +1 -0
  254. package/dist/assets/prolog-CbFg5uaA.js +1 -0
  255. package/dist/assets/proto-C7zT0LnQ.js +1 -0
  256. package/dist/assets/pug-CGlum2m_.js +1 -0
  257. package/dist/assets/puppet-BMWR74SV.js +1 -0
  258. package/dist/assets/purescript-CklMAg4u.js +1 -0
  259. package/dist/assets/python-B6aJPvgy.js +1 -0
  260. package/dist/assets/qml-3beO22l8.js +1 -0
  261. package/dist/assets/qmldir-C8lEn-DE.js +1 -0
  262. package/dist/assets/qss-IeuSbFQv.js +1 -0
  263. package/dist/assets/quadrantDiagram-337W2JSQ-CFh-ijm2.js +7 -0
  264. package/dist/assets/r-Dspwwk_N.js +1 -0
  265. package/dist/assets/racket-BqYA7rlc.js +1 -0
  266. package/dist/assets/raku-DXvB9xmW.js +1 -0
  267. package/dist/assets/razor-Uh8Bk_45.js +1 -0
  268. package/dist/assets/red-bN70gL4F.js +1 -0
  269. package/dist/assets/reg-C-SQnVFl.js +1 -0
  270. package/dist/assets/regexp-CDVJQ6XC.js +1 -0
  271. package/dist/assets/rel-C3B-1QV4.js +1 -0
  272. package/dist/assets/requirementDiagram-Z7DCOOCP-BNPlTs5Q.js +73 -0
  273. package/dist/assets/riscv-BM1_JUlF.js +1 -0
  274. package/dist/assets/ron-D8l8udqQ.js +1 -0
  275. package/dist/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
  276. package/dist/assets/rose-pine-moon-D4_iv3hh.js +1 -0
  277. package/dist/assets/rose-pine-qdsjHGoJ.js +1 -0
  278. package/dist/assets/rosmsg-BJDFO7_C.js +1 -0
  279. package/dist/assets/rst-BrH8l1NY.js +1 -0
  280. package/dist/assets/ruby-Dw2BHqvy.js +1 -0
  281. package/dist/assets/rust-B1yitclQ.js +1 -0
  282. package/dist/assets/sankeyDiagram-WA2Y5GQK-C5l_hYst.js +10 -0
  283. package/dist/assets/sas-cz2c8ADy.js +1 -0
  284. package/dist/assets/sass-Cj5Yp3dK.js +1 -0
  285. package/dist/assets/scala-C151Ov-r.js +1 -0
  286. package/dist/assets/scheme-C98Dy4si.js +1 -0
  287. package/dist/assets/scss-OYdSNvt2.js +1 -0
  288. package/dist/assets/sdbl-DVxCFoDh.js +1 -0
  289. package/dist/assets/sequenceDiagram-2WXFIKYE-B4a_rQw8.js +145 -0
  290. package/dist/assets/shaderlab-Dg9Lc6iA.js +1 -0
  291. package/dist/assets/shellscript-Yzrsuije.js +1 -0
  292. package/dist/assets/shellsession-BADoaaVG.js +1 -0
  293. package/dist/assets/slack-dark-BthQWCQV.js +1 -0
  294. package/dist/assets/slack-ochin-DqwNpetd.js +1 -0
  295. package/dist/assets/smalltalk-BERRCDM3.js +1 -0
  296. package/dist/assets/snazzy-light-Bw305WKR.js +1 -0
  297. package/dist/assets/solarized-dark-DXbdFlpD.js +1 -0
  298. package/dist/assets/solarized-light-L9t79GZl.js +1 -0
  299. package/dist/assets/solidity-rGO070M0.js +1 -0
  300. package/dist/assets/soy-Brmx7dQM.js +1 -0
  301. package/dist/assets/sparql-rVzFXLq3.js +1 -0
  302. package/dist/assets/splunk-BtCnVYZw.js +1 -0
  303. package/dist/assets/sql-BLtJtn59.js +1 -0
  304. package/dist/assets/ssh-config-_ykCGR6B.js +1 -0
  305. package/dist/assets/stata-BH5u7GGu.js +1 -0
  306. package/dist/assets/stateDiagram-RAJIS63D-Bt4mMmKB.js +1 -0
  307. package/dist/assets/stateDiagram-v2-FVOUBMTO-6NYMazfq.js +1 -0
  308. package/dist/assets/stylus-BEDo0Tqx.js +1 -0
  309. package/dist/assets/surrealql-Bq5Q-fJD.js +1 -0
  310. package/dist/assets/svelte-C_ipcX3V.js +1 -0
  311. package/dist/assets/swift-D82vCrfD.js +1 -0
  312. package/dist/assets/synthwave-84-CbfX1IO0.js +1 -0
  313. package/dist/assets/system-verilog-CnnmHF94.js +1 -0
  314. package/dist/assets/systemd-4A_iFExJ.js +1 -0
  315. package/dist/assets/talonscript-CkByrt1z.js +1 -0
  316. package/dist/assets/tasl-QIJgUcNo.js +1 -0
  317. package/dist/assets/tcl-dwOrl1Do.js +1 -0
  318. package/dist/assets/templ-P3uqSqPl.js +1 -0
  319. package/dist/assets/terraform-BETggiCN.js +1 -0
  320. package/dist/assets/tex-idrVyKtj.js +1 -0
  321. package/dist/assets/timeline-definition-YZTLITO2-CLYvSw_R.js +61 -0
  322. package/dist/assets/tokyo-night-hegEt444.js +1 -0
  323. package/dist/assets/toml-vGWfd6FD.js +1 -0
  324. package/dist/assets/treemap-KZPCXAKY-ksND0hZK.js +162 -0
  325. package/dist/assets/ts-tags-zn1MmPIZ.js +1 -0
  326. package/dist/assets/tsv-B_m7g4N7.js +1 -0
  327. package/dist/assets/tsx-COt5Ahok.js +1 -0
  328. package/dist/assets/turtle-BsS91CYL.js +1 -0
  329. package/dist/assets/twig-DNn4PbVi.js +1 -0
  330. package/dist/assets/typescript-BPQ3VLAy.js +1 -0
  331. package/dist/assets/typespec-BGHnOYBU.js +1 -0
  332. package/dist/assets/typst-DHCkPAjA.js +1 -0
  333. package/dist/assets/v-BcVCzyr7.js +1 -0
  334. package/dist/assets/vala-CsfeWuGM.js +1 -0
  335. package/dist/assets/vb-D17OF-Vu.js +1 -0
  336. package/dist/assets/{vendor-codemirror-B88_OPWf.js → vendor-codemirror-Dz7_EqNA.js} +3 -3
  337. package/dist/assets/{vendor-react-C3RJLQGO.js → vendor-react-Cpt6D04s.js} +11 -11
  338. package/dist/assets/vennDiagram-LZ73GAT5-CaQg4oZK.js +34 -0
  339. package/dist/assets/verilog-BQ8w6xss.js +1 -0
  340. package/dist/assets/vesper-DU1UobuO.js +1 -0
  341. package/dist/assets/vhdl-CeAyd5Ju.js +1 -0
  342. package/dist/assets/viml-CJc9bBzg.js +1 -0
  343. package/dist/assets/vitesse-black-Bkuqu6BP.js +1 -0
  344. package/dist/assets/vitesse-dark-D0r3Knsf.js +1 -0
  345. package/dist/assets/vitesse-light-CVO1_9PV.js +1 -0
  346. package/dist/assets/vue-DN_0RTcg.js +1 -0
  347. package/dist/assets/vue-html-AaS7Mt5G.js +1 -0
  348. package/dist/assets/vue-vine-CQOfvN7w.js +1 -0
  349. package/dist/assets/vyper-CDx5xZoG.js +1 -0
  350. package/dist/assets/wasm-CG6Dc4jp.js +1 -0
  351. package/dist/assets/wasm-MzD3tlZU.js +1 -0
  352. package/dist/assets/wenyan-BV7otONQ.js +1 -0
  353. package/dist/assets/wgsl-Dx-B1_4e.js +1 -0
  354. package/dist/assets/wikitext-BhOHFoWU.js +1 -0
  355. package/dist/assets/wit-5i3qLPDT.js +1 -0
  356. package/dist/assets/wolfram-lXgVvXCa.js +1 -0
  357. package/dist/assets/xml-sdJ4AIDG.js +1 -0
  358. package/dist/assets/xsl-CtQFsRM5.js +1 -0
  359. package/dist/assets/xychartDiagram-JWTSCODW-C8dCbTeM.js +7 -0
  360. package/dist/assets/yaml-Buea-lGh.js +1 -0
  361. package/dist/assets/zenscript-DVFEvuxE.js +1 -0
  362. package/dist/assets/zig-VOosw3JB.js +1 -0
  363. package/dist/index.html +35 -21
  364. package/dist/manifest.json +1 -1
  365. package/dist/sw.js +18 -46
  366. package/package.json +12 -8
  367. package/server/bin/codex-sdk-wrapper.js +49 -0
  368. package/server/channels/runtime/AgentRuntimeAdapter.js +2 -5
  369. package/server/channels/store/ChannelStore.js +73 -107
  370. package/server/claude-sdk.js +160 -6
  371. package/server/cli.js +590 -32
  372. package/server/cli.test.js +76 -0
  373. package/server/database/db.js +438 -372
  374. package/server/external-agent/auth.js +88 -0
  375. package/server/external-agent/service.js +1052 -0
  376. package/server/external-agent/service.test.js +41 -0
  377. package/server/external-agent/ws.js +1526 -0
  378. package/server/external-agent/ws.test.js +289 -0
  379. package/server/gemini-cli.js +108 -20
  380. package/server/index.js +115 -121
  381. package/server/load-env.js +16 -13
  382. package/server/openai-codex.js +165 -11
  383. package/server/opencode-cli.js +3 -2
  384. package/server/projects.js +432 -338
  385. package/server/routes/agent.js +347 -459
  386. package/server/routes/auth.js +14 -36
  387. package/server/routes/cli-auth.js +60 -113
  388. package/server/routes/commands.js +16 -26
  389. package/server/routes/git.js +5 -16
  390. package/server/routes/projects.js +2 -7
  391. package/server/routes/session-core.js +177 -0
  392. package/server/session-core/abortSession.js +48 -0
  393. package/server/session-core/eventStore.js +139 -0
  394. package/server/session-core/providerAdapters.js +84 -0
  395. package/server/session-core/providerDiscovery.js +235 -0
  396. package/server/session-core/runtimeState.js +390 -0
  397. package/server/session-core/runtimeWriter.js +59 -0
  398. package/server/utils/agentCallback.js +273 -0
  399. package/server/utils/agentImages.js +253 -0
  400. package/server/utils/codexPath.js +47 -0
  401. package/server/utils/defaultWorkingDirectory.js +34 -0
  402. package/shared/conversationEvents.js +1071 -0
  403. package/shared/modelConstants.js +18 -24
  404. package/dist/assets/index-CVjMty4a.js +0 -902
  405. package/dist/assets/index-eo5scY_Z.css +0 -32
  406. package/server/cursor-cli.js +0 -276
  407. package/server/database/init.sql +0 -98
  408. package/server/routes/cursor.js +0 -795
package/server/index.js CHANGED
@@ -41,6 +41,20 @@ function getServiceIdentity() {
41
41
  }
42
42
 
43
43
  // ANSI color codes for terminal output
44
+ async function getHealthProviderInstallationSummary() {
45
+ const providers = ['claude', 'codex', 'gemini', 'opencode'];
46
+ const statuses = await Promise.all(providers.map(async (provider) => {
47
+ try {
48
+ const result = await detectProviderInstallationStatus(provider);
49
+ return [provider, !!result?.installed];
50
+ } catch {
51
+ return [provider, false];
52
+ }
53
+ }));
54
+
55
+ return Object.fromEntries(statuses);
56
+ }
57
+
44
58
  const colors = {
45
59
  reset: '\x1b[0m',
46
60
  bright: '\x1b[1m',
@@ -73,16 +87,14 @@ import pty from 'node-pty';
73
87
  import fetch from 'node-fetch';
74
88
  import mime from 'mime-types';
75
89
 
76
- import { getProjects, getSessions, getSessionMessages, renameProject, deleteSession, deleteProject, addProjectManually, extractProjectDirectory, clearProjectDirectoryCache, getGeminiSessionMessages } from './projects.js';
77
- import { queryClaudeSDK, abortClaudeSDKSession, isClaudeSDKSessionActive, getActiveClaudeSDKSessions, resolveToolApproval } from './claude-sdk.js';
78
- import { spawnCursor, abortCursorSession, isCursorSessionActive, getActiveCursorSessions } from './cursor-cli.js';
79
- import { queryCodex, abortCodexSession, isCodexSessionActive, getActiveCodexSessions } from './openai-codex.js';
80
- import { queryGemini, abortGeminiSession, isGeminiSessionActive, getActiveGeminiSessions } from './gemini-cli.js';
81
- import { queryOpencode, abortOpencodeSession, isOpencodeSessionActive, getActiveOpencodeSessions } from './opencode-cli.js';
90
+ import { getProjects, getSessions, getSessionMessages, renameProject, deleteSession, deleteProject, addProjectManually, extractProjectDirectory, clearProjectDirectoryCache, clearProviderSessionLookupCaches, getGeminiSessionMessages } from './projects.js';
91
+ import { queryClaudeSDK, isClaudeSDKSessionActive, getActiveClaudeSDKSessions, resolveToolApproval } from './claude-sdk.js';
92
+ import { queryCodex, isCodexSessionActive, getActiveCodexSessions } from './openai-codex.js';
93
+ import { queryGemini, isGeminiSessionActive, getActiveGeminiSessions } from './gemini-cli.js';
94
+ import { queryOpencode, isOpencodeSessionActive, getActiveOpencodeSessions } from './opencode-cli.js';
82
95
  import gitRoutes from './routes/git.js';
83
96
  import authRoutes from './routes/auth.js';
84
97
  import mcpRoutes from './routes/mcp.js';
85
- import cursorRoutes from './routes/cursor.js';
86
98
  import taskmasterRoutes from './routes/taskmaster.js';
87
99
  import mcpUtilsRoutes from './routes/mcp-utils.js';
88
100
  import commandsRoutes from './routes/commands.js';
@@ -90,15 +102,21 @@ import settingsRoutes from './routes/settings.js';
90
102
  import channelsRoutes from './routes/channels.js';
91
103
  import agentRoutes from './routes/agent.js';
92
104
  import projectsRoutes, { WORKSPACES_ROOT, validateWorkspacePath } from './routes/projects.js';
93
- import cliAuthRoutes from './routes/cli-auth.js';
105
+ import cliAuthRoutes, { detectProviderInstallationStatus } from './routes/cli-auth.js';
94
106
  import userRoutes from './routes/user.js';
95
107
  import codexRoutes from './routes/codex.js';
96
108
  import opencodeRoutes from './routes/opencode.js';
109
+ import sessionCoreRoutes from './routes/session-core.js';
97
110
  import { parseCodexTokenCountInfo } from './utils/codexTokenUsage.js';
111
+ import { getConfiguredDefaultProjectPath, resolveWorkingDirectory } from './utils/defaultWorkingDirectory.js';
98
112
  import { initializeDatabase } from './database/db.js';
99
113
  import { validateApiKey, authenticateToken, authenticateWebSocket } from './middleware/auth.js';
100
114
  import { IS_PLATFORM } from './constants/config.js';
101
115
  import { getChannelManager } from './channels/index.js';
116
+ import { SessionEventMirrorWriter } from './session-core/runtimeWriter.js';
117
+ import { abortAgentSessionWithWriter } from './session-core/abortSession.js';
118
+ import { authenticateExternalWebSocketRequest } from './external-agent/auth.js';
119
+ import { handleExternalAgentWebSocketConnection } from './external-agent/ws.js';
102
120
 
103
121
  // File system watcher for projects folder
104
122
  let projectsWatcher = null;
@@ -243,10 +261,26 @@ function broadcastProgress(progress) {
243
261
  });
244
262
  }
245
263
 
246
- // Setup file system watcher for Claude projects folder using chokidar
264
+ function extractSessionIdFromChangedFile(filePath) {
265
+ const basename = path.basename(filePath || '', path.extname(filePath || ''));
266
+ if (!basename) {
267
+ return null;
268
+ }
269
+
270
+ const directMatch = basename.match(/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i);
271
+ if (directMatch?.[1]) {
272
+ return directMatch[1];
273
+ }
274
+
275
+ return basename || null;
276
+ }
277
+
278
+ // Setup file system watcher for project and provider session folders using chokidar
247
279
  async function setupProjectsWatcher() {
248
280
  const chokidar = (await import('chokidar')).default;
249
281
  const claudeProjectsPath = path.join(os.homedir(), '.claude', 'projects');
282
+ const codexSessionsPath = path.join(os.homedir(), '.codex', 'sessions');
283
+ const watchRoots = [claudeProjectsPath, codexSessionsPath];
250
284
 
251
285
  if (projectsWatcher) {
252
286
  projectsWatcher.close();
@@ -254,7 +288,7 @@ async function setupProjectsWatcher() {
254
288
 
255
289
  try {
256
290
  // Initialize chokidar watcher with optimized settings
257
- projectsWatcher = chokidar.watch(claudeProjectsPath, {
291
+ projectsWatcher = chokidar.watch(watchRoots, {
258
292
  ignored: [
259
293
  '**/node_modules/**',
260
294
  '**/.git/**',
@@ -289,17 +323,26 @@ async function setupProjectsWatcher() {
289
323
 
290
324
  // Clear project directory cache when files change
291
325
  clearProjectDirectoryCache();
326
+ clearProviderSessionLookupCaches();
292
327
 
293
328
  // Get updated projects list
294
329
  const updatedProjects = await getProjects(broadcastProgress);
295
330
 
296
331
  // Notify all connected clients about the project changes
332
+ const changedProvider = filePath.startsWith(codexSessionsPath)
333
+ ? 'codex'
334
+ : 'claude';
335
+ const changedFileRoot = changedProvider === 'codex'
336
+ ? codexSessionsPath
337
+ : claudeProjectsPath;
297
338
  const updateMessage = JSON.stringify({
298
339
  type: 'projects_updated',
299
340
  projects: updatedProjects,
300
341
  timestamp: new Date().toISOString(),
301
342
  changeType: eventType,
302
- changedFile: path.relative(claudeProjectsPath, filePath)
343
+ changedFile: path.relative(changedFileRoot, filePath),
344
+ changedProvider,
345
+ changedSessionId: extractSessionIdFromChangedFile(filePath)
303
346
  });
304
347
 
305
348
  connectedClients.forEach(client => {
@@ -344,38 +387,52 @@ const PTY_SESSION_TIMEOUT = 30 * 60 * 1000;
344
387
  // Single WebSocket server that handles both paths
345
388
  const wss = new WebSocketServer({
346
389
  server,
347
- verifyClient: (info) => {
390
+ verifyClient: (info, done) => {
348
391
  console.log('WebSocket connection attempt to:', info.req.url);
349
392
 
350
- // Platform mode: always allow connection
393
+ const url = new URL(info.req.url, 'http://localhost');
394
+ const pathname = url.pathname;
395
+
396
+ if (pathname === '/api/agent/ws') {
397
+ const authResult = authenticateExternalWebSocketRequest(info.req);
398
+ if (!authResult.ok) {
399
+ console.log('[WARN] External agent WebSocket authentication failed:', authResult.message);
400
+ done(false, authResult.statusCode || 401, authResult.message || 'Unauthorized');
401
+ return;
402
+ }
403
+
404
+ console.log('[OK] External agent WebSocket authenticated');
405
+ done(true);
406
+ return;
407
+ }
408
+
409
+ // Platform mode: always allow internal UI WebSocket connections.
351
410
  if (IS_PLATFORM) {
352
411
  const user = authenticateWebSocket(null); // Will return first user
353
412
  if (!user) {
354
413
  console.log('[WARN] Platform mode: No user found in database');
355
- return false;
414
+ done(false, 500, 'Platform mode: No user found in database');
415
+ return;
356
416
  }
357
417
  info.req.user = user;
358
- console.log('[OK] Platform mode WebSocket authenticated for user:', user.username);
359
- return true;
418
+ console.log('[OK] WebSocket authenticated for user:', user.username);
419
+ done(true);
420
+ return;
360
421
  }
361
422
 
362
- // Normal mode: verify token
363
- // Extract token from query parameters or headers
364
- const url = new URL(info.req.url, 'http://localhost');
365
423
  const token = url.searchParams.get('token') ||
366
424
  info.req.headers.authorization?.split(' ')[1];
367
425
 
368
- // Verify token
369
426
  const user = authenticateWebSocket(token);
370
427
  if (!user) {
371
428
  console.log('[WARN] WebSocket authentication failed');
372
- return false;
429
+ done(false, 401, 'Unauthorized');
430
+ return;
373
431
  }
374
432
 
375
- // Store user info in the request for later use
376
433
  info.req.user = user;
377
434
  console.log('[OK] WebSocket authenticated for user:', user.username);
378
- return true;
435
+ done(true);
379
436
  }
380
437
  });
381
438
 
@@ -397,10 +454,11 @@ app.use(express.json({
397
454
  app.use(express.urlencoded({ limit: '50mb', extended: true }));
398
455
 
399
456
  // Public health check endpoint (no authentication required)
400
- app.get('/health', (req, res) => {
457
+ app.get('/health', async (req, res) => {
401
458
  const service = getServiceIdentity();
402
459
  const environment = resolveRuntimeEnvironment(process.env.NODE_ENV === 'production');
403
460
  const port = Number(process.env.PORT || 32123);
461
+ const providersInstalled = await getHealthProviderInstallationSummary();
404
462
 
405
463
  res.setHeader('X-App-Identifier', service.id);
406
464
  res.setHeader('X-App-Name', service.name);
@@ -414,7 +472,8 @@ app.get('/health', (req, res) => {
414
472
  runtime: {
415
473
  environment,
416
474
  port
417
- }
475
+ },
476
+ providersInstalled
418
477
  });
419
478
  });
420
479
 
@@ -433,9 +492,6 @@ app.use('/api/git', authenticateToken, gitRoutes);
433
492
  // MCP API Routes (protected)
434
493
  app.use('/api/mcp', authenticateToken, mcpRoutes);
435
494
 
436
- // Cursor API Routes (protected)
437
- app.use('/api/cursor', authenticateToken, cursorRoutes);
438
-
439
495
  // TaskMaster API Routes (protected)
440
496
  app.use('/api/taskmaster', authenticateToken, taskmasterRoutes);
441
497
 
@@ -460,6 +516,7 @@ app.use('/api/user', authenticateToken, userRoutes);
460
516
  // Codex API Routes (protected)
461
517
  app.use('/api/codex', authenticateToken, codexRoutes);
462
518
  app.use('/api/opencode', authenticateToken, opencodeRoutes);
519
+ app.use('/api/session-core', authenticateToken, sessionCoreRoutes);
463
520
 
464
521
  // Agent API Routes (uses API key authentication)
465
522
  app.use('/api/agent', agentRoutes);
@@ -1012,6 +1069,8 @@ wss.on('connection', (ws, request) => {
1012
1069
  handleShellConnection(ws);
1013
1070
  } else if (pathname === '/ws') {
1014
1071
  handleChatConnection(ws);
1072
+ } else if (pathname === '/api/agent/ws') {
1073
+ handleExternalAgentWebSocketConnection(ws, request);
1015
1074
  } else {
1016
1075
  console.log('[WARN] Unknown WebSocket path:', pathname);
1017
1076
  ws.close();
@@ -1052,11 +1111,13 @@ function handleChatConnection(ws) {
1052
1111
  connectedClients.add(ws);
1053
1112
 
1054
1113
  // Wrap WebSocket with writer for consistent interface with SSEStreamWriter
1055
- const writer = new WebSocketWriter(ws);
1114
+ const baseWriter = new WebSocketWriter(ws);
1115
+ const getSessionWriter = (provider = 'claude') => new SessionEventMirrorWriter(baseWriter, provider);
1056
1116
 
1057
1117
  ws.on('message', async (message) => {
1118
+ let data = null;
1058
1119
  try {
1059
- const data = JSON.parse(message);
1120
+ data = JSON.parse(message);
1060
1121
 
1061
1122
  if (data.type === 'claude-command') {
1062
1123
  console.log('[DEBUG] User message:', data.command || '[Continue/Resume]');
@@ -1064,62 +1125,34 @@ function handleChatConnection(ws) {
1064
1125
  console.log('🔄 Session:', data.options?.sessionId ? 'Resume' : 'New');
1065
1126
 
1066
1127
  // Use Claude Agents SDK
1067
- await queryClaudeSDK(data.command, data.options, writer);
1068
- } else if (data.type === 'cursor-command') {
1069
- console.log('[DEBUG] Cursor message:', data.command || '[Continue/Resume]');
1070
- console.log('📁 Project:', data.options?.cwd || 'Unknown');
1071
- console.log('🔄 Session:', data.options?.sessionId ? 'Resume' : 'New');
1072
- console.log('🤖 Model:', data.options?.model || 'default');
1073
- await spawnCursor(data.command, data.options, writer);
1128
+ await queryClaudeSDK(data.command, data.options, new SessionEventMirrorWriter(baseWriter, 'claude'));
1074
1129
  } else if (data.type === 'codex-command') {
1075
1130
  console.log('[DEBUG] Codex message:', data.command || '[Continue/Resume]');
1076
1131
  console.log('📁 Project:', data.options?.projectPath || data.options?.cwd || 'Unknown');
1077
1132
  console.log('🔄 Session:', data.options?.sessionId ? 'Resume' : 'New');
1078
1133
  console.log('🤖 Model:', data.options?.model || 'default');
1079
- await queryCodex(data.command, data.options, writer);
1134
+ await queryCodex(data.command, data.options, new SessionEventMirrorWriter(baseWriter, 'codex'));
1080
1135
  } else if (data.type === 'gemini-command') {
1081
1136
  console.log('[DEBUG] Gemini message:', data.command || '[Continue/Resume]');
1082
1137
  console.log('📁 Project:', data.options?.projectPath || data.options?.cwd || 'Unknown');
1083
1138
  console.log('🔄 Session:', data.options?.sessionId ? 'Resume' : 'New');
1084
1139
  console.log('🤖 Model:', data.options?.model || 'default');
1085
- await queryGemini(data.command, data.options, writer);
1140
+ await queryGemini(data.command, data.options, new SessionEventMirrorWriter(baseWriter, 'gemini'));
1086
1141
  } else if (data.type === 'opencode-command') {
1087
1142
  console.log('[DEBUG] OpenCode message:', data.command || '[Continue/Resume]');
1088
1143
  console.log('📁 Project:', data.options?.projectPath || data.options?.cwd || 'Unknown');
1089
1144
  console.log('🔄 Session:', data.options?.sessionId ? 'Resume' : 'New');
1090
1145
  console.log('🤖 Model:', data.options?.model || 'default');
1091
- await queryOpencode(data.command, data.options, writer);
1092
- } else if (data.type === 'cursor-resume') {
1093
- // Backward compatibility: treat as cursor-command with resume and no prompt
1094
- console.log('[DEBUG] Cursor resume session (compat):', data.sessionId);
1095
- await spawnCursor('', {
1096
- sessionId: data.sessionId,
1097
- resume: true,
1098
- cwd: data.options?.cwd
1099
- }, writer);
1146
+ await queryOpencode(data.command, data.options, new SessionEventMirrorWriter(baseWriter, 'opencode'));
1100
1147
  } else if (data.type === 'abort-session') {
1101
1148
  console.log('[DEBUG] Abort session request:', data.sessionId);
1102
- const provider = data.provider || 'claude';
1103
- let success;
1104
-
1105
- if (provider === 'cursor') {
1106
- success = abortCursorSession(data.sessionId);
1107
- } else if (provider === 'codex') {
1108
- success = abortCodexSession(data.sessionId);
1109
- } else if (provider === 'gemini') {
1110
- success = abortGeminiSession(data.sessionId);
1111
- } else if (provider === 'opencode') {
1112
- success = abortOpencodeSession(data.sessionId);
1113
- } else {
1114
- // Use Claude Agents SDK
1115
- success = await abortClaudeSDKSession(data.sessionId);
1116
- }
1117
-
1118
- writer.send({
1119
- type: 'session-aborted',
1120
- sessionId: data.sessionId,
1149
+ const provider = typeof data.provider === 'string' && data.provider.trim()
1150
+ ? data.provider.trim().toLowerCase()
1151
+ : 'claude';
1152
+ await abortAgentSessionWithWriter({
1121
1153
  provider,
1122
- success
1154
+ sessionId: data.sessionId,
1155
+ writer: getSessionWriter(provider)
1123
1156
  });
1124
1157
  } else if (data.type === 'claude-permission-response') {
1125
1158
  // Relay UI approval decisions back into the SDK control flow.
@@ -1133,24 +1166,13 @@ function handleChatConnection(ws) {
1133
1166
  rememberEntry: data.rememberEntry
1134
1167
  });
1135
1168
  }
1136
- } else if (data.type === 'cursor-abort') {
1137
- console.log('[DEBUG] Abort Cursor session:', data.sessionId);
1138
- const success = abortCursorSession(data.sessionId);
1139
- writer.send({
1140
- type: 'session-aborted',
1141
- sessionId: data.sessionId,
1142
- provider: 'cursor',
1143
- success
1144
- });
1145
1169
  } else if (data.type === 'check-session-status') {
1146
1170
  // Check if a specific session is currently processing
1147
1171
  const provider = data.provider || 'claude';
1148
1172
  const sessionId = data.sessionId;
1173
+ const sessionWriter = getSessionWriter(provider);
1149
1174
  let isActive;
1150
-
1151
- if (provider === 'cursor') {
1152
- isActive = isCursorSessionActive(sessionId);
1153
- } else if (provider === 'codex') {
1175
+ if (provider === 'codex') {
1154
1176
  isActive = isCodexSessionActive(sessionId);
1155
1177
  } else if (provider === 'gemini') {
1156
1178
  isActive = isGeminiSessionActive(sessionId);
@@ -1161,7 +1183,7 @@ function handleChatConnection(ws) {
1161
1183
  isActive = isClaudeSDKSessionActive(sessionId);
1162
1184
  }
1163
1185
 
1164
- writer.send({
1186
+ sessionWriter.send({
1165
1187
  type: 'session-status',
1166
1188
  sessionId,
1167
1189
  provider,
@@ -1170,22 +1192,22 @@ function handleChatConnection(ws) {
1170
1192
  } else if (data.type === 'get-active-sessions') {
1171
1193
  // Get all currently active sessions
1172
1194
  const activeSessions = {
1173
- claude: getActiveClaudeSDKSessions(),
1174
- cursor: getActiveCursorSessions(),
1175
- codex: getActiveCodexSessions(),
1195
+ claude: getActiveClaudeSDKSessions(), codex: getActiveCodexSessions(),
1176
1196
  gemini: getActiveGeminiSessions(),
1177
1197
  opencode: getActiveOpencodeSessions()
1178
1198
  };
1179
- writer.send({
1199
+ baseWriter.send({
1180
1200
  type: 'active-sessions',
1181
1201
  sessions: activeSessions
1182
1202
  });
1183
1203
  }
1184
1204
  } catch (error) {
1185
1205
  console.error('[ERROR] Chat WebSocket error:', error.message);
1186
- writer.send({
1206
+ baseWriter.send({
1187
1207
  type: 'error',
1188
- error: error.message
1208
+ error: error.message,
1209
+ provider: typeof data?.type === 'string' ? data.type.replace(/-command$/, '') : undefined,
1210
+ sessionId: data?.sessionId || data?.options?.sessionId || null
1189
1211
  });
1190
1212
  }
1191
1213
  });
@@ -1210,18 +1232,16 @@ function handleShellConnection(ws) {
1210
1232
  console.log('📨 Shell message received:', data.type);
1211
1233
 
1212
1234
  if (data.type === 'init') {
1213
- const projectPath = data.projectPath || process.cwd();
1235
+ const projectPath = resolveWorkingDirectory({ projectPath: data.projectPath });
1214
1236
  const sessionId = data.sessionId;
1215
1237
  const hasSession = data.hasSession;
1216
1238
  const provider = data.provider || 'claude';
1217
1239
  const initialCommand = data.initialCommand;
1218
1240
  const isPlainShell = data.isPlainShell || (!!initialCommand && !hasSession) || provider === 'plain-shell';
1219
1241
 
1220
- // Login commands (Claude/Cursor auth) should never reuse cached sessions
1242
+ // Login commands should never reuse cached sessions
1221
1243
  const isLoginCommand = initialCommand && (
1222
- initialCommand.includes('setup-token') ||
1223
- initialCommand.includes('cursor-agent login') ||
1224
- initialCommand.includes('auth login')
1244
+ initialCommand.includes('setup-token') || initialCommand.includes('auth login')
1225
1245
  );
1226
1246
 
1227
1247
  // Include command hash in session key so different commands get separate sessions
@@ -1280,7 +1300,7 @@ function handleShellConnection(ws) {
1280
1300
  if (isPlainShell) {
1281
1301
  welcomeMsg = `\x1b[36mStarting terminal in: ${projectPath}\x1b[0m\r\n`;
1282
1302
  } else {
1283
- const providerName = provider === 'cursor' ? 'Cursor' : provider === 'gemini' ? 'Gemini' : 'Claude';
1303
+ const providerName = provider === 'codex' ? 'Codex' : provider === 'gemini' ? 'Gemini' : provider === 'opencode' ? 'OpenCode' : 'Claude';
1284
1304
  welcomeMsg = hasSession ?
1285
1305
  `\x1b[36mResuming ${providerName} session ${sessionId} in: ${projectPath}\x1b[0m\r\n` :
1286
1306
  `\x1b[36mStarting new ${providerName} session in: ${projectPath}\x1b[0m\r\n`;
@@ -1301,21 +1321,6 @@ function handleShellConnection(ws) {
1301
1321
  } else {
1302
1322
  shellCommand = `cd "${projectPath}" && ${initialCommand}`;
1303
1323
  }
1304
- } else if (provider === 'cursor') {
1305
- // Use cursor-agent command
1306
- if (os.platform() === 'win32') {
1307
- if (hasSession && sessionId) {
1308
- shellCommand = `Set-Location -Path "${projectPath}"; cursor-agent --resume="${sessionId}"`;
1309
- } else {
1310
- shellCommand = `Set-Location -Path "${projectPath}"; cursor-agent`;
1311
- }
1312
- } else {
1313
- if (hasSession && sessionId) {
1314
- shellCommand = `cd "${projectPath}" && cursor-agent --resume="${sessionId}"`;
1315
- } else {
1316
- shellCommand = `cd "${projectPath}" && cursor-agent`;
1317
- }
1318
- }
1319
1324
  } else if (provider === 'gemini') {
1320
1325
  if (os.platform() === 'win32') {
1321
1326
  if (hasSession && sessionId) {
@@ -1766,18 +1771,6 @@ app.get('/api/projects/:projectName/sessions/:sessionId/token-usage', authentica
1766
1771
  if (!safeSessionId) {
1767
1772
  return res.status(400).json({ error: 'Invalid sessionId' });
1768
1773
  }
1769
-
1770
- // Handle Cursor sessions - they use SQLite and don't have token usage info
1771
- if (provider === 'cursor') {
1772
- return res.json({
1773
- used: 0,
1774
- total: 0,
1775
- breakdown: { input: 0, cacheCreation: 0, cacheRead: 0 },
1776
- unsupported: true,
1777
- message: 'Token usage tracking not available for Cursor sessions'
1778
- });
1779
- }
1780
-
1781
1774
  // Handle Codex sessions
1782
1775
  if (provider === 'codex') {
1783
1776
  const codexSessionsDir = path.join(homeDir, '.codex', 'sessions');
@@ -2057,6 +2050,7 @@ function writeRuntimeStatusFile(port, isProduction) {
2057
2050
  url: `http://localhost:${port}`,
2058
2051
  mode: isProduction ? 'production-build' : 'development-proxy',
2059
2052
  endpoint,
2053
+ defaultProjectPath: getConfiguredDefaultProjectPath() || null,
2060
2054
  startedAt: new Date().toISOString(),
2061
2055
  statusFile: RUNTIME_STATUS_PATH,
2062
2056
  };
@@ -7,18 +7,21 @@ import { dirname } from 'path';
7
7
  const __filename = fileURLToPath(import.meta.url);
8
8
  const __dirname = dirname(__filename);
9
9
 
10
- try {
11
- const envPath = path.join(__dirname, '../.env');
12
- const envFile = fs.readFileSync(envPath, 'utf8');
13
- envFile.split('\n').forEach(line => {
14
- const trimmedLine = line.trim();
15
- if (trimmedLine && !trimmedLine.startsWith('#')) {
16
- const [key, ...valueParts] = trimmedLine.split('=');
17
- if (key && valueParts.length > 0 && !process.env[key]) {
18
- process.env[key] = valueParts.join('=').trim();
10
+ const envPath = path.join(__dirname, '../.env');
11
+
12
+ if (fs.existsSync(envPath)) {
13
+ try {
14
+ const envFile = fs.readFileSync(envPath, 'utf8');
15
+ envFile.split('\n').forEach(line => {
16
+ const trimmedLine = line.trim();
17
+ if (trimmedLine && !trimmedLine.startsWith('#')) {
18
+ const [key, ...valueParts] = trimmedLine.split('=');
19
+ if (key && valueParts.length > 0 && !process.env[key]) {
20
+ process.env[key] = valueParts.join('=').trim();
21
+ }
19
22
  }
20
- }
21
- });
22
- } catch (e) {
23
- console.log('No .env file found or error reading it:', e.message);
23
+ });
24
+ } catch (error) {
25
+ console.warn('[WARN] Failed to read .env file:', error.message);
26
+ }
24
27
  }