@axhub/genie 0.1.8 → 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.
- package/README.md +1 -1
- package/dist/api-docs.html +2 -2
- package/dist/assets/App-IUhj6pRQ.js +546 -0
- package/dist/assets/App-qxJ8_QYu.css +32 -0
- package/dist/assets/ReviewApp-B8aNlXpI.js +1 -0
- package/dist/assets/_basePickBy-DF_C8v-X.js +1 -0
- package/dist/assets/_baseUniq-Dl8X6bvw.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-TwO_Ni8v.js +1 -0
- package/dist/assets/architectureDiagram-2XIMDMQ5-Dgm9kjQy.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-BhTxXYHE.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-D3xrrPyf.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-D6xYGBae.js +1 -0
- package/dist/assets/chunk-4BX2VUAB-Fb3wkGSX.js +1 -0
- package/dist/assets/chunk-55IACEB6-CQwPJLM_.js +1 -0
- package/dist/assets/chunk-FMBD7UC4-B3SocdK3.js +15 -0
- package/dist/assets/chunk-JSJVCQXG-4LjhKVWX.js +1 -0
- package/dist/assets/chunk-KX2RTZJC-B5NX8jxL.js +1 -0
- package/dist/assets/chunk-NQ4KR5QH-6puKzw3k.js +220 -0
- package/dist/assets/chunk-QZHKN3VN-CxscPgdC.js +1 -0
- package/dist/assets/chunk-WL4C6EOR-uBFUeI3B.js +189 -0
- package/dist/assets/clarity-D53aC0YG.js +1 -0
- package/dist/assets/classDiagram-VBA2DB6C-CAq2xBD7.js +1 -0
- package/dist/assets/classDiagram-v2-RAHNMMFH-CAq2xBD7.js +1 -0
- package/dist/assets/clojure-P80f7IUj.js +1 -0
- package/dist/assets/clone-Ci5Ji0hp.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-DlbARPn2.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-D5rHdqja.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-1UmM7jTs.js +24 -0
- package/dist/assets/diagram-IFDJBPK2-BiB8xLQb.js +43 -0
- package/dist/assets/diagram-P4PSJMXO-D0DHiPZv.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-CnRJ2Jix.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-CEgo6QRr.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-BIuQLJvD.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-BgM4MazK.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-CAfp4sq_.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-qMmmT5JC.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-DIJsxqXa.css +1 -0
- package/dist/assets/index-DLN_-tVh.js +2 -0
- package/dist/assets/infoDiagram-LFFYTUFH-CWSerJ0x.js +2 -0
- package/dist/assets/ini-BEwlwnbL.js +1 -0
- package/dist/assets/init-Gi6I4Gst.js +1 -0
- package/dist/assets/ishikawaDiagram-PHBUUO56-CzeVsiJ6.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-D_NYt9lf.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-CX7AUuup.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-DSvVDs_y.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-CVh3kWAl.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-CrPRD2Zy.js +964 -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-w_orDc4B.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-Ddit1h2q.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-DVw1s8Ut.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-DQPZpp_9.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-CfbFynOx.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-BO9n1wra.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-CRL3ceNd.js +1 -0
- package/dist/assets/stateDiagram-v2-FVOUBMTO-CZOgjDCg.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-BR7smGEM.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-DkR8x0Kw.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-D5if-Qdt.js} +3 -3
- package/dist/assets/{vendor-react-C3RJLQGO.js → vendor-react-CSz7XC90.js} +11 -11
- package/dist/assets/vennDiagram-LZ73GAT5-DS7XpPV_.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-BgjSBvNS.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 +34 -20
- package/dist/sw.js +18 -46
- package/package.json +10 -7
- 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 +151 -3
- package/server/cli.js +21 -21
- package/server/database/db.js +438 -372
- package/server/gemini-cli.js +106 -19
- package/server/index.js +63 -105
- package/server/load-env.js +16 -13
- package/server/openai-codex.js +144 -9
- package/server/projects.js +340 -331
- package/server/routes/agent.js +424 -29
- 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/runtimeWriter.js +55 -0
- package/server/utils/agentCallback.js +273 -0
- package/server/utils/codexPath.js +47 -0
- package/shared/conversationEvents.js +1031 -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/gemini-cli.js
CHANGED
|
@@ -101,11 +101,68 @@ function emitTextChunks(ws, sessionId, chunks) {
|
|
|
101
101
|
});
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
+
function formatGeminiProcessError(code, stderrOutput) {
|
|
105
|
+
const normalizedStderr = String(stderrOutput || '').trim();
|
|
106
|
+
if (normalizedStderr) {
|
|
107
|
+
const apiMessageMatch =
|
|
108
|
+
normalizedStderr.match(/"message":"([^"]+)"/) ||
|
|
109
|
+
normalizedStderr.match(/message:\s*"([^"]+)"/i) ||
|
|
110
|
+
normalizedStderr.match(/ApiError:\s*\{.*?"message":"([^"]+)"/i) ||
|
|
111
|
+
normalizedStderr.match(/Error when talking to Gemini API[\s\S]*?message":"([^"]+)"/i);
|
|
112
|
+
|
|
113
|
+
if (apiMessageMatch?.[1]) {
|
|
114
|
+
return apiMessageMatch[1];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const firstMeaningfulLine = normalizedStderr
|
|
118
|
+
.split('\n')
|
|
119
|
+
.map((line) => line.trim())
|
|
120
|
+
.find((line) => line && !line.startsWith('at '));
|
|
121
|
+
|
|
122
|
+
if (firstMeaningfulLine) {
|
|
123
|
+
return firstMeaningfulLine;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return normalizedStderr;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return `Gemini CLI exited with code ${code}`;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function extractGeminiEventError(event) {
|
|
133
|
+
if (!event || typeof event !== 'object') {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const candidates = [
|
|
138
|
+
event?.error?.message,
|
|
139
|
+
event?.error?.details,
|
|
140
|
+
event?.result?.error?.message,
|
|
141
|
+
event?.result?.error,
|
|
142
|
+
event?.data?.error?.message,
|
|
143
|
+
event?.data?.error,
|
|
144
|
+
event?.message
|
|
145
|
+
];
|
|
146
|
+
|
|
147
|
+
for (const candidate of candidates) {
|
|
148
|
+
const normalized = String(candidate || '').trim();
|
|
149
|
+
if (normalized) {
|
|
150
|
+
return normalized;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
|
|
104
157
|
async function queryGemini(command, options = {}, ws) {
|
|
105
158
|
return new Promise((resolve, reject) => {
|
|
106
159
|
const { sessionId, cwd, projectPath, resume, model, permissionMode } = options;
|
|
107
160
|
let capturedSessionId = sessionId;
|
|
108
161
|
let sentSessionCreated = false;
|
|
162
|
+
let stderrBuffer = '';
|
|
163
|
+
let fatalErrorSent = false;
|
|
164
|
+
let sawSuccessfulTerminalEvent = false;
|
|
165
|
+
let sawErroredTerminalEvent = false;
|
|
109
166
|
|
|
110
167
|
const args = ['-y', '@google/gemini-cli'];
|
|
111
168
|
|
|
@@ -142,6 +199,19 @@ async function queryGemini(command, options = {}, ws) {
|
|
|
142
199
|
activeGeminiProcesses.set(processRegistryKey, geminiProcess);
|
|
143
200
|
|
|
144
201
|
const finalizeSessionId = () => capturedSessionId || sessionId || null;
|
|
202
|
+
const emitFatalError = (errorMessage) => {
|
|
203
|
+
if (fatalErrorSent || !errorMessage) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
fatalErrorSent = true;
|
|
208
|
+
ws.send({
|
|
209
|
+
type: 'claude-error',
|
|
210
|
+
error: errorMessage,
|
|
211
|
+
provider: 'gemini',
|
|
212
|
+
sessionId: finalizeSessionId()
|
|
213
|
+
});
|
|
214
|
+
};
|
|
145
215
|
|
|
146
216
|
const handleJsonEvent = (event) => {
|
|
147
217
|
const incomingSessionId = event?.session_id || event?.sessionId || event?.data?.session_id || event?.data?.sessionId;
|
|
@@ -169,6 +239,15 @@ async function queryGemini(command, options = {}, ws) {
|
|
|
169
239
|
|
|
170
240
|
const type = event?.type || event?.event || event?.kind;
|
|
171
241
|
if (type === 'result' || type === 'done' || type === 'complete') {
|
|
242
|
+
const eventStatus = String(event?.status || event?.result?.status || '').trim().toLowerCase();
|
|
243
|
+
const eventError = extractGeminiEventError(event);
|
|
244
|
+
if (eventStatus === 'error' || eventError) {
|
|
245
|
+
sawErroredTerminalEvent = true;
|
|
246
|
+
emitFatalError(eventError || 'Gemini CLI request failed');
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
sawSuccessfulTerminalEvent = true;
|
|
172
251
|
ws.send({
|
|
173
252
|
type: 'claude-response',
|
|
174
253
|
data: { type: 'content_block_stop' },
|
|
@@ -204,11 +283,13 @@ async function queryGemini(command, options = {}, ws) {
|
|
|
204
283
|
});
|
|
205
284
|
|
|
206
285
|
geminiProcess.stderr.on('data', (data) => {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
286
|
+
const chunk = data.toString();
|
|
287
|
+
stderrBuffer += chunk;
|
|
288
|
+
|
|
289
|
+
const normalizedChunk = chunk.trim();
|
|
290
|
+
if (normalizedChunk) {
|
|
291
|
+
console.warn('Gemini CLI stderr:', normalizedChunk);
|
|
292
|
+
}
|
|
212
293
|
});
|
|
213
294
|
|
|
214
295
|
geminiProcess.on('close', (code) => {
|
|
@@ -223,29 +304,35 @@ async function queryGemini(command, options = {}, ws) {
|
|
|
223
304
|
|
|
224
305
|
activeGeminiProcesses.delete(processRegistryKey);
|
|
225
306
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
307
|
+
if (code === 0 && !sawErroredTerminalEvent) {
|
|
308
|
+
if (!sawSuccessfulTerminalEvent) {
|
|
309
|
+
ws.send({
|
|
310
|
+
type: 'claude-response',
|
|
311
|
+
data: { type: 'content_block_stop' },
|
|
312
|
+
provider: 'gemini',
|
|
313
|
+
sessionId: finalizeSessionId()
|
|
314
|
+
});
|
|
315
|
+
}
|
|
233
316
|
|
|
234
|
-
|
|
317
|
+
ws.send({
|
|
318
|
+
type: 'claude-complete',
|
|
319
|
+
sessionId: finalizeSessionId(),
|
|
320
|
+
provider: 'gemini',
|
|
321
|
+
exitCode: code,
|
|
322
|
+
isNewSession: !sessionId && !!command
|
|
323
|
+
});
|
|
235
324
|
resolve();
|
|
236
325
|
} else {
|
|
237
|
-
|
|
326
|
+
const errorMessage = formatGeminiProcessError(code, stderrBuffer);
|
|
327
|
+
emitFatalError(errorMessage);
|
|
328
|
+
reject(new Error(errorMessage));
|
|
238
329
|
}
|
|
239
330
|
});
|
|
240
331
|
|
|
241
332
|
geminiProcess.on('error', (error) => {
|
|
242
333
|
activeGeminiProcesses.delete(processRegistryKey);
|
|
243
334
|
|
|
244
|
-
|
|
245
|
-
type: 'claude-error',
|
|
246
|
-
error: error.message,
|
|
247
|
-
sessionId: finalizeSessionId()
|
|
248
|
-
});
|
|
335
|
+
emitFatalError(error.message);
|
|
249
336
|
|
|
250
337
|
reject(error);
|
|
251
338
|
});
|
package/server/index.js
CHANGED
|
@@ -73,16 +73,14 @@ import pty from 'node-pty';
|
|
|
73
73
|
import fetch from 'node-fetch';
|
|
74
74
|
import mime from 'mime-types';
|
|
75
75
|
|
|
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';
|
|
76
|
+
import { getProjects, getSessions, getSessionMessages, renameProject, deleteSession, deleteProject, addProjectManually, extractProjectDirectory, clearProjectDirectoryCache, clearProviderSessionLookupCaches, getGeminiSessionMessages } from './projects.js';
|
|
77
|
+
import { queryClaudeSDK, isClaudeSDKSessionActive, getActiveClaudeSDKSessions, resolveToolApproval } from './claude-sdk.js';
|
|
78
|
+
import { queryCodex, isCodexSessionActive, getActiveCodexSessions } from './openai-codex.js';
|
|
79
|
+
import { queryGemini, isGeminiSessionActive, getActiveGeminiSessions } from './gemini-cli.js';
|
|
80
|
+
import { queryOpencode, isOpencodeSessionActive, getActiveOpencodeSessions } from './opencode-cli.js';
|
|
82
81
|
import gitRoutes from './routes/git.js';
|
|
83
82
|
import authRoutes from './routes/auth.js';
|
|
84
83
|
import mcpRoutes from './routes/mcp.js';
|
|
85
|
-
import cursorRoutes from './routes/cursor.js';
|
|
86
84
|
import taskmasterRoutes from './routes/taskmaster.js';
|
|
87
85
|
import mcpUtilsRoutes from './routes/mcp-utils.js';
|
|
88
86
|
import commandsRoutes from './routes/commands.js';
|
|
@@ -94,11 +92,14 @@ import cliAuthRoutes from './routes/cli-auth.js';
|
|
|
94
92
|
import userRoutes from './routes/user.js';
|
|
95
93
|
import codexRoutes from './routes/codex.js';
|
|
96
94
|
import opencodeRoutes from './routes/opencode.js';
|
|
95
|
+
import sessionCoreRoutes from './routes/session-core.js';
|
|
97
96
|
import { parseCodexTokenCountInfo } from './utils/codexTokenUsage.js';
|
|
98
97
|
import { initializeDatabase } from './database/db.js';
|
|
99
98
|
import { validateApiKey, authenticateToken, authenticateWebSocket } from './middleware/auth.js';
|
|
100
99
|
import { IS_PLATFORM } from './constants/config.js';
|
|
101
100
|
import { getChannelManager } from './channels/index.js';
|
|
101
|
+
import { SessionEventMirrorWriter } from './session-core/runtimeWriter.js';
|
|
102
|
+
import { abortAgentSessionWithWriter } from './session-core/abortSession.js';
|
|
102
103
|
|
|
103
104
|
// File system watcher for projects folder
|
|
104
105
|
let projectsWatcher = null;
|
|
@@ -243,10 +244,26 @@ function broadcastProgress(progress) {
|
|
|
243
244
|
});
|
|
244
245
|
}
|
|
245
246
|
|
|
246
|
-
|
|
247
|
+
function extractSessionIdFromChangedFile(filePath) {
|
|
248
|
+
const basename = path.basename(filePath || '', path.extname(filePath || ''));
|
|
249
|
+
if (!basename) {
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
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);
|
|
254
|
+
if (directMatch?.[1]) {
|
|
255
|
+
return directMatch[1];
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return basename || null;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Setup file system watcher for project and provider session folders using chokidar
|
|
247
262
|
async function setupProjectsWatcher() {
|
|
248
263
|
const chokidar = (await import('chokidar')).default;
|
|
249
264
|
const claudeProjectsPath = path.join(os.homedir(), '.claude', 'projects');
|
|
265
|
+
const codexSessionsPath = path.join(os.homedir(), '.codex', 'sessions');
|
|
266
|
+
const watchRoots = [claudeProjectsPath, codexSessionsPath];
|
|
250
267
|
|
|
251
268
|
if (projectsWatcher) {
|
|
252
269
|
projectsWatcher.close();
|
|
@@ -254,7 +271,7 @@ async function setupProjectsWatcher() {
|
|
|
254
271
|
|
|
255
272
|
try {
|
|
256
273
|
// Initialize chokidar watcher with optimized settings
|
|
257
|
-
projectsWatcher = chokidar.watch(
|
|
274
|
+
projectsWatcher = chokidar.watch(watchRoots, {
|
|
258
275
|
ignored: [
|
|
259
276
|
'**/node_modules/**',
|
|
260
277
|
'**/.git/**',
|
|
@@ -289,17 +306,26 @@ async function setupProjectsWatcher() {
|
|
|
289
306
|
|
|
290
307
|
// Clear project directory cache when files change
|
|
291
308
|
clearProjectDirectoryCache();
|
|
309
|
+
clearProviderSessionLookupCaches();
|
|
292
310
|
|
|
293
311
|
// Get updated projects list
|
|
294
312
|
const updatedProjects = await getProjects(broadcastProgress);
|
|
295
313
|
|
|
296
314
|
// Notify all connected clients about the project changes
|
|
315
|
+
const changedProvider = filePath.startsWith(codexSessionsPath)
|
|
316
|
+
? 'codex'
|
|
317
|
+
: 'claude';
|
|
318
|
+
const changedFileRoot = changedProvider === 'codex'
|
|
319
|
+
? codexSessionsPath
|
|
320
|
+
: claudeProjectsPath;
|
|
297
321
|
const updateMessage = JSON.stringify({
|
|
298
322
|
type: 'projects_updated',
|
|
299
323
|
projects: updatedProjects,
|
|
300
324
|
timestamp: new Date().toISOString(),
|
|
301
325
|
changeType: eventType,
|
|
302
|
-
changedFile: path.relative(
|
|
326
|
+
changedFile: path.relative(changedFileRoot, filePath),
|
|
327
|
+
changedProvider,
|
|
328
|
+
changedSessionId: extractSessionIdFromChangedFile(filePath)
|
|
303
329
|
});
|
|
304
330
|
|
|
305
331
|
connectedClients.forEach(client => {
|
|
@@ -433,9 +459,6 @@ app.use('/api/git', authenticateToken, gitRoutes);
|
|
|
433
459
|
// MCP API Routes (protected)
|
|
434
460
|
app.use('/api/mcp', authenticateToken, mcpRoutes);
|
|
435
461
|
|
|
436
|
-
// Cursor API Routes (protected)
|
|
437
|
-
app.use('/api/cursor', authenticateToken, cursorRoutes);
|
|
438
|
-
|
|
439
462
|
// TaskMaster API Routes (protected)
|
|
440
463
|
app.use('/api/taskmaster', authenticateToken, taskmasterRoutes);
|
|
441
464
|
|
|
@@ -460,6 +483,7 @@ app.use('/api/user', authenticateToken, userRoutes);
|
|
|
460
483
|
// Codex API Routes (protected)
|
|
461
484
|
app.use('/api/codex', authenticateToken, codexRoutes);
|
|
462
485
|
app.use('/api/opencode', authenticateToken, opencodeRoutes);
|
|
486
|
+
app.use('/api/session-core', authenticateToken, sessionCoreRoutes);
|
|
463
487
|
|
|
464
488
|
// Agent API Routes (uses API key authentication)
|
|
465
489
|
app.use('/api/agent', agentRoutes);
|
|
@@ -1052,11 +1076,13 @@ function handleChatConnection(ws) {
|
|
|
1052
1076
|
connectedClients.add(ws);
|
|
1053
1077
|
|
|
1054
1078
|
// Wrap WebSocket with writer for consistent interface with SSEStreamWriter
|
|
1055
|
-
const
|
|
1079
|
+
const baseWriter = new WebSocketWriter(ws);
|
|
1080
|
+
const getSessionWriter = (provider = 'claude') => new SessionEventMirrorWriter(baseWriter, provider);
|
|
1056
1081
|
|
|
1057
1082
|
ws.on('message', async (message) => {
|
|
1083
|
+
let data = null;
|
|
1058
1084
|
try {
|
|
1059
|
-
|
|
1085
|
+
data = JSON.parse(message);
|
|
1060
1086
|
|
|
1061
1087
|
if (data.type === 'claude-command') {
|
|
1062
1088
|
console.log('[DEBUG] User message:', data.command || '[Continue/Resume]');
|
|
@@ -1064,62 +1090,34 @@ function handleChatConnection(ws) {
|
|
|
1064
1090
|
console.log('🔄 Session:', data.options?.sessionId ? 'Resume' : 'New');
|
|
1065
1091
|
|
|
1066
1092
|
// 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);
|
|
1093
|
+
await queryClaudeSDK(data.command, data.options, new SessionEventMirrorWriter(baseWriter, 'claude'));
|
|
1074
1094
|
} else if (data.type === 'codex-command') {
|
|
1075
1095
|
console.log('[DEBUG] Codex message:', data.command || '[Continue/Resume]');
|
|
1076
1096
|
console.log('📁 Project:', data.options?.projectPath || data.options?.cwd || 'Unknown');
|
|
1077
1097
|
console.log('🔄 Session:', data.options?.sessionId ? 'Resume' : 'New');
|
|
1078
1098
|
console.log('🤖 Model:', data.options?.model || 'default');
|
|
1079
|
-
await queryCodex(data.command, data.options,
|
|
1099
|
+
await queryCodex(data.command, data.options, new SessionEventMirrorWriter(baseWriter, 'codex'));
|
|
1080
1100
|
} else if (data.type === 'gemini-command') {
|
|
1081
1101
|
console.log('[DEBUG] Gemini message:', data.command || '[Continue/Resume]');
|
|
1082
1102
|
console.log('📁 Project:', data.options?.projectPath || data.options?.cwd || 'Unknown');
|
|
1083
1103
|
console.log('🔄 Session:', data.options?.sessionId ? 'Resume' : 'New');
|
|
1084
1104
|
console.log('🤖 Model:', data.options?.model || 'default');
|
|
1085
|
-
await queryGemini(data.command, data.options,
|
|
1105
|
+
await queryGemini(data.command, data.options, new SessionEventMirrorWriter(baseWriter, 'gemini'));
|
|
1086
1106
|
} else if (data.type === 'opencode-command') {
|
|
1087
1107
|
console.log('[DEBUG] OpenCode message:', data.command || '[Continue/Resume]');
|
|
1088
1108
|
console.log('📁 Project:', data.options?.projectPath || data.options?.cwd || 'Unknown');
|
|
1089
1109
|
console.log('🔄 Session:', data.options?.sessionId ? 'Resume' : 'New');
|
|
1090
1110
|
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);
|
|
1111
|
+
await queryOpencode(data.command, data.options, new SessionEventMirrorWriter(baseWriter, 'opencode'));
|
|
1100
1112
|
} else if (data.type === 'abort-session') {
|
|
1101
1113
|
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,
|
|
1114
|
+
const provider = typeof data.provider === 'string' && data.provider.trim()
|
|
1115
|
+
? data.provider.trim().toLowerCase()
|
|
1116
|
+
: 'claude';
|
|
1117
|
+
await abortAgentSessionWithWriter({
|
|
1121
1118
|
provider,
|
|
1122
|
-
|
|
1119
|
+
sessionId: data.sessionId,
|
|
1120
|
+
writer: getSessionWriter(provider)
|
|
1123
1121
|
});
|
|
1124
1122
|
} else if (data.type === 'claude-permission-response') {
|
|
1125
1123
|
// Relay UI approval decisions back into the SDK control flow.
|
|
@@ -1133,24 +1131,13 @@ function handleChatConnection(ws) {
|
|
|
1133
1131
|
rememberEntry: data.rememberEntry
|
|
1134
1132
|
});
|
|
1135
1133
|
}
|
|
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
1134
|
} else if (data.type === 'check-session-status') {
|
|
1146
1135
|
// Check if a specific session is currently processing
|
|
1147
1136
|
const provider = data.provider || 'claude';
|
|
1148
1137
|
const sessionId = data.sessionId;
|
|
1138
|
+
const sessionWriter = getSessionWriter(provider);
|
|
1149
1139
|
let isActive;
|
|
1150
|
-
|
|
1151
|
-
if (provider === 'cursor') {
|
|
1152
|
-
isActive = isCursorSessionActive(sessionId);
|
|
1153
|
-
} else if (provider === 'codex') {
|
|
1140
|
+
if (provider === 'codex') {
|
|
1154
1141
|
isActive = isCodexSessionActive(sessionId);
|
|
1155
1142
|
} else if (provider === 'gemini') {
|
|
1156
1143
|
isActive = isGeminiSessionActive(sessionId);
|
|
@@ -1161,7 +1148,7 @@ function handleChatConnection(ws) {
|
|
|
1161
1148
|
isActive = isClaudeSDKSessionActive(sessionId);
|
|
1162
1149
|
}
|
|
1163
1150
|
|
|
1164
|
-
|
|
1151
|
+
sessionWriter.send({
|
|
1165
1152
|
type: 'session-status',
|
|
1166
1153
|
sessionId,
|
|
1167
1154
|
provider,
|
|
@@ -1170,22 +1157,22 @@ function handleChatConnection(ws) {
|
|
|
1170
1157
|
} else if (data.type === 'get-active-sessions') {
|
|
1171
1158
|
// Get all currently active sessions
|
|
1172
1159
|
const activeSessions = {
|
|
1173
|
-
claude: getActiveClaudeSDKSessions(),
|
|
1174
|
-
cursor: getActiveCursorSessions(),
|
|
1175
|
-
codex: getActiveCodexSessions(),
|
|
1160
|
+
claude: getActiveClaudeSDKSessions(), codex: getActiveCodexSessions(),
|
|
1176
1161
|
gemini: getActiveGeminiSessions(),
|
|
1177
1162
|
opencode: getActiveOpencodeSessions()
|
|
1178
1163
|
};
|
|
1179
|
-
|
|
1164
|
+
baseWriter.send({
|
|
1180
1165
|
type: 'active-sessions',
|
|
1181
1166
|
sessions: activeSessions
|
|
1182
1167
|
});
|
|
1183
1168
|
}
|
|
1184
1169
|
} catch (error) {
|
|
1185
1170
|
console.error('[ERROR] Chat WebSocket error:', error.message);
|
|
1186
|
-
|
|
1171
|
+
baseWriter.send({
|
|
1187
1172
|
type: 'error',
|
|
1188
|
-
error: error.message
|
|
1173
|
+
error: error.message,
|
|
1174
|
+
provider: typeof data?.type === 'string' ? data.type.replace(/-command$/, '') : undefined,
|
|
1175
|
+
sessionId: data?.sessionId || data?.options?.sessionId || null
|
|
1189
1176
|
});
|
|
1190
1177
|
}
|
|
1191
1178
|
});
|
|
@@ -1217,11 +1204,9 @@ function handleShellConnection(ws) {
|
|
|
1217
1204
|
const initialCommand = data.initialCommand;
|
|
1218
1205
|
const isPlainShell = data.isPlainShell || (!!initialCommand && !hasSession) || provider === 'plain-shell';
|
|
1219
1206
|
|
|
1220
|
-
// Login commands
|
|
1207
|
+
// Login commands should never reuse cached sessions
|
|
1221
1208
|
const isLoginCommand = initialCommand && (
|
|
1222
|
-
initialCommand.includes('setup-token') ||
|
|
1223
|
-
initialCommand.includes('cursor-agent login') ||
|
|
1224
|
-
initialCommand.includes('auth login')
|
|
1209
|
+
initialCommand.includes('setup-token') || initialCommand.includes('auth login')
|
|
1225
1210
|
);
|
|
1226
1211
|
|
|
1227
1212
|
// Include command hash in session key so different commands get separate sessions
|
|
@@ -1280,7 +1265,7 @@ function handleShellConnection(ws) {
|
|
|
1280
1265
|
if (isPlainShell) {
|
|
1281
1266
|
welcomeMsg = `\x1b[36mStarting terminal in: ${projectPath}\x1b[0m\r\n`;
|
|
1282
1267
|
} else {
|
|
1283
|
-
const providerName = provider === '
|
|
1268
|
+
const providerName = provider === 'codex' ? 'Codex' : provider === 'gemini' ? 'Gemini' : provider === 'opencode' ? 'OpenCode' : 'Claude';
|
|
1284
1269
|
welcomeMsg = hasSession ?
|
|
1285
1270
|
`\x1b[36mResuming ${providerName} session ${sessionId} in: ${projectPath}\x1b[0m\r\n` :
|
|
1286
1271
|
`\x1b[36mStarting new ${providerName} session in: ${projectPath}\x1b[0m\r\n`;
|
|
@@ -1301,21 +1286,6 @@ function handleShellConnection(ws) {
|
|
|
1301
1286
|
} else {
|
|
1302
1287
|
shellCommand = `cd "${projectPath}" && ${initialCommand}`;
|
|
1303
1288
|
}
|
|
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
1289
|
} else if (provider === 'gemini') {
|
|
1320
1290
|
if (os.platform() === 'win32') {
|
|
1321
1291
|
if (hasSession && sessionId) {
|
|
@@ -1766,18 +1736,6 @@ app.get('/api/projects/:projectName/sessions/:sessionId/token-usage', authentica
|
|
|
1766
1736
|
if (!safeSessionId) {
|
|
1767
1737
|
return res.status(400).json({ error: 'Invalid sessionId' });
|
|
1768
1738
|
}
|
|
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
1739
|
// Handle Codex sessions
|
|
1782
1740
|
if (provider === 'codex') {
|
|
1783
1741
|
const codexSessionsDir = path.join(homeDir, '.codex', 'sessions');
|
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
|
}
|