@axhub/genie 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +37 -23
- package/dist/manifest.json +2 -2
- package/dist/sw.js +18 -46
- package/package.json +12 -7
- package/server/bin/codex-sdk-wrapper.js +49 -0
- package/server/channels/core/ChannelManager.js +399 -0
- package/server/channels/core/PluginManager.js +59 -0
- package/server/channels/index.js +3 -0
- package/server/channels/plugins/BasePlugin.js +46 -0
- package/server/channels/plugins/dingtalk/DingTalkAdapter.js +156 -0
- package/server/channels/plugins/dingtalk/DingTalkPlugin.js +592 -0
- package/server/channels/plugins/dingtalk/index.js +2 -0
- package/server/channels/plugins/lark/LarkAdapter.js +100 -0
- package/server/channels/plugins/lark/LarkCards.js +43 -0
- package/server/channels/plugins/lark/LarkPlugin.js +260 -0
- package/server/channels/runtime/AgentRuntimeAdapter.js +176 -0
- package/server/channels/runtime/DingTalkStreamWriter.js +105 -0
- package/server/channels/runtime/LarkStreamWriter.js +99 -0
- package/server/channels/store/ChannelStore.js +202 -0
- package/server/claude-sdk.js +151 -3
- package/server/cli.js +21 -21
- package/server/database/db.js +449 -275
- package/server/gemini-cli.js +106 -19
- package/server/index.js +87 -108
- package/server/load-env.js +16 -13
- package/server/openai-codex.js +146 -10
- package/server/projects.js +340 -331
- package/server/routes/agent.js +429 -30
- package/server/routes/auth.js +14 -36
- package/server/routes/channels.js +221 -0
- package/server/routes/cli-auth.js +117 -124
- 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-C2r-Jzfw.js +0 -897
- package/dist/assets/index-COkoBQi5.css +0 -32
- package/server/cursor-cli.js +0 -276
- package/server/database/init.sql +0 -52
- package/server/routes/cursor.js +0 -795
package/server/routes/git.js
CHANGED
|
@@ -5,7 +5,6 @@ import path from 'path';
|
|
|
5
5
|
import { promises as fs } from 'fs';
|
|
6
6
|
import { extractProjectDirectory } from '../projects.js';
|
|
7
7
|
import { queryClaudeSDK } from '../claude-sdk.js';
|
|
8
|
-
import { spawnCursor } from '../cursor-cli.js';
|
|
9
8
|
import { queryGemini } from '../gemini-cli.js';
|
|
10
9
|
|
|
11
10
|
const router = express.Router();
|
|
@@ -520,8 +519,8 @@ router.post('/generate-commit-message', async (req, res) => {
|
|
|
520
519
|
}
|
|
521
520
|
|
|
522
521
|
// Validate provider
|
|
523
|
-
if (!['claude', '
|
|
524
|
-
return res.status(400).json({ error: 'provider must be "claude"
|
|
522
|
+
if (!['claude', 'gemini'].includes(provider)) {
|
|
523
|
+
return res.status(400).json({ error: 'provider must be "claude" or "gemini"' });
|
|
525
524
|
}
|
|
526
525
|
|
|
527
526
|
try {
|
|
@@ -574,10 +573,10 @@ router.post('/generate-commit-message', async (req, res) => {
|
|
|
574
573
|
});
|
|
575
574
|
|
|
576
575
|
/**
|
|
577
|
-
* Generates a commit message using AI (Claude SDK,
|
|
576
|
+
* Generates a commit message using AI (Claude SDK, Codex, Gemini, or OpenCode)
|
|
578
577
|
* @param {Array<string>} files - List of changed files
|
|
579
578
|
* @param {string} diffContext - Git diff content
|
|
580
|
-
* @param {string} provider - 'claude'
|
|
579
|
+
* @param {string} provider - 'claude' or 'gemini'
|
|
581
580
|
* @param {string} projectPath - Project directory path
|
|
582
581
|
* @returns {Promise<string>} Generated commit message
|
|
583
582
|
*/
|
|
@@ -611,7 +610,7 @@ Generate the commit message:`;
|
|
|
611
610
|
const parsed = typeof data === 'string' ? JSON.parse(data) : data;
|
|
612
611
|
console.log('🔍 Writer received message type:', parsed.type);
|
|
613
612
|
|
|
614
|
-
// Handle different message formats from
|
|
613
|
+
// Handle different message formats from supported providers
|
|
615
614
|
// Claude SDK sends: {type: 'claude-response', data: {message: {content: [...]}}}
|
|
616
615
|
if (parsed.type === 'claude-response' && parsed.data) {
|
|
617
616
|
const message = parsed.data.message || parsed.data;
|
|
@@ -626,11 +625,6 @@ Generate the commit message:`;
|
|
|
626
625
|
}
|
|
627
626
|
}
|
|
628
627
|
}
|
|
629
|
-
// Cursor CLI sends: {type: 'cursor-output', output: '...'}
|
|
630
|
-
else if (parsed.type === 'cursor-output' && parsed.output) {
|
|
631
|
-
console.log('✅ Cursor output:', parsed.output.substring(0, 100));
|
|
632
|
-
responseText += parsed.output;
|
|
633
|
-
}
|
|
634
628
|
else if (parsed.type === 'claude-response' && parsed.data?.type === 'content_block_delta' && parsed.data?.delta?.text) {
|
|
635
629
|
responseText += parsed.data.delta.text;
|
|
636
630
|
}
|
|
@@ -657,11 +651,6 @@ Generate the commit message:`;
|
|
|
657
651
|
permissionMode: 'bypassPermissions',
|
|
658
652
|
model: 'sonnet'
|
|
659
653
|
}, writer);
|
|
660
|
-
} else if (provider === 'cursor') {
|
|
661
|
-
await spawnCursor(prompt, {
|
|
662
|
-
cwd: projectPath,
|
|
663
|
-
skipPermissions: true
|
|
664
|
-
}, writer);
|
|
665
654
|
} else if (provider === 'gemini') {
|
|
666
655
|
await queryGemini(prompt, {
|
|
667
656
|
cwd: projectPath,
|
|
@@ -4,6 +4,7 @@ import path from 'path';
|
|
|
4
4
|
import { spawn } from 'child_process';
|
|
5
5
|
import os from 'os';
|
|
6
6
|
import { addProjectManually } from '../projects.js';
|
|
7
|
+
import { githubTokensDb } from '../database/db.js';
|
|
7
8
|
|
|
8
9
|
const router = express.Router();
|
|
9
10
|
|
|
@@ -311,13 +312,7 @@ router.post('/create-workspace', async (req, res) => {
|
|
|
311
312
|
* Helper function to get GitHub token from database
|
|
312
313
|
*/
|
|
313
314
|
async function getGithubTokenById(tokenId, userId) {
|
|
314
|
-
const
|
|
315
|
-
const db = await getDatabase();
|
|
316
|
-
|
|
317
|
-
const credential = await db.get(
|
|
318
|
-
'SELECT * FROM user_credentials WHERE id = ? AND user_id = ? AND credential_type = ? AND is_active = 1',
|
|
319
|
-
[tokenId, userId, 'github_token']
|
|
320
|
-
);
|
|
315
|
+
const credential = githubTokensDb.getGithubTokenById(userId, tokenId);
|
|
321
316
|
|
|
322
317
|
// Return in the expected format (github_token field for compatibility)
|
|
323
318
|
if (credential) {
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import { getProjects } from '../projects.js';
|
|
3
|
+
import { discoverAllProviders, discoverProvider } from '../session-core/providerDiscovery.js';
|
|
4
|
+
import { getProviderAdapter } from '../session-core/providerAdapters.js';
|
|
5
|
+
|
|
6
|
+
const router = express.Router();
|
|
7
|
+
|
|
8
|
+
function flattenProjectSessions(project) {
|
|
9
|
+
const groups = [
|
|
10
|
+
{ provider: 'claude', items: project.sessions || [] },
|
|
11
|
+
{ provider: 'codex', items: project.codexSessions || [] },
|
|
12
|
+
{ provider: 'gemini', items: project.geminiSessions || [] },
|
|
13
|
+
{ provider: 'opencode', items: project.opencodeSessions || [] }
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
return groups.flatMap(({ provider, items }) => items.map((item) => ({ ...item, provider, __provider: provider })))
|
|
17
|
+
.sort((a, b) => new Date(b.lastActivity || b.updated_at || b.createdAt || 0) - new Date(a.lastActivity || a.updated_at || a.createdAt || 0));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
router.get('/providers', async (req, res) => {
|
|
21
|
+
try {
|
|
22
|
+
const providers = await discoverAllProviders({ projectPath: req.query.projectPath });
|
|
23
|
+
res.json({ success: true, providers });
|
|
24
|
+
} catch (error) {
|
|
25
|
+
res.status(500).json({ success: false, error: error.message });
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
router.get('/providers/:provider', async (req, res) => {
|
|
30
|
+
try {
|
|
31
|
+
const result = await discoverProvider(req.params.provider, { projectPath: req.query.projectPath });
|
|
32
|
+
res.json({ success: true, ...result });
|
|
33
|
+
} catch (error) {
|
|
34
|
+
res.status(500).json({ success: false, error: error.message });
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
router.get('/projects/:projectName/history-index', async (req, res) => {
|
|
39
|
+
try {
|
|
40
|
+
const projects = await getProjects();
|
|
41
|
+
const project = projects.find((entry) => entry.name === req.params.projectName);
|
|
42
|
+
if (!project) {
|
|
43
|
+
return res.status(404).json({ success: false, error: 'Project not found' });
|
|
44
|
+
}
|
|
45
|
+
res.json({ success: true, project: { name: project.name, fullPath: project.fullPath || project.path, displayName: project.displayName || project.name }, sessions: flattenProjectSessions(project) });
|
|
46
|
+
} catch (error) {
|
|
47
|
+
res.status(500).json({ success: false, error: error.message });
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
router.get('/sessions/:sessionId/resolve', async (req, res) => {
|
|
52
|
+
try {
|
|
53
|
+
const projects = await getProjects();
|
|
54
|
+
const requestedSessionId = String(req.params.sessionId || '').trim();
|
|
55
|
+
const providerHint = typeof req.query.provider === 'string' ? req.query.provider.trim().toLowerCase() : '';
|
|
56
|
+
|
|
57
|
+
if (!requestedSessionId) {
|
|
58
|
+
return res.status(400).json({ success: false, error: 'Session id is required' });
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const providerOrder = [
|
|
62
|
+
providerHint,
|
|
63
|
+
'codex',
|
|
64
|
+
'claude',
|
|
65
|
+
'gemini',
|
|
66
|
+
'opencode'
|
|
67
|
+
].filter((provider, index, all) => provider && all.indexOf(provider) === index);
|
|
68
|
+
|
|
69
|
+
const directProjectMatch = projects.find((project) => {
|
|
70
|
+
const flattened = flattenProjectSessions(project);
|
|
71
|
+
return flattened.some((session) => session.id === requestedSessionId);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
if (directProjectMatch) {
|
|
75
|
+
const flattened = flattenProjectSessions(directProjectMatch);
|
|
76
|
+
const matchedSession = flattened.find((session) => session.id === requestedSessionId);
|
|
77
|
+
|
|
78
|
+
return res.json({
|
|
79
|
+
success: true,
|
|
80
|
+
found: true,
|
|
81
|
+
provider: matchedSession.provider,
|
|
82
|
+
session: matchedSession,
|
|
83
|
+
project: {
|
|
84
|
+
name: directProjectMatch.name,
|
|
85
|
+
fullPath: directProjectMatch.fullPath || directProjectMatch.path,
|
|
86
|
+
path: directProjectMatch.path,
|
|
87
|
+
displayName: directProjectMatch.displayName || directProjectMatch.name
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
for (const provider of providerOrder) {
|
|
93
|
+
const adapter = getProviderAdapter(provider);
|
|
94
|
+
|
|
95
|
+
for (const project of projects) {
|
|
96
|
+
let sessions = [];
|
|
97
|
+
|
|
98
|
+
try {
|
|
99
|
+
if (provider === 'claude') {
|
|
100
|
+
const result = await adapter.listSessions({ projectName: project.name, limit: 1000, offset: 0 });
|
|
101
|
+
sessions = Array.isArray(result) ? result : [];
|
|
102
|
+
} else {
|
|
103
|
+
sessions = await adapter.listSessions({ projectPath: project.fullPath || project.path, limit: 0 });
|
|
104
|
+
}
|
|
105
|
+
} catch (error) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const matchedSession = sessions.find((session) => session.id === requestedSessionId);
|
|
110
|
+
if (!matchedSession) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return res.json({
|
|
115
|
+
success: true,
|
|
116
|
+
found: true,
|
|
117
|
+
provider,
|
|
118
|
+
session: matchedSession,
|
|
119
|
+
project: {
|
|
120
|
+
name: project.name,
|
|
121
|
+
fullPath: project.fullPath || project.path,
|
|
122
|
+
path: project.path,
|
|
123
|
+
displayName: project.displayName || project.name
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
res.status(404).json({ success: true, found: false });
|
|
130
|
+
} catch (error) {
|
|
131
|
+
res.status(500).json({ success: false, error: error.message });
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
router.get('/sessions/:provider/:sessionId/events', async (req, res) => {
|
|
136
|
+
try {
|
|
137
|
+
const adapter = getProviderAdapter(req.params.provider);
|
|
138
|
+
const parsedLimit = req.query.limit ? parseInt(req.query.limit, 10) : null;
|
|
139
|
+
const parsedOffset = req.query.offset ? parseInt(req.query.offset, 10) : 0;
|
|
140
|
+
const result = await adapter.loadEvents({
|
|
141
|
+
projectName: req.query.projectName,
|
|
142
|
+
projectPath: req.query.projectPath,
|
|
143
|
+
sessionId: req.params.sessionId,
|
|
144
|
+
limit: parsedLimit,
|
|
145
|
+
offset: parsedOffset
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
const events = Array.isArray(result) ? result : (result?.events || result?.messages || []);
|
|
149
|
+
const total = typeof result?.total === 'number' ? result.total : events.length;
|
|
150
|
+
const hasMore = typeof result?.hasMore === 'boolean' ? result.hasMore : false;
|
|
151
|
+
const offset = typeof result?.offset === 'number' ? result.offset : parsedOffset;
|
|
152
|
+
const limit = Object.prototype.hasOwnProperty.call(result || {}, 'limit')
|
|
153
|
+
? result.limit
|
|
154
|
+
: parsedLimit;
|
|
155
|
+
|
|
156
|
+
const response = {
|
|
157
|
+
success: true,
|
|
158
|
+
provider: req.params.provider,
|
|
159
|
+
sessionId: req.params.sessionId,
|
|
160
|
+
events,
|
|
161
|
+
total,
|
|
162
|
+
hasMore,
|
|
163
|
+
offset,
|
|
164
|
+
limit
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
if (result && typeof result === 'object' && result.tokenUsage) {
|
|
168
|
+
response.tokenUsage = result.tokenUsage;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
res.json(response);
|
|
172
|
+
} catch (error) {
|
|
173
|
+
res.status(500).json({ success: false, error: error.message });
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
export default router;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { abortClaudeSDKSession } from '../claude-sdk.js';
|
|
2
|
+
import { abortCodexSession } from '../openai-codex.js';
|
|
3
|
+
import { abortGeminiSession } from '../gemini-cli.js';
|
|
4
|
+
import { abortOpencodeSession } from '../opencode-cli.js';
|
|
5
|
+
|
|
6
|
+
export const ABORTABLE_AGENT_PROVIDERS = ['claude', 'codex', 'gemini', 'opencode'];
|
|
7
|
+
|
|
8
|
+
export function isAbortableAgentProvider(provider) {
|
|
9
|
+
return ABORTABLE_AGENT_PROVIDERS.includes(String(provider || '').trim().toLowerCase());
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export async function abortAgentSession(provider, sessionId) {
|
|
13
|
+
const normalizedProvider = String(provider || 'claude').trim().toLowerCase();
|
|
14
|
+
|
|
15
|
+
if (normalizedProvider === 'codex') {
|
|
16
|
+
return abortCodexSession(sessionId);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (normalizedProvider === 'gemini') {
|
|
20
|
+
return abortGeminiSession(sessionId);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (normalizedProvider === 'opencode') {
|
|
24
|
+
return abortOpencodeSession(sessionId);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return abortClaudeSDKSession(sessionId);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export async function abortAgentSessionWithWriter({ provider = 'claude', sessionId, writer }) {
|
|
31
|
+
const normalizedProvider = String(provider || 'claude').trim().toLowerCase();
|
|
32
|
+
const success = await abortAgentSession(normalizedProvider, sessionId);
|
|
33
|
+
const payload = {
|
|
34
|
+
type: 'session-aborted',
|
|
35
|
+
sessionId,
|
|
36
|
+
provider: normalizedProvider,
|
|
37
|
+
success
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
if (writer && typeof writer.send === 'function') {
|
|
41
|
+
writer.send(payload);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
success,
|
|
46
|
+
payload
|
|
47
|
+
};
|
|
48
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
CONVERSATION_EVENT_KINDS,
|
|
7
|
+
isConversationEvent
|
|
8
|
+
} from '../../shared/conversationEvents.js';
|
|
9
|
+
|
|
10
|
+
const MIRRORED_EVENT_STORE_ROOT = path.join(os.homedir(), '.axhub-genie', 'session-events');
|
|
11
|
+
const PERSISTED_EVENT_KINDS = new Set([
|
|
12
|
+
CONVERSATION_EVENT_KINDS.SESSION_STATE_CHANGED,
|
|
13
|
+
CONVERSATION_EVENT_KINDS.ERROR,
|
|
14
|
+
CONVERSATION_EVENT_KINDS.APPROVAL_REQUEST,
|
|
15
|
+
CONVERSATION_EVENT_KINDS.APPROVAL_RESOLVED,
|
|
16
|
+
CONVERSATION_EVENT_KINDS.SYSTEM_NOTICE
|
|
17
|
+
]);
|
|
18
|
+
|
|
19
|
+
function getSessionEventFilePath(provider, sessionId) {
|
|
20
|
+
return path.join(MIRRORED_EVENT_STORE_ROOT, String(provider || 'claude'), `${sessionId}.jsonl`);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function normalizePersistedEvents(events = []) {
|
|
24
|
+
return events.filter((event) => (
|
|
25
|
+
isConversationEvent(event) &&
|
|
26
|
+
event.sessionId &&
|
|
27
|
+
PERSISTED_EVENT_KINDS.has(event.kind)
|
|
28
|
+
));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function sortObjectKeys(value) {
|
|
32
|
+
if (Array.isArray(value)) {
|
|
33
|
+
return value.map(sortObjectKeys);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (value && typeof value === 'object') {
|
|
37
|
+
return Object.keys(value)
|
|
38
|
+
.sort()
|
|
39
|
+
.reduce((accumulator, key) => {
|
|
40
|
+
accumulator[key] = sortObjectKeys(value[key]);
|
|
41
|
+
return accumulator;
|
|
42
|
+
}, {});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function createEventSignature(event) {
|
|
49
|
+
return JSON.stringify(sortObjectKeys({
|
|
50
|
+
kind: event.kind,
|
|
51
|
+
provider: event.provider,
|
|
52
|
+
sessionId: event.sessionId,
|
|
53
|
+
timestamp: event.timestamp,
|
|
54
|
+
payload: event.payload || {},
|
|
55
|
+
extensions: event.extensions || {},
|
|
56
|
+
rawRef: event.rawRef || null
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export async function appendMirroredConversationEvents(events = []) {
|
|
61
|
+
const normalizedEvents = normalizePersistedEvents(events);
|
|
62
|
+
if (normalizedEvents.length === 0) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const eventsByFile = new Map();
|
|
67
|
+
normalizedEvents.forEach((event) => {
|
|
68
|
+
const filePath = getSessionEventFilePath(event.provider, event.sessionId);
|
|
69
|
+
if (!eventsByFile.has(filePath)) {
|
|
70
|
+
eventsByFile.set(filePath, []);
|
|
71
|
+
}
|
|
72
|
+
eventsByFile.get(filePath).push(event);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
await Promise.all(Array.from(eventsByFile.entries()).map(async ([filePath, fileEvents]) => {
|
|
76
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
77
|
+
const serialized = fileEvents.map((event) => JSON.stringify(event)).join('\n');
|
|
78
|
+
await fs.appendFile(filePath, `${serialized}\n`, 'utf8');
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export async function readMirroredConversationEvents(provider, sessionId) {
|
|
83
|
+
if (!provider || !sessionId) {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const filePath = getSessionEventFilePath(provider, sessionId);
|
|
88
|
+
|
|
89
|
+
try {
|
|
90
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
91
|
+
return content
|
|
92
|
+
.split('\n')
|
|
93
|
+
.map((line) => line.trim())
|
|
94
|
+
.filter(Boolean)
|
|
95
|
+
.map((line) => {
|
|
96
|
+
try {
|
|
97
|
+
return JSON.parse(line);
|
|
98
|
+
} catch {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
})
|
|
102
|
+
.filter(isConversationEvent);
|
|
103
|
+
} catch (error) {
|
|
104
|
+
if (error?.code === 'ENOENT') {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function mergeConversationEventHistories(primaryEvents = [], mirroredEvents = []) {
|
|
112
|
+
const merged = [];
|
|
113
|
+
const seenSignatures = new Set();
|
|
114
|
+
|
|
115
|
+
[...primaryEvents, ...mirroredEvents].forEach((event) => {
|
|
116
|
+
if (!isConversationEvent(event)) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const signature = createEventSignature(event);
|
|
121
|
+
if (seenSignatures.has(signature)) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
seenSignatures.add(signature);
|
|
126
|
+
merged.push(event);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
merged.sort((left, right) => {
|
|
130
|
+
const leftTime = new Date(left.timestamp || 0).getTime();
|
|
131
|
+
const rightTime = new Date(right.timestamp || 0).getTime();
|
|
132
|
+
if (leftTime !== rightTime) {
|
|
133
|
+
return leftTime - rightTime;
|
|
134
|
+
}
|
|
135
|
+
return 0;
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
return merged;
|
|
139
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { normalizeLegacyHistoryEntries, SUPPORTED_PROVIDERS } from '../../shared/conversationEvents.js';
|
|
2
|
+
import { mergeConversationEventHistories, readMirroredConversationEvents } from './eventStore.js';
|
|
3
|
+
import {
|
|
4
|
+
getSessionMessages,
|
|
5
|
+
getCodexSessionMessages,
|
|
6
|
+
getOpencodeSessionMessages,
|
|
7
|
+
getGeminiSessionMessages,
|
|
8
|
+
getSessions,
|
|
9
|
+
getCodexSessions,
|
|
10
|
+
getOpencodeSessions,
|
|
11
|
+
getGeminiSessions
|
|
12
|
+
} from '../projects.js';
|
|
13
|
+
|
|
14
|
+
async function flattenLegacyMessages(result) {
|
|
15
|
+
if (Array.isArray(result)) return result;
|
|
16
|
+
return Array.isArray(result?.messages) ? result.messages : [];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async function normalizeLegacyLoadResult(result, provider, sessionId) {
|
|
20
|
+
const messages = await flattenLegacyMessages(result);
|
|
21
|
+
const legacyEvents = normalizeLegacyHistoryEntries(messages, provider, sessionId);
|
|
22
|
+
const mirroredEvents = await readMirroredConversationEvents(provider, sessionId);
|
|
23
|
+
const events = mergeConversationEventHistories(legacyEvents, mirroredEvents);
|
|
24
|
+
|
|
25
|
+
if (Array.isArray(result)) {
|
|
26
|
+
return events;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
...result,
|
|
31
|
+
events
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const PROVIDER_ADAPTERS = {
|
|
36
|
+
claude: {
|
|
37
|
+
async listSessions({ projectName, limit = 50, offset = 0 }) {
|
|
38
|
+
const result = await getSessions(projectName, limit, offset);
|
|
39
|
+
return (result?.sessions || []).map((session) => ({ ...session, provider: 'claude' }));
|
|
40
|
+
},
|
|
41
|
+
async loadEvents({ projectName, sessionId, limit = null, offset = 0 }) {
|
|
42
|
+
const rawMessages = await getSessionMessages(projectName, sessionId, limit, offset);
|
|
43
|
+
return normalizeLegacyLoadResult(rawMessages, 'claude', sessionId);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
codex: {
|
|
47
|
+
async listSessions({ projectPath, limit = 50 }) {
|
|
48
|
+
const sessions = await getCodexSessions(projectPath, { limit });
|
|
49
|
+
return sessions.map((session) => ({ ...session, provider: 'codex' }));
|
|
50
|
+
},
|
|
51
|
+
async loadEvents({ sessionId, limit = null, offset = 0 }) {
|
|
52
|
+
const rawMessages = await getCodexSessionMessages(sessionId, limit, offset);
|
|
53
|
+
return normalizeLegacyLoadResult(rawMessages, 'codex', sessionId);
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
gemini: {
|
|
57
|
+
async listSessions({ projectPath, limit = 50 }) {
|
|
58
|
+
const sessions = await getGeminiSessions(projectPath, { limit });
|
|
59
|
+
return sessions.map((session) => ({ ...session, provider: 'gemini' }));
|
|
60
|
+
},
|
|
61
|
+
async loadEvents({ sessionId, limit = null, offset = 0 }) {
|
|
62
|
+
const rawMessages = await getGeminiSessionMessages(sessionId, limit, offset);
|
|
63
|
+
return normalizeLegacyLoadResult(rawMessages, 'gemini', sessionId);
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
opencode: {
|
|
67
|
+
async listSessions({ projectPath, limit = 50 }) {
|
|
68
|
+
const sessions = await getOpencodeSessions(projectPath, { limit });
|
|
69
|
+
return sessions.map((session) => ({ ...session, provider: 'opencode' }));
|
|
70
|
+
},
|
|
71
|
+
async loadEvents({ sessionId, limit = null, offset = 0 }) {
|
|
72
|
+
const rawMessages = await getOpencodeSessionMessages(sessionId, limit, offset);
|
|
73
|
+
return normalizeLegacyLoadResult(rawMessages, 'opencode', sessionId);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export function getProviderAdapter(provider) {
|
|
79
|
+
const normalizedProvider = String(provider || '').toLowerCase();
|
|
80
|
+
if (!SUPPORTED_PROVIDERS.includes(normalizedProvider)) {
|
|
81
|
+
throw new Error(`Unsupported provider: ${provider}`);
|
|
82
|
+
}
|
|
83
|
+
return PROVIDER_ADAPTERS[normalizedProvider];
|
|
84
|
+
}
|