@axhub/genie 0.1.7 → 0.1.9

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 (411) hide show
  1. package/README.md +1 -1
  2. package/dist/api-docs.html +2 -2
  3. package/dist/assets/App-IUhj6pRQ.js +546 -0
  4. package/dist/assets/App-qxJ8_QYu.css +32 -0
  5. package/dist/assets/ReviewApp-B8aNlXpI.js +1 -0
  6. package/dist/assets/_basePickBy-DF_C8v-X.js +1 -0
  7. package/dist/assets/_baseUniq-Dl8X6bvw.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-TwO_Ni8v.js +1 -0
  20. package/dist/assets/architectureDiagram-2XIMDMQ5-Dgm9kjQy.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-BhTxXYHE.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-D3xrrPyf.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-D6xYGBae.js +1 -0
  49. package/dist/assets/chunk-4BX2VUAB-Fb3wkGSX.js +1 -0
  50. package/dist/assets/chunk-55IACEB6-CQwPJLM_.js +1 -0
  51. package/dist/assets/chunk-FMBD7UC4-B3SocdK3.js +15 -0
  52. package/dist/assets/chunk-JSJVCQXG-4LjhKVWX.js +1 -0
  53. package/dist/assets/chunk-KX2RTZJC-B5NX8jxL.js +1 -0
  54. package/dist/assets/chunk-NQ4KR5QH-6puKzw3k.js +220 -0
  55. package/dist/assets/chunk-QZHKN3VN-CxscPgdC.js +1 -0
  56. package/dist/assets/chunk-WL4C6EOR-uBFUeI3B.js +189 -0
  57. package/dist/assets/clarity-D53aC0YG.js +1 -0
  58. package/dist/assets/classDiagram-VBA2DB6C-CAq2xBD7.js +1 -0
  59. package/dist/assets/classDiagram-v2-RAHNMMFH-CAq2xBD7.js +1 -0
  60. package/dist/assets/clojure-P80f7IUj.js +1 -0
  61. package/dist/assets/clone-Ci5Ji0hp.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-DlbARPn2.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-D5rHdqja.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-1UmM7jTs.js +24 -0
  86. package/dist/assets/diagram-IFDJBPK2-BiB8xLQb.js +43 -0
  87. package/dist/assets/diagram-P4PSJMXO-D0DHiPZv.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-CnRJ2Jix.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-CEgo6QRr.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-BIuQLJvD.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-BgM4MazK.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-CAfp4sq_.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-qMmmT5JC.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-DIJsxqXa.css +1 -0
  162. package/dist/assets/index-DLN_-tVh.js +2 -0
  163. package/dist/assets/infoDiagram-LFFYTUFH-CWSerJ0x.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-CzeVsiJ6.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-D_NYt9lf.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-CX7AUuup.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-DSvVDs_y.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-CVh3kWAl.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-CrPRD2Zy.js +964 -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-w_orDc4B.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-Ddit1h2q.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-DVw1s8Ut.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-DQPZpp_9.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-CfbFynOx.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-BO9n1wra.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-CRL3ceNd.js +1 -0
  307. package/dist/assets/stateDiagram-v2-FVOUBMTO-CZOgjDCg.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-BR7smGEM.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-DkR8x0Kw.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-D5if-Qdt.js} +3 -3
  337. package/dist/assets/{vendor-react-C3RJLQGO.js → vendor-react-CSz7XC90.js} +11 -11
  338. package/dist/assets/vennDiagram-LZ73GAT5-DS7XpPV_.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-BgjSBvNS.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 +37 -23
  364. package/dist/manifest.json +2 -2
  365. package/dist/sw.js +18 -46
  366. package/package.json +12 -7
  367. package/server/bin/codex-sdk-wrapper.js +49 -0
  368. package/server/channels/core/ChannelManager.js +399 -0
  369. package/server/channels/core/PluginManager.js +59 -0
  370. package/server/channels/index.js +3 -0
  371. package/server/channels/plugins/BasePlugin.js +46 -0
  372. package/server/channels/plugins/dingtalk/DingTalkAdapter.js +156 -0
  373. package/server/channels/plugins/dingtalk/DingTalkPlugin.js +592 -0
  374. package/server/channels/plugins/dingtalk/index.js +2 -0
  375. package/server/channels/plugins/lark/LarkAdapter.js +100 -0
  376. package/server/channels/plugins/lark/LarkCards.js +43 -0
  377. package/server/channels/plugins/lark/LarkPlugin.js +260 -0
  378. package/server/channels/runtime/AgentRuntimeAdapter.js +176 -0
  379. package/server/channels/runtime/DingTalkStreamWriter.js +105 -0
  380. package/server/channels/runtime/LarkStreamWriter.js +99 -0
  381. package/server/channels/store/ChannelStore.js +202 -0
  382. package/server/claude-sdk.js +151 -3
  383. package/server/cli.js +21 -21
  384. package/server/database/db.js +449 -275
  385. package/server/gemini-cli.js +106 -19
  386. package/server/index.js +87 -108
  387. package/server/load-env.js +16 -13
  388. package/server/openai-codex.js +146 -10
  389. package/server/projects.js +340 -331
  390. package/server/routes/agent.js +429 -30
  391. package/server/routes/auth.js +14 -36
  392. package/server/routes/channels.js +221 -0
  393. package/server/routes/cli-auth.js +117 -124
  394. package/server/routes/commands.js +16 -26
  395. package/server/routes/git.js +5 -16
  396. package/server/routes/projects.js +2 -7
  397. package/server/routes/session-core.js +177 -0
  398. package/server/session-core/abortSession.js +48 -0
  399. package/server/session-core/eventStore.js +139 -0
  400. package/server/session-core/providerAdapters.js +84 -0
  401. package/server/session-core/providerDiscovery.js +235 -0
  402. package/server/session-core/runtimeWriter.js +55 -0
  403. package/server/utils/agentCallback.js +273 -0
  404. package/server/utils/codexPath.js +47 -0
  405. package/shared/conversationEvents.js +1031 -0
  406. package/shared/modelConstants.js +18 -24
  407. package/dist/assets/index-C2r-Jzfw.js +0 -897
  408. package/dist/assets/index-COkoBQi5.css +0 -32
  409. package/server/cursor-cli.js +0 -276
  410. package/server/database/init.sql +0 -52
  411. package/server/routes/cursor.js +0 -795
@@ -1,6 +1,6 @@
1
1
  import express from 'express';
2
2
  import bcrypt from 'bcrypt';
3
- import { userDb, db } from '../database/db.js';
3
+ import { userDb } from '../database/db.js';
4
4
  import { generateToken, authenticateToken } from '../middleware/auth.js';
5
5
 
6
6
  const router = express.Router();
@@ -33,45 +33,23 @@ router.post('/register', async (req, res) => {
33
33
  return res.status(400).json({ error: 'Username must be at least 3 characters, password at least 6 characters' });
34
34
  }
35
35
 
36
- // Use a transaction to prevent race conditions
37
- db.prepare('BEGIN').run();
38
- try {
39
- // Check if users already exist (only allow one user)
40
- const hasUsers = userDb.hasUsers();
41
- if (hasUsers) {
42
- db.prepare('ROLLBACK').run();
43
- return res.status(403).json({ error: 'User already exists. This is a single-user system.' });
44
- }
45
-
46
- // Hash password
47
- const saltRounds = 12;
48
- const passwordHash = await bcrypt.hash(password, saltRounds);
49
-
50
- // Create user
51
- const user = userDb.createUser(username, passwordHash);
52
-
53
- // Generate token
54
- const token = generateToken(user);
55
-
56
- // Update last login
57
- userDb.updateLastLogin(user.id);
36
+ const saltRounds = 12;
37
+ const passwordHash = await bcrypt.hash(password, saltRounds);
38
+ const user = userDb.registerUser(username, passwordHash);
39
+ const token = generateToken(user);
58
40
 
59
- db.prepare('COMMIT').run();
60
-
61
- res.json({
62
- success: true,
63
- user: { id: user.id, username: user.username },
64
- token
65
- });
66
- } catch (error) {
67
- db.prepare('ROLLBACK').run();
68
- throw error;
69
- }
41
+ res.json({
42
+ success: true,
43
+ user: { id: user.id, username: user.username },
44
+ token
45
+ });
70
46
 
71
47
  } catch (error) {
72
48
  console.error('Registration error:', error);
73
- if (error.code === 'SQLITE_CONSTRAINT_UNIQUE') {
49
+ if (error.code === 'USERNAME_EXISTS') {
74
50
  res.status(409).json({ error: 'Username already exists' });
51
+ } else if (error.code === 'USER_EXISTS') {
52
+ res.status(403).json({ error: 'User already exists. This is a single-user system.' });
75
53
  } else {
76
54
  res.status(500).json({ error: 'Internal server error' });
77
55
  }
@@ -132,4 +110,4 @@ router.post('/logout', authenticateToken, (req, res) => {
132
110
  res.json({ success: true, message: 'Logged out successfully' });
133
111
  });
134
112
 
135
- export default router;
113
+ export default router;
@@ -0,0 +1,221 @@
1
+ import express from 'express';
2
+
3
+ import { getChannelManager } from '../channels/index.js';
4
+
5
+ const router = express.Router();
6
+
7
+ const SUPPORTED_PLATFORMS = new Set(['lark', 'dingtalk']);
8
+
9
+ function parseBoolean(value) {
10
+ if (value === true || value === 'true' || value === 1 || value === '1') {
11
+ return true;
12
+ }
13
+ if (value === false || value === 'false' || value === 0 || value === '0') {
14
+ return false;
15
+ }
16
+ return null;
17
+ }
18
+
19
+ function normalizePlatform(value) {
20
+ const platform = String(value || '').trim().toLowerCase();
21
+ return SUPPORTED_PLATFORMS.has(platform) ? platform : null;
22
+ }
23
+
24
+ async function resolveManager(req, res) {
25
+ const platform = normalizePlatform(req.params.platform);
26
+ if (!platform) {
27
+ res.status(400).json({ success: false, error: 'unsupported platform' });
28
+ return null;
29
+ }
30
+
31
+ const manager = getChannelManager();
32
+ await manager.initialize();
33
+ return { manager, platform };
34
+ }
35
+
36
+ router.get('/:platform/config', async (req, res) => {
37
+ try {
38
+ const resolved = await resolveManager(req, res);
39
+ if (!resolved) return;
40
+
41
+ const { manager, platform } = resolved;
42
+ res.json({ success: true, config: manager.getConfig(platform) });
43
+ } catch (error) {
44
+ res.status(500).json({ success: false, error: error.message });
45
+ }
46
+ });
47
+
48
+ router.put('/:platform/config', async (req, res) => {
49
+ try {
50
+ const resolved = await resolveManager(req, res);
51
+ if (!resolved) return;
52
+
53
+ const { manager, platform } = resolved;
54
+ const config = manager.updateConfig(platform, req.body || {});
55
+ res.json({ success: true, config });
56
+ } catch (error) {
57
+ res.status(500).json({ success: false, error: error.message });
58
+ }
59
+ });
60
+
61
+ router.post('/:platform/test', async (req, res) => {
62
+ try {
63
+ const resolved = await resolveManager(req, res);
64
+ if (!resolved) return;
65
+
66
+ const { manager, platform } = resolved;
67
+ const result =
68
+ platform === 'dingtalk'
69
+ ? await manager.testConnection(platform, {
70
+ clientId: String(req.body?.clientId || '').trim(),
71
+ clientSecret: String(req.body?.clientSecret || '').trim(),
72
+ })
73
+ : await manager.testConnection(platform, {
74
+ appId: String(req.body?.appId || '').trim(),
75
+ appSecret: String(req.body?.appSecret || '').trim(),
76
+ });
77
+
78
+ if (!result.success) {
79
+ return res.status(400).json(result);
80
+ }
81
+
82
+ res.json(result);
83
+ } catch (error) {
84
+ res.status(500).json({ success: false, error: error.message });
85
+ }
86
+ });
87
+
88
+ router.post('/:platform/start', async (req, res) => {
89
+ try {
90
+ const resolved = await resolveManager(req, res);
91
+ if (!resolved) return;
92
+
93
+ const { manager, platform } = resolved;
94
+ const status = await manager.startPlugin(platform);
95
+ res.json({ success: true, status });
96
+ } catch (error) {
97
+ res.status(400).json({ success: false, error: error.message });
98
+ }
99
+ });
100
+
101
+ router.post('/:platform/stop', async (req, res) => {
102
+ try {
103
+ const resolved = await resolveManager(req, res);
104
+ if (!resolved) return;
105
+
106
+ const { manager, platform } = resolved;
107
+ const status = await manager.stopPlugin(platform);
108
+ res.json({ success: true, status });
109
+ } catch (error) {
110
+ res.status(500).json({ success: false, error: error.message });
111
+ }
112
+ });
113
+
114
+ router.get('/:platform/status', async (req, res) => {
115
+ try {
116
+ const resolved = await resolveManager(req, res);
117
+ if (!resolved) return;
118
+
119
+ const { manager, platform } = resolved;
120
+ res.json({ success: true, status: manager.getStatus(platform) });
121
+ } catch (error) {
122
+ res.status(500).json({ success: false, error: error.message });
123
+ }
124
+ });
125
+
126
+ router.get('/:platform/allowed-users', async (req, res) => {
127
+ try {
128
+ const resolved = await resolveManager(req, res);
129
+ if (!resolved) return;
130
+
131
+ const { manager, platform } = resolved;
132
+ res.json({ success: true, users: manager.listAllowedUsers(platform) });
133
+ } catch (error) {
134
+ res.status(500).json({ success: false, error: error.message });
135
+ }
136
+ });
137
+
138
+ router.post('/:platform/allowed-users', async (req, res) => {
139
+ try {
140
+ const userId = String(req.body?.userId || '').trim();
141
+ const displayName = req.body?.displayName;
142
+ const note = req.body?.note;
143
+
144
+ if (!userId) {
145
+ return res.status(400).json({ success: false, error: 'userId is required' });
146
+ }
147
+
148
+ const resolved = await resolveManager(req, res);
149
+ if (!resolved) return;
150
+
151
+ const { manager, platform } = resolved;
152
+
153
+ const user = manager.addAllowedUser(platform, {
154
+ userId,
155
+ displayName,
156
+ note,
157
+ });
158
+
159
+ res.json({ success: true, user });
160
+ } catch (error) {
161
+ if (String(error.message || '').includes('UNIQUE')) {
162
+ return res.status(409).json({ success: false, error: '该用户ID已存在' });
163
+ }
164
+
165
+ res.status(500).json({ success: false, error: error.message });
166
+ }
167
+ });
168
+
169
+ router.patch('/:platform/allowed-users/:id/toggle', async (req, res) => {
170
+ try {
171
+ const id = Number(req.params.id);
172
+ const isActive = parseBoolean(req.body?.isActive);
173
+
174
+ if (!Number.isFinite(id)) {
175
+ return res.status(400).json({ success: false, error: 'invalid id' });
176
+ }
177
+
178
+ if (isActive === null) {
179
+ return res.status(400).json({ success: false, error: 'isActive must be boolean' });
180
+ }
181
+
182
+ const resolved = await resolveManager(req, res);
183
+ if (!resolved) return;
184
+
185
+ const { manager, platform } = resolved;
186
+
187
+ const ok = manager.toggleAllowedUser(platform, id, isActive);
188
+ if (!ok) {
189
+ return res.status(404).json({ success: false, error: 'user not found' });
190
+ }
191
+
192
+ res.json({ success: true });
193
+ } catch (error) {
194
+ res.status(500).json({ success: false, error: error.message });
195
+ }
196
+ });
197
+
198
+ router.delete('/:platform/allowed-users/:id', async (req, res) => {
199
+ try {
200
+ const id = Number(req.params.id);
201
+ if (!Number.isFinite(id)) {
202
+ return res.status(400).json({ success: false, error: 'invalid id' });
203
+ }
204
+
205
+ const resolved = await resolveManager(req, res);
206
+ if (!resolved) return;
207
+
208
+ const { manager, platform } = resolved;
209
+
210
+ const ok = manager.removeAllowedUser(platform, id);
211
+ if (!ok) {
212
+ return res.status(404).json({ success: false, error: 'user not found' });
213
+ }
214
+
215
+ res.json({ success: true });
216
+ } catch (error) {
217
+ res.status(500).json({ success: false, error: error.message });
218
+ }
219
+ });
220
+
221
+ export default router;
@@ -3,16 +3,22 @@ import { spawn } from 'child_process';
3
3
  import fs from 'fs/promises';
4
4
  import path from 'path';
5
5
  import os from 'os';
6
+ import { listOpencodeModels } from '../opencode-cli.js';
6
7
 
7
8
  const router = express.Router();
8
9
  const INSTALLATION_CACHE_TTL_MS = 12 * 60 * 60 * 1000;
9
10
  const SUPPORTED_PROVIDER_COMMANDS = {
10
11
  claude: 'claude',
11
- cursor: 'cursor-agent',
12
12
  codex: 'codex',
13
13
  gemini: 'gemini',
14
14
  opencode: 'opencode'
15
15
  };
16
+ const PROVIDER_INSTALL_HINTS = {
17
+ claude: 'Install Claude Code CLI: npm i -g @anthropic-ai/claude-code',
18
+ codex: 'Install Codex CLI: npm i -g @openai/codex',
19
+ gemini: 'Install Gemini CLI: npm i -g @google/gemini-cli',
20
+ opencode: 'Install OpenCode CLI: npm i -g opencode-ai'
21
+ };
16
22
  const installationStatusCache = new Map(); // provider -> status
17
23
  const installationStatusInFlight = new Map(); // provider -> Promise
18
24
 
@@ -87,6 +93,7 @@ function buildInstallationStatus(provider, command, installed, resolvedPath, rea
87
93
  command,
88
94
  installed,
89
95
  reason,
96
+ installHint: PROVIDER_INSTALL_HINTS[provider] || null,
90
97
  resolvedPath,
91
98
  checkedAt: new Date().toISOString(),
92
99
  cacheHit,
@@ -114,18 +121,56 @@ async function detectProviderInstallationStatus(provider) {
114
121
  }
115
122
 
116
123
  const detectionPromise = (async () => {
117
- const commandCheck = await resolveCommandPath(command);
118
- const installed = commandCheck.found;
119
- const status = buildInstallationStatus(
120
- provider,
121
- command,
122
- installed,
123
- commandCheck.resolvedPath,
124
- commandCheck.reason,
125
- false
126
- );
127
-
128
- if (installed) {
124
+ let status;
125
+
126
+ if (provider === 'opencode') {
127
+ const [opencodeCheck, npxCheck] = await Promise.all([
128
+ resolveCommandPath('opencode'),
129
+ resolveCommandPath('npx')
130
+ ]);
131
+
132
+ if (opencodeCheck.found) {
133
+ status = buildInstallationStatus(
134
+ provider,
135
+ 'opencode',
136
+ true,
137
+ opencodeCheck.resolvedPath,
138
+ null,
139
+ false
140
+ );
141
+ } else if (npxCheck.found) {
142
+ status = buildInstallationStatus(
143
+ provider,
144
+ 'npx (fallback: opencode-ai@latest)',
145
+ true,
146
+ npxCheck.resolvedPath,
147
+ 'OpenCode binary not found in PATH. Axhub Genie will use npx fallback.',
148
+ false
149
+ );
150
+ } else {
151
+ status = buildInstallationStatus(
152
+ provider,
153
+ 'opencode',
154
+ false,
155
+ null,
156
+ opencodeCheck.reason || npxCheck.reason || 'OpenCode and npx are not available in PATH',
157
+ false
158
+ );
159
+ }
160
+ } else {
161
+ const commandCheck = await resolveCommandPath(command);
162
+ const installed = commandCheck.found;
163
+ status = buildInstallationStatus(
164
+ provider,
165
+ command,
166
+ installed,
167
+ commandCheck.resolvedPath,
168
+ commandCheck.reason,
169
+ false
170
+ );
171
+ }
172
+
173
+ if (status.installed) {
129
174
  installationStatusCache.set(provider, {
130
175
  status,
131
176
  expiresAt: now + INSTALLATION_CACHE_TTL_MS
@@ -200,25 +245,6 @@ router.get('/claude/status', async (req, res) => {
200
245
  }
201
246
  });
202
247
 
203
- router.get('/cursor/status', async (req, res) => {
204
- try {
205
- const result = await checkCursorStatus();
206
-
207
- res.json({
208
- authenticated: result.authenticated,
209
- email: result.email,
210
- error: result.error
211
- });
212
-
213
- } catch (error) {
214
- console.error('Error checking Cursor auth status:', error);
215
- res.status(500).json({
216
- authenticated: false,
217
- email: null,
218
- error: error.message
219
- });
220
- }
221
- });
222
248
 
223
249
  router.get('/codex/status', async (req, res) => {
224
250
  try {
@@ -283,6 +309,27 @@ async function checkClaudeCredentials() {
283
309
  email: null
284
310
  };
285
311
  } catch (error) {
312
+ try {
313
+ const configPath = path.join(os.homedir(), '.claude', 'config.json');
314
+ const configContent = await fs.readFile(configPath, 'utf8');
315
+ const config = JSON.parse(configContent);
316
+
317
+ if (typeof config?.primaryApiKey === 'string' && config.primaryApiKey.trim()) {
318
+ return {
319
+ authenticated: true,
320
+ email: 'API Key Auth'
321
+ };
322
+ }
323
+ } catch {
324
+ }
325
+
326
+ if (typeof process.env.ANTHROPIC_API_KEY === 'string' && process.env.ANTHROPIC_API_KEY.trim()) {
327
+ return {
328
+ authenticated: true,
329
+ email: 'API Key Auth'
330
+ };
331
+ }
332
+
286
333
  return {
287
334
  authenticated: false,
288
335
  email: null
@@ -290,98 +337,6 @@ async function checkClaudeCredentials() {
290
337
  }
291
338
  }
292
339
 
293
- function checkCursorStatus() {
294
- return new Promise((resolve) => {
295
- let processCompleted = false;
296
-
297
- const timeout = setTimeout(() => {
298
- if (!processCompleted) {
299
- processCompleted = true;
300
- if (childProcess) {
301
- childProcess.kill();
302
- }
303
- resolve({
304
- authenticated: false,
305
- email: null,
306
- error: 'Command timeout'
307
- });
308
- }
309
- }, 5000);
310
-
311
- let childProcess;
312
- try {
313
- childProcess = spawn('cursor-agent', ['status']);
314
- } catch (err) {
315
- clearTimeout(timeout);
316
- processCompleted = true;
317
- resolve({
318
- authenticated: false,
319
- email: null,
320
- error: 'Cursor CLI not found or not installed'
321
- });
322
- return;
323
- }
324
-
325
- let stdout = '';
326
- let stderr = '';
327
-
328
- childProcess.stdout.on('data', (data) => {
329
- stdout += data.toString();
330
- });
331
-
332
- childProcess.stderr.on('data', (data) => {
333
- stderr += data.toString();
334
- });
335
-
336
- childProcess.on('close', (code) => {
337
- if (processCompleted) return;
338
- processCompleted = true;
339
- clearTimeout(timeout);
340
-
341
- if (code === 0) {
342
- const emailMatch = stdout.match(/Logged in as ([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/i);
343
-
344
- if (emailMatch) {
345
- resolve({
346
- authenticated: true,
347
- email: emailMatch[1],
348
- output: stdout
349
- });
350
- } else if (stdout.includes('Logged in')) {
351
- resolve({
352
- authenticated: true,
353
- email: 'Logged in',
354
- output: stdout
355
- });
356
- } else {
357
- resolve({
358
- authenticated: false,
359
- email: null,
360
- error: 'Not logged in'
361
- });
362
- }
363
- } else {
364
- resolve({
365
- authenticated: false,
366
- email: null,
367
- error: stderr || 'Not logged in'
368
- });
369
- }
370
- });
371
-
372
- childProcess.on('error', (err) => {
373
- if (processCompleted) return;
374
- processCompleted = true;
375
- clearTimeout(timeout);
376
-
377
- resolve({
378
- authenticated: false,
379
- email: null,
380
- error: 'Cursor CLI not found or not installed'
381
- });
382
- });
383
- });
384
- }
385
340
 
386
341
  async function checkCodexCredentials() {
387
342
  try {
@@ -510,6 +465,37 @@ async function checkOpencodeCredentials() {
510
465
  if (anyFileAccessible) {
511
466
  return { authenticated: false, email: null, error: 'Invalid OpenCode credentials format' };
512
467
  }
468
+
469
+ const configCandidates = [
470
+ path.join(os.homedir(), '.config', 'opencode', 'opencode.json'),
471
+ path.join(os.homedir(), '.opencode', 'opencode.json')
472
+ ];
473
+
474
+ for (const configPath of configCandidates) {
475
+ try {
476
+ const raw = await fs.readFile(configPath, 'utf8');
477
+ const config = JSON.parse(raw);
478
+ const providers = config?.provider;
479
+
480
+ if (providers && typeof providers === 'object' && Object.keys(providers).length > 0) {
481
+ return { authenticated: true, email: 'Configured', error: null };
482
+ }
483
+ } catch {
484
+ }
485
+ }
486
+
487
+ try {
488
+ const discovery = await Promise.race([
489
+ listOpencodeModels({ cwd: process.cwd() }),
490
+ new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), 8000))
491
+ ]);
492
+
493
+ if (Array.isArray(discovery?.models) && discovery.models.length > 0) {
494
+ return { authenticated: true, email: 'Configured', error: null };
495
+ }
496
+ } catch {
497
+ }
498
+
513
499
  return { authenticated: false, email: null, error: 'OpenCode not configured' };
514
500
  } catch (error) {
515
501
  return { authenticated: false, email: null, error: 'OpenCode not configured' };
@@ -531,4 +517,11 @@ router.get('/opencode/status', async (req, res) => {
531
517
  }
532
518
  });
533
519
 
520
+ export {
521
+ detectProviderInstallationStatus,
522
+ checkClaudeCredentials, checkCodexCredentials,
523
+ checkGeminiCredentials,
524
+ checkOpencodeCredentials
525
+ };
526
+
534
527
  export default router;
@@ -4,8 +4,8 @@ import path from 'path';
4
4
  import { fileURLToPath } from 'url';
5
5
  import os from 'os';
6
6
  import matter from 'gray-matter';
7
- import { CLAUDE_MODELS, CURSOR_MODELS, CODEX_MODELS, GEMINI_MODELS, OPENCODE_MODELS } from '../../shared/modelConstants.js';
8
- import { listOpencodeModels } from '../opencode-cli.js';
7
+ import { CLAUDE_MODELS, CODEX_MODELS, GEMINI_MODELS, OPENCODE_MODELS } from '../../shared/modelConstants.js';
8
+ import { discoverAllProviders } from '../session-core/providerDiscovery.js';
9
9
 
10
10
  const __filename = fileURLToPath(import.meta.url);
11
11
  const __dirname = path.dirname(__filename);
@@ -184,39 +184,29 @@ Custom commands can be created in:
184
184
  },
185
185
 
186
186
  '/model': async (args, context) => {
187
- // Read available models from centralized constants
188
- const availableModels = {
189
- claude: CLAUDE_MODELS.OPTIONS.map(o => o.value),
190
- cursor: CURSOR_MODELS.OPTIONS.map(o => o.value),
191
- codex: CODEX_MODELS.OPTIONS.map(o => o.value),
192
- gemini: GEMINI_MODELS.OPTIONS.map(o => o.value),
193
- opencode: OPENCODE_MODELS.OPTIONS.map(o => o.value)
194
- };
187
+ const providerDiscovery = await discoverAllProviders({ projectPath: context?.projectPath });
188
+ const availableModels = providerDiscovery.reduce((acc, item) => {
189
+ acc[item.provider] = Array.isArray(item.models) && item.models.length > 0
190
+ ? item.models.map((entry) => entry.id)
191
+ : (item.provider === 'claude'
192
+ ? CLAUDE_MODELS.OPTIONS.map(o => o.value)
193
+ : item.provider === 'codex'
194
+ ? CODEX_MODELS.OPTIONS.map(o => o.value)
195
+ : item.provider === 'gemini'
196
+ ? GEMINI_MODELS.OPTIONS.map(o => o.value)
197
+ : OPENCODE_MODELS.OPTIONS.map(o => o.value));
198
+ return acc;
199
+ }, {});
195
200
 
196
201
  const currentProvider = context?.provider || 'claude';
197
202
  const providerDefaults = {
198
203
  claude: CLAUDE_MODELS.DEFAULT,
199
- cursor: CURSOR_MODELS.DEFAULT,
200
204
  codex: CODEX_MODELS.DEFAULT,
201
205
  gemini: GEMINI_MODELS.DEFAULT,
202
206
  opencode: OPENCODE_MODELS.DEFAULT
203
207
  };
204
208
  const currentModel = context?.model || providerDefaults[currentProvider] || CLAUDE_MODELS.DEFAULT;
205
- let opencodeDiscovery = null;
206
-
207
- if (context?.projectPath) {
208
- try {
209
- opencodeDiscovery = await listOpencodeModels({
210
- projectPath: context?.projectPath,
211
- cwd: context?.projectPath
212
- });
213
- if (opencodeDiscovery.models.length > 0) {
214
- availableModels.opencode = opencodeDiscovery.models;
215
- }
216
- } catch (error) {
217
- console.warn('Failed to query OpenCode runtime models:', error.message);
218
- }
219
- }
209
+ const opencodeDiscovery = providerDiscovery.find((item) => item.provider === 'opencode') || null;
220
210
 
221
211
  return {
222
212
  type: 'builtin',