@ayushporwal/coja 0.0.1
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/bin/coja.js +2 -0
- package/dist/ai/chat-handler.js +115 -0
- package/dist/ai/chats.js +92 -0
- package/dist/ai/history.js +70 -0
- package/dist/ai/prompt.js +73 -0
- package/dist/ai/providers.js +81 -0
- package/dist/ai/title.js +77 -0
- package/dist/ai/tools.js +495 -0
- package/dist/ai/types.js +22 -0
- package/dist/app.js +142 -0
- package/dist/cli.js +99 -0
- package/dist/codex/connection.js +293 -0
- package/dist/codex/errors.js +52 -0
- package/dist/codex/models.js +97 -0
- package/dist/codex/oauth.js +217 -0
- package/dist/codex/protocol.js +49 -0
- package/dist/codex/provider.js +209 -0
- package/dist/context.js +8 -0
- package/dist/custom-providers.js +134 -0
- package/dist/data-dir.js +25 -0
- package/dist/db.js +65 -0
- package/dist/forge/forge.js +11 -0
- package/dist/forge/gh-cli.js +99 -0
- package/dist/forge/github.js +627 -0
- package/dist/forge/graphql.js +106 -0
- package/dist/forge/queries.js +258 -0
- package/dist/git/plumbing.js +519 -0
- package/dist/git/remote.js +47 -0
- package/dist/git/run.js +256 -0
- package/dist/open-browser.js +27 -0
- package/dist/paths.js +18 -0
- package/dist/pr/fetcher.js +173 -0
- package/dist/pr/objects.js +83 -0
- package/dist/pr/refs.js +17 -0
- package/dist/projects/add.js +111 -0
- package/dist/projects/store.js +37 -0
- package/dist/routes/chat.js +187 -0
- package/dist/routes/fs.js +65 -0
- package/dist/routes/git.js +75 -0
- package/dist/routes/guard.js +96 -0
- package/dist/routes/http.js +35 -0
- package/dist/routes/projects.js +51 -0
- package/dist/routes/pulls.js +64 -0
- package/dist/routes/review.js +113 -0
- package/dist/routes/setup.js +285 -0
- package/dist/secrets/providers.js +27 -0
- package/dist/secrets/store.js +190 -0
- package/dist/server.js +51 -0
- package/dist/services.js +15 -0
- package/dist/shared/api.js +186 -0
- package/package.json +35 -0
- package/public/assets/abap-CLvhMVsD.js +1 -0
- package/public/assets/actionscript-3-Cs6JJXT5.js +1 -0
- package/public/assets/ada-C5qYipkI.js +1 -0
- package/public/assets/ahk-CA9gdOdF.js +1 -0
- package/public/assets/ahk2-_6rzW9BS.js +1 -0
- package/public/assets/andromeeda-vGVdxbeo.js +1 -0
- package/public/assets/angular-html-BvGMhoM4.js +1 -0
- package/public/assets/angular-ts-D4cJlfHk.js +1 -0
- package/public/assets/apache-U0d_L8uA.js +1 -0
- package/public/assets/apex-KFGFyKwG.js +1 -0
- package/public/assets/apl-BAzDJNhF.js +1 -0
- package/public/assets/applescript-CCn79oCD.js +1 -0
- package/public/assets/ara-4CJ0cIlV.js +1 -0
- package/public/assets/asciidoc-SCjQUq34.js +1 -0
- package/public/assets/asm-Cmm7eHzH.js +1 -0
- package/public/assets/astro-tbl65Kw6.js +1 -0
- package/public/assets/aurora-x-CDeNXAV0.js +1 -0
- package/public/assets/awk-BWXHIvNe.js +1 -0
- package/public/assets/ayu-dark-DluEY0Gj.js +1 -0
- package/public/assets/ayu-light-C3h-C4tm.js +1 -0
- package/public/assets/ayu-mirage-Bqwy1Gya.js +1 -0
- package/public/assets/ballerina-B7ZEbQpA.js +1 -0
- package/public/assets/bat-qdxAdBWQ.js +1 -0
- package/public/assets/beancount-D-usSTwE.js +1 -0
- package/public/assets/berry-DKpUyyne.js +1 -0
- package/public/assets/bibtex-Ci_nEsc7.js +1 -0
- package/public/assets/bicep-CUHmPFLl.js +1 -0
- package/public/assets/bird2-CYIUgYqB.js +1 -0
- package/public/assets/blade-Cy5u_P69.js +1 -0
- package/public/assets/bsl-_VjlB9mv.js +1 -0
- package/public/assets/c-xsYtGME5.js +1 -0
- package/public/assets/c3-D0apG41V.js +1 -0
- package/public/assets/cadence-CQ2zXKGN.js +1 -0
- package/public/assets/cairo-DLTphjLi.js +1 -0
- package/public/assets/catppuccin-frappe-C9Q5zVZY.js +1 -0
- package/public/assets/catppuccin-latte-CtsyrtPq.js +1 -0
- package/public/assets/catppuccin-macchiato-R8nAf1vR.js +1 -0
- package/public/assets/catppuccin-mocha-DjuaAJKi.js +1 -0
- package/public/assets/chapel-DlXZg0HF.js +1 -0
- package/public/assets/clarity-CtfBBspg.js +1 -0
- package/public/assets/clojure-DqKBuwfJ.js +1 -0
- package/public/assets/cmake-Bj61d0ZC.js +1 -0
- package/public/assets/cobol-NNONwiOX.js +1 -0
- package/public/assets/codeowners-C8r90Shi.js +1 -0
- package/public/assets/codeql-oeQT6MSM.js +1 -0
- package/public/assets/coffee-O853MBTp.js +1 -0
- package/public/assets/common-lisp-Cv5bFMCO.js +1 -0
- package/public/assets/coq-DuBRPxYg.js +1 -0
- package/public/assets/cpp-DtWY3seq.js +1 -0
- package/public/assets/crystal-CcZ3zkyx.js +1 -0
- package/public/assets/csharp-oqKa8noW.js +1 -0
- package/public/assets/css-mSNQLTOb.js +1 -0
- package/public/assets/csv-Dx-8-gkx.js +1 -0
- package/public/assets/cue-CE9AQfxI.js +1 -0
- package/public/assets/cypher-ClKdZ_lG.js +1 -0
- package/public/assets/d-qD-0Kul2.js +1 -0
- package/public/assets/dark-plus-Cs2F2srj.js +1 -0
- package/public/assets/dart-CnvKMtbv.js +1 -0
- package/public/assets/dax-BkyTk9wS.js +1 -0
- package/public/assets/desktop-Dlh5hvp9.js +1 -0
- package/public/assets/diff-woXpYk--.js +1 -0
- package/public/assets/docker-IyjqRm3v.js +1 -0
- package/public/assets/dotenv-_5a1GRtc.js +1 -0
- package/public/assets/dracula-BHWKrbxM.js +1 -0
- package/public/assets/dracula-soft-5eyTD99u.js +1 -0
- package/public/assets/dream-maker-DW3nJb8Q.js +1 -0
- package/public/assets/edge-BA0HOmx0.js +1 -0
- package/public/assets/elixir-Buj0VxhK.js +1 -0
- package/public/assets/elm-lVH2iZsu.js +1 -0
- package/public/assets/emacs-lisp-c_oH4hRZ.js +1 -0
- package/public/assets/erb-CbQPls-2.js +1 -0
- package/public/assets/erlang-Cphh6RMH.js +1 -0
- package/public/assets/everforest-dark-sB-x3p7T.js +1 -0
- package/public/assets/everforest-light-Df2xbC6M.js +1 -0
- package/public/assets/fennel-DQxkIbk2.js +1 -0
- package/public/assets/fish-BJitypiv.js +1 -0
- package/public/assets/fluent-C03EYrpw.js +1 -0
- package/public/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
- package/public/assets/fortran-free-form-CYNrtFtB.js +1 -0
- package/public/assets/fsharp-D13ZGOAj.js +1 -0
- package/public/assets/gdresource-xMC7jr7x.js +1 -0
- package/public/assets/gdscript-DYvRD3hg.js +1 -0
- package/public/assets/gdshader-CBce3t8t.js +1 -0
- package/public/assets/genie-CV2tkWYe.js +1 -0
- package/public/assets/gherkin-DExj1W_8.js +1 -0
- package/public/assets/git-commit-BSykSTBG.js +1 -0
- package/public/assets/git-rebase-DidgtTB0.js +1 -0
- package/public/assets/github-dark-C-LZuMrd.js +1 -0
- package/public/assets/github-dark-default-DXG-b-1a.js +1 -0
- package/public/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
- package/public/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
- package/public/assets/github-light-EUqPIrTm.js +1 -0
- package/public/assets/github-light-default-BXViO-2h.js +1 -0
- package/public/assets/github-light-high-contrast-B68TUdTA.js +1 -0
- package/public/assets/gleam-CSRkHgEL.js +1 -0
- package/public/assets/glimmer-js-Cck5MdS-.js +1 -0
- package/public/assets/glimmer-ts-DMfQxyYr.js +1 -0
- package/public/assets/glsl-DPBFrb1h.js +1 -0
- package/public/assets/gn-ilITqXS6.js +1 -0
- package/public/assets/gnuplot-7GGW24-e.js +1 -0
- package/public/assets/go-rLFTqkRN.js +1 -0
- package/public/assets/graphql-BvPubeCr.js +1 -0
- package/public/assets/groovy-CacY0gHj.js +1 -0
- package/public/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
- package/public/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
- package/public/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
- package/public/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
- package/public/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
- package/public/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
- package/public/assets/hack-Drv5y81z.js +1 -0
- package/public/assets/haml-DcpINEk-.js +1 -0
- package/public/assets/handlebars-sj4UAwHW.js +1 -0
- package/public/assets/haskell-D8IpX4py.js +1 -0
- package/public/assets/haxe-C8oCnwJJ.js +1 -0
- package/public/assets/hcl-Dh228itO.js +1 -0
- package/public/assets/hjson-CxZEssPk.js +1 -0
- package/public/assets/hlsl-Cvrh5tZx.js +1 -0
- package/public/assets/horizon-CE9ld1lL.js +1 -0
- package/public/assets/horizon-bright-DSNQnXHK.js +1 -0
- package/public/assets/houston-CsvMBhTu.js +1 -0
- package/public/assets/html-DQjDPZbg.js +1 -0
- package/public/assets/html-derivative-DscSYlel.js +1 -0
- package/public/assets/http-CCrfmrUy.js +1 -0
- package/public/assets/hurl-DLm6Xdy2.js +1 -0
- package/public/assets/hxml-Dcm88srW.js +1 -0
- package/public/assets/hy-CZbG8q4J.js +1 -0
- package/public/assets/imba-DsUTQ-LC.js +1 -0
- package/public/assets/index-BDRMh7Hy.js +2918 -0
- package/public/assets/index-Cw-82hD0.css +1 -0
- package/public/assets/ini-B5eOa1yu.js +1 -0
- package/public/assets/java-CzpiG9dn.js +1 -0
- package/public/assets/javascript-2eedadNh.js +1 -0
- package/public/assets/jinja-Cch1Cycs.js +1 -0
- package/public/assets/jison-C3DQW9A-.js +1 -0
- package/public/assets/json-BhBCwuxI.js +1 -0
- package/public/assets/json5-BR5RXkoi.js +1 -0
- package/public/assets/jsonc-CYpm1nAK.js +1 -0
- package/public/assets/jsonl-CmCQp5Yx.js +1 -0
- package/public/assets/jsonnet-CJTPZ8u_.js +1 -0
- package/public/assets/jssm-DXw9l8Rf.js +1 -0
- package/public/assets/jsx-De1vU88o.js +1 -0
- package/public/assets/julia-BlJzw_Rq.js +1 -0
- package/public/assets/just-A2qsO4cM.js +1 -0
- package/public/assets/kanagawa-dragon-Bozd7klA.js +1 -0
- package/public/assets/kanagawa-lotus-BmuOG9ZW.js +1 -0
- package/public/assets/kanagawa-wave-BML5mF2J.js +1 -0
- package/public/assets/kdl-CsD5j6eV.js +1 -0
- package/public/assets/kotlin-DhhofPvG.js +1 -0
- package/public/assets/kusto-C7mF5XQf.js +1 -0
- package/public/assets/laserwave-C_8bwKvT.js +1 -0
- package/public/assets/latex-CDaOJk0y.js +1 -0
- package/public/assets/lean-CewbzKMR.js +1 -0
- package/public/assets/less-DVTAwKKz.js +1 -0
- package/public/assets/light-plus-DVQuIRkW.js +1 -0
- package/public/assets/liquid-BOnT7KYX.js +1 -0
- package/public/assets/llvm-DqHOMS-s.js +1 -0
- package/public/assets/log-BNLmms1o.js +1 -0
- package/public/assets/logo-Cluzi2Zq.js +1 -0
- package/public/assets/lottie-BT9QSO-G.js +2 -0
- package/public/assets/lua-CoLL9qBE.js +1 -0
- package/public/assets/luau-C2pBCSgt.js +1 -0
- package/public/assets/make-Dixweg8N.js +1 -0
- package/public/assets/markdown-BYOwaDjH.js +1 -0
- package/public/assets/marko-D8Xuri3Y.js +1 -0
- package/public/assets/material-theme-Bm3Qr25_.js +1 -0
- package/public/assets/material-theme-darker-2IIEA8gg.js +1 -0
- package/public/assets/material-theme-lighter-uhdI0v04.js +1 -0
- package/public/assets/material-theme-ocean-CHQ94UKr.js +1 -0
- package/public/assets/material-theme-palenight-B5W6OYN7.js +1 -0
- package/public/assets/matlab-D7qyCx1q.js +1 -0
- package/public/assets/mdc-BhVsbv7E.js +1 -0
- package/public/assets/mdx-DQZ5AkYe.js +1 -0
- package/public/assets/mermaid-BxpfTIzt.js +1 -0
- package/public/assets/min-dark-BSWPekZh.js +1 -0
- package/public/assets/min-light-DDpmG2fV.js +1 -0
- package/public/assets/mipsasm-BMqwQI7S.js +1 -0
- package/public/assets/mojo-fg40_ntQ.js +1 -0
- package/public/assets/monokai-B_bV9PQ9.js +1 -0
- package/public/assets/moonbit-DgjMoLWr.js +1 -0
- package/public/assets/move-BYnGhZoM.js +1 -0
- package/public/assets/narrat-_X_XdTYD.js +1 -0
- package/public/assets/nextflow-BJtWHP5T.js +1 -0
- package/public/assets/nextflow-groovy-DJMQeKeT.js +1 -0
- package/public/assets/nginx-CN1bxnHs.js +1 -0
- package/public/assets/night-owl-DhmEMT88.js +1 -0
- package/public/assets/night-owl-light-eJ-hLW7d.js +1 -0
- package/public/assets/nim-BKDc-Eam.js +1 -0
- package/public/assets/nix-IvuFDN5E.js +1 -0
- package/public/assets/nord-Cb4Vim4T.js +1 -0
- package/public/assets/nsis-CjNLYCLg.js +1 -0
- package/public/assets/nushell-DHYfO66s.js +1 -0
- package/public/assets/objective-c-D1A_Heim.js +1 -0
- package/public/assets/objective-cpp-BsSzOQcm.js +1 -0
- package/public/assets/ocaml-O90oeIOV.js +1 -0
- package/public/assets/odin-B1RWQWA5.js +1 -0
- package/public/assets/one-dark-pro-CLwyXe_n.js +1 -0
- package/public/assets/one-light-D7Lr4KcI.js +1 -0
- package/public/assets/openscad-BUDT5pXO.js +1 -0
- package/public/assets/org-CBldiceC.js +1 -0
- package/public/assets/pascal-4ZHwLPI5.js +1 -0
- package/public/assets/perl-KiFGXvwB.js +1 -0
- package/public/assets/php-CjFYgW_Q.js +1 -0
- package/public/assets/pierre-dark-CpLgRqie.js +1 -0
- package/public/assets/pierre-dark-protanopia-deuteranopia-B35FxJx-.js +1 -0
- package/public/assets/pierre-dark-soft-kZQmAZld.js +1 -0
- package/public/assets/pierre-dark-tritanopia-CpjhbsIL.js +1 -0
- package/public/assets/pierre-dark-vibrant-CpQYzh95.js +1 -0
- package/public/assets/pierre-light-CoaEpmwp.js +1 -0
- package/public/assets/pierre-light-protanopia-deuteranopia-0fSaH845.js +1 -0
- package/public/assets/pierre-light-soft-lWLdNTOI.js +1 -0
- package/public/assets/pierre-light-tritanopia-CEbqgOJL.js +1 -0
- package/public/assets/pierre-light-vibrant-D80Fkn33.js +1 -0
- package/public/assets/pkl-ot-7Btpt.js +1 -0
- package/public/assets/plastic-DQwYfKfQ.js +1 -0
- package/public/assets/plsql-DGHpHOYJ.js +1 -0
- package/public/assets/po-BiJDBrnU.js +1 -0
- package/public/assets/poimandres-DRFjx7u4.js +1 -0
- package/public/assets/polar-C7UOKdEL.js +1 -0
- package/public/assets/postcss-BXeXVLqQ.js +1 -0
- package/public/assets/powerquery-DNMTfnFr.js +1 -0
- package/public/assets/powershell-CCSX75yM.js +1 -0
- package/public/assets/prisma-DMgNhnYS.js +1 -0
- package/public/assets/prolog-iXnhIJG7.js +1 -0
- package/public/assets/proto-DB4EqR-F.js +1 -0
- package/public/assets/pug-CiQNzZtF.js +1 -0
- package/public/assets/puppet-CDv2pdJW.js +1 -0
- package/public/assets/purescript-9MfHhQsQ.js +1 -0
- package/public/assets/python-gzcpVVnB.js +1 -0
- package/public/assets/qml-BynhyZxj.js +1 -0
- package/public/assets/qmldir-DCQb3MpD.js +1 -0
- package/public/assets/qss-Fe1Jh2GI.js +1 -0
- package/public/assets/r-BydfSESc.js +1 -0
- package/public/assets/racket-DcIDlBhZ.js +1 -0
- package/public/assets/raku-B3gFvitq.js +1 -0
- package/public/assets/razor-Bfi-c6ag.js +1 -0
- package/public/assets/rbs-C0MpOrj4.js +1 -0
- package/public/assets/red-DX1BQOs8.js +1 -0
- package/public/assets/reg-CRGYupPL.js +1 -0
- package/public/assets/regexp-BFpups_T.js +1 -0
- package/public/assets/rel-BtDbiS_P.js +1 -0
- package/public/assets/riscv-Ckw8ddFX.js +1 -0
- package/public/assets/ron-VUp2lXgN.js +1 -0
- package/public/assets/rose-pine-aMsaMD1D.js +1 -0
- package/public/assets/rose-pine-dawn-8PwUyIlP.js +1 -0
- package/public/assets/rose-pine-moon-DO-qXg-I.js +1 -0
- package/public/assets/rosmsg-CAekHB0j.js +1 -0
- package/public/assets/rst-Z5_5o5cf.js +1 -0
- package/public/assets/ruby-DyP6QZ5x.js +1 -0
- package/public/assets/rust-Cfkwpbl8.js +1 -0
- package/public/assets/sas-DzcEtbFW.js +1 -0
- package/public/assets/sass-DXrisJhu.js +1 -0
- package/public/assets/scala-BiFt_7mu.js +1 -0
- package/public/assets/scheme-DQCgrYNe.js +1 -0
- package/public/assets/scss-BVi50TCh.js +1 -0
- package/public/assets/sdbl-bTVj8UrX.js +1 -0
- package/public/assets/shaderlab-TOUzSsQk.js +1 -0
- package/public/assets/shellscript-DwBEbT4l.js +1 -0
- package/public/assets/shellsession-DtCkQKX0.js +1 -0
- package/public/assets/slack-dark-DnToyrRv.js +1 -0
- package/public/assets/slack-ochin-B2OO5cIa.js +1 -0
- package/public/assets/smalltalk-BHpQb5nM.js +1 -0
- package/public/assets/smithy-Dgaz7aur.js +1 -0
- package/public/assets/snazzy-light-4G7pJPwS.js +1 -0
- package/public/assets/solarized-dark-UdsmMDCL.js +1 -0
- package/public/assets/solarized-light-C1IUL_tW.js +1 -0
- package/public/assets/solidity-Bj7E1mRn.js +1 -0
- package/public/assets/soy-Col_eH-0.js +1 -0
- package/public/assets/sparql-D_iOobhT.js +1 -0
- package/public/assets/splunk-BC2Px7Mm.js +1 -0
- package/public/assets/sql-CF1geVQJ.js +1 -0
- package/public/assets/ssh-config-BgfXC-Er.js +1 -0
- package/public/assets/stata-JT7HPvq1.js +1 -0
- package/public/assets/stylus-B6D30XZt.js +1 -0
- package/public/assets/surrealql-kYIUYZug.js +1 -0
- package/public/assets/svelte-CsWZn_FS.js +1 -0
- package/public/assets/swift-CyEgAFGc.js +1 -0
- package/public/assets/synthwave-84-nFMaYfgc.js +1 -0
- package/public/assets/system-verilog-Dh5ihWbf.js +1 -0
- package/public/assets/systemd-BxMlprV5.js +1 -0
- package/public/assets/talonscript-CohzipZa.js +1 -0
- package/public/assets/tasl-DMoTqEGO.js +1 -0
- package/public/assets/tcl-CZd0xW_V.js +1 -0
- package/public/assets/templ-DCsT8WEJ.js +1 -0
- package/public/assets/terraform-DswuEJGm.js +1 -0
- package/public/assets/tex-ZyN9TW16.js +1 -0
- package/public/assets/tokyo-night-oM2G3aXe.js +1 -0
- package/public/assets/toml-CcmNWLt0.js +1 -0
- package/public/assets/ts-tags-ArLnwaTi.js +1 -0
- package/public/assets/tsv-sltzmVWM.js +1 -0
- package/public/assets/tsx-CXwa5__r.js +1 -0
- package/public/assets/turtle-ByJddavk.js +1 -0
- package/public/assets/twig-BsBKj8BU.js +1 -0
- package/public/assets/typescript-Brm8t4pO.js +1 -0
- package/public/assets/typespec-BRdr0IET.js +1 -0
- package/public/assets/typst-vNjrO6QE.js +1 -0
- package/public/assets/v-DBj4K9d_.js +1 -0
- package/public/assets/vala-zf12oZj6.js +1 -0
- package/public/assets/vb-DOwzaHZ0.js +1 -0
- package/public/assets/verilog-B2gwz-sJ.js +1 -0
- package/public/assets/vesper-DdrHHSXu.js +1 -0
- package/public/assets/vhdl-BroJfC0k.js +1 -0
- package/public/assets/viml-DvXPmvsu.js +1 -0
- package/public/assets/vitesse-black-fwtXNY1n.js +1 -0
- package/public/assets/vitesse-dark-BZCL-v6S.js +1 -0
- package/public/assets/vitesse-light-VbXTXTou.js +1 -0
- package/public/assets/vue-CcPq89qx.js +1 -0
- package/public/assets/vue-html-B5qW2N7E.js +1 -0
- package/public/assets/vue-vine-LYElP1mf.js +1 -0
- package/public/assets/vyper-CgoNMtux.js +1 -0
- package/public/assets/wasm-BnjxR4X6.js +1 -0
- package/public/assets/wasm-ByWQv1Qj.js +1 -0
- package/public/assets/wenyan-C8pVoKbM.js +1 -0
- package/public/assets/wgsl-BsKzXJz4.js +1 -0
- package/public/assets/wikitext-ClFFjSW2.js +1 -0
- package/public/assets/wit-DdvCle-K.js +1 -0
- package/public/assets/wolfram-DLL8P-h_.js +1 -0
- package/public/assets/xml-D5hvN78Q.js +1 -0
- package/public/assets/xsl-CBSZ35CX.js +1 -0
- package/public/assets/yaml-D4FTZq40.js +1 -0
- package/public/assets/zenscript-BnlCZFoB.js +1 -0
- package/public/assets/zig-CMLA9XwU.js +1 -0
- package/public/brand/coja/cj-dark.svg +1 -0
- package/public/brand/coja/cj-light.svg +1 -0
- package/public/brand/coja/cj-themeable.svg +1 -0
- package/public/brand/coja/lottie/cj-huge-dark.json +311 -0
- package/public/brand/coja/lottie/cj-huge-light.json +311 -0
- package/public/brand/coja/lottie/cj-large-dark.json +311 -0
- package/public/brand/coja/lottie/cj-large-light.json +311 -0
- package/public/brand/coja/lottie/cj-medium-dark.json +311 -0
- package/public/brand/coja/lottie/cj-medium-light.json +311 -0
- package/public/brand/coja/lottie/cj-small-dark.json +311 -0
- package/public/brand/coja/lottie/cj-small-light.json +311 -0
- package/public/brand/coja/manifest.json +172 -0
- package/public/brand/coja/themes/ember/dark/cj-huge.json +311 -0
- package/public/brand/coja/themes/ember/dark/cj-large.json +311 -0
- package/public/brand/coja/themes/ember/dark/cj-medium.json +311 -0
- package/public/brand/coja/themes/ember/dark/cj-small.json +311 -0
- package/public/brand/coja/themes/ember/dark/cj.svg +1 -0
- package/public/brand/coja/themes/ember/light/cj-huge.json +311 -0
- package/public/brand/coja/themes/ember/light/cj-large.json +311 -0
- package/public/brand/coja/themes/ember/light/cj-medium.json +311 -0
- package/public/brand/coja/themes/ember/light/cj-small.json +311 -0
- package/public/brand/coja/themes/ember/light/cj.svg +1 -0
- package/public/brand/coja/themes/grove/dark/cj-huge.json +311 -0
- package/public/brand/coja/themes/grove/dark/cj-large.json +311 -0
- package/public/brand/coja/themes/grove/dark/cj-medium.json +311 -0
- package/public/brand/coja/themes/grove/dark/cj-small.json +311 -0
- package/public/brand/coja/themes/grove/dark/cj.svg +1 -0
- package/public/brand/coja/themes/grove/light/cj-huge.json +311 -0
- package/public/brand/coja/themes/grove/light/cj-large.json +311 -0
- package/public/brand/coja/themes/grove/light/cj-medium.json +311 -0
- package/public/brand/coja/themes/grove/light/cj-small.json +311 -0
- package/public/brand/coja/themes/grove/light/cj.svg +1 -0
- package/public/brand/coja/themes/iris/dark/cj-huge.json +311 -0
- package/public/brand/coja/themes/iris/dark/cj-large.json +311 -0
- package/public/brand/coja/themes/iris/dark/cj-medium.json +311 -0
- package/public/brand/coja/themes/iris/dark/cj-small.json +311 -0
- package/public/brand/coja/themes/iris/dark/cj.svg +1 -0
- package/public/brand/coja/themes/iris/light/cj-huge.json +311 -0
- package/public/brand/coja/themes/iris/light/cj-large.json +311 -0
- package/public/brand/coja/themes/iris/light/cj-medium.json +311 -0
- package/public/brand/coja/themes/iris/light/cj-small.json +311 -0
- package/public/brand/coja/themes/iris/light/cj.svg +1 -0
- package/public/brand/coja/themes/mulberry/dark/cj-huge.json +311 -0
- package/public/brand/coja/themes/mulberry/dark/cj-large.json +311 -0
- package/public/brand/coja/themes/mulberry/dark/cj-medium.json +311 -0
- package/public/brand/coja/themes/mulberry/dark/cj-small.json +311 -0
- package/public/brand/coja/themes/mulberry/dark/cj.svg +1 -0
- package/public/brand/coja/themes/mulberry/light/cj-huge.json +311 -0
- package/public/brand/coja/themes/mulberry/light/cj-large.json +311 -0
- package/public/brand/coja/themes/mulberry/light/cj-medium.json +311 -0
- package/public/brand/coja/themes/mulberry/light/cj-small.json +311 -0
- package/public/brand/coja/themes/mulberry/light/cj.svg +1 -0
- package/public/brand/coja/themes/ocean/dark/cj-huge.json +311 -0
- package/public/brand/coja/themes/ocean/dark/cj-large.json +311 -0
- package/public/brand/coja/themes/ocean/dark/cj-medium.json +311 -0
- package/public/brand/coja/themes/ocean/dark/cj-small.json +311 -0
- package/public/brand/coja/themes/ocean/dark/cj.svg +1 -0
- package/public/brand/coja/themes/ocean/light/cj-huge.json +311 -0
- package/public/brand/coja/themes/ocean/light/cj-large.json +311 -0
- package/public/brand/coja/themes/ocean/light/cj-medium.json +311 -0
- package/public/brand/coja/themes/ocean/light/cj-small.json +311 -0
- package/public/brand/coja/themes/ocean/light/cj.svg +1 -0
- package/public/fonts/ibm-plex-sans/IBMPlexSans-Bold.woff2 +0 -0
- package/public/fonts/ibm-plex-sans/IBMPlexSans-BoldItalic.woff2 +0 -0
- package/public/fonts/ibm-plex-sans/IBMPlexSans-Italic.woff2 +0 -0
- package/public/fonts/ibm-plex-sans/IBMPlexSans-Medium.woff2 +0 -0
- package/public/fonts/ibm-plex-sans/IBMPlexSans-MediumItalic.woff2 +0 -0
- package/public/fonts/ibm-plex-sans/IBMPlexSans-Regular.woff2 +0 -0
- package/public/fonts/ibm-plex-sans/IBMPlexSans-SemiBold.woff2 +0 -0
- package/public/fonts/ibm-plex-sans/IBMPlexSans-SemiBoldItalic.woff2 +0 -0
- package/public/fonts/ibm-plex-sans/LICENSE.txt +93 -0
- package/public/fonts/ibm-plex-sans/PROVENANCE.md +10 -0
- package/public/fonts/maple-mono-nf/LICENSE.txt +93 -0
- package/public/fonts/maple-mono-nf/MapleMono-NF-Bold.woff2 +0 -0
- package/public/fonts/maple-mono-nf/MapleMono-NF-BoldItalic.woff2 +0 -0
- package/public/fonts/maple-mono-nf/MapleMono-NF-Italic.woff2 +0 -0
- package/public/fonts/maple-mono-nf/MapleMono-NF-Medium.woff2 +0 -0
- package/public/fonts/maple-mono-nf/MapleMono-NF-MediumItalic.woff2 +0 -0
- package/public/fonts/maple-mono-nf/MapleMono-NF-Regular.woff2 +0 -0
- package/public/fonts/maple-mono-nf/MapleMono-NF-SemiBold.woff2 +0 -0
- package/public/fonts/maple-mono-nf/MapleMono-NF-SemiBoldItalic.woff2 +0 -0
- package/public/fonts/maple-mono-nf/PROVENANCE.md +12 -0
- package/public/index.html +14 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { ForgeError } from './forge.js';
|
|
2
|
+
import { invalidateTokenCache } from './gh-cli.js';
|
|
3
|
+
export const GITHUB_GRAPHQL_ENDPOINT = 'https://api.github.com/graphql';
|
|
4
|
+
export const TOKEN_REJECTED = 'GitHub rejected the token from gh. Run `gh auth login` (or `gh auth refresh`) in your terminal and try again.';
|
|
5
|
+
export function createGraphqlClient(opts) {
|
|
6
|
+
const { getToken, fetchImpl = fetch, endpoint = GITHUB_GRAPHQL_ENDPOINT, onUnauthorized = invalidateTokenCache, timeoutMs = 30_000, } = opts;
|
|
7
|
+
return async function gql(query, variables = {}) {
|
|
8
|
+
const token = await getToken();
|
|
9
|
+
let res;
|
|
10
|
+
try {
|
|
11
|
+
res = await fetchImpl(endpoint, {
|
|
12
|
+
method: 'POST',
|
|
13
|
+
// The token must only ever go to `endpoint`; a redirect elsewhere is a failure.
|
|
14
|
+
redirect: 'error',
|
|
15
|
+
headers: {
|
|
16
|
+
authorization: `bearer ${token}`,
|
|
17
|
+
'content-type': 'application/json',
|
|
18
|
+
accept: 'application/json',
|
|
19
|
+
'user-agent': 'coja',
|
|
20
|
+
},
|
|
21
|
+
body: JSON.stringify({ query, variables }),
|
|
22
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
throw new ForgeError(`Could not reach GitHub: ${errorMessage(err)}`, 502);
|
|
27
|
+
}
|
|
28
|
+
if (res.status === 401) {
|
|
29
|
+
onUnauthorized();
|
|
30
|
+
throw new ForgeError(TOKEN_REJECTED, 401);
|
|
31
|
+
}
|
|
32
|
+
if (!res.ok) {
|
|
33
|
+
throw new ForgeError(describeHttpFailure(res, await safeText(res)), res.status);
|
|
34
|
+
}
|
|
35
|
+
let body;
|
|
36
|
+
try {
|
|
37
|
+
body = (await res.json());
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
throw new ForgeError('GitHub returned an unreadable response.', 502);
|
|
41
|
+
}
|
|
42
|
+
if (body.errors && body.errors.length > 0) {
|
|
43
|
+
throw new ForgeError(body.errors.map((e) => e.message).join('; '), statusForGraphqlErrors(body.errors), body.errors);
|
|
44
|
+
}
|
|
45
|
+
if (body.data == null)
|
|
46
|
+
throw new ForgeError('GitHub returned no data.', 502);
|
|
47
|
+
return body.data;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* GitHub tags GraphQL errors with a `type`. Validation failures the user can
|
|
52
|
+
* act on (e.g. "Can not approve your own pull request") are UNPROCESSABLE →
|
|
53
|
+
* 422; missing objects → 404; permission problems → 403; the rest is the
|
|
54
|
+
* host's (or our query's) fault → 502.
|
|
55
|
+
*/
|
|
56
|
+
export function statusForGraphqlErrors(errors) {
|
|
57
|
+
const types = new Set(errors.map((e) => e.type));
|
|
58
|
+
if (types.has('UNPROCESSABLE'))
|
|
59
|
+
return 422;
|
|
60
|
+
if (types.has('NOT_FOUND'))
|
|
61
|
+
return 404;
|
|
62
|
+
if (types.has('FORBIDDEN') || types.has('INSUFFICIENT_SCOPES'))
|
|
63
|
+
return 403;
|
|
64
|
+
if (types.has('RATE_LIMITED'))
|
|
65
|
+
return 429;
|
|
66
|
+
return 502;
|
|
67
|
+
}
|
|
68
|
+
function describeHttpFailure(res, text) {
|
|
69
|
+
const retryAfter = res.headers.get('retry-after');
|
|
70
|
+
const remaining = res.headers.get('x-ratelimit-remaining');
|
|
71
|
+
if ((res.status === 403 || res.status === 429) && (retryAfter || remaining === '0')) {
|
|
72
|
+
const reset = res.headers.get('x-ratelimit-reset');
|
|
73
|
+
const when = retryAfter
|
|
74
|
+
? `in ${retryAfter}s`
|
|
75
|
+
: reset
|
|
76
|
+
? `at ${new Date(Number(reset) * 1000).toISOString()}`
|
|
77
|
+
: 'later';
|
|
78
|
+
return `GitHub rate limit exceeded; try again ${when}.`;
|
|
79
|
+
}
|
|
80
|
+
const detail = messageFromBody(text);
|
|
81
|
+
return `GitHub API request failed with HTTP ${res.status}${detail ? `: ${detail}` : ''}`;
|
|
82
|
+
}
|
|
83
|
+
function messageFromBody(text) {
|
|
84
|
+
try {
|
|
85
|
+
const parsed = JSON.parse(text);
|
|
86
|
+
return typeof parsed?.message === 'string' ? parsed.message : undefined;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function safeText(res) {
|
|
93
|
+
try {
|
|
94
|
+
return await res.text();
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return '';
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function errorMessage(err) {
|
|
101
|
+
if (err instanceof Error) {
|
|
102
|
+
const cause = err.cause;
|
|
103
|
+
return cause?.message ? `${err.message} (${cause.message})` : err.message;
|
|
104
|
+
}
|
|
105
|
+
return String(err);
|
|
106
|
+
}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL documents for the GitHub forge, plus the raw response shapes they
|
|
3
|
+
* select (the `Raw*` / `*Data` types). Field names, argument names and enum
|
|
4
|
+
* values were verified against the live schema by introspection; a document
|
|
5
|
+
* and its data type must be changed together.
|
|
6
|
+
*
|
|
7
|
+
* Paging: every connection is requested with `first: 100` (GitHub's maximum)
|
|
8
|
+
* and exposes `pageInfo`; `*Page` documents fetch the following pages of one
|
|
9
|
+
* connection so the initial detail query is never repeated.
|
|
10
|
+
*/
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Fragments
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
const PR_SUMMARY = /* GraphQL */ `
|
|
15
|
+
fragment PrSummary on PullRequest {
|
|
16
|
+
id number title url isDraft createdAt updatedAt
|
|
17
|
+
additions deletions changedFiles
|
|
18
|
+
author { login avatarUrl }
|
|
19
|
+
headRefName baseRefName headRefOid baseRefOid
|
|
20
|
+
viewerReviews: reviews(author: $login, last: 20) { nodes { id state submittedAt } }
|
|
21
|
+
pendingReview: reviews(author: $login, states: [PENDING], first: 1) {
|
|
22
|
+
nodes { id comments(first: 1) { totalCount } }
|
|
23
|
+
}
|
|
24
|
+
}`;
|
|
25
|
+
const COMMENT_FIELDS = /* GraphQL */ `
|
|
26
|
+
fragment CommentFields on PullRequestReviewComment {
|
|
27
|
+
id databaseId body bodyHTML createdAt url state
|
|
28
|
+
author { login avatarUrl }
|
|
29
|
+
pullRequestReview { id state }
|
|
30
|
+
}`;
|
|
31
|
+
const THREAD_FIELDS = /* GraphQL */ `
|
|
32
|
+
fragment ThreadFields on PullRequestReviewThread {
|
|
33
|
+
id path line startLine originalLine diffSide startDiffSide isResolved isOutdated
|
|
34
|
+
comments(first: 100) {
|
|
35
|
+
pageInfo { hasNextPage endCursor }
|
|
36
|
+
nodes { ...CommentFields }
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
${COMMENT_FIELDS}`;
|
|
40
|
+
const REVIEW_FIELDS = /* GraphQL */ `
|
|
41
|
+
fragment ReviewFields on PullRequestReview {
|
|
42
|
+
id state body bodyHTML submittedAt createdAt url
|
|
43
|
+
author { login avatarUrl }
|
|
44
|
+
comments(first: 1) { totalCount }
|
|
45
|
+
}`;
|
|
46
|
+
const ISSUE_COMMENT_FIELDS = /* GraphQL */ `
|
|
47
|
+
fragment IssueCommentFields on IssueComment {
|
|
48
|
+
id body bodyHTML createdAt url
|
|
49
|
+
author { login avatarUrl }
|
|
50
|
+
}`;
|
|
51
|
+
const COMMIT_FIELDS = /* GraphQL */ `
|
|
52
|
+
fragment CommitFields on PullRequestCommit {
|
|
53
|
+
url
|
|
54
|
+
commit {
|
|
55
|
+
oid abbreviatedOid messageHeadline messageBody committedDate url
|
|
56
|
+
author { name user { login } }
|
|
57
|
+
}
|
|
58
|
+
}`;
|
|
59
|
+
const FILE_FIELDS = 'path additions deletions changeType viewerViewedState';
|
|
60
|
+
const PAGE_INFO = 'pageInfo { hasNextPage endCursor }';
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Queries
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
export const VIEWER = /* GraphQL */ `
|
|
65
|
+
query Viewer { viewer { login avatarUrl } }`;
|
|
66
|
+
/** Open PRs, most recently updated first. Variables: owner, name, login, after? */
|
|
67
|
+
export const PR_LIST = /* GraphQL */ `
|
|
68
|
+
query PrList($owner: String!, $name: String!, $login: String!, $after: String) {
|
|
69
|
+
repository(owner: $owner, name: $name) {
|
|
70
|
+
pullRequests(states: [OPEN], first: 100, after: $after,
|
|
71
|
+
orderBy: { field: UPDATED_AT, direction: DESC }) {
|
|
72
|
+
totalCount
|
|
73
|
+
${PAGE_INFO}
|
|
74
|
+
nodes { ...PrSummary }
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
${PR_SUMMARY}`;
|
|
79
|
+
/**
|
|
80
|
+
* Filtered open PRs via GitHub's search API. The caller builds the query
|
|
81
|
+
* string (repo/is:pr/is:open plus qualifiers); search order is best-match,
|
|
82
|
+
* like GitHub's own filtered list. Variables: query (the full string),
|
|
83
|
+
* login, after?
|
|
84
|
+
*/
|
|
85
|
+
export const PR_SEARCH = /* GraphQL */ `
|
|
86
|
+
query PrSearch($query: String!, $login: String!, $after: String) {
|
|
87
|
+
search(query: $query, type: ISSUE, first: 100, after: $after) {
|
|
88
|
+
issueCount
|
|
89
|
+
pageInfo { hasNextPage endCursor }
|
|
90
|
+
nodes { ... on PullRequest { ...PrSummary } }
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
${PR_SUMMARY}`;
|
|
94
|
+
/** Variables: owner, name, number */
|
|
95
|
+
export const PR_REFS = /* GraphQL */ `
|
|
96
|
+
query PrRefs($owner: String!, $name: String!, $number: Int!) {
|
|
97
|
+
repository(owner: $owner, name: $name) {
|
|
98
|
+
pullRequest(number: $number) { id number headRefOid baseRefOid baseRefName headRefName }
|
|
99
|
+
}
|
|
100
|
+
}`;
|
|
101
|
+
/** First page of everything the review screen needs. Variables: owner, name, number, login */
|
|
102
|
+
export const PR_DETAIL = /* GraphQL */ `
|
|
103
|
+
query PrDetail($owner: String!, $name: String!, $number: Int!, $login: String!) {
|
|
104
|
+
repository(owner: $owner, name: $name) {
|
|
105
|
+
pullRequest(number: $number) {
|
|
106
|
+
...PrSummary
|
|
107
|
+
body bodyHTML
|
|
108
|
+
commits(first: 100) { totalCount ${PAGE_INFO} nodes { ...CommitFields } }
|
|
109
|
+
files(first: 100) { totalCount ${PAGE_INFO} nodes { ${FILE_FIELDS} } }
|
|
110
|
+
reviewThreads(first: 100) { totalCount ${PAGE_INFO} nodes { ...ThreadFields } }
|
|
111
|
+
reviews(first: 100) { ${PAGE_INFO} nodes { ...ReviewFields } }
|
|
112
|
+
comments(first: 100) { ${PAGE_INFO} nodes { ...IssueCommentFields } }
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
${PR_SUMMARY}
|
|
117
|
+
${COMMIT_FIELDS}
|
|
118
|
+
${THREAD_FIELDS}
|
|
119
|
+
${REVIEW_FIELDS}
|
|
120
|
+
${ISSUE_COMMENT_FIELDS}`;
|
|
121
|
+
const pageQuery = (name, connection, fragments = '') => /* GraphQL */ `
|
|
122
|
+
query ${name}($owner: String!, $name: String!, $number: Int!, $after: String!) {
|
|
123
|
+
repository(owner: $owner, name: $name) {
|
|
124
|
+
pullRequest(number: $number) { ${connection} }
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
${fragments}`;
|
|
128
|
+
/** Variables: owner, name, number, after */
|
|
129
|
+
export const PR_COMMITS_PAGE = pageQuery('PrCommitsPage', `commits(first: 100, after: $after) { ${PAGE_INFO} nodes { ...CommitFields } }`, COMMIT_FIELDS);
|
|
130
|
+
export const PR_FILES_PAGE = pageQuery('PrFilesPage', `files(first: 100, after: $after) { ${PAGE_INFO} nodes { ${FILE_FIELDS} } }`);
|
|
131
|
+
export const PR_THREADS_PAGE = pageQuery('PrThreadsPage', `reviewThreads(first: 100, after: $after) { ${PAGE_INFO} nodes { ...ThreadFields } }`, THREAD_FIELDS);
|
|
132
|
+
export const PR_REVIEWS_PAGE = pageQuery('PrReviewsPage', `reviews(first: 100, after: $after) { ${PAGE_INFO} nodes { ...ReviewFields } }`, REVIEW_FIELDS);
|
|
133
|
+
export const PR_ISSUE_COMMENTS_PAGE = pageQuery('PrIssueCommentsPage', `comments(first: 100, after: $after) { ${PAGE_INFO} nodes { ...IssueCommentFields } }`, ISSUE_COMMENT_FIELDS);
|
|
134
|
+
/** Comments of one thread beyond its first 100. Variables: id (thread node id), after */
|
|
135
|
+
export const THREAD_COMMENTS_PAGE = /* GraphQL */ `
|
|
136
|
+
query ThreadCommentsPage($id: ID!, $after: String!) {
|
|
137
|
+
node(id: $id) {
|
|
138
|
+
... on PullRequestReviewThread {
|
|
139
|
+
comments(first: 100, after: $after) { ${PAGE_INFO} nodes { ...CommentFields } }
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
${COMMENT_FIELDS}`;
|
|
144
|
+
/**
|
|
145
|
+
* The pull request a review comment / thread belongs to, for tying a
|
|
146
|
+
* client-supplied node id to the PR named in the route. Two documents, so an id
|
|
147
|
+
* of the other type resolves to no pull request at all. Variables: id
|
|
148
|
+
*/
|
|
149
|
+
const ownerQuery = (name, type) => /* GraphQL */ `
|
|
150
|
+
query ${name}($id: ID!) {
|
|
151
|
+
node(id: $id) {
|
|
152
|
+
... on ${type} { pullRequest { number repository { name owner { login } } } }
|
|
153
|
+
}
|
|
154
|
+
}`;
|
|
155
|
+
export const COMMENT_OWNER = ownerQuery('CommentOwner', 'PullRequestReviewComment');
|
|
156
|
+
export const THREAD_OWNER = ownerQuery('ThreadOwner', 'PullRequestReviewThread');
|
|
157
|
+
/** The viewer's pending review on a PR, if any. Variables: owner, name, number, login */
|
|
158
|
+
export const PENDING_REVIEW = /* GraphQL */ `
|
|
159
|
+
query PendingReview($owner: String!, $name: String!, $number: Int!, $login: String!) {
|
|
160
|
+
repository(owner: $owner, name: $name) {
|
|
161
|
+
pullRequest(number: $number) {
|
|
162
|
+
id
|
|
163
|
+
reviews(author: $login, states: [PENDING], first: 1) {
|
|
164
|
+
nodes { id comments(first: 1) { totalCount } }
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}`;
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
// Mutations — every one of these is reached only from an HTTP route handler
|
|
171
|
+
// that a human triggered in the UI ("the AI drafts, the human sends").
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
/** Create a PENDING review anchored at a commit (no event). Variables: pullRequestId, commitOID */
|
|
174
|
+
export const START_REVIEW = /* GraphQL */ `
|
|
175
|
+
mutation StartReview($pullRequestId: ID!, $commitOID: GitObjectID) {
|
|
176
|
+
addPullRequestReview(input: { pullRequestId: $pullRequestId, commitOID: $commitOID }) {
|
|
177
|
+
pullRequestReview { id state }
|
|
178
|
+
}
|
|
179
|
+
}`;
|
|
180
|
+
/**
|
|
181
|
+
* Add a line/range thread to a pending review. Variables: input
|
|
182
|
+
* (AddPullRequestReviewThreadInput: pullRequestReviewId, path, body, line, side, startLine?, startSide?).
|
|
183
|
+
* `firstComment` reaches the owning review's updated comment count.
|
|
184
|
+
*/
|
|
185
|
+
export const ADD_THREAD = /* GraphQL */ `
|
|
186
|
+
mutation AddThread($input: AddPullRequestReviewThreadInput!) {
|
|
187
|
+
addPullRequestReviewThread(input: $input) {
|
|
188
|
+
thread {
|
|
189
|
+
...ThreadFields
|
|
190
|
+
firstComment: comments(first: 1) {
|
|
191
|
+
nodes { pullRequestReview { id comments(first: 1) { totalCount } } }
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
${THREAD_FIELDS}`;
|
|
197
|
+
/**
|
|
198
|
+
* Reply to a thread without a pullRequestReviewId (decisions.md). Verified live: when the viewer
|
|
199
|
+
* has no pending review GitHub creates and submits a one-comment review, so the reply is public
|
|
200
|
+
* at once; when a pending review exists GitHub attaches the reply to it (state PENDING) and it
|
|
201
|
+
* publishes with the review. Variables: threadId, body
|
|
202
|
+
*/
|
|
203
|
+
export const REPLY = /* GraphQL */ `
|
|
204
|
+
mutation Reply($threadId: ID!, $body: String!) {
|
|
205
|
+
addPullRequestReviewThreadReply(input: { pullRequestReviewThreadId: $threadId, body: $body }) {
|
|
206
|
+
comment {
|
|
207
|
+
...CommentFields
|
|
208
|
+
pullRequestReview { id state comments(first: 1) { totalCount } }
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
${COMMENT_FIELDS}`;
|
|
213
|
+
/** Variables: id, body */
|
|
214
|
+
export const UPDATE_COMMENT = /* GraphQL */ `
|
|
215
|
+
mutation UpdateComment($id: ID!, $body: String!) {
|
|
216
|
+
updatePullRequestReviewComment(input: { pullRequestReviewCommentId: $id, body: $body }) {
|
|
217
|
+
pullRequestReviewComment { ...CommentFields }
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
${COMMENT_FIELDS}`;
|
|
221
|
+
/** Variables: id */
|
|
222
|
+
export const DELETE_COMMENT = /* GraphQL */ `
|
|
223
|
+
mutation DeleteComment($id: ID!) {
|
|
224
|
+
deletePullRequestReviewComment(input: { id: $id }) {
|
|
225
|
+
pullRequestReviewComment { id }
|
|
226
|
+
}
|
|
227
|
+
}`;
|
|
228
|
+
/** Submit an existing pending review. Variables: reviewId, event, body? */
|
|
229
|
+
export const SUBMIT_REVIEW = /* GraphQL */ `
|
|
230
|
+
mutation SubmitReview($reviewId: ID!, $event: PullRequestReviewEvent!, $body: String) {
|
|
231
|
+
submitPullRequestReview(input: { pullRequestReviewId: $reviewId, event: $event, body: $body }) {
|
|
232
|
+
pullRequestReview { id state url }
|
|
233
|
+
}
|
|
234
|
+
}`;
|
|
235
|
+
/** Create and submit a review in one call (no pending review exists). Variables: pullRequestId, commitOID, event, body? */
|
|
236
|
+
export const ADD_AND_SUBMIT_REVIEW = /* GraphQL */ `
|
|
237
|
+
mutation AddAndSubmitReview($pullRequestId: ID!, $commitOID: GitObjectID, $event: PullRequestReviewEvent!, $body: String) {
|
|
238
|
+
addPullRequestReview(input: { pullRequestId: $pullRequestId, commitOID: $commitOID, event: $event, body: $body }) {
|
|
239
|
+
pullRequestReview { id state url }
|
|
240
|
+
}
|
|
241
|
+
}`;
|
|
242
|
+
/** Delete a pending review and all its draft comments. Variables: reviewId */
|
|
243
|
+
export const DISCARD_REVIEW = /* GraphQL */ `
|
|
244
|
+
mutation DiscardReview($reviewId: ID!) {
|
|
245
|
+
deletePullRequestReview(input: { pullRequestReviewId: $reviewId }) {
|
|
246
|
+
pullRequestReview { id }
|
|
247
|
+
}
|
|
248
|
+
}`;
|
|
249
|
+
/** Variables: pullRequestId, path */
|
|
250
|
+
export const MARK_VIEWED = /* GraphQL */ `
|
|
251
|
+
mutation MarkViewed($pullRequestId: ID!, $path: String!) {
|
|
252
|
+
markFileAsViewed(input: { pullRequestId: $pullRequestId, path: $path }) { pullRequest { id } }
|
|
253
|
+
}`;
|
|
254
|
+
/** Variables: pullRequestId, path */
|
|
255
|
+
export const UNMARK_VIEWED = /* GraphQL */ `
|
|
256
|
+
mutation UnmarkViewed($pullRequestId: ID!, $path: String!) {
|
|
257
|
+
unmarkFileAsViewed(input: { pullRequestId: $pullRequestId, path: $path }) { pullRequest { id } }
|
|
258
|
+
}`;
|