@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/README.md
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Axhub Genie 是一个 Web UI,用来管理与使用本地/远程的 Claude Code、
|
|
1
|
+
Axhub Genie 是一个 Web UI,用来管理与使用本地/远程的 Claude Code、Codex、Gemini 和 OpenCode 会话。
|
|
2
2
|
它提供聊天、文件与终端等能力,便于在桌面和移动端统一操作。
|
package/dist/api-docs.html
CHANGED
|
@@ -303,14 +303,14 @@
|
|
|
303
303
|
This page is auto-generated. Do not edit <code>public/api-docs.html</code> directly.
|
|
304
304
|
</div>
|
|
305
305
|
<article id="markdown-root" class="markdown-body"></article>
|
|
306
|
-
<footer>Generated at: 2026-
|
|
306
|
+
<footer>Generated at: 2026-03-17T18:03:51.485Z</footer>
|
|
307
307
|
</div>
|
|
308
308
|
</section>
|
|
309
309
|
</main>
|
|
310
310
|
|
|
311
311
|
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
|
312
312
|
<script>
|
|
313
|
-
const markdownSource = "# 开放接口使用文档(MVP)\n\n> 单一事实源(Single Source of Truth)文件:`docs/open-api-mvp.zh-CN.md` \n> 页面入口:`/api-docs.html`(由脚本自动生成,请勿手改 HTML)\n\n<a id=\"overview\"></a>\n\n> 适用场景:外部系统(本地 Web / 本地服务)与 Assistant UI 本地服务通信,实现**创建会话、进入指定会话、续聊指定会话**。\n\n## Quick English Summary\n\n- Backend endpoints: `GET /health`, `POST /api/agent`\n- Frontend integration: URL query params + iframe `postMessage` (`update_context`, `update_prompt`)\n- Auth default: local anonymous is allowed for `/api/agent`; `X-API-Key` is optional unless `AGENT_API_KEY_REQUIRED=true`\n\n## 1. 基本信息\n\n- Assistant 前端地址(示例):`http://localhost:5173`\n- Assistant 后端地址(示例):`http://localhost:32123`\n- 会话页面路由格式:`/session/{sessionId}`\n- 健康检查:`GET /health`\n\n### 1.0 地址发现(先执行命令)\n\n在开发、测试、生产环境中,地址可能不同。请先在部署机器执行:\n\n```bash\naxhub-genie status\n```\n\n建议使用三项核心字段:\n\n- `endpoint.environment`\n- `endpoint.frontendUrl`\n- `endpoint.apiBaseUrl`\n\n说明:\n\n- 在不知道 API 地址时,不需要先调用任何 HTTP 接口;直接用 `axhub-genie status` 获取。\n- 后续所有文档中的 `http://localhost:32123`,都可以替换为 `endpoint.apiBaseUrl` 对应主机地址。\n- 文中示例的 `<CURRENT_API_BASE>` 指 `endpoint.apiBaseUrl`(例如 `http://localhost:32123/api`)。\n\n### 1.1 完整示例\n\n```bash\naxhub-genie status --json\n```\n\n完整返回示例:\n\n```json\n{\n \"running\": true,\n \"pid\": 12345,\n \"port\": 32123,\n \"startedAt\": \"2026-02-08T03:12:45.321Z\",\n \"statusFile\": \"/Users/you/.axhub-genie/runtime-status.json\",\n \"endpoint\": {\n \"environment\": \"development\",\n \"frontendUrl\": \"http://localhost:5173\",\n \"apiBaseUrl\": \"http://localhost:32123/api\"\n }\n}\n```\n\n### 1.0.1 健康检查与服务身份识别\n\n为了避免外部系统误把其他项目当成 Assistant 服务,建议在探活时同时校验 `service.id` 或响应头中的 `X-App-Identifier`。\n\n请求示例:\n\n```bash\ncurl -i http://localhost:32123/health\n```\n\n响应体示例:\n\n```json\n{\n \"status\": \"ok\",\n \"timestamp\": \"2026-02-09T12:00:00.000Z\",\n \"service\": {\n \"id\": \"@axhub/genie\",\n \"name\": \"Axhub Genie\",\n \"version\": \"1.16.3\"\n },\n \"runtime\": {\n \"environment\": \"development\",\n \"port\": 32123\n }\n}\n```\n\n关键响应头(可用于快速识别):\n\n- `X-App-Identifier: @axhub/genie`\n- `X-App-Name: Axhub Genie`\n- `X-App-Version: 1.16.3`\n- `X-App-Environment: development`\n\n可选环境变量(用于自定义身份/环境标识):\n\n- `APP_IDENTIFIER`(默认:`@axhub/genie`)\n- `APP_DISPLAY_NAME`(默认:`Axhub Genie`)\n- `APP_VERSION`(默认:读取 `package.json` 的 `version`)\n- `APP_RUNTIME_ENV`(默认:`APP_RUNTIME_ENV || NODE_ENV || development`)\n\n建议:\n\n- 探活成功条件 = HTTP `200` 且 `status=ok` 且 `service.id` 命中预期值。\n- 如果你的网关会剥离自定义 Header,优先校验响应体中的 `service.id`。\n\n### 1.1 前端 URL 参数(新增)\n\n你现在可以通过 `http://localhost:5173/` 的查询参数,预选项目和默认工具:\n\n| 参数 | 示例 | 说明 |\n|---|---|---|\n| `project` | `?project=my-project` | 按项目名/显示名/路径精确匹配项目 |\n| `projectName` | `?projectName=my-project` | `project` 的同义参数 |\n| `cwd` | `?cwd=/Users/you/my-project` | 按项目路径匹配(优先) |\n| `workdir` | `?workdir=/Users/you/my-project` | `cwd` 的同义参数 |\n| `provider` | `?provider=codex` | 预设默认工具(`claude`/`cursor`/`codex`/`gemini`/`opencode`) |\n| `tool` | `?tool=codex` | `provider` 的同义参数 |\n| `cli` | `?cli=codex` | `provider` 的同义参数 |\n| `context` | `?context=%7B%22version%22%3A%221%22%2C%22systemContext%22%3A%22tenant%3Aacme%22%2C%22currentFile%22%3A%22docs%2Fopen-api-mvp.zh-CN.md%22%2C%22selectedElements%22%3A%5B%7B%22tag%22%3A%22iframe%22%2C%22selector%22%3A%22%23preview-frame%22%2C%22label%22%3A%22%E9%A2%84%E8%A7%88%E5%8C%BA%E5%9F%9F%22%7D%5D%7D` | 动态上下文(`contextV1` JSON,首次发送消息时自动附加,仅发送一次) |\n| `prompt` | `?prompt=%E8%AF%B7%E5%85%88%E5%88%86%E6%9E%90%E5%BD%93%E5%89%8D%E9%A1%B5` | 预填输入框内容(仅页面生命周期内首次 URL 生效,默认不自动发送) |\n\n示例:\n\n- `http://localhost:5173/?project=my-project&provider=codex`\n- `http://localhost:5173/?cwd=/Users/you/my-project&provider=cursor`\n- `http://localhost:5173/?project=my-project&provider=codex&context=%7B%22version%22%3A%221%22%2C%22systemContext%22%3A%22tenant%3Aacme%22%2C%22currentFile%22%3A%22docs%2Fopen-api-mvp.zh-CN.md%22%2C%22selectedElements%22%3A%5B%7B%22tag%22%3A%22iframe%22%2C%22selector%22%3A%22%23preview-frame%22%2C%22label%22%3A%22%E9%A2%84%E8%A7%88%E5%8C%BA%E5%9F%9F%22%7D%5D%7D`\n- `http://localhost:5173/?project=my-project&provider=codex&prompt=%E8%AF%B7%E5%85%88%E6%A3%80%E6%9F%A5%E5%BD%93%E5%89%8D%E9%A1%B5%E9%9D%A2`\n\n`context` 采用固定 `contextV1` 结构(不兼容旧格式):\n\n```json\n{\n \"version\": \"1\",\n \"systemContext\": \"租户:acme; 角色:analyst\",\n \"currentFile\": \"docs/open-api-mvp.zh-CN.md\",\n \"selectedElements\": [\n {\n \"tag\": \"iframe\",\n \"selector\": \"#preview-frame\",\n \"label\": \"预览区域\"\n }\n ],\n \"extensions\": {\n \"pageId\": \"dashboard\"\n }\n}\n```\n\n字段约束:\n\n- `version`:必填,固定值 `\"1\"`\n- `systemContext`:必填字符串,可为空字符串\n- `currentFile`:必填字符串,可为空字符串(仅路径)\n- `selectedElements`:必填数组,可为空;元素必须包含 `tag`、`selector`、`label` 字符串字段\n- `extensions`:可选对象,预留扩展\n\n兼容性说明:\n\n- URL 仅支持 `context` 参数,不再读取 `externalContext`、`iframeContext`\n\n## 1.1 前端 URL 可选参数\n\n你可以在前端链接上附带以下参数:\n\n- `cwd`:工作目录(本地项目路径)\n- `model`:默认选中模型(与 UI 模型下拉一致)\n\n示例:\n\n- `http://localhost:5173/?cwd=/Users/you/your-project&model=sonnet`\n- `http://localhost:5173/session/019c...c32e?cwd=/Users/you/your-project&model=gpt-5.2-codex`\n\n说明:\n\n- `cwd` 会尝试匹配已存在的项目并自动选中\n- `model` 会自动选中对应模型;若同名模型同时出现在多个 provider 中,会优先保持当前 provider\n\n### 1.2 iframe 场景:通过 `postMessage` 更新 context\n\n当 Assistant UI 被 iframe 内嵌时,可通过 `postMessage` 动态更新 context。\n\n行为规则:\n\n- context 只会在**下一次用户发送消息**时自动附加一次。\n- 一旦附加发送过,会标记为“已发送”。\n- 任何新的 `postMessage` 更新都会将状态重置为“未发送”,并在下一次消息时重新附加。\n- `update_context` 新增可选 `mode`:默认 `replace`(覆盖),可选 `append`(追加,适合分多次选择元素)。\n\n推荐消息格式(父页面 -> iframe):\n\n```js\niframeEl.contentWindow.postMessage({\n type: 'update_context',\n mode: 'replace', // 可选:replace(默认) / append\n context: {\n version: '1',\n systemContext: '租户:acme; 角色:analyst',\n currentFile: 'docs/open-api-mvp.zh-CN.md',\n selectedElements: [\n {\n tag: 'div',\n selector: '#main-content > .toolbar',\n label: '顶部工具条'\n }\n ],\n extensions: {\n pageId: 'dashboard'\n }\n }\n}, '*');\n```\n\n追加模式示例(分多次追加选中元素):\n\n```js\niframeEl.contentWindow.postMessage({\n type: 'update_context',\n mode: 'append',\n context: {\n selectedElements: [\n {\n tag: 'button',\n selector: '#save-btn',\n label: '保存按钮'\n }\n ]\n }\n}, '*');\n```\n\n协议约束(MVP v2):\n\n- 仅支持 `type: update_context`\n- `mode` 可选:`replace`(默认)/ `append`\n- `mode=replace` 时:`context` 必须是对象,且满足 `contextV1` 结构\n- `mode=append` 时:`context` 允许按需传字段;`selectedElements` 会追加到现有上下文(建议按 `tag+selector+label` 去重)\n- `mode=append` 时:除 `selectedElements` 外,其它字段(如 `systemContext`/`currentFile`/`extensions`)若传入则按传入值更新;未传入字段保持原值\n- 不再兼容 `set_context`、`external_context_update`\n- 不再兼容 `payload`、`value`、`customContext`\n- 非法 `context` 会被忽略并输出 `console.warn`,不会阻断正常聊天发送\n\n### 1.3 iframe 场景:通过 `postMessage` 更新预填输入(prompt)\n\n当 Assistant UI 被 iframe 内嵌时,可通过 `postMessage` 动态更新输入框预填内容。\n\n行为规则:\n\n- URL 参数 `prompt` 只在页面生命周期内首次生效(不会随 URL 后续变化重复覆盖)。\n- `postMessage` 的 `update_prompt` 会直接替换输入框内容。\n- 默认仅预填,不自动发送。\n- 当 `autoSend=true` 时,仅在“当前可发送”(已选项目且未在生成中)才立即发送;否则只预填,不排队重试。\n\n推荐消息格式(父页面 -> iframe):\n\n```js\niframeEl.contentWindow.postMessage({\n type: 'update_prompt',\n prompt: '请基于当前页面状态继续分析',\n autoSend: false\n}, '*');\n```\n\n自动发送示例:\n\n```js\niframeEl.contentWindow.postMessage({\n type: 'update_prompt',\n prompt: '请基于当前页面状态继续分析',\n autoSend: true\n}, '*');\n```\n\n完整消息 JSON 示例:\n\n```json\n{\n \"type\": \"update_prompt\",\n \"prompt\": \"请先总结当前页面上下文,再给出下一步建议\",\n \"autoSend\": true\n}\n```\n\n兼容类型:`update_prompt`、`set_prompt`、`external_prompt_update`\n\n兼容字段:`prompt`(推荐)、`payload`、`value`、`prefill`\n\n<a id=\"authentication\"></a>\n\n## 2. 鉴权策略(MVP)\n\n当前默认策略:\n\n- `POST /api/agent` **可本地匿名调用**(不传 `X-API-Key` 也可)\n- 如果传了 `X-API-Key`,会执行校验\n- 如需强制鉴权,设置环境变量:`AGENT_API_KEY_REQUIRED=true`\n\n<a id=\"agent\"></a>\n\n## 3. 核心开放接口\n\n### 3.1 创建或续聊会话\n\n`POST /api/agent`\n\n#### 请求体\n\n| 字段 | 类型 | 必填 | 说明 |\n|---|---|---|---|\n| `projectPath` | string | 条件必填 | 本地项目路径(建议 MVP 直接使用此字段) |\n| `message` | string | 条件必填 | 本轮用户输入。`openOnly=true` 时可为空 |\n| `provider` | string | 否 | `claude` / `cursor` / `codex` / `gemini` / `opencode`,默认 `claude` |\n| `sessionId` | string | 否 | 传入则续聊指定会话,不传则创建新会话 |\n| `openOnly` | boolean | 否 | `true` 表示只返回会话跳转信息,不触发模型调用 |\n| `stream` | boolean | 否 | 是否流式,默认 `true`;集成场景建议 `false` |\n| `model` | string | 否 | 指定模型 |\n| `githubUrl` | string | 否 | 需要自动 clone 仓库时使用 |\n| `cleanup` | boolean | 否 | clone 场景完成后是否清理(默认 `true`) |\n| `githubToken` | string | 否 | GitHub Personal Access Token;请求内优先级高于设置页保存值 |\n| `branchName` | string | 否 | 自定义分支名;传入后会自动开启 `createBranch=true` |\n| `createBranch` | boolean | 否 | 任务完成后创建并推送 Git 分支(默认 `false`) |\n| `createPR` | boolean | 否 | 任务完成后创建 GitHub Pull Request(默认 `false`) |\n\n#### 关键校验规则\n\n- `openOnly=true` 或“`message` 为空且 `sessionId` 非空”时,会进入 only-open 模式。\n- only-open 模式下必须传 `sessionId`。\n- only-open 模式下不支持 `githubUrl` / `createBranch` / `createPR`。\n- `openOnly=true` 请求会忽略 `cleanup`,无需额外传 `cleanup=false`。\n\n#### 返回(`stream: false`)\n\n```json\n{\n \"success\": true,\n \"sessionId\": \"019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"sessionPath\": \"/session/019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"sessionUrl\": \"https://assistant.example.com/session/019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"isResumed\": false,\n \"messages\": [],\n \"tokens\": {\n \"inputTokens\": 0,\n \"outputTokens\": 0,\n \"cacheReadTokens\": 0,\n \"cacheCreationTokens\": 0,\n \"totalTokens\": 0\n },\n \"projectPath\": \"/Users/you/your-project\"\n}\n```\n\n字段说明:\n\n- `sessionId`:后续续聊和跳转的核心 ID\n- `sessionPath`:前端相对路径\n- `sessionUrl`:可直接打开的前端完整链接\n- `isResumed`:`true` 表示这次请求是续聊\n- `branch`:仅在 `createBranch=true` 时返回(成功返回分支信息,失败返回错误对象)\n- `pullRequest`:仅在 `createPR=true` 时返回(成功返回 PR 信息,失败返回错误对象)\n\n---\n\n### 3.2 进入指定会话(前端跳转)\n\nAssistant 当前已支持固定链接格式,无需新增接口:\n\n- `{FRONTEND_URL}/session/{sessionId}`(生产环境推荐配置 `FRONTEND_URL`)\n- 本地开发默认:`http://localhost:5173/session/{sessionId}`\n\n因此,外部系统调用 `POST /api/agent` 后,拿到 `sessionUrl` 直接打开即可。\n\n### 3.3 只打开会话(不发送消息)\n\n如果你只想“进入某个会话页面”,不想触发模型,可以调用:\n\n- `POST /api/agent`\n- 传 `openOnly: true`\n- `message` 可为空\n- 必须传 `sessionId`\n\n请求示例:\n\n```bash\ncurl -X POST <CURRENT_API_BASE>/agent \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"sessionId\": \"019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"openOnly\": true,\n \"stream\": false\n }'\n```\n\n返回示例:\n\n```json\n{\n \"success\": true,\n \"openOnly\": true,\n \"sessionId\": \"019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"sessionPath\": \"/session/019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"sessionUrl\": \"https://assistant.example.com/session/019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"isResumed\": true,\n \"message\": \"Session link generated. No model call triggered.\"\n}\n```\n\n## 4. 对接流程(推荐)\n\n### 流程 A:创建新会话并打开\n\n1. 外部系统调用 `POST /api/agent`(不传 `sessionId`,且带 `message`)\n2. 保存返回的 `sessionId`\n3. 打开返回的 `sessionUrl`\n\n### 流程 B:进入并续聊已有会话\n\n1. 外部系统根据业务会话键找到已保存的 `sessionId`\n2. 调用 `POST /api/agent` 且传 `openOnly=true`(或直接拼接 URL)\n3. 如需服务端触发续聊,再调用 `POST /api/agent` 并传 `sessionId`\n\n<a id=\"usage-examples\"></a>\n\n## 5. cURL 示例\n\n### 5.1 创建新会话(MVP 无鉴权)\n\n```bash\ncurl -X POST <CURRENT_API_BASE>/agent \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"projectPath\": \"/Users/you/your-project\",\n \"provider\": \"claude\",\n \"message\": \"请先梳理当前项目结构并给出重构计划\",\n \"stream\": false\n }'\n```\n\n### 5.2 续聊指定会话\n\n```bash\ncurl -X POST <CURRENT_API_BASE>/agent \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"projectPath\": \"/Users/you/your-project\",\n \"provider\": \"claude\",\n \"sessionId\": \"019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"message\": \"继续上一轮,把第 1、2 点先落代码\",\n \"stream\": false\n }'\n```\n\n### 5.3 只打开会话(不输入)\n\n```bash\ncurl -X POST <CURRENT_API_BASE>/agent \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"sessionId\": \"019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"openOnly\": true,\n \"stream\": false\n }'\n```\n\n### 5.4 可选:携带 API Key\n\n```bash\ncurl -X POST <CURRENT_API_BASE>/agent \\\n -H \"Content-Type: application/json\" \\\n -H \"X-API-Key: ck_xxx\" \\\n -d '{\n \"projectPath\": \"/Users/you/your-project\",\n \"message\": \"继续处理\"\n }'\n```\n\n### 5.5 自动创建分支并发起 PR\n\n```bash\ncurl -X POST <CURRENT_API_BASE>/agent \\\n -H \"Content-Type: application/json\" \\\n -H \"X-API-Key: ck_xxx\" \\\n -d '{\n \"githubUrl\": \"https://github.com/user/repo\",\n \"message\": \"修复鉴权逻辑并补充测试\",\n \"createBranch\": true,\n \"createPR\": true,\n \"stream\": false\n }'\n```\n\n### 5.6 指定自定义分支名\n\n```bash\ncurl -X POST <CURRENT_API_BASE>/agent \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"projectPath\": \"/Users/you/your-project\",\n \"message\": \"新增 API 网关重试策略\",\n \"branchName\": \"feature/api-retry-strategy\",\n \"createPR\": true,\n \"stream\": false\n }'\n```\n\n## 6. 外部系统会话映射建议\n\n建议在外部系统保存映射:\n\n- `external_conversation_key -> sessionId`\n\n这样可保证:\n\n- 可重入(同一业务会话可重复进入)\n- 可续聊(服务端调用时带 `sessionId`)\n- 可跳转(拼接前端链接)\n\n<a id=\"frontend-integration\"></a>\n\n## 7. 动态上下文注入规范(MVP v2)\n\n当前前端会在“下一次用户发送消息”时自动附加一次动态上下文,注入格式如下:\n\n```text\n[DYNAMIC CONTEXT V1]\n{ ...contextV1 json... }\n\n[USER MESSAGE]\n...用户输入...\n```\n\n行为规则:\n\n1. `context` 仅附加一次;发送后标记为已发送。\n2. 收到新的 URL `context` 或新的 `postMessage(update_context)` 后,重置为未发送。\n3. `postMessage(update_context)` 默认 `mode=replace`(覆盖当前待发送上下文)。\n4. 当 `mode=append` 时:`selectedElements` 采用追加策略(建议按 `tag+selector+label` 去重),便于分批选元素。\n5. 当 `mode=append` 时:未传入字段保持原值;已传入字段更新为最新值。\n6. 输入区会展示上下文标签(系统上下文 / 当前文件 / 选中元素)。\n7. 用户可手动取消某个标签;取消仅影响当前待发送上下文。\n8. 如果用户取消后上下文为空,则本次不附加动态上下文块。\n\n非法输入处理:\n\n- `context` 非法 JSON(URL)或字段校验失败:忽略该上下文并 `console.warn`\n- 不会阻止用户继续发送消息\n\n<a id=\"faq\"></a>\n\n## 8. 常见问题\n\n### Q1:只想“打开会话页面”,不想触发模型怎么办?\n\n两种方式都可以:\n\n1. 直接跳转:`/session/{sessionId}`\n2. 调用 `POST /api/agent` 并传 `openOnly=true`\n\n### Q2:`sessionId` 传了但会话不存在会怎样?\n\n不同 provider 的底层行为可能不同(可能报错或新建)。建议外部系统以“本地已保存映射”为准,避免传错 ID。\n\n### Q3:如何从当前地址拿到 sessionId?\n\n例如你的地址:\n\n- `http://localhost:5173/session/019c3263-967f-7ba2-84fe-fc5c694f6316`\n\n其中 `019c3263-967f-7ba2-84fe-fc5c694f6316` 就是 `sessionId`。\n\n## 9. 版本说明\n\n- 文档版本:MVP v1.1\n- 更新日期:2026-02-12\n- 文档来源:`docs/open-api-mvp.zh-CN.md`(`/api-docs.html` 由脚本生成)\n- 对应能力:`/api/agent` 支持 `sessionId` 续聊、`openOnly` 仅打开、`gemini/opencode` provider、可选 `createBranch/createPR`\n";
|
|
313
|
+
const markdownSource = "# 开放接口使用文档(MVP)\n\n> 单一事实源(Single Source of Truth)文件:`docs/open-api-mvp.zh-CN.md` \n> 页面入口:`/api-docs.html`(由脚本自动生成,请勿手改 HTML)\n\n<a id=\"overview\"></a>\n\n> 适用场景:外部系统(本地 Web / 本地服务)与 Assistant UI 本地服务通信,实现**创建会话、进入指定会话、续聊指定会话、中断运行中会话**。\n\n## Quick English Summary\n\n- Backend endpoints: `GET /health`, `POST /api/agent`, `POST /api/agent/abort`\n- Frontend integration: URL query params + iframe `postMessage` (`update_context`, `update_prompt`)\n- Auth default: local anonymous is allowed for `/api/agent`; `X-API-Key` is optional unless `AGENT_API_KEY_REQUIRED=true`\n\n## 1. 基本信息\n\n- Assistant 前端地址(示例):`http://localhost:5173`\n- Assistant 后端地址(示例):`http://localhost:32123`\n- 会话页面路由格式:`/session/{sessionId}`\n- 健康检查:`GET /health`\n\n### 1.0 地址发现(先执行命令)\n\n在开发、测试、生产环境中,地址可能不同。请先在部署机器执行:\n\n```bash\naxhub-genie status\n```\n\n建议使用三项核心字段:\n\n- `endpoint.environment`\n- `endpoint.frontendUrl`\n- `endpoint.apiBaseUrl`\n\n说明:\n\n- 在不知道 API 地址时,不需要先调用任何 HTTP 接口;直接用 `axhub-genie status` 获取。\n- 后续所有文档中的 `http://localhost:32123`,都可以替换为 `endpoint.apiBaseUrl` 对应主机地址。\n- 文中示例的 `<CURRENT_API_BASE>` 指 `endpoint.apiBaseUrl`(例如 `http://localhost:32123/api`)。\n\n### 1.1 完整示例\n\n```bash\naxhub-genie status --json\n```\n\n完整返回示例:\n\n```json\n{\n \"running\": true,\n \"pid\": 12345,\n \"port\": 32123,\n \"startedAt\": \"2026-02-08T03:12:45.321Z\",\n \"statusFile\": \"/Users/you/.axhub-genie/runtime-status.json\",\n \"endpoint\": {\n \"environment\": \"development\",\n \"frontendUrl\": \"http://localhost:5173\",\n \"apiBaseUrl\": \"http://localhost:32123/api\"\n }\n}\n```\n\n### 1.0.1 健康检查与服务身份识别\n\n为了避免外部系统误把其他项目当成 Assistant 服务,建议在探活时同时校验 `service.id` 或响应头中的 `X-App-Identifier`。\n\n请求示例:\n\n```bash\ncurl -i http://localhost:32123/health\n```\n\n响应体示例:\n\n```json\n{\n \"status\": \"ok\",\n \"timestamp\": \"2026-02-09T12:00:00.000Z\",\n \"service\": {\n \"id\": \"@axhub/genie\",\n \"name\": \"Axhub Genie\",\n \"version\": \"1.16.3\"\n },\n \"runtime\": {\n \"environment\": \"development\",\n \"port\": 32123\n }\n}\n```\n\n关键响应头(可用于快速识别):\n\n- `X-App-Identifier: @axhub/genie`\n- `X-App-Name: Axhub Genie`\n- `X-App-Version: 1.16.3`\n- `X-App-Environment: development`\n\n可选环境变量(用于自定义身份/环境标识):\n\n- `APP_IDENTIFIER`(默认:`@axhub/genie`)\n- `APP_DISPLAY_NAME`(默认:`Axhub Genie`)\n- `APP_VERSION`(默认:读取 `package.json` 的 `version`)\n- `APP_RUNTIME_ENV`(默认:`APP_RUNTIME_ENV || NODE_ENV || development`)\n\n建议:\n\n- 探活成功条件 = HTTP `200` 且 `status=ok` 且 `service.id` 命中预期值。\n- 如果你的网关会剥离自定义 Header,优先校验响应体中的 `service.id`。\n\n### 1.1 前端 URL 参数(新增)\n\n你现在可以通过 `http://localhost:5173/` 的查询参数,预选项目和默认工具:\n\n| 参数 | 示例 | 说明 |\n|---|---|---|\n| `project` | `?project=my-project` | 按项目名/显示名/路径精确匹配项目 |\n| `projectName` | `?projectName=my-project` | `project` 的同义参数 |\n| `cwd` | `?cwd=/Users/you/my-project` | 按项目路径匹配(优先) |\n| `workdir` | `?workdir=/Users/you/my-project` | `cwd` 的同义参数 |\n| `provider` | `?provider=codex` | 预设默认工具(`claude`/`cursor`/`codex`/`gemini`/`opencode`) |\n| `tool` | `?tool=codex` | `provider` 的同义参数 |\n| `cli` | `?cli=codex` | `provider` 的同义参数 |\n| `context` | `?context=%7B%22version%22%3A%221%22%2C%22systemContext%22%3A%22tenant%3Aacme%22%2C%22currentFile%22%3A%22docs%2Fopen-api-mvp.zh-CN.md%22%2C%22selectedElements%22%3A%5B%7B%22tag%22%3A%22iframe%22%2C%22selector%22%3A%22%23preview-frame%22%2C%22label%22%3A%22%E9%A2%84%E8%A7%88%E5%8C%BA%E5%9F%9F%22%7D%5D%7D` | 动态上下文(`contextV1` JSON,首次发送消息时自动附加,仅发送一次) |\n| `prompt` | `?prompt=%E8%AF%B7%E5%85%88%E5%88%86%E6%9E%90%E5%BD%93%E5%89%8D%E9%A1%B5` | 预填输入框内容(仅页面生命周期内首次 URL 生效,默认不自动发送) |\n\n示例:\n\n- `http://localhost:5173/?project=my-project&provider=codex`\n- `http://localhost:5173/?cwd=/Users/you/my-project&provider=cursor`\n- `http://localhost:5173/?project=my-project&provider=codex&context=%7B%22version%22%3A%221%22%2C%22systemContext%22%3A%22tenant%3Aacme%22%2C%22currentFile%22%3A%22docs%2Fopen-api-mvp.zh-CN.md%22%2C%22selectedElements%22%3A%5B%7B%22tag%22%3A%22iframe%22%2C%22selector%22%3A%22%23preview-frame%22%2C%22label%22%3A%22%E9%A2%84%E8%A7%88%E5%8C%BA%E5%9F%9F%22%7D%5D%7D`\n- `http://localhost:5173/?project=my-project&provider=codex&prompt=%E8%AF%B7%E5%85%88%E6%A3%80%E6%9F%A5%E5%BD%93%E5%89%8D%E9%A1%B5%E9%9D%A2`\n\n`context` 采用固定 `contextV1` 结构(不兼容旧格式):\n\n```json\n{\n \"version\": \"1\",\n \"systemContext\": \"租户:acme; 角色:analyst\",\n \"currentFile\": \"docs/open-api-mvp.zh-CN.md\",\n \"selectedElements\": [\n {\n \"tag\": \"iframe\",\n \"selector\": \"#preview-frame\",\n \"label\": \"预览区域\"\n }\n ],\n \"extensions\": {\n \"pageId\": \"dashboard\"\n }\n}\n```\n\n字段约束:\n\n- `version`:必填,固定值 `\"1\"`\n- `systemContext`:必填字符串,可为空字符串\n- `currentFile`:必填字符串,可为空字符串(仅路径)\n- `selectedElements`:必填数组,可为空;元素必须包含 `tag`、`selector`、`label` 字符串字段\n- `extensions`:可选对象,预留扩展\n\n兼容性说明:\n\n- URL 仅支持 `context` 参数,不再读取 `externalContext`、`iframeContext`\n\n## 1.1 前端 URL 可选参数\n\n你可以在前端链接上附带以下参数:\n\n- `cwd`:工作目录(本地项目路径)\n- `model`:默认选中模型(与 UI 模型下拉一致)\n\n示例:\n\n- `http://localhost:5173/?cwd=/Users/you/your-project&model=sonnet`\n- `http://localhost:5173/session/019c...c32e?cwd=/Users/you/your-project&model=gpt-5.2-codex`\n\n说明:\n\n- `cwd` 会尝试匹配已存在的项目并自动选中\n- `model` 会自动选中对应模型;若同名模型同时出现在多个 provider 中,会优先保持当前 provider\n\n### 1.2 iframe 场景:通过 `postMessage` 更新 context\n\n当 Assistant UI 被 iframe 内嵌时,可通过 `postMessage` 动态更新 context。\n\n行为规则:\n\n- context 只会在**下一次用户发送消息**时自动附加一次。\n- 一旦附加发送过,会标记为“已发送”。\n- 任何新的 `postMessage` 更新都会将状态重置为“未发送”,并在下一次消息时重新附加。\n- `update_context` 新增可选 `mode`:默认 `replace`(覆盖),可选 `append`(追加,适合分多次选择元素)。\n\n推荐消息格式(父页面 -> iframe):\n\n```js\niframeEl.contentWindow.postMessage({\n type: 'update_context',\n mode: 'replace', // 可选:replace(默认) / append\n context: {\n version: '1',\n systemContext: '租户:acme; 角色:analyst',\n currentFile: 'docs/open-api-mvp.zh-CN.md',\n selectedElements: [\n {\n tag: 'div',\n selector: '#main-content > .toolbar',\n label: '顶部工具条'\n }\n ],\n extensions: {\n pageId: 'dashboard'\n }\n }\n}, '*');\n```\n\n追加模式示例(分多次追加选中元素):\n\n```js\niframeEl.contentWindow.postMessage({\n type: 'update_context',\n mode: 'append',\n context: {\n selectedElements: [\n {\n tag: 'button',\n selector: '#save-btn',\n label: '保存按钮'\n }\n ]\n }\n}, '*');\n```\n\n协议约束(MVP v2):\n\n- 仅支持 `type: update_context`\n- `mode` 可选:`replace`(默认)/ `append`\n- `mode=replace` 时:`context` 必须是对象,且满足 `contextV1` 结构\n- `mode=append` 时:`context` 允许按需传字段;`selectedElements` 会追加到现有上下文(建议按 `tag+selector+label` 去重)\n- `mode=append` 时:除 `selectedElements` 外,其它字段(如 `systemContext`/`currentFile`/`extensions`)若传入则按传入值更新;未传入字段保持原值\n- 不再兼容 `set_context`、`external_context_update`\n- 不再兼容 `payload`、`value`、`customContext`\n- 非法 `context` 会被忽略并输出 `console.warn`,不会阻断正常聊天发送\n\n### 1.3 iframe 场景:通过 `postMessage` 更新预填输入(prompt)\n\n当 Assistant UI 被 iframe 内嵌时,可通过 `postMessage` 动态更新输入框预填内容。\n\n行为规则:\n\n- URL 参数 `prompt` 只在页面生命周期内首次生效(不会随 URL 后续变化重复覆盖)。\n- `postMessage` 的 `update_prompt` 会直接替换输入框内容。\n- 默认仅预填,不自动发送。\n- 当 `autoSend=true` 时,仅在“当前可发送”(已选项目且未在生成中)才立即发送;否则只预填,不排队重试。\n\n推荐消息格式(父页面 -> iframe):\n\n```js\niframeEl.contentWindow.postMessage({\n type: 'update_prompt',\n prompt: '请基于当前页面状态继续分析',\n autoSend: false\n}, '*');\n```\n\n自动发送示例:\n\n```js\niframeEl.contentWindow.postMessage({\n type: 'update_prompt',\n prompt: '请基于当前页面状态继续分析',\n autoSend: true\n}, '*');\n```\n\n完整消息 JSON 示例:\n\n```json\n{\n \"type\": \"update_prompt\",\n \"prompt\": \"请先总结当前页面上下文,再给出下一步建议\",\n \"autoSend\": true\n}\n```\n\n兼容类型:`update_prompt`、`set_prompt`、`external_prompt_update`\n\n兼容字段:`prompt`(推荐)、`payload`、`value`、`prefill`\n\n<a id=\"authentication\"></a>\n\n## 2. 鉴权策略(MVP)\n\n当前默认策略:\n\n- `POST /api/agent` **可本地匿名调用**(不传 `X-API-Key` 也可)\n- 如果传了 `X-API-Key`,会执行校验\n- 如需强制鉴权,设置环境变量:`AGENT_API_KEY_REQUIRED=true`\n\n<a id=\"agent\"></a>\n\n## 3. 核心开放接口\n\n### 3.1 创建或续聊会话\n\n`POST /api/agent`\n\n#### 请求体\n\n| 字段 | 类型 | 必填 | 说明 |\n|---|---|---|---|\n| `projectPath` | string | 条件必填 | 本地项目路径(建议 MVP 直接使用此字段) |\n| `message` | string | 条件必填 | 本轮用户输入。`openOnly=true` 时可为空 |\n| `provider` | string | 否 | `claude` / `cursor` / `codex` / `gemini` / `opencode`,默认 `claude` |\n| `sessionId` | string | 否 | 传入则续聊指定会话,不传则创建新会话 |\n| `openOnly` | boolean | 否 | `true` 表示只返回会话跳转信息,不触发模型调用 |\n| `stream` | boolean | 否 | 是否流式,默认 `true`;集成场景建议 `false` |\n| `model` | string | 否 | 指定模型 |\n| `githubUrl` | string | 否 | 需要自动 clone 仓库时使用 |\n| `cleanup` | boolean | 否 | clone 场景完成后是否清理(默认 `true`) |\n| `githubToken` | string | 否 | GitHub Personal Access Token;请求内优先级高于设置页保存值 |\n| `branchName` | string | 否 | 自定义分支名;传入后会自动开启 `createBranch=true` |\n| `createBranch` | boolean | 否 | 任务完成后创建并推送 Git 分支(默认 `false`) |\n| `createPR` | boolean | 否 | 任务完成后创建 GitHub Pull Request(默认 `false`) |\n| `callback` | object | 否 | 终态回调配置。支持 `url` / `events` / `secret`,任务以 `completed` / `errored` / `aborted` 结束时异步回调 |\n\n#### 关键校验规则\n\n- `openOnly=true` 或“`message` 为空且 `sessionId` 非空”时,会进入 only-open 模式。\n- only-open 模式下必须传 `sessionId`。\n- only-open 模式下不支持 `githubUrl` / `createBranch` / `createPR`。\n- only-open 模式下也不支持 `callback`。\n- `openOnly=true` 请求会忽略 `cleanup`,无需额外传 `cleanup=false`。\n- `callback.url` 必须是合法的 `http/https` 地址。\n- `callback.events` 可选,默认等于 `[\"completed\", \"errored\", \"aborted\"]`。\n- `callback.events` 只允许包含 `completed` / `errored` / `aborted`。\n- `callback.secret` 可选;传入后回调请求会带 `X-Agent-Signature` HMAC 签名。\n\n#### 返回(`stream: false`)\n\n```json\n{\n \"success\": true,\n \"sessionId\": \"019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"sessionPath\": \"/session/019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"sessionUrl\": \"https://assistant.example.com/session/019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"isResumed\": false,\n \"messages\": [],\n \"tokens\": {\n \"inputTokens\": 0,\n \"outputTokens\": 0,\n \"cacheReadTokens\": 0,\n \"cacheCreationTokens\": 0,\n \"totalTokens\": 0\n },\n \"projectPath\": \"/Users/you/your-project\"\n}\n```\n\n字段说明:\n\n- `sessionId`:后续续聊和跳转的核心 ID\n- `sessionPath`:前端相对路径\n- `sessionUrl`:可直接打开的前端完整链接\n- `isResumed`:`true` 表示这次请求是续聊\n- `branch`:仅在 `createBranch=true` 时返回(成功返回分支信息,失败返回错误对象)\n- `pullRequest`:仅在 `createPR=true` 时返回(成功返回 PR 信息,失败返回错误对象)\n\n#### `callback` 字段示例\n\n```json\n{\n \"projectPath\": \"/Users/you/your-project\",\n \"message\": \"请修复首页按钮点击态\",\n \"provider\": \"codex\",\n \"stream\": false,\n \"callback\": {\n \"url\": \"https://external.example.com/agent/callback\",\n \"events\": [\"completed\", \"errored\", \"aborted\"],\n \"secret\": \"shared-secret\"\n }\n}\n```\n\n#### 终态回调说明\n\n- `callback` 只做终态通知,不推送中间流式事件。\n- 回调投递为异步旁路,不阻塞主接口响应。\n- 最多尝试 3 次:首次立即发送,失败后约在 1 秒、5 秒后重试。\n- 仅网络错误、超时、HTTP `>=500` 会重试;HTTP `4xx` 不重试。\n- 回调 Header:\n - `X-Agent-Event`\n - `X-Agent-Event-Id`\n - `X-Agent-Delivery-Attempt`\n - `X-Agent-Signature`(仅当传入 `callback.secret`)\n\n#### 终态回调 Payload 示例\n\n成功:\n\n```json\n{\n \"event\": \"completed\",\n \"eventId\": \"agentcb_12345678-1234-1234-1234-1234567890ab\",\n \"sessionId\": \"019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"provider\": \"codex\",\n \"status\": \"completed\",\n \"success\": true,\n \"projectPath\": \"/Users/you/your-project\",\n \"isResumed\": false,\n \"startedAt\": \"2026-03-18T10:00:00.000Z\",\n \"finishedAt\": \"2026-03-18T10:00:08.000Z\",\n \"result\": {\n \"sessionPath\": \"/session/019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"sessionUrl\": \"https://assistant.example.com/session/019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"messages\": [],\n \"tokens\": {\n \"inputTokens\": 0,\n \"outputTokens\": 0,\n \"cacheReadTokens\": 0,\n \"cacheCreationTokens\": 0,\n \"totalTokens\": 0\n },\n \"branch\": null,\n \"pullRequest\": null\n },\n \"error\": null\n}\n```\n\n失败:\n\n```json\n{\n \"event\": \"errored\",\n \"eventId\": \"agentcb_12345678-1234-1234-1234-1234567890ab\",\n \"sessionId\": \"019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"provider\": \"codex\",\n \"status\": \"errored\",\n \"success\": false,\n \"projectPath\": \"/Users/you/your-project\",\n \"isResumed\": false,\n \"startedAt\": \"2026-03-18T10:00:00.000Z\",\n \"finishedAt\": \"2026-03-18T10:00:08.000Z\",\n \"result\": {\n \"sessionPath\": \"/session/019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"sessionUrl\": \"https://assistant.example.com/session/019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"messages\": [],\n \"tokens\": {\n \"inputTokens\": 0,\n \"outputTokens\": 0,\n \"cacheReadTokens\": 0,\n \"cacheCreationTokens\": 0,\n \"totalTokens\": 0\n },\n \"branch\": null,\n \"pullRequest\": null\n },\n \"error\": {\n \"message\": \"Project path does not exist: /Users/you/missing-project\"\n }\n}\n```\n\n---\n\n### 3.2 进入指定会话(前端跳转)\n\nAssistant 当前已支持固定链接格式,无需新增接口:\n\n- `{FRONTEND_URL}/session/{sessionId}`(生产环境推荐配置 `FRONTEND_URL`)\n- 本地开发默认:`http://localhost:5173/session/{sessionId}`\n\n因此,外部系统调用 `POST /api/agent` 后,拿到 `sessionUrl` 直接打开即可。\n\n### 3.3 只打开会话(不发送消息)\n\n如果你只想“进入某个会话页面”,不想触发模型,可以调用:\n\n- `POST /api/agent`\n- 传 `openOnly: true`\n- `message` 可为空\n- 必须传 `sessionId`\n\n请求示例:\n\n```bash\ncurl -X POST <CURRENT_API_BASE>/agent \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"sessionId\": \"019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"openOnly\": true,\n \"stream\": false\n }'\n```\n\n返回示例:\n\n```json\n{\n \"success\": true,\n \"openOnly\": true,\n \"sessionId\": \"019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"sessionPath\": \"/session/019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"sessionUrl\": \"https://assistant.example.com/session/019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"isResumed\": true,\n \"message\": \"Session link generated. No model call triggered.\"\n}\n```\n\n### 3.4 中断会话\n\n`POST /api/agent/abort`\n\n用于中断当前仍在运行中的会话。\n\n#### 请求体\n\n| 字段 | 类型 | 必填 | 说明 |\n|---|---|---|---|\n| `sessionId` | string | 是 | 要中断的会话 ID |\n| `provider` | string | 否 | `claude` / `codex` / `gemini` / `opencode`;默认 `claude` |\n\n#### 关键校验规则\n\n- `sessionId` 必须是非空字符串。\n- `provider` 如果传入,必须是 `claude` / `codex` / `gemini` / `opencode`。\n- 如果不传 `provider`,服务端按 `claude` 处理,不做自动识别。\n- 如果没有找到仍在运行中的会话,返回 `HTTP 200`,但 `success=false`。\n\n#### 返回(成功)\n\n```json\n{\n \"success\": true,\n \"aborted\": true,\n \"sessionId\": \"019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"provider\": \"claude\",\n \"message\": \"Session aborted\"\n}\n```\n\n#### 返回(未找到活跃会话)\n\n```json\n{\n \"success\": false,\n \"aborted\": false,\n \"sessionId\": \"019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"provider\": \"claude\",\n \"error\": \"Active session not found\"\n}\n```\n\n## 4. 对接流程(推荐)\n\n### 流程 A:创建新会话并打开\n\n1. 外部系统调用 `POST /api/agent`(不传 `sessionId`,且带 `message`)\n2. 保存返回的 `sessionId`\n3. 打开返回的 `sessionUrl`\n\n### 流程 B:进入并续聊已有会话\n\n1. 外部系统根据业务会话键找到已保存的 `sessionId`\n2. 调用 `POST /api/agent` 且传 `openOnly=true`(或直接拼接 URL)\n3. 如需服务端触发续聊,再调用 `POST /api/agent` 并传 `sessionId`\n\n<a id=\"usage-examples\"></a>\n\n## 5. cURL 示例\n\n### 5.1 创建新会话(MVP 无鉴权)\n\n```bash\ncurl -X POST <CURRENT_API_BASE>/agent \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"projectPath\": \"/Users/you/your-project\",\n \"provider\": \"claude\",\n \"message\": \"请先梳理当前项目结构并给出重构计划\",\n \"stream\": false\n }'\n```\n\n### 5.2 续聊指定会话\n\n```bash\ncurl -X POST <CURRENT_API_BASE>/agent \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"projectPath\": \"/Users/you/your-project\",\n \"provider\": \"claude\",\n \"sessionId\": \"019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"message\": \"继续上一轮,把第 1、2 点先落代码\",\n \"stream\": false\n }'\n```\n\n### 5.3 只打开会话(不输入)\n\n```bash\ncurl -X POST <CURRENT_API_BASE>/agent \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"sessionId\": \"019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"openOnly\": true,\n \"stream\": false\n }'\n```\n\n### 5.4 可选:携带 API Key\n\n```bash\ncurl -X POST <CURRENT_API_BASE>/agent \\\n -H \"Content-Type: application/json\" \\\n -H \"X-API-Key: ck_xxx\" \\\n -d '{\n \"projectPath\": \"/Users/you/your-project\",\n \"message\": \"继续处理\"\n }'\n```\n\n### 5.5 自动创建分支并发起 PR\n\n```bash\ncurl -X POST <CURRENT_API_BASE>/agent \\\n -H \"Content-Type: application/json\" \\\n -H \"X-API-Key: ck_xxx\" \\\n -d '{\n \"githubUrl\": \"https://github.com/user/repo\",\n \"message\": \"修复鉴权逻辑并补充测试\",\n \"createBranch\": true,\n \"createPR\": true,\n \"stream\": false\n }'\n```\n\n### 5.6 指定自定义分支名\n\n```bash\ncurl -X POST <CURRENT_API_BASE>/agent \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"projectPath\": \"/Users/you/your-project\",\n \"message\": \"新增 API 网关重试策略\",\n \"branchName\": \"feature/api-retry-strategy\",\n \"createPR\": true,\n \"stream\": false\n }'\n```\n\n### 5.7 中断运行中的会话\n\n```bash\ncurl -X POST <CURRENT_API_BASE>/agent/abort \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"sessionId\": \"019c3263-967f-7ba2-84fe-fc5c694f6316\",\n \"provider\": \"codex\"\n }'\n```\n\n## 6. 外部系统会话映射建议\n\n建议在外部系统保存映射:\n\n- `external_conversation_key -> sessionId`\n\n这样可保证:\n\n- 可重入(同一业务会话可重复进入)\n- 可续聊(服务端调用时带 `sessionId`)\n- 可跳转(拼接前端链接)\n\n<a id=\"frontend-integration\"></a>\n\n## 7. 动态上下文注入规范(MVP v2)\n\n当前前端会在“下一次用户发送消息”时自动附加一次动态上下文,注入格式如下:\n\n```text\n[DYNAMIC CONTEXT V1]\n{ ...contextV1 json... }\n\n[USER MESSAGE]\n...用户输入...\n```\n\n行为规则:\n\n1. `context` 仅附加一次;发送后标记为已发送。\n2. 收到新的 URL `context` 或新的 `postMessage(update_context)` 后,重置为未发送。\n3. `postMessage(update_context)` 默认 `mode=replace`(覆盖当前待发送上下文)。\n4. 当 `mode=append` 时:`selectedElements` 采用追加策略(建议按 `tag+selector+label` 去重),便于分批选元素。\n5. 当 `mode=append` 时:未传入字段保持原值;已传入字段更新为最新值。\n6. 输入区会展示上下文标签(系统上下文 / 当前文件 / 选中元素)。\n7. 用户可手动取消某个标签;取消仅影响当前待发送上下文。\n8. 如果用户取消后上下文为空,则本次不附加动态上下文块。\n\n非法输入处理:\n\n- `context` 非法 JSON(URL)或字段校验失败:忽略该上下文并 `console.warn`\n- 不会阻止用户继续发送消息\n\n<a id=\"faq\"></a>\n\n## 8. 常见问题\n\n### Q1:只想“打开会话页面”,不想触发模型怎么办?\n\n两种方式都可以:\n\n1. 直接跳转:`/session/{sessionId}`\n2. 调用 `POST /api/agent` 并传 `openOnly=true`\n\n### Q2:`sessionId` 传了但会话不存在会怎样?\n\n不同 provider 的底层行为可能不同(可能报错或新建)。建议外部系统以“本地已保存映射”为准,避免传错 ID。\n\n### Q3:如何从当前地址拿到 sessionId?\n\n例如你的地址:\n\n- `http://localhost:5173/session/019c3263-967f-7ba2-84fe-fc5c694f6316`\n\n其中 `019c3263-967f-7ba2-84fe-fc5c694f6316` 就是 `sessionId`。\n\n### Q4:`POST /api/agent/abort` 为什么返回 200 但 `success=false`?\n\n这表示请求本身是合法的,但服务端没有找到可中断的运行中会话。常见原因包括:\n\n1. `sessionId` 传错了\n2. `provider` 传错了\n3. 会话已经自然结束或之前已被中断\n\n## 9. 版本说明\n\n- 文档版本:MVP v1.2\n- 更新日期:2026-03-18\n- 文档来源:`docs/open-api-mvp.zh-CN.md`(`/api-docs.html` 由脚本生成)\n- 对应能力:`/api/agent` 支持 `sessionId` 续聊、`openOnly` 仅打开、`gemini/opencode` provider、可选 `createBranch/createPR`,`/api/agent/abort` 支持中断运行中会话\n";
|
|
314
314
|
const root = document.getElementById('markdown-root');
|
|
315
315
|
|
|
316
316
|
function scrollToHashAnchor() {
|