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