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