@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/cli.js CHANGED
@@ -16,11 +16,18 @@
16
16
  import fs from 'fs';
17
17
  import path from 'path';
18
18
  import os from 'os';
19
+ import { spawn } from 'child_process';
19
20
  import { fileURLToPath } from 'url';
20
21
  import { dirname } from 'path';
22
+ import { WebSocket } from 'ws';
23
+ import {
24
+ DEFAULT_WORKING_DIRECTORY_ENV,
25
+ getConfiguredDefaultProjectPath,
26
+ } from './utils/defaultWorkingDirectory.js';
21
27
 
22
28
  const __filename = fileURLToPath(import.meta.url);
23
29
  const __dirname = dirname(__filename);
30
+ const DEFAULT_EDITOR_TIMEOUT_MS = 15000;
24
31
 
25
32
  // ANSI color codes for terminal output
26
33
  const colors = {
@@ -72,10 +79,10 @@ function loadEnvFile() {
72
79
  }
73
80
  }
74
81
 
75
- // Get the database path (same logic as db.js)
76
- function getDatabasePath() {
82
+ // Get the data file path (same logic as db.js)
83
+ function getDataFilePath() {
77
84
  loadEnvFile();
78
- return process.env.DATABASE_PATH || path.join(__dirname, 'database', 'auth.db');
85
+ return process.env.DATA_FILE_PATH || path.join(__dirname, 'database', 'state.json');
79
86
  }
80
87
 
81
88
  // Get the installation directory
@@ -95,6 +102,69 @@ function sleep(ms) {
95
102
  return new Promise(resolve => setTimeout(resolve, ms));
96
103
  }
97
104
 
105
+ function getOpenCommand(url) {
106
+ if (!url) {
107
+ return null;
108
+ }
109
+
110
+ if (process.platform === 'darwin') {
111
+ return {
112
+ command: 'open',
113
+ args: [url],
114
+ };
115
+ }
116
+
117
+ if (process.platform === 'win32') {
118
+ return {
119
+ command: 'cmd',
120
+ args: ['/c', 'start', '', url],
121
+ };
122
+ }
123
+
124
+ return {
125
+ command: 'xdg-open',
126
+ args: [url],
127
+ };
128
+ }
129
+
130
+ function openBrowser(url) {
131
+ const openCommand = getOpenCommand(url);
132
+ if (!openCommand) {
133
+ return false;
134
+ }
135
+
136
+ try {
137
+ const child = spawn(openCommand.command, openCommand.args, {
138
+ stdio: 'ignore',
139
+ detached: true,
140
+ });
141
+ child.unref();
142
+ return true;
143
+ } catch (error) {
144
+ console.warn(`${c.warn('[WARN]')} Failed to open browser automatically: ${error.message}`);
145
+ return false;
146
+ }
147
+ }
148
+
149
+ async function waitForRuntimeStatus(pid, timeoutMs = 10000) {
150
+ const deadline = Date.now() + timeoutMs;
151
+
152
+ while (Date.now() < deadline) {
153
+ const runtimeStatus = getRuntimeStatus();
154
+ if (
155
+ runtimeStatus.running &&
156
+ Number(runtimeStatus?.data?.pid) === pid &&
157
+ runtimeStatus?.data?.endpoint?.frontendUrl
158
+ ) {
159
+ return runtimeStatus.data;
160
+ }
161
+
162
+ await sleep(200);
163
+ }
164
+
165
+ return null;
166
+ }
167
+
98
168
  function isProcessAlive(pid) {
99
169
  if (!Number.isInteger(pid) || pid <= 0) {
100
170
  return false;
@@ -137,6 +207,18 @@ function getRuntimeStatus() {
137
207
  }
138
208
  }
139
209
 
210
+ function resolveConfiguredDefaultProjectPathFromStatus(runtimeStatus) {
211
+ const runtimeConfiguredPath = typeof runtimeStatus?.data?.defaultProjectPath === 'string'
212
+ ? runtimeStatus.data.defaultProjectPath.trim()
213
+ : '';
214
+
215
+ if (runtimeConfiguredPath) {
216
+ return runtimeConfiguredPath;
217
+ }
218
+
219
+ return getConfiguredDefaultProjectPath() || null;
220
+ }
221
+
140
222
  async function stopServer() {
141
223
  const runtimeStatus = getRuntimeStatus();
142
224
 
@@ -214,6 +296,337 @@ function buildEndpointFromEnv(port) {
214
296
  };
215
297
  }
216
298
 
299
+ function discoverApiBaseUrl() {
300
+ const runtimeStatus = getRuntimeStatus();
301
+ const runtimePort = runtimeStatus?.data?.port;
302
+ const configuredPort = process.env.PORT || '32123';
303
+ const displayPort = runtimeStatus.running && runtimePort ? runtimePort : configuredPort;
304
+ const envEndpoint = buildEndpointFromEnv(displayPort);
305
+ const runtimeEndpoint = runtimeStatus?.data?.endpoint || {};
306
+ return String(runtimeEndpoint.apiBaseUrl || envEndpoint.apiBaseUrl || '').trim();
307
+ }
308
+
309
+ function normalizeApiBaseUrl(value) {
310
+ return String(value || '').trim().replace(/\/+$/, '');
311
+ }
312
+
313
+ function deriveExternalAgentWebSocketUrl(apiBaseUrl, apiKey) {
314
+ const normalizedApiBaseUrl = normalizeApiBaseUrl(apiBaseUrl);
315
+ if (!normalizedApiBaseUrl) {
316
+ throw new Error('api base URL is required');
317
+ }
318
+
319
+ const url = new URL(normalizedApiBaseUrl);
320
+ url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
321
+ url.pathname = `${url.pathname.replace(/\/$/, '')}/agent/ws`;
322
+ url.search = '';
323
+ if (apiKey) {
324
+ url.searchParams.set('apiKey', apiKey);
325
+ }
326
+ return url.toString();
327
+ }
328
+
329
+ function createRequestId(prefix = 'editor') {
330
+ if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
331
+ return `${prefix}_${crypto.randomUUID()}`;
332
+ }
333
+ return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
334
+ }
335
+
336
+ function parseCommaSeparatedList(value) {
337
+ return String(value || '')
338
+ .split(',')
339
+ .map((item) => item.trim())
340
+ .filter(Boolean);
341
+ }
342
+
343
+ function parsePositiveInteger(value, label) {
344
+ if (value === undefined || value === null || value === '') {
345
+ return null;
346
+ }
347
+ const next = Number(value);
348
+ if (!Number.isInteger(next) || next <= 0) {
349
+ throw new Error(`${label} must be a positive integer`);
350
+ }
351
+ return next;
352
+ }
353
+
354
+ function buildEditorSuccessResponse({ requestId, channel = null, targetClientId = null, data = {} }) {
355
+ return {
356
+ ok: true,
357
+ requestId,
358
+ channel,
359
+ targetClientId,
360
+ data,
361
+ };
362
+ }
363
+
364
+ function buildEditorErrorResponse({ requestId, channel = null, targetClientId = null, code, message }) {
365
+ return {
366
+ ok: false,
367
+ requestId,
368
+ channel,
369
+ targetClientId,
370
+ error: {
371
+ code,
372
+ message,
373
+ },
374
+ };
375
+ }
376
+
377
+ function printJson(payload) {
378
+ console.log(JSON.stringify(payload, null, 2));
379
+ }
380
+
381
+ async function sendEditorWebSocketRequest({ apiBaseUrl, apiKey, message, timeoutMs }) {
382
+ const wsUrl = deriveExternalAgentWebSocketUrl(apiBaseUrl, apiKey);
383
+ return new Promise((resolve, reject) => {
384
+ let settled = false;
385
+ const socket = new WebSocket(wsUrl);
386
+ const cleanup = () => {
387
+ clearTimeout(timer);
388
+ socket.removeAllListeners();
389
+ if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) {
390
+ socket.close();
391
+ }
392
+ };
393
+ const finish = (callback) => (value) => {
394
+ if (settled) return;
395
+ settled = true;
396
+ cleanup();
397
+ callback(value);
398
+ };
399
+ const timer = setTimeout(() => {
400
+ finish(reject)(new Error(`Timed out waiting for response to ${message.type}`));
401
+ }, timeoutMs);
402
+
403
+ socket.on('open', () => {
404
+ socket.send(JSON.stringify(message));
405
+ });
406
+
407
+ socket.on('message', (rawMessage) => {
408
+ let parsed = null;
409
+ try {
410
+ parsed = JSON.parse(String(rawMessage));
411
+ } catch {
412
+ return;
413
+ }
414
+ if (parsed?.requestId !== message.requestId) {
415
+ return;
416
+ }
417
+
418
+ if (parsed?.type === 'integration.error') {
419
+ const payload = parsed.payload || {};
420
+ const error = new Error(payload.message || 'Integration request failed');
421
+ error.code = payload.code || 'INTEGRATION_ERROR';
422
+ finish(reject)(error);
423
+ return;
424
+ }
425
+
426
+ if (parsed?.type === 'agent.error') {
427
+ const error = new Error(parsed.error || 'Agent request failed');
428
+ error.code = 'AGENT_ERROR';
429
+ finish(reject)(error);
430
+ return;
431
+ }
432
+
433
+ if (parsed?.type === 'integration.ack') {
434
+ return;
435
+ }
436
+
437
+ finish(resolve)(parsed);
438
+ });
439
+
440
+ socket.on('error', (error) => {
441
+ const nextError = new Error(`WebSocket request failed: ${error.message}`);
442
+ nextError.code = 'CONNECTION_ERROR';
443
+ finish(reject)(nextError);
444
+ });
445
+
446
+ socket.on('close', () => {
447
+ if (!settled) {
448
+ const error = new Error('WebSocket closed before a response was received');
449
+ error.code = 'CONNECTION_CLOSED';
450
+ finish(reject)(error);
451
+ }
452
+ });
453
+ });
454
+ }
455
+
456
+ function resolveOutputDirPath(outputDir) {
457
+ return path.resolve(outputDir || process.cwd());
458
+ }
459
+
460
+ function requireOption(options, key, message) {
461
+ const value = typeof options[key] === 'string' ? options[key].trim() : options[key];
462
+ if (!value) {
463
+ throw new Error(message);
464
+ }
465
+ return value;
466
+ }
467
+
468
+ function buildTaskRef(options) {
469
+ const requestId = typeof options.taskRequestId === 'string' ? options.taskRequestId.trim() : '';
470
+ const sessionId = typeof options.sessionId === 'string' ? options.sessionId.trim() : '';
471
+ const provider = typeof options.provider === 'string' ? options.provider.trim() : '';
472
+ if (!requestId && !sessionId && !provider) {
473
+ return null;
474
+ }
475
+ return {
476
+ ...(requestId ? { requestId } : {}),
477
+ ...(sessionId ? { sessionId } : {}),
478
+ ...(provider ? { provider } : {}),
479
+ };
480
+ }
481
+
482
+ function buildEditorRequest(positionals, options) {
483
+ const scope = {
484
+ requestId: createRequestId('editor'),
485
+ channel: typeof options.channel === 'string' ? options.channel.trim() : null,
486
+ targetClientId: typeof options.targetClientId === 'string' ? options.targetClientId.trim() : null,
487
+ };
488
+ const commandPath = positionals.join(' ');
489
+
490
+ if (commandPath === 'editor clients list') {
491
+ return {
492
+ ...scope,
493
+ message: {
494
+ type: 'integration.editor.clients.list',
495
+ requestId: scope.requestId,
496
+ payload: {
497
+ ...(scope.channel ? { channel: scope.channel } : {}),
498
+ ...(options.clientId ? { clientId: String(options.clientId).trim() } : {}),
499
+ },
500
+ },
501
+ };
502
+ }
503
+
504
+ const channel = requireOption(options, 'channel', '--channel is required for editor commands');
505
+ const targetClientId = requireOption(options, 'targetClientId', '--target-client-id is required for editor commands');
506
+
507
+ if (commandPath === 'editor snapshot') {
508
+ return {
509
+ requestId: scope.requestId,
510
+ channel,
511
+ targetClientId,
512
+ message: {
513
+ type: 'integration.editor.snapshot.get',
514
+ requestId: scope.requestId,
515
+ payload: { channel, targetClientId },
516
+ },
517
+ };
518
+ }
519
+
520
+ if (commandPath === 'editor nodes list') {
521
+ return {
522
+ requestId: scope.requestId,
523
+ channel,
524
+ targetClientId,
525
+ message: {
526
+ type: 'integration.editor.nodes.list',
527
+ requestId: scope.requestId,
528
+ payload: {
529
+ channel,
530
+ targetClientId,
531
+ ...(options.status ? { status: parseCommaSeparatedList(options.status) } : {}),
532
+ ...(options.elementKey ? { elementKey: String(options.elementKey).trim() } : {}),
533
+ ...(options.limit ? { limit: parsePositiveInteger(options.limit, '--limit') } : {}),
534
+ },
535
+ },
536
+ };
537
+ }
538
+
539
+ if (commandPath === 'editor node screenshot') {
540
+ return {
541
+ requestId: scope.requestId,
542
+ channel,
543
+ targetClientId,
544
+ message: {
545
+ type: 'integration.editor.node.screenshot.get',
546
+ requestId: scope.requestId,
547
+ payload: {
548
+ channel,
549
+ targetClientId,
550
+ elementKey: requireOption(options, 'elementKey', '--element-key is required'),
551
+ downloadPath: resolveOutputDirPath(options.outputDir),
552
+ },
553
+ },
554
+ };
555
+ }
556
+
557
+ if (commandPath === 'editor context-images export') {
558
+ return {
559
+ requestId: scope.requestId,
560
+ channel,
561
+ targetClientId,
562
+ message: {
563
+ type: 'integration.editor.context-images.get',
564
+ requestId: scope.requestId,
565
+ payload: {
566
+ channel,
567
+ targetClientId,
568
+ downloadPath: resolveOutputDirPath(options.outputDir),
569
+ },
570
+ },
571
+ };
572
+ }
573
+
574
+ if (commandPath === 'editor editing set') {
575
+ return {
576
+ requestId: scope.requestId,
577
+ channel,
578
+ targetClientId,
579
+ message: {
580
+ type: 'integration.editor.editing.set',
581
+ requestId: scope.requestId,
582
+ payload: {
583
+ channel,
584
+ targetClientId,
585
+ elementKey: requireOption(options, 'elementKey', '--element-key is required'),
586
+ state: requireOption(options, 'state', '--state is required'),
587
+ ...(buildTaskRef(options) ? { taskRef: buildTaskRef(options) } : {}),
588
+ },
589
+ },
590
+ };
591
+ }
592
+
593
+ throw new Error(`Unknown editor command: ${commandPath}`);
594
+ }
595
+
596
+ async function runEditorCommand(positionals, options) {
597
+ const apiBaseUrl = normalizeApiBaseUrl(options.apiBase || discoverApiBaseUrl());
598
+ if (!apiBaseUrl) {
599
+ throw new Error('Unable to discover API base URL. Please pass --api-base explicitly.');
600
+ }
601
+
602
+ const editorRequest = buildEditorRequest(positionals, options);
603
+ const timeoutMs = parsePositiveInteger(options.timeoutMs || DEFAULT_EDITOR_TIMEOUT_MS, '--timeout-ms') || DEFAULT_EDITOR_TIMEOUT_MS;
604
+
605
+ try {
606
+ const response = await sendEditorWebSocketRequest({
607
+ apiBaseUrl,
608
+ apiKey: options.apiKey,
609
+ message: editorRequest.message,
610
+ timeoutMs,
611
+ });
612
+ printJson(buildEditorSuccessResponse({
613
+ requestId: editorRequest.requestId,
614
+ channel: editorRequest.channel,
615
+ targetClientId: editorRequest.targetClientId,
616
+ data: response?.payload || {},
617
+ }));
618
+ } catch (error) {
619
+ printJson(buildEditorErrorResponse({
620
+ requestId: editorRequest.requestId,
621
+ channel: editorRequest.channel,
622
+ targetClientId: editorRequest.targetClientId,
623
+ code: error.code || 'EDITOR_REQUEST_FAILED',
624
+ message: error.message,
625
+ }));
626
+ process.exit(1);
627
+ }
628
+ }
629
+
217
630
  // Show status command
218
631
  function showStatus(options = {}) {
219
632
  const runtimeStatus = getRuntimeStatus();
@@ -227,6 +640,7 @@ function showStatus(options = {}) {
227
640
  frontendUrl: runtimeEndpoint.frontendUrl || envEndpoint.frontendUrl,
228
641
  apiBaseUrl: runtimeEndpoint.apiBaseUrl || envEndpoint.apiBaseUrl,
229
642
  };
643
+ const defaultProjectPath = resolveConfiguredDefaultProjectPathFromStatus(runtimeStatus);
230
644
 
231
645
  const statusPayload = {
232
646
  running: !!runtimeStatus.running,
@@ -234,6 +648,7 @@ function showStatus(options = {}) {
234
648
  port: Number(displayPort),
235
649
  startedAt: runtimeStatus?.data?.startedAt || null,
236
650
  statusFile: runtimeStatus.statusPath,
651
+ defaultProjectPath,
237
652
  endpoint,
238
653
  };
239
654
 
@@ -253,15 +668,15 @@ function showStatus(options = {}) {
253
668
  console.log(`\n${c.info('[INFO]')} Installation Directory:`);
254
669
  console.log(` ${c.dim(installDir)}`);
255
670
 
256
- // Database location
257
- const dbPath = getDatabasePath();
258
- const dbExists = fs.existsSync(dbPath);
259
- console.log(`\n${c.info('[INFO]')} Database Location:`);
260
- console.log(` ${c.dim(dbPath)}`);
261
- console.log(` Status: ${dbExists ? c.ok('[OK] Exists') : c.warn('[WARN] Not created yet (will be created on first run)')}`);
671
+ // Data file location
672
+ const dataFilePath = getDataFilePath();
673
+ const dataFileExists = fs.existsSync(dataFilePath);
674
+ console.log(`\n${c.info('[INFO]')} Data File Location:`);
675
+ console.log(` ${c.dim(dataFilePath)}`);
676
+ console.log(` Status: ${dataFileExists ? c.ok('[OK] Exists') : c.warn('[WARN] Not created yet (will be created on first run)')}`);
262
677
 
263
- if (dbExists) {
264
- const stats = fs.statSync(dbPath);
678
+ if (dataFileExists) {
679
+ const stats = fs.statSync(dataFilePath);
265
680
  console.log(` Size: ${c.dim((stats.size / 1024).toFixed(2) + ' KB')}`);
266
681
  console.log(` Modified: ${c.dim(stats.mtime.toLocaleString())}`);
267
682
  }
@@ -288,6 +703,7 @@ function showStatus(options = {}) {
288
703
  console.log(` Started: ${c.dim(runtimeStartedAt ? new Date(runtimeStartedAt).toLocaleString() : '(unknown)')}`);
289
704
  }
290
705
 
706
+ console.log(` Default Project Path: ${c.dim(defaultProjectPath || '(not configured)')}`);
291
707
  console.log(` Environment: ${c.dim(endpoint.environment || '(not configured)')}`);
292
708
  console.log(` Frontend URL: ${c.dim(endpoint.frontendUrl || '(not configured)')}`);
293
709
  console.log(` API Base URL: ${c.dim(endpoint.apiBaseUrl || '(not configured)')}`);
@@ -295,7 +711,8 @@ function showStatus(options = {}) {
295
711
  // Environment variables
296
712
  console.log(`\n${c.info('[INFO]')} Configuration:`);
297
713
  console.log(` PORT: ${c.bright(configuredPort)} ${c.dim(process.env.PORT ? '' : '(default)')}`);
298
- console.log(` DATABASE_PATH: ${c.dim(process.env.DATABASE_PATH || '(using default location)')}`);
714
+ console.log(` DATA_FILE_PATH: ${c.dim(process.env.DATA_FILE_PATH || '(using default location)')}`);
715
+ console.log(` ${DEFAULT_WORKING_DIRECTORY_ENV}: ${c.dim(getConfiguredDefaultProjectPath() || '(using process working directory)')}`);
299
716
  console.log(` CLAUDE_CLI_PATH: ${c.dim(process.env.CLAUDE_CLI_PATH || 'claude (default)')}`);
300
717
  console.log(` CONTEXT_WINDOW: ${c.dim(process.env.CONTEXT_WINDOW || '160000 (default)')}`);
301
718
 
@@ -316,7 +733,7 @@ function showStatus(options = {}) {
316
733
  console.log('\n' + c.dim('═'.repeat(60)));
317
734
  console.log(`\n${c.tip('[TIP]')} Hints:`);
318
735
  console.log(` ${c.dim('>')} Use ${c.bright('axhub-genie --port 8080')} to run on a custom port`);
319
- console.log(` ${c.dim('>')} Use ${c.bright('axhub-genie --database-path /path/to/db')} for custom database`);
736
+ console.log(` ${c.dim('>')} Use ${c.bright('axhub-genie --data-file-path /path/to/state.json')} for custom data file`);
320
737
  console.log(` ${c.dim('>')} Run ${c.bright('axhub-genie help')} for all options`);
321
738
  console.log(` ${c.dim('>')} Access the UI at http://localhost:${displayPort}\n`);
322
739
  }
@@ -335,32 +752,57 @@ Commands:
335
752
  start Start the Axhub Genie server (default)
336
753
  stop Stop the running Axhub Genie server
337
754
  status Show configuration and data locations
755
+ editor Query or control a connected web editor frontend
338
756
  update Update to the latest version
339
757
  help Show this help information
340
758
  version Show version information
341
759
 
342
760
  Options:
343
761
  -p, --port <port> Set server port (default: 32123)
344
- --database-path <path> Set custom database location
345
- --json Output status as JSON (for scripts)
762
+ --data-file-path <path> Set custom data file location
763
+ --cwd <path> Set default working directory for agent/API requests
764
+ --workdir <path> Alias for --cwd
765
+ --default-project-path <path> Alias for --cwd
766
+ --no-open Do not open the homepage automatically after start
767
+ --json Output JSON (status or editor commands)
768
+ --api-base <url> Override API base URL for editor commands
769
+ --api-key <key> API key for /api/agent/ws editor commands
770
+ --channel <name> Integration channel for editor commands
771
+ --target-client-id <id> Target frontend client ID for editor commands
772
+ --client-id <id> Optional client filter for editor clients list
773
+ --element-key <key> Target element key for editor node commands
774
+ --status <values> Comma-separated status filters for editor nodes list
775
+ --state <editing|idle> Target editing state for editor editing set
776
+ --limit <n> Maximum number of nodes returned by editor nodes list
777
+ --output-dir <path> Download directory for screenshot/image export commands
778
+ --timeout-ms <ms> Timeout for editor WebSocket requests (default: ${DEFAULT_EDITOR_TIMEOUT_MS})
346
779
  -h, --help Show this help information
347
780
  -v, --version Show version information
348
781
 
349
782
  Examples:
350
783
  $ axhub-genie # Start with defaults
351
784
  $ axhub-genie --port 8080 # Start on port 8080
785
+ $ axhub-genie --cwd /path/to/repo # Start with a default working directory
352
786
  $ axhub-genie -p 3000 # Short form for port
353
787
  $ axhub-genie start --port 4000 # Explicit start command
354
788
  $ axhub-genie stop # Stop running server
355
789
  $ axhub-genie status # Show configuration
356
790
  $ axhub-genie status --json # Get machine-readable status
791
+ $ axhub-genie editor clients list --channel project-a
792
+ $ axhub-genie editor snapshot --channel project-a --target-client-id figma-123
793
+ $ axhub-genie editor nodes list --channel project-a --target-client-id figma-123 --status pending-dispatch,dirty
794
+ $ axhub-genie editor node screenshot --channel project-a --target-client-id figma-123 --element-key hero-card --output-dir .
795
+ $ axhub-genie editor context-images export --channel project-a --target-client-id figma-123
796
+ $ axhub-genie editor editing set --channel project-a --target-client-id figma-123 --element-key hero-card --state editing
357
797
 
358
798
  Environment Variables:
359
799
  PORT Set server port (default: 32123)
360
- DATABASE_PATH Set custom database location
800
+ DATA_FILE_PATH Set custom data file location
801
+ ${DEFAULT_WORKING_DIRECTORY_ENV} Set default working directory for agent/API requests
361
802
  CLAUDE_CLI_PATH Set custom Claude CLI path
362
803
  CONTEXT_WINDOW Set context window size (default: 160000)
363
804
  AXHUB_GENIE_STATUS_PATH Set runtime status file path
805
+ AXHUB_GENIE_NO_OPEN Set to true to disable auto-opening the homepage
364
806
 
365
807
  Documentation:
366
808
  ${packageJson.homepage || 'https://github.com/siteboon/claudecodeui'}
@@ -440,11 +882,30 @@ async function startServer() {
440
882
 
441
883
  // Import and run the server
442
884
  await import('./index.js');
885
+
886
+ if (process.env.AXHUB_GENIE_NO_OPEN === 'true') {
887
+ return;
888
+ }
889
+
890
+ const runtimeData = await waitForRuntimeStatus(process.pid);
891
+ if (!runtimeData) {
892
+ console.log(`${c.warn('[WARN]')} Server started, but homepage could not be opened automatically because runtime status was not ready in time.`);
893
+ return;
894
+ }
895
+
896
+ const frontendUrl = runtimeData?.endpoint?.frontendUrl || runtimeData?.url;
897
+ const opened = openBrowser(frontendUrl);
898
+
899
+ if (opened) {
900
+ console.log(`${c.info('[INFO]')} Opened homepage: ${c.dim(frontendUrl)}`);
901
+ } else {
902
+ console.log(`${c.tip('[TIP]')} Open the homepage manually: ${c.bright(frontendUrl)}`);
903
+ }
443
904
  }
444
905
 
445
906
  // Parse CLI arguments
446
907
  function parseArgs(args) {
447
- const parsed = { command: 'start', options: {} };
908
+ const parsed = { positionals: [], options: {} };
448
909
 
449
910
  for (let i = 0; i < args.length; i++) {
450
911
  const arg = args[i];
@@ -453,18 +914,84 @@ function parseArgs(args) {
453
914
  parsed.options.port = args[++i];
454
915
  } else if (arg.startsWith('--port=')) {
455
916
  parsed.options.port = arg.split('=')[1];
456
- } else if (arg === '--database-path') {
457
- parsed.options.databasePath = args[++i];
458
- } else if (arg.startsWith('--database-path=')) {
459
- parsed.options.databasePath = arg.split('=')[1];
917
+ } else if (arg === '--cwd' || arg === '--workdir' || arg === '--default-project-path') {
918
+ parsed.options.defaultProjectPath = args[++i];
919
+ } else if (arg.startsWith('--cwd=')) {
920
+ parsed.options.defaultProjectPath = arg.split('=')[1];
921
+ } else if (arg.startsWith('--workdir=')) {
922
+ parsed.options.defaultProjectPath = arg.split('=')[1];
923
+ } else if (arg.startsWith('--default-project-path=')) {
924
+ parsed.options.defaultProjectPath = arg.split('=')[1];
925
+ } else if (arg === '--data-file-path') {
926
+ parsed.options.dataFilePath = args[++i];
927
+ } else if (arg.startsWith('--data-file-path=')) {
928
+ parsed.options.dataFilePath = arg.split('=')[1];
929
+ } else if (arg === '--api-base') {
930
+ parsed.options.apiBase = args[++i];
931
+ } else if (arg.startsWith('--api-base=')) {
932
+ parsed.options.apiBase = arg.split('=')[1];
933
+ } else if (arg === '--api-key') {
934
+ parsed.options.apiKey = args[++i];
935
+ } else if (arg.startsWith('--api-key=')) {
936
+ parsed.options.apiKey = arg.split('=')[1];
937
+ } else if (arg === '--channel') {
938
+ parsed.options.channel = args[++i];
939
+ } else if (arg.startsWith('--channel=')) {
940
+ parsed.options.channel = arg.split('=')[1];
941
+ } else if (arg === '--target-client-id') {
942
+ parsed.options.targetClientId = args[++i];
943
+ } else if (arg.startsWith('--target-client-id=')) {
944
+ parsed.options.targetClientId = arg.split('=')[1];
945
+ } else if (arg === '--client-id') {
946
+ parsed.options.clientId = args[++i];
947
+ } else if (arg.startsWith('--client-id=')) {
948
+ parsed.options.clientId = arg.split('=')[1];
949
+ } else if (arg === '--element-key') {
950
+ parsed.options.elementKey = args[++i];
951
+ } else if (arg.startsWith('--element-key=')) {
952
+ parsed.options.elementKey = arg.split('=')[1];
953
+ } else if (arg === '--status') {
954
+ parsed.options.status = args[++i];
955
+ } else if (arg.startsWith('--status=')) {
956
+ parsed.options.status = arg.split('=')[1];
957
+ } else if (arg === '--state') {
958
+ parsed.options.state = args[++i];
959
+ } else if (arg.startsWith('--state=')) {
960
+ parsed.options.state = arg.split('=')[1];
961
+ } else if (arg === '--limit') {
962
+ parsed.options.limit = args[++i];
963
+ } else if (arg.startsWith('--limit=')) {
964
+ parsed.options.limit = arg.split('=')[1];
965
+ } else if (arg === '--output-dir') {
966
+ parsed.options.outputDir = args[++i];
967
+ } else if (arg.startsWith('--output-dir=')) {
968
+ parsed.options.outputDir = arg.split('=')[1];
969
+ } else if (arg === '--timeout-ms') {
970
+ parsed.options.timeoutMs = args[++i];
971
+ } else if (arg.startsWith('--timeout-ms=')) {
972
+ parsed.options.timeoutMs = arg.split('=')[1];
973
+ } else if (arg === '--session-id') {
974
+ parsed.options.sessionId = args[++i];
975
+ } else if (arg.startsWith('--session-id=')) {
976
+ parsed.options.sessionId = arg.split('=')[1];
977
+ } else if (arg === '--provider') {
978
+ parsed.options.provider = args[++i];
979
+ } else if (arg.startsWith('--provider=')) {
980
+ parsed.options.provider = arg.split('=')[1];
981
+ } else if (arg === '--task-request-id') {
982
+ parsed.options.taskRequestId = args[++i];
983
+ } else if (arg.startsWith('--task-request-id=')) {
984
+ parsed.options.taskRequestId = arg.split('=')[1];
460
985
  } else if (arg === '--json') {
461
986
  parsed.options.json = true;
987
+ } else if (arg === '--no-open') {
988
+ parsed.options.noOpen = true;
462
989
  } else if (arg === '--help' || arg === '-h') {
463
- parsed.command = 'help';
990
+ parsed.options.help = true;
464
991
  } else if (arg === '--version' || arg === '-v') {
465
- parsed.command = 'version';
992
+ parsed.options.version = true;
466
993
  } else if (!arg.startsWith('-')) {
467
- parsed.command = arg;
994
+ parsed.positionals.push(arg);
468
995
  }
469
996
  }
470
997
 
@@ -476,20 +1003,38 @@ async function main() {
476
1003
  loadEnvFile();
477
1004
 
478
1005
  const args = process.argv.slice(2);
479
- const { command, options } = parseArgs(args);
1006
+ const { positionals, options } = parseArgs(args);
1007
+ const command = options.help
1008
+ ? 'help'
1009
+ : options.version
1010
+ ? 'version'
1011
+ : positionals[0] || 'start';
480
1012
 
481
1013
  // Apply CLI options to environment variables
482
1014
  if (options.port) {
483
1015
  process.env.PORT = options.port;
484
1016
  }
485
- if (options.databasePath) {
486
- process.env.DATABASE_PATH = options.databasePath;
1017
+ if (options.dataFilePath) {
1018
+ process.env.DATA_FILE_PATH = options.dataFilePath;
1019
+ }
1020
+ if (options.defaultProjectPath) {
1021
+ process.env[DEFAULT_WORKING_DIRECTORY_ENV] = path.resolve(options.defaultProjectPath);
487
1022
  }
488
1023
 
489
1024
  switch (command) {
490
1025
  case 'start':
1026
+ if (positionals[0] === 'editor') {
1027
+ await runEditorCommand(positionals, options);
1028
+ break;
1029
+ }
1030
+ if (options.noOpen) {
1031
+ process.env.AXHUB_GENIE_NO_OPEN = 'true';
1032
+ }
491
1033
  await startServer();
492
1034
  break;
1035
+ case 'editor':
1036
+ await runEditorCommand(positionals, options);
1037
+ break;
493
1038
  case 'status':
494
1039
  case 'info':
495
1040
  showStatus(options);
@@ -517,8 +1062,21 @@ async function main() {
517
1062
  }
518
1063
  }
519
1064
 
520
- // Run the CLI
521
- main().catch(error => {
522
- console.error('\n❌ Error:', error.message);
523
- process.exit(1);
524
- });
1065
+ const isDirectExecution = process.argv[1] && path.resolve(process.argv[1]) === __filename;
1066
+
1067
+ if (isDirectExecution) {
1068
+ main().catch(error => {
1069
+ console.error('\n❌ Error:', error.message);
1070
+ process.exit(1);
1071
+ });
1072
+ }
1073
+
1074
+ export {
1075
+ buildEditorRequest,
1076
+ buildEditorSuccessResponse,
1077
+ buildEditorErrorResponse,
1078
+ deriveExternalAgentWebSocketUrl,
1079
+ normalizeApiBaseUrl,
1080
+ parseArgs,
1081
+ runEditorCommand,
1082
+ };