@prismshadow/penguin-server 0.2.2 → 0.2.4
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 +3 -0
- package/dist/api/types.d.ts +552 -49
- package/dist/chunk-KQQ3HSTK.js +568 -0
- package/dist/chunk-KQQ3HSTK.js.map +1 -0
- package/dist/hmr/manifest.d.ts +54 -0
- package/dist/hmr/manifest.js +27 -0
- package/dist/hmr/manifest.js.map +1 -0
- package/dist/index.js +4495 -1041
- package/dist/index.js.map +1 -1
- package/dist/reset-admin-password.d.ts +28 -0
- package/dist/reset-admin-password.js +39 -0
- package/dist/reset-admin-password.js.map +1 -0
- package/package.json +15 -3
- package/web-dist/assets/addon-fit-ClUHZ6NU.js +1 -0
- package/web-dist/assets/addon-web-links-BKMSMMvN.js +1 -0
- package/web-dist/assets/cpp-DIPi6g--.js +1 -0
- package/web-dist/assets/highlighter-Cp5vYdaX.js +152 -0
- package/web-dist/assets/index-BJNmFD1m.js +187 -0
- package/web-dist/assets/index-BneOZQwC.css +1 -0
- package/web-dist/assets/ruby-B13GW9FM.js +1 -0
- package/web-dist/assets/xterm-j28bzvOQ.js +9 -0
- package/web-dist/index.html +2 -2
- package/web-dist/assets/abap-BdImnpbu.js +0 -1
- package/web-dist/assets/actionscript-3-CoDkCxhg.js +0 -1
- package/web-dist/assets/ada-bCR0ucgS.js +0 -1
- package/web-dist/assets/andromeeda-C4gqWexZ.js +0 -1
- package/web-dist/assets/angular-html-DA-rfuFy.js +0 -1
- package/web-dist/assets/angular-ts-BrjP3tb8.js +0 -1
- package/web-dist/assets/apache-Pmp26Uib.js +0 -1
- package/web-dist/assets/apex-Dqspr-GT.js +0 -1
- package/web-dist/assets/apl-CORt7UWP.js +0 -1
- package/web-dist/assets/applescript-Co6uUVPk.js +0 -1
- package/web-dist/assets/ara-BRHolxvo.js +0 -1
- package/web-dist/assets/asciidoc-Ve4PFQV2.js +0 -1
- package/web-dist/assets/asm-D_Q5rh1f.js +0 -1
- package/web-dist/assets/astro-HNnZUWAn.js +0 -1
- package/web-dist/assets/aurora-x-D-2ljcwZ.js +0 -1
- package/web-dist/assets/awk-DMzUqQB5.js +0 -1
- package/web-dist/assets/ayu-dark-DYE7WIF3.js +0 -1
- package/web-dist/assets/ayu-light-BA47KaF1.js +0 -1
- package/web-dist/assets/ayu-mirage-32ctXXKs.js +0 -1
- package/web-dist/assets/ballerina-BFfxhgS-.js +0 -1
- package/web-dist/assets/bat-BkioyH1T.js +0 -1
- package/web-dist/assets/beancount-k_qm7-4y.js +0 -1
- package/web-dist/assets/berry-uYugtg8r.js +0 -1
- package/web-dist/assets/bibtex-CHM0blh-.js +0 -1
- package/web-dist/assets/bicep-Bmn6On1c.js +0 -1
- package/web-dist/assets/bird2-BIv1doCn.js +0 -1
- package/web-dist/assets/blade-2xfisSek.js +0 -1
- package/web-dist/assets/bsl-BO_Y6i37.js +0 -1
- package/web-dist/assets/c3-MRO5bC_T.js +0 -1
- package/web-dist/assets/cadence-Bv_4Rxtq.js +0 -1
- package/web-dist/assets/cairo-KRGpt6FW.js +0 -1
- package/web-dist/assets/catppuccin-frappe-DFWUc33u.js +0 -1
- package/web-dist/assets/catppuccin-latte-C9dUb6Cb.js +0 -1
- package/web-dist/assets/catppuccin-macchiato-DQyhUUbL.js +0 -1
- package/web-dist/assets/catppuccin-mocha-D87Tk5Gz.js +0 -1
- package/web-dist/assets/clarity-D53aC0YG.js +0 -1
- package/web-dist/assets/clojure-P80f7IUj.js +0 -1
- package/web-dist/assets/cmake-D1j8_8rp.js +0 -1
- package/web-dist/assets/cobol-nBiQ_Alo.js +0 -1
- package/web-dist/assets/codeowners-Bp6g37R7.js +0 -1
- package/web-dist/assets/codeql-DsOJ9woJ.js +0 -1
- package/web-dist/assets/coffee-Ch7k5sss.js +0 -1
- package/web-dist/assets/common-lisp-Cg-RD9OK.js +0 -1
- package/web-dist/assets/coq-DkFqJrB1.js +0 -1
- package/web-dist/assets/cpp-UfJy6YNI.js +0 -1
- package/web-dist/assets/crystal-DGywbUpC.js +0 -1
- package/web-dist/assets/csharp-DSvCPggb.js +0 -1
- package/web-dist/assets/csv-fuZLfV_i.js +0 -1
- package/web-dist/assets/cue-D82EKSYY.js +0 -1
- package/web-dist/assets/cypher-COkxafJQ.js +0 -1
- package/web-dist/assets/d-85-TOEBH.js +0 -1
- package/web-dist/assets/dark-plus-C3mMm8J8.js +0 -1
- package/web-dist/assets/dart-bE4Kk8sk.js +0 -1
- package/web-dist/assets/dax-CEL-wOlO.js +0 -1
- package/web-dist/assets/desktop-BmXAJ9_W.js +0 -1
- package/web-dist/assets/docker-BcOcwvcX.js +0 -1
- package/web-dist/assets/dotenv-Da5cRb03.js +0 -1
- package/web-dist/assets/dracula-BzJJZx-M.js +0 -1
- package/web-dist/assets/dracula-soft-BXkSAIEj.js +0 -1
- package/web-dist/assets/dream-maker-BtqSS_iP.js +0 -1
- package/web-dist/assets/edge-FbVlp4U3.js +0 -1
- package/web-dist/assets/elixir-CkH2-t6x.js +0 -1
- package/web-dist/assets/elm-DbKCFpqz.js +0 -1
- package/web-dist/assets/emacs-lisp-CXvaQtF9.js +0 -1
- package/web-dist/assets/erb-Dm6A9KJ5.js +0 -1
- package/web-dist/assets/erlang-DsQrWhSR.js +0 -1
- package/web-dist/assets/everforest-dark-BgDCqdQA.js +0 -1
- package/web-dist/assets/everforest-light-C8M2exoo.js +0 -1
- package/web-dist/assets/fennel-BYunw83y.js +0 -1
- package/web-dist/assets/fish-BvzEVeQv.js +0 -1
- package/web-dist/assets/fluent-C4IJs8-o.js +0 -1
- package/web-dist/assets/fortran-fixed-form-CkoXwp7k.js +0 -1
- package/web-dist/assets/fortran-free-form-BxgE0vQu.js +0 -1
- package/web-dist/assets/fsharp-CXgrBDvD.js +0 -1
- package/web-dist/assets/gdresource-BOOCDP_w.js +0 -1
- package/web-dist/assets/gdscript-C5YyOfLZ.js +0 -1
- package/web-dist/assets/gdshader-DkwncUOv.js +0 -1
- package/web-dist/assets/genie-D0YGMca9.js +0 -1
- package/web-dist/assets/gherkin-DyxjwDmM.js +0 -1
- package/web-dist/assets/git-commit-F4YmCXRG.js +0 -1
- package/web-dist/assets/git-rebase-r7XF79zn.js +0 -1
- package/web-dist/assets/github-dark-default-Cuk6v7N8.js +0 -1
- package/web-dist/assets/github-dark-dimmed-DH5Ifo-i.js +0 -1
- package/web-dist/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -1
- package/web-dist/assets/github-light-default-D7oLnXFd.js +0 -1
- package/web-dist/assets/github-light-high-contrast-BfjtVDDH.js +0 -1
- package/web-dist/assets/gleam-BspZqrRM.js +0 -1
- package/web-dist/assets/glimmer-js-ByusRIyA.js +0 -1
- package/web-dist/assets/glimmer-ts-BfAWNZQY.js +0 -1
- package/web-dist/assets/glsl-DplSGwfg.js +0 -1
- package/web-dist/assets/gn-n2N0HUVH.js +0 -1
- package/web-dist/assets/gnuplot-DdkO51Og.js +0 -1
- package/web-dist/assets/graphql-ChdNCCLP.js +0 -1
- package/web-dist/assets/groovy-gcz8RCvz.js +0 -1
- package/web-dist/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -1
- package/web-dist/assets/gruvbox-dark-medium-GsRaNv29.js +0 -1
- package/web-dist/assets/gruvbox-dark-soft-CVdnzihN.js +0 -1
- package/web-dist/assets/gruvbox-light-hard-CH1njM8p.js +0 -1
- package/web-dist/assets/gruvbox-light-medium-DRw_LuNl.js +0 -1
- package/web-dist/assets/gruvbox-light-soft-hJgmCMqR.js +0 -1
- package/web-dist/assets/hack-DbPARsA_.js +0 -1
- package/web-dist/assets/haml-D5jkg6IW.js +0 -1
- package/web-dist/assets/handlebars-BpdQsYii.js +0 -1
- package/web-dist/assets/haskell-Df6bDoY_.js +0 -1
- package/web-dist/assets/haxe-CzTSHFRz.js +0 -1
- package/web-dist/assets/hcl-BWvSN4gD.js +0 -1
- package/web-dist/assets/hjson-D5-asLiD.js +0 -1
- package/web-dist/assets/hlsl-D3lLCCz7.js +0 -1
- package/web-dist/assets/horizon-BUw7H-hv.js +0 -1
- package/web-dist/assets/horizon-bright-CUuTKBJd.js +0 -1
- package/web-dist/assets/houston-DnULxvSX.js +0 -1
- package/web-dist/assets/html-derivative-DlHx6ybY.js +0 -1
- package/web-dist/assets/http-jrhK8wxY.js +0 -1
- package/web-dist/assets/hurl-irOxFIW8.js +0 -1
- package/web-dist/assets/hxml-Bvhsp5Yf.js +0 -1
- package/web-dist/assets/hy-DFXneXwc.js +0 -1
- package/web-dist/assets/imba-DGztddWO.js +0 -1
- package/web-dist/assets/index-B3puu-Hr.js +0 -153
- package/web-dist/assets/index-CaDuyrN0.css +0 -1
- package/web-dist/assets/index-rgHg3m6g.js +0 -181
- package/web-dist/assets/jinja-f2NsQr07.js +0 -1
- package/web-dist/assets/jison-wvAkD_A8.js +0 -1
- package/web-dist/assets/json5-C9tS-k6U.js +0 -1
- package/web-dist/assets/jsonc-Des-eS-w.js +0 -1
- package/web-dist/assets/jsonl-DcaNXYhu.js +0 -1
- package/web-dist/assets/jsonnet-DFQXde-d.js +0 -1
- package/web-dist/assets/jssm-C2t-YnRu.js +0 -1
- package/web-dist/assets/julia-D7OTSIA_.js +0 -1
- package/web-dist/assets/just-CUsbIsdP.js +0 -1
- package/web-dist/assets/kanagawa-dragon-CkXjmgJE.js +0 -1
- package/web-dist/assets/kanagawa-lotus-CfQXZHmo.js +0 -1
- package/web-dist/assets/kanagawa-wave-DWedfzmr.js +0 -1
- package/web-dist/assets/kdl-DV7GczEv.js +0 -1
- package/web-dist/assets/kotlin-BdnUsdx6.js +0 -1
- package/web-dist/assets/kusto-wEQ09or8.js +0 -1
- package/web-dist/assets/laserwave-DUszq2jm.js +0 -1
- package/web-dist/assets/latex-CaSxy8MP.js +0 -1
- package/web-dist/assets/lean-BZvkOJ9d.js +0 -1
- package/web-dist/assets/less-B1dDrJ26.js +0 -1
- package/web-dist/assets/light-plus-B7mTdjB0.js +0 -1
- package/web-dist/assets/liquid-C0sCDyMI.js +0 -1
- package/web-dist/assets/llvm-DjAJT7YJ.js +0 -1
- package/web-dist/assets/logo-BtOb2qkB.js +0 -1
- package/web-dist/assets/lua-BaeVxFsk.js +0 -1
- package/web-dist/assets/luau-KW6xsasC.js +0 -1
- package/web-dist/assets/make-CHLpvVh8.js +0 -1
- package/web-dist/assets/marko-DjSrsDqO.js +0 -1
- package/web-dist/assets/material-theme-D5KoaKCx.js +0 -1
- package/web-dist/assets/material-theme-darker-BfHTSMKl.js +0 -1
- package/web-dist/assets/material-theme-lighter-B0m2ddpp.js +0 -1
- package/web-dist/assets/material-theme-ocean-CyktbL80.js +0 -1
- package/web-dist/assets/material-theme-palenight-Csfq5Kiy.js +0 -1
- package/web-dist/assets/matlab-D7o27uSR.js +0 -1
- package/web-dist/assets/mdc-DTYItulj.js +0 -1
- package/web-dist/assets/mdx-Cmh6b_Ma.js +0 -1
- package/web-dist/assets/mermaid-mWjccvbQ.js +0 -1
- package/web-dist/assets/min-dark-CafNBF8u.js +0 -1
- package/web-dist/assets/min-light-CTRr51gU.js +0 -1
- package/web-dist/assets/mipsasm-CKIfxQSi.js +0 -1
- package/web-dist/assets/mojo-rZm6bMo-.js +0 -1
- package/web-dist/assets/monokai-D4h5O-jR.js +0 -1
- package/web-dist/assets/moonbit-_H4v1dQx.js +0 -1
- package/web-dist/assets/move-IF9eRakj.js +0 -1
- package/web-dist/assets/narrat-DRg8JJMk.js +0 -1
- package/web-dist/assets/nextflow-C-mBbutL.js +0 -1
- package/web-dist/assets/nextflow-groovy-vE_lwT2v.js +0 -1
- package/web-dist/assets/nginx-BpAMiNFr.js +0 -1
- package/web-dist/assets/night-owl-C39BiMTA.js +0 -1
- package/web-dist/assets/night-owl-light-CMTm3GFP.js +0 -1
- package/web-dist/assets/nim-BIad80T-.js +0 -1
- package/web-dist/assets/nix-CwoSXNpI.js +0 -1
- package/web-dist/assets/nord-Ddv68eIx.js +0 -1
- package/web-dist/assets/nushell-Cz2AlsmD.js +0 -1
- package/web-dist/assets/objective-c-DXmwc3jG.js +0 -1
- package/web-dist/assets/objective-cpp-CLxacb5B.js +0 -1
- package/web-dist/assets/ocaml-C0hk2d4L.js +0 -1
- package/web-dist/assets/odin-BBf5iR-q.js +0 -1
- package/web-dist/assets/one-dark-pro-DVMEJ2y_.js +0 -1
- package/web-dist/assets/one-light-C3Wv6jpd.js +0 -1
- package/web-dist/assets/openscad-C4EeE6gA.js +0 -1
- package/web-dist/assets/pascal-D93ZcfNL.js +0 -1
- package/web-dist/assets/perl-B9cMNwum.js +0 -1
- package/web-dist/assets/pkl-u5AG7uiY.js +0 -1
- package/web-dist/assets/plastic-3e1v2bzS.js +0 -1
- package/web-dist/assets/plsql-ChMvpjG-.js +0 -1
- package/web-dist/assets/po-BTJTHyun.js +0 -1
- package/web-dist/assets/poimandres-CS3Unz2-.js +0 -1
- package/web-dist/assets/polar-C0HS_06l.js +0 -1
- package/web-dist/assets/postcss-CXtECtnM.js +0 -1
- package/web-dist/assets/powerquery-CEu0bR-o.js +0 -1
- package/web-dist/assets/powershell-Dpen1YoG.js +0 -1
- package/web-dist/assets/prisma-Dd19v3D-.js +0 -1
- package/web-dist/assets/prolog-CbFg5uaA.js +0 -1
- package/web-dist/assets/proto-C7zT0LnQ.js +0 -1
- package/web-dist/assets/pug-DKIMFp6K.js +0 -1
- package/web-dist/assets/puppet-BMWR74SV.js +0 -1
- package/web-dist/assets/purescript-CklMAg4u.js +0 -1
- package/web-dist/assets/qml-3beO22l8.js +0 -1
- package/web-dist/assets/qmldir-C8lEn-DE.js +0 -1
- package/web-dist/assets/qss-IeuSbFQv.js +0 -1
- package/web-dist/assets/r-Dspwwk_N.js +0 -1
- package/web-dist/assets/racket-BqYA7rlc.js +0 -1
- package/web-dist/assets/raku-DXvB9xmW.js +0 -1
- package/web-dist/assets/razor-BjBPvh-w.js +0 -1
- package/web-dist/assets/red-bN70gL4F.js +0 -1
- package/web-dist/assets/reg-C-SQnVFl.js +0 -1
- package/web-dist/assets/regexp-CDVJQ6XC.js +0 -1
- package/web-dist/assets/rel-C3B-1QV4.js +0 -1
- package/web-dist/assets/riscv-BM1_JUlF.js +0 -1
- package/web-dist/assets/ron-D8l8udqQ.js +0 -1
- package/web-dist/assets/rose-pine-dawn-DHQR4-dF.js +0 -1
- package/web-dist/assets/rose-pine-moon-D4_iv3hh.js +0 -1
- package/web-dist/assets/rose-pine-qdsjHGoJ.js +0 -1
- package/web-dist/assets/rosmsg-BJDFO7_C.js +0 -1
- package/web-dist/assets/rst-CpCqk9r5.js +0 -1
- package/web-dist/assets/ruby-DyJCeAvU.js +0 -1
- package/web-dist/assets/sas-DEy46yEz.js +0 -1
- package/web-dist/assets/sass-Cj5Yp3dK.js +0 -1
- package/web-dist/assets/scala-C151Ov-r.js +0 -1
- package/web-dist/assets/scheme-C98Dy4si.js +0 -1
- package/web-dist/assets/scss-D5BDwBP9.js +0 -1
- package/web-dist/assets/sdbl-DVxCFoDh.js +0 -1
- package/web-dist/assets/shaderlab-Dg9Lc6iA.js +0 -1
- package/web-dist/assets/shellsession-BADoaaVG.js +0 -1
- package/web-dist/assets/slack-dark-BthQWCQV.js +0 -1
- package/web-dist/assets/slack-ochin-DqwNpetd.js +0 -1
- package/web-dist/assets/smalltalk-BERRCDM3.js +0 -1
- package/web-dist/assets/snazzy-light-Bw305WKR.js +0 -1
- package/web-dist/assets/solarized-dark-DXbdFlpD.js +0 -1
- package/web-dist/assets/solarized-light-L9t79GZl.js +0 -1
- package/web-dist/assets/solidity-rGO070M0.js +0 -1
- package/web-dist/assets/soy-8wufbnw4.js +0 -1
- package/web-dist/assets/sparql-rVzFXLq3.js +0 -1
- package/web-dist/assets/splunk-BtCnVYZw.js +0 -1
- package/web-dist/assets/ssh-config-_ykCGR6B.js +0 -1
- package/web-dist/assets/stata-DI20mbqo.js +0 -1
- package/web-dist/assets/stylus-BEDo0Tqx.js +0 -1
- package/web-dist/assets/surrealql-Bq5Q-fJD.js +0 -1
- package/web-dist/assets/svelte-Cy7k_4gC.js +0 -1
- package/web-dist/assets/swift-D82vCrfD.js +0 -1
- package/web-dist/assets/synthwave-84-CbfX1IO0.js +0 -1
- package/web-dist/assets/system-verilog-CnnmHF94.js +0 -1
- package/web-dist/assets/systemd-4A_iFExJ.js +0 -1
- package/web-dist/assets/talonscript-CkByrt1z.js +0 -1
- package/web-dist/assets/tasl-QIJgUcNo.js +0 -1
- package/web-dist/assets/tcl-dwOrl1Do.js +0 -1
- package/web-dist/assets/templ-DhtptRzy.js +0 -1
- package/web-dist/assets/terraform-BETggiCN.js +0 -1
- package/web-dist/assets/tex-idrVyKtj.js +0 -1
- package/web-dist/assets/tokyo-night-hegEt444.js +0 -1
- package/web-dist/assets/ts-tags-D351s5mN.js +0 -1
- package/web-dist/assets/tsv-B_m7g4N7.js +0 -1
- package/web-dist/assets/turtle-BsS91CYL.js +0 -1
- package/web-dist/assets/twig-CW1WmMYd.js +0 -1
- package/web-dist/assets/typespec-CAFt9gP4.js +0 -1
- package/web-dist/assets/typst-DHCkPAjA.js +0 -1
- package/web-dist/assets/v-BcVCzyr7.js +0 -1
- package/web-dist/assets/vala-CsfeWuGM.js +0 -1
- package/web-dist/assets/vb-D17OF-Vu.js +0 -1
- package/web-dist/assets/verilog-BQ8w6xss.js +0 -1
- package/web-dist/assets/vesper-DRje8inN.js +0 -1
- package/web-dist/assets/vhdl-CeAyd5Ju.js +0 -1
- package/web-dist/assets/viml-CJc9bBzg.js +0 -1
- package/web-dist/assets/vitesse-black-Bkuqu6BP.js +0 -1
- package/web-dist/assets/vitesse-dark-D0r3Knsf.js +0 -1
- package/web-dist/assets/vitesse-light-CVO1_9PV.js +0 -1
- package/web-dist/assets/vue-D2xRrEX4.js +0 -1
- package/web-dist/assets/vue-html-AaS7Mt5G.js +0 -1
- package/web-dist/assets/vue-vine-BoDAl6tE.js +0 -1
- package/web-dist/assets/vyper-CDx5xZoG.js +0 -1
- package/web-dist/assets/wasm-CG6Dc4jp.js +0 -1
- package/web-dist/assets/wasm-MzD3tlZU.js +0 -1
- package/web-dist/assets/wenyan-BV7otONQ.js +0 -1
- package/web-dist/assets/wgsl-Dx-B1_4e.js +0 -1
- package/web-dist/assets/wikitext-BhOHFoWU.js +0 -1
- package/web-dist/assets/wit-5i3qLPDT.js +0 -1
- package/web-dist/assets/wolfram-lXgVvXCa.js +0 -1
- package/web-dist/assets/xsl-CtQFsRM5.js +0 -1
- package/web-dist/assets/zenscript-DVFEvuxE.js +0 -1
- package/web-dist/assets/zig-VOosw3JB.js +0 -1
package/dist/api/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { OmniMessage, ToolCallPayload } from '@prismshadow/penguin-core/omnimessage';
|
|
1
|
+
import { OmniMessage, ToolCallPayload, CompactionMode } from '@prismshadow/penguin-core/omnimessage';
|
|
2
2
|
import { ThinkingLevelName, ToolDefinitionConfig, MCPServerConfig } from '@prismshadow/penguin-core/interfaces';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -72,6 +72,38 @@ interface MeResponse {
|
|
|
72
72
|
* token) may omit it.
|
|
73
73
|
*/
|
|
74
74
|
sessionVia: "password" | "desktop";
|
|
75
|
+
/**
|
|
76
|
+
* The upload limits currently in force, so the composer can refuse an oversize pick before
|
|
77
|
+
* reading it and can name the real number in the message. They are admin-settable and ride
|
|
78
|
+
* `/api/me` rather than `/api/admin/settings` because every user's composer needs them, not
|
|
79
|
+
* just an admin's.
|
|
80
|
+
*/
|
|
81
|
+
uploadLimits: UploadLimits;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Upload limits as the web app sees them: whole MB, the same unit the admin form uses, so the
|
|
85
|
+
* number in the error message is the number the admin typed.
|
|
86
|
+
*/
|
|
87
|
+
interface UploadLimits {
|
|
88
|
+
/** Per-file cap for composer file attachments. */
|
|
89
|
+
attachmentMaxMb: number;
|
|
90
|
+
/** Per-message total of decoded attachment bytes. */
|
|
91
|
+
attachmentTotalMb: number;
|
|
92
|
+
/** Per-message file count. Fixed server-side, not admin-settable. */
|
|
93
|
+
attachmentMaxCount: number;
|
|
94
|
+
/**
|
|
95
|
+
* Per-image cap for images that ride the conversation inline. Fixed server-side and
|
|
96
|
+
* deliberately far below the attachment cap — an inline image enters the conversation and the
|
|
97
|
+
* Trace, where its size is paid again on every history page and every resume.
|
|
98
|
+
*/
|
|
99
|
+
imageMaxMb: number;
|
|
100
|
+
/**
|
|
101
|
+
* The range the two admin-settable limits may be set to. Carried here so the admin form states
|
|
102
|
+
* the real bounds without compiling its own copy of them — the server is the only place that
|
|
103
|
+
* decides how large an upload it can survive.
|
|
104
|
+
*/
|
|
105
|
+
attachmentLimitMinMb: number;
|
|
106
|
+
attachmentLimitMaxMb: number;
|
|
75
107
|
}
|
|
76
108
|
interface PasswordChangeRequest {
|
|
77
109
|
/** Omitted only by desktop-established sessions (desktop mode); required otherwise. */
|
|
@@ -119,11 +151,23 @@ interface ServerSettings {
|
|
|
119
151
|
*/
|
|
120
152
|
proxyForAgent: boolean;
|
|
121
153
|
/**
|
|
122
|
-
* The shared explicit proxy address (canonical
|
|
123
|
-
* follow the proxy environment variables. When set it takes
|
|
124
|
-
* HTTP_PROXY / HTTPS_PROXY wherever the owning switch is on.
|
|
154
|
+
* The shared explicit proxy address (a canonical URL — http(s):// or socks5:// /
|
|
155
|
+
* socks://), or null = follow the proxy environment variables. When set it takes
|
|
156
|
+
* precedence over HTTP_PROXY / HTTPS_PROXY wherever the owning switch is on.
|
|
125
157
|
*/
|
|
126
158
|
proxyUrl: string | null;
|
|
159
|
+
/**
|
|
160
|
+
* Per-file cap for composer file attachments, in whole MB (default 100). Applies to the very
|
|
161
|
+
* next upload — the validators read it per request, nothing is snapshotted at boot.
|
|
162
|
+
*/
|
|
163
|
+
attachmentMaxMb: number;
|
|
164
|
+
/**
|
|
165
|
+
* Per-message total of decoded attachment bytes, in whole MB (default 120). Never below
|
|
166
|
+
* `attachmentMaxMb`, so a message may always carry one full-size attachment. The global request
|
|
167
|
+
* body cap is derived from this value (base64 inflates it by 4/3, plus headroom for one inline
|
|
168
|
+
* image and the JSON framing), which is why raising it needs no separate setting.
|
|
169
|
+
*/
|
|
170
|
+
attachmentTotalMb: number;
|
|
127
171
|
}
|
|
128
172
|
interface ServerSettingsResponse {
|
|
129
173
|
settings: ServerSettings;
|
|
@@ -133,12 +177,38 @@ interface ServerSettingsUpdateRequest {
|
|
|
133
177
|
proxyForApp?: boolean;
|
|
134
178
|
proxyForAgent?: boolean;
|
|
135
179
|
/**
|
|
136
|
-
* New proxy address. Accepted forms:
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
180
|
+
* New proxy address. Accepted forms: any proxy URL undici's dispatcher takes —
|
|
181
|
+
* `http://`, `https://`, `socks5://` / `socks://`, credentials allowed — or bare
|
|
182
|
+
* `host[:port]` (normalized to `http://…`; only normalized values are stored, and the
|
|
183
|
+
* response echoes the stored form). Empty/whitespace-only or null clears the address
|
|
184
|
+
* (follow the environment variables); anything else is 400 `invalid_proxy_url`.
|
|
140
185
|
*/
|
|
141
186
|
proxyUrl?: string | null;
|
|
187
|
+
/**
|
|
188
|
+
* New per-file attachment cap in whole MB. Must be an integer between 1 and 200; anything else
|
|
189
|
+
* — a fraction, a string, 102400 for "100GB" — is 400 `invalid_attachment_limit` and writes
|
|
190
|
+
* nothing.
|
|
191
|
+
*/
|
|
192
|
+
attachmentMaxMb?: number;
|
|
193
|
+
/**
|
|
194
|
+
* New per-message total attachment cap in whole MB. Same 1..200 integer range, and additionally
|
|
195
|
+
* must not be below the *effective* per-file cap (the value in the same PUT, or the stored one
|
|
196
|
+
* when this PUT does not change it) — a total below the per-file cap would make a legal single
|
|
197
|
+
* attachment unsendable. Violations are 400 `invalid_attachment_limit`.
|
|
198
|
+
*/
|
|
199
|
+
attachmentTotalMb?: number;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* One draft-screen shortcut: a prompt the user wrote, filed under a name they chose. Clicking it
|
|
203
|
+
* fills the composer exactly like a built-in example does, and sends nothing. Deliberately holds
|
|
204
|
+
* no Skill list — a saved prompt is not authored against a known Skill catalog the way a shipped
|
|
205
|
+
* example is, and the Agent it will run under is picked after the click.
|
|
206
|
+
*/
|
|
207
|
+
interface DraftShortcut {
|
|
208
|
+
/** Stable client-generated id: what an edit or a delete addresses the row by. Unique per user. */
|
|
209
|
+
id: string;
|
|
210
|
+
title: string;
|
|
211
|
+
prompt: string;
|
|
142
212
|
}
|
|
143
213
|
/** User UI preferences (SQLite ui_prefs, free-form JSON; known keys declared here). */
|
|
144
214
|
interface UiPrefs {
|
|
@@ -154,6 +224,13 @@ interface UiPrefs {
|
|
|
154
224
|
showCliSessions?: boolean;
|
|
155
225
|
/** The initial-password notice banner (app layout) was permanently dismissed by the user. */
|
|
156
226
|
initialPasswordBannerDismissed?: boolean;
|
|
227
|
+
/**
|
|
228
|
+
* The draft screen's user-defined shortcuts, in display order. Replaced whole on every write
|
|
229
|
+
* (the merge is shallow, so the array is one field like any other) and bounded on write by
|
|
230
|
+
* services/draft-shortcuts.ts — count, title length and prompt length — because this is the one
|
|
231
|
+
* known key holding user-authored text rather than a flag or an id.
|
|
232
|
+
*/
|
|
233
|
+
draftShortcuts?: DraftShortcut[];
|
|
157
234
|
[key: string]: unknown;
|
|
158
235
|
}
|
|
159
236
|
interface PrefsResponse {
|
|
@@ -236,7 +313,7 @@ interface ModelInfo {
|
|
|
236
313
|
/** Display name: explicit TOML field (user-edited) takes priority, then the built-in catalog; falls back to unset (frontend shows modelId). */
|
|
237
314
|
displayName?: string;
|
|
238
315
|
contextWindow?: number;
|
|
239
|
-
/** AgentHub client protocol (`openai`, etc.); defaults to AgentHub inferring it from modelId. */
|
|
316
|
+
/** AgentHub client protocol (`openai-chat`, `openai-responses`, etc.); defaults to AgentHub inferring it from modelId. */
|
|
240
317
|
clientType?: string;
|
|
241
318
|
/**
|
|
242
319
|
* Whether image input (vision/multimodal) is supported: the TOML `vision` annotation takes
|
|
@@ -251,9 +328,24 @@ interface ModelInfo {
|
|
|
251
328
|
* seeded per-Agent default (32000), which cannot fit into e.g. a 32k context window.
|
|
252
329
|
*/
|
|
253
330
|
maxTokens?: number;
|
|
331
|
+
/**
|
|
332
|
+
* Per-model fast mode (TOML `fast_mode` annotation; user-only, never preset by the
|
|
333
|
+
* built-in catalog): when true, session requests opt into the provider's faster serving
|
|
334
|
+
* tier at premium pricing (AgentHub UniConfig `fast_mode`). Only `true` is reported;
|
|
335
|
+
* unset = off. Models without a fast tier reject requests carrying it.
|
|
336
|
+
*/
|
|
337
|
+
fastMode?: boolean;
|
|
254
338
|
pricing?: ModelPricingDto;
|
|
255
339
|
/** Environment variable name to fall back to when api_key is empty (e.g. ANTHROPIC_API_KEY); unset if no known fallback. */
|
|
256
340
|
envKey?: string;
|
|
341
|
+
/**
|
|
342
|
+
* Masked preview (same rule as `credential.apiKeyMasked`) of the value the server process
|
|
343
|
+
* currently holds for `envKey` — the plaintext is never serialized. Reported only for
|
|
344
|
+
* first-party official entries (vendor group, catalog shape unmodified); gateway, custom
|
|
345
|
+
* and user-defined groups never carry it. Absent = the variable is unset or empty, or the
|
|
346
|
+
* entry is not first-party.
|
|
347
|
+
*/
|
|
348
|
+
envKeyMasked?: string;
|
|
257
349
|
credential?: CredentialInfo;
|
|
258
350
|
isDefault: boolean;
|
|
259
351
|
}
|
|
@@ -293,6 +385,8 @@ interface ModelUpdateEntry {
|
|
|
293
385
|
vision?: boolean;
|
|
294
386
|
/** Per-model max output tokens, a positive integer (wins over the Agent config); omitted = inherit the Agent value (the annotation is cleared). */
|
|
295
387
|
maxTokens?: number;
|
|
388
|
+
/** Per-model fast mode: only `true` is persisted; omitted or `false` clears the annotation (absent = off). */
|
|
389
|
+
fastMode?: boolean;
|
|
296
390
|
pricing?: ModelPricingDto;
|
|
297
391
|
/** Providing it overwrites and updates createdAt; omitting it keeps the existing value. */
|
|
298
392
|
apiKey?: string;
|
|
@@ -333,6 +427,45 @@ interface ModelTestRequest {
|
|
|
333
427
|
baseUrl?: string | null;
|
|
334
428
|
/** AgentHub client protocol; required for unsaved custom models (otherwise the id can't be auto-routed). */
|
|
335
429
|
clientType?: string;
|
|
430
|
+
/**
|
|
431
|
+
* Test with fast mode (the frontend always sends the form's current value, so an unsaved
|
|
432
|
+
* toggle — either direction — is what gets tested); omitted falls back to the stored
|
|
433
|
+
* annotation. Lets "Test connection" surface a fast-mode rejection before saving.
|
|
434
|
+
*/
|
|
435
|
+
fastMode?: boolean;
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Vision capability probe: sends one 1x1 image and a one-word prompt on this model's
|
|
439
|
+
* credential, to decide whether the models dialog's "supports vision" switch should be
|
|
440
|
+
* turned on. The body mirrors the connectivity test (same paired reference and same
|
|
441
|
+
* not-yet-saved overrides), so an unsaved model can be probed before it exists on disk.
|
|
442
|
+
*
|
|
443
|
+
* Unlike protocol detection this is a real, billed completion — an image request cannot be
|
|
444
|
+
* shaped to cost nothing — so it only ever runs when the user presses the control.
|
|
445
|
+
*/
|
|
446
|
+
interface ModelVisionDetectRequest {
|
|
447
|
+
provider: string;
|
|
448
|
+
modelId: string;
|
|
449
|
+
/** Newly entered API key (plaintext); the stored one backs the probe when omitted. */
|
|
450
|
+
apiKey?: string;
|
|
451
|
+
/** "Clear saved API key" is checked: do not fall back to the stored key. */
|
|
452
|
+
clearApiKey?: boolean;
|
|
453
|
+
/** Form's current base URL; null means "explicitly none" (as in the connectivity test). */
|
|
454
|
+
baseUrl?: string | null;
|
|
455
|
+
/** Protocol to speak, when the form has one; otherwise the stored/auto-routed client. */
|
|
456
|
+
clientType?: string;
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Vision probe verdict. `supported` = the model took the image and answered; `unsupported`
|
|
460
|
+
* = it answered specifically that it will not take an image (a definitive negative, not an
|
|
461
|
+
* error); `failed` = the probe never got a usable answer (auth, network, an unrelated
|
|
462
|
+
* error), so nothing about the capability was learned and the setting is left alone.
|
|
463
|
+
*/
|
|
464
|
+
type ModelVisionOutcome = "supported" | "unsupported" | "failed";
|
|
465
|
+
/** Vision probe result; `message` carries the truncated provider error for the failed case. */
|
|
466
|
+
interface ModelVisionDetectResponse {
|
|
467
|
+
outcome: ModelVisionOutcome;
|
|
468
|
+
message?: string;
|
|
336
469
|
}
|
|
337
470
|
/**
|
|
338
471
|
* Connectivity test result: carries round-trip latency when ok, and a reason on failure
|
|
@@ -353,6 +486,71 @@ interface ModelTestResponse {
|
|
|
353
486
|
tps?: number;
|
|
354
487
|
message?: string;
|
|
355
488
|
}
|
|
489
|
+
/**
|
|
490
|
+
* Protocol auto-detection (POST /api/projects/:p/models/detect, owner): probes which of
|
|
491
|
+
* AgentHub's generic protocol clients a custom base URL serves — `openai-responses` first,
|
|
492
|
+
* then `ant-messages`, then `openai-chat` — and reports the first hit. Used by the custom
|
|
493
|
+
* model dialog to fill `clientType` from the endpoint itself; costs no tokens (each probe
|
|
494
|
+
* is a minimal invalid request whose error reveals the protocol shape).
|
|
495
|
+
*/
|
|
496
|
+
interface ModelProtocolDetectRequest {
|
|
497
|
+
/** Base URL to probe (as typed in the form); each probe appends its protocol path. */
|
|
498
|
+
baseUrl: string;
|
|
499
|
+
/** Newly entered API key (plaintext); used for probe auth if provided. Detection also works keyless: a protocol-shaped 401/403 still proves the route. */
|
|
500
|
+
apiKey?: string;
|
|
501
|
+
/** "Clear saved API key" is checked: do not fall back to the stored key (probe the current draft). */
|
|
502
|
+
clearApiKey?: boolean;
|
|
503
|
+
/** Optional paired reference: when it names a stored entry and no apiKey is given, that entry's saved key backs the probes (mirrors the connectivity test). */
|
|
504
|
+
provider?: string;
|
|
505
|
+
modelId?: string;
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* One probe's outcome: `served` = the route answered in an API shape (including auth
|
|
509
|
+
* failures — 401/403 with a protocol-shaped body proves the route exists);
|
|
510
|
+
* `route_missing` = 404/405; `server_error` = 5xx (proves nothing about the path);
|
|
511
|
+
* `junk` = HTML / non-JSON / JSON matching no API shape; `timeout` / `network_error` =
|
|
512
|
+
* the request itself failed.
|
|
513
|
+
*/
|
|
514
|
+
type ProtocolProbeOutcome = "served" | "route_missing" | "server_error" | "junk" | "timeout" | "network_error";
|
|
515
|
+
/** One probe, for debugging display: the probed URL derives from baseUrl only (never contains the key). */
|
|
516
|
+
interface ModelProtocolProbeDto {
|
|
517
|
+
/** AgentHub client type this probe stands for (`openai-responses` / `ant-messages` / `openai-chat`). */
|
|
518
|
+
clientType: string;
|
|
519
|
+
/** Full URL probed (base URL + the protocol's path). */
|
|
520
|
+
url: string;
|
|
521
|
+
outcome: ProtocolProbeOutcome;
|
|
522
|
+
/** HTTP status, when a response arrived at all. */
|
|
523
|
+
status?: number;
|
|
524
|
+
}
|
|
525
|
+
/** Detection result: probes run sequentially and stop at the first served protocol, so `probes` lists only the ones actually run, in order. */
|
|
526
|
+
interface ModelProtocolDetectResponse {
|
|
527
|
+
/** The first protocol the endpoint serves (an AgentHub client type); absent when none of the three matched. */
|
|
528
|
+
detected?: string;
|
|
529
|
+
probes: ModelProtocolProbeDto[];
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Endpoint model listing (POST /api/projects/:p/models/list, owner): given a base URL and
|
|
533
|
+
* the protocol `/detect` reported, returns every model id the endpoint serves (AgentHub's
|
|
534
|
+
* `listModels()` on the routed client). Used by the add-group dialog to import a provider's
|
|
535
|
+
* whole listing in one go; the ids come back in the endpoint's own order.
|
|
536
|
+
*/
|
|
537
|
+
interface EndpointModelListRequest {
|
|
538
|
+
/** Endpoint base URL (as typed in the add-group dialog). */
|
|
539
|
+
baseUrl: string;
|
|
540
|
+
/** AgentHub client type to speak (normally a detected generic protocol; whole-endpoint listings need one). */
|
|
541
|
+
clientType: string;
|
|
542
|
+
/** Newly entered API key (plaintext); omitted = the SDK's environment fallback for the protocol. */
|
|
543
|
+
apiKey?: string;
|
|
544
|
+
}
|
|
545
|
+
/** Listing outcome: model ids on success, a truncated provider/SDK reason otherwise. */
|
|
546
|
+
interface EndpointModelListResponse {
|
|
547
|
+
ok: boolean;
|
|
548
|
+
/** The model ids the endpoint serves, in the order the endpoint returned them (ok only). */
|
|
549
|
+
models?: string[];
|
|
550
|
+
/** The routed client has no models endpoint (AgentHub UnsupportedOperationError) — callers offer the manual path. */
|
|
551
|
+
unsupported?: boolean;
|
|
552
|
+
message?: string;
|
|
553
|
+
}
|
|
356
554
|
/**
|
|
357
555
|
* PUT /api/projects/:p/models/default (owner): narrow default-model switch — flips the same
|
|
358
556
|
* top-level `default_model` the models page's whole-table PUT writes, without resending the
|
|
@@ -385,10 +583,40 @@ interface ChatDefaultsDto {
|
|
|
385
583
|
/**
|
|
386
584
|
* Fallback thinking level for Agents whose config has no explicit `model.thinking_level`
|
|
387
585
|
* (resolution chain: Agent explicit > this project default > built-in "medium"). Never
|
|
388
|
-
* "none" — only the
|
|
586
|
+
* "none" — only the selectable tiers.
|
|
389
587
|
*/
|
|
390
588
|
thinkingLevel?: Exclude<ThinkingLevelName, "none">;
|
|
391
589
|
}
|
|
590
|
+
/**
|
|
591
|
+
* One deny rule of the sandbox command policy — plain project-editable data. The factory
|
|
592
|
+
* rules are seeded into new projects and carry no special status thereafter: every rule
|
|
593
|
+
* can be edited, disabled, or deleted.
|
|
594
|
+
*/
|
|
595
|
+
interface CommandPolicyRuleDto {
|
|
596
|
+
name: string;
|
|
597
|
+
/** JavaScript regex source, matched against the whitespace-normalized command. */
|
|
598
|
+
pattern: string;
|
|
599
|
+
/** What the rule catches (free text). */
|
|
600
|
+
description?: string;
|
|
601
|
+
/** Per-rule switch, effective value (defaults on). */
|
|
602
|
+
enabled: boolean;
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Per-Project sandbox command policy: deny rules for shell commands, evaluated ahead of
|
|
606
|
+
* the approval mode (a hit is denied even under allow-all). Serves as the GET response and
|
|
607
|
+
* the PUT response. The PUT request body carries `enabled?` plus the full `rules` list
|
|
608
|
+
* (required — a PUT always materializes the list into the config, model-presets style);
|
|
609
|
+
* per-rule `enabled` may be omitted there and defaults to on. Owner-only to write; any
|
|
610
|
+
* member may read.
|
|
611
|
+
*/
|
|
612
|
+
interface CommandPolicyDto {
|
|
613
|
+
/** Effective master switch; an absent stored value reads as true (the policy defaults on). */
|
|
614
|
+
enabled: boolean;
|
|
615
|
+
/** The effective rule list — the factory set when the project predates seeding and has none stored. */
|
|
616
|
+
rules: CommandPolicyRuleDto[];
|
|
617
|
+
/** The factory set, served for the settings UI's "restore defaults". */
|
|
618
|
+
defaultRules: CommandPolicyRuleDto[];
|
|
619
|
+
}
|
|
392
620
|
/** Read-only vault entry display: key name + masked value; plaintext is never sent. */
|
|
393
621
|
interface VaultEntryInfo {
|
|
394
622
|
key: string;
|
|
@@ -596,6 +824,8 @@ interface MemoryScopeInfo {
|
|
|
596
824
|
workspacePath?: string;
|
|
597
825
|
/** Number of Markdown topic files in the directory (the `MEMORY.md` index not counted). */
|
|
598
826
|
fileCount: number;
|
|
827
|
+
/** Whether the directory holds a `MEMORY.md` index, so an import confirmation can say whether one would be replaced. */
|
|
828
|
+
hasIndex: boolean;
|
|
599
829
|
/** Most recent topic-file mtime in the directory (ISO 8601); unset when the directory holds no topic file. */
|
|
600
830
|
updatedAt?: string;
|
|
601
831
|
}
|
|
@@ -635,6 +865,64 @@ interface MemoryFileResponse {
|
|
|
635
865
|
file: MemoryFileInfo;
|
|
636
866
|
content: string;
|
|
637
867
|
}
|
|
868
|
+
/** One topic file inside a transfer document: the name it had in its scope, and its whole text. */
|
|
869
|
+
interface MemoryTransferFile {
|
|
870
|
+
/** File name inside the scope directory, e.g. `prefers-pnpm.md` — a name, never a path. */
|
|
871
|
+
name: string;
|
|
872
|
+
/** The file's full Markdown text, frontmatter included. */
|
|
873
|
+
content: string;
|
|
874
|
+
}
|
|
875
|
+
/**
|
|
876
|
+
* GET …/memory/scopes/:key/export, and the body a POST …/import carries back: everything one
|
|
877
|
+
* scope holds, as one JSON document — the topic files and the scope's own `MEMORY.md`.
|
|
878
|
+
*/
|
|
879
|
+
interface MemoryScopeExport {
|
|
880
|
+
/** Format marker, so a foreign JSON file is refused with a clear reason rather than half-imported. */
|
|
881
|
+
format: "penguin-memory-scope";
|
|
882
|
+
/** Document version. A reader accepts exactly this; a later format bumps it and states its own compatibility. */
|
|
883
|
+
version: 1;
|
|
884
|
+
/** The scope this was exported from. Informational: an import writes into the scope its URL names. */
|
|
885
|
+
scopeKey: string;
|
|
886
|
+
kind: MemoryScopeInfo["kind"];
|
|
887
|
+
/** The Workspace the source scope stood for, when it had a `.workspace` marker. */
|
|
888
|
+
workspacePath?: string;
|
|
889
|
+
/** When the document was produced (ISO 8601). */
|
|
890
|
+
exportedAt: string;
|
|
891
|
+
/** The scope's `MEMORY.md`, or null when the scope has none. Only the index reaches the model's context. */
|
|
892
|
+
index: string | null;
|
|
893
|
+
files: MemoryTransferFile[];
|
|
894
|
+
}
|
|
895
|
+
/**
|
|
896
|
+
* What an import does with a name the target scope already holds:
|
|
897
|
+
* - `skip` — keep what is on disk, write only names the scope does not have (destroys nothing);
|
|
898
|
+
* - `overwrite` — replace a same-named file's content;
|
|
899
|
+
* - `replace` — additionally delete every topic file the document does not carry.
|
|
900
|
+
* The two destructive modes require `confirm`.
|
|
901
|
+
*/
|
|
902
|
+
type MemoryImportMode = "skip" | "overwrite" | "replace";
|
|
903
|
+
/** POST …/memory/scopes/:key/import */
|
|
904
|
+
interface MemoryImportRequest {
|
|
905
|
+
/** Defaults to `skip`. */
|
|
906
|
+
mode?: MemoryImportMode;
|
|
907
|
+
/** Required by `overwrite` and `replace`; without it they are refused with 409 `memory_import_confirm_required`. */
|
|
908
|
+
confirm?: boolean;
|
|
909
|
+
payload: MemoryScopeExport;
|
|
910
|
+
}
|
|
911
|
+
/** What one import did, name by name, so the UI can report it rather than claim success. */
|
|
912
|
+
interface MemoryImportResponse {
|
|
913
|
+
scopeKey: string;
|
|
914
|
+
mode: MemoryImportMode;
|
|
915
|
+
/** Names written that the scope did not have. */
|
|
916
|
+
added: string[];
|
|
917
|
+
/** Names whose existing content was replaced. */
|
|
918
|
+
overwritten: string[];
|
|
919
|
+
/** Names left untouched because the scope already had them (`skip` only). */
|
|
920
|
+
skipped: string[];
|
|
921
|
+
/** Names deleted because `replace` dropped everything the document did not carry. */
|
|
922
|
+
removed: string[];
|
|
923
|
+
/** Whether the scope's `MEMORY.md` was written or extended. */
|
|
924
|
+
indexWritten: boolean;
|
|
925
|
+
}
|
|
638
926
|
interface SessionInfo {
|
|
639
927
|
sessionId: string;
|
|
640
928
|
projectId: string;
|
|
@@ -645,11 +933,35 @@ interface SessionInfo {
|
|
|
645
933
|
modelId: string;
|
|
646
934
|
workspace: string;
|
|
647
935
|
approvalMode: ApprovalMode;
|
|
936
|
+
/**
|
|
937
|
+
* Thinking level pinned for this Session (set via PATCH; the Web App's in-chat picker).
|
|
938
|
+
* Unset = never pinned: runs that carry no level of their own fall back to the Agent
|
|
939
|
+
* config's `model.thinking_level`, so config edits keep taking effect. Once pinned it
|
|
940
|
+
* survives reloads and applies to every later run of this Session, and an Agent-config
|
|
941
|
+
* change no longer moves it.
|
|
942
|
+
*/
|
|
943
|
+
thinkingLevel?: ThinkingLevelName;
|
|
648
944
|
/** Short title auto-generated by the model after the first turn; unset until generated (frontend shows "New Chat"). */
|
|
649
945
|
title?: string;
|
|
650
946
|
/** Session source (for list badges/folders), derived from core session_meta — the single source of truth (not stored in the DB); unset for user-created sessions. */
|
|
651
947
|
source?: SessionSource;
|
|
652
948
|
createdAt: string;
|
|
949
|
+
/**
|
|
950
|
+
* Last activity the server drove for this Session (ISO 8601, same convention as
|
|
951
|
+
* createdAt), monotonic — it never moves backwards. Set to createdAt at creation, then
|
|
952
|
+
* stamped when a run starts and again when it ends; a run here is one Task, one
|
|
953
|
+
* compaction, or one whole goal loop (every round of a goal belongs to a single run, so
|
|
954
|
+
* an N-round goal stamps twice, not 2N times).
|
|
955
|
+
*
|
|
956
|
+
* Two kinds of row therefore stay at createdAt no matter how busy they look: Sessions
|
|
957
|
+
* adopted from a CLI Trace (this server drives none of their runs) and subagent rows
|
|
958
|
+
* (their work is driven through the parent Session's entry). Reading real activity for
|
|
959
|
+
* those would mean consulting the Trace tree, which this field deliberately does not do.
|
|
960
|
+
*
|
|
961
|
+
* Rows that predate the field are backfilled once at startup from the Session's most
|
|
962
|
+
* recent request timestamp, falling back to createdAt.
|
|
963
|
+
*/
|
|
964
|
+
lastActiveAt: string;
|
|
653
965
|
status: SessionStatus;
|
|
654
966
|
/** Number of approvals awaiting human decision (a persisted count outside server events, for list badges). */
|
|
655
967
|
pendingApprovalCount: number;
|
|
@@ -719,11 +1031,36 @@ interface SessionCreateRequest {
|
|
|
719
1031
|
interface SessionCreateResponse {
|
|
720
1032
|
session: SessionInfo;
|
|
721
1033
|
}
|
|
1034
|
+
/** Immutable location of one record in a Session's append-only Trace. */
|
|
1035
|
+
interface TracePosition {
|
|
1036
|
+
/** Trace shard index (`001` on disk becomes `1`). */
|
|
1037
|
+
fileIndex: number;
|
|
1038
|
+
/** Zero-based record ordinal within the parsed shard. */
|
|
1039
|
+
ordinal: number;
|
|
1040
|
+
}
|
|
1041
|
+
/** History-only transport metadata; `tracePosition` is never persisted into Trace JSONL. */
|
|
1042
|
+
type HistoryMessage = OmniMessage & {
|
|
1043
|
+
tracePosition?: TracePosition;
|
|
1044
|
+
};
|
|
1045
|
+
interface SessionForkRequest {
|
|
1046
|
+
/** The final root assistant text record of the completed Task to keep. */
|
|
1047
|
+
position: TracePosition;
|
|
1048
|
+
}
|
|
1049
|
+
interface SessionForkResponse {
|
|
1050
|
+
session: SessionInfo;
|
|
1051
|
+
}
|
|
722
1052
|
interface SessionResponse {
|
|
723
1053
|
session: SessionInfo;
|
|
724
1054
|
}
|
|
725
1055
|
interface SessionPatchRequest {
|
|
726
1056
|
approvalMode?: ApprovalMode;
|
|
1057
|
+
/**
|
|
1058
|
+
* Pin this Session's thinking level (`none | low | medium | high | xhigh | max`, anything else
|
|
1059
|
+
* is a 400). It applies to every later run of the Session that doesn't carry its own
|
|
1060
|
+
* level, and replaces the Agent-config fallback for this Session. There is no unpin:
|
|
1061
|
+
* the picker only offers concrete levels.
|
|
1062
|
+
*/
|
|
1063
|
+
thinkingLevel?: ThinkingLevelName;
|
|
727
1064
|
/** Archive / unarchive (default list hides archived). */
|
|
728
1065
|
archived?: boolean;
|
|
729
1066
|
/** Manual rename; non-empty string, overrides the auto-generated title. */
|
|
@@ -791,7 +1128,7 @@ interface MessagesPageInfo {
|
|
|
791
1128
|
}
|
|
792
1129
|
/** Message history: the full messages and events from concatenating all of this Session's Trace files in order (excludes partial_*). */
|
|
793
1130
|
interface MessagesResponse {
|
|
794
|
-
messages:
|
|
1131
|
+
messages: HistoryMessage[];
|
|
795
1132
|
/**
|
|
796
1133
|
* Present only while the Session is running/compacting: the in-progress stream tail
|
|
797
1134
|
* (open streaming fragments + the channel cursor they cover), so a client joining
|
|
@@ -814,17 +1151,26 @@ interface MessagesResponse {
|
|
|
814
1151
|
type TaskInputPart = {
|
|
815
1152
|
type: "text";
|
|
816
1153
|
text: string;
|
|
817
|
-
}
|
|
1154
|
+
}
|
|
1155
|
+
/**
|
|
1156
|
+
* An image that rides the conversation inline, as a base64 `data:` URL or an http(s) URL.
|
|
1157
|
+
* A data URL is capped at 20MB (413 `image_too_large`) — a fixed limit that does NOT follow
|
|
1158
|
+
* the admin-settable attachment cap, because an inline image is written into the Trace and
|
|
1159
|
+
* read back on every history page and every resume.
|
|
1160
|
+
*/
|
|
1161
|
+
| {
|
|
818
1162
|
type: "image_url";
|
|
819
1163
|
imageUrl: string;
|
|
820
1164
|
}
|
|
821
1165
|
/**
|
|
822
1166
|
* File attachment (the composer's "+" menu): `dataUrl` is a base64 `data:` URL of the
|
|
823
|
-
* file's bytes, capped
|
|
824
|
-
*
|
|
825
|
-
*
|
|
826
|
-
*
|
|
827
|
-
*
|
|
1167
|
+
* file's bytes, capped per file and per message by the admin-settable upload limits
|
|
1168
|
+
* (defaults 100MB / 120MB; 413 `file_too_large` / `payload_too_large` / `too_many_files`,
|
|
1169
|
+
* and the request as a whole still has to fit the body cap those limits derive). The
|
|
1170
|
+
* server writes it into the Session scratchpad under a sanitized name and appends an
|
|
1171
|
+
* `[attached file: <path>]` line to the message text — the bytes never enter the
|
|
1172
|
+
* conversation, the model opens the file by path. `fileName` is the original name (no path
|
|
1173
|
+
* separators, no `..`).
|
|
828
1174
|
*/
|
|
829
1175
|
| {
|
|
830
1176
|
type: "file";
|
|
@@ -835,9 +1181,10 @@ interface TaskCreateRequest {
|
|
|
835
1181
|
input: TaskInputPart[];
|
|
836
1182
|
/**
|
|
837
1183
|
* Thinking level for this Task's LLM requests (a per-turn parameter; one of
|
|
838
|
-
* `none | low | medium | high | xhigh`, anything else is a 400). Omitted = falls back to
|
|
839
|
-
* the
|
|
840
|
-
*
|
|
1184
|
+
* `none | low | medium | high | xhigh | max`, anything else is a 400). Omitted = falls back to
|
|
1185
|
+
* the Session's pinned level (`SessionInfo.thinkingLevel`) and, when that is unset too,
|
|
1186
|
+
* to the Agent config's `model.thinking_level`. A queued follow-up (`queueIfBusy`) keeps
|
|
1187
|
+
* its level and applies it when it auto-starts.
|
|
841
1188
|
*/
|
|
842
1189
|
thinkingLevel?: ThinkingLevelName;
|
|
843
1190
|
/**
|
|
@@ -912,6 +1259,8 @@ interface SteerRequest {
|
|
|
912
1259
|
* stream, and the whole list drops when the run exits (core discards undelivered steering).
|
|
913
1260
|
*/
|
|
914
1261
|
interface PendingSteeringInfo {
|
|
1262
|
+
/** Server-assigned id, stable for the entry's queued lifetime: the handle DELETE /steer/:steerId recalls it by. */
|
|
1263
|
+
id: string;
|
|
915
1264
|
/** The message text as accepted (trimmed); may be empty when images/files carry the message. */
|
|
916
1265
|
text: string;
|
|
917
1266
|
/** Number of images that rode along. */
|
|
@@ -919,6 +1268,43 @@ interface PendingSteeringInfo {
|
|
|
919
1268
|
/** Number of file attachments that rode along. */
|
|
920
1269
|
files: number;
|
|
921
1270
|
}
|
|
1271
|
+
/**
|
|
1272
|
+
* One follow-up task queued with `queueIfBusy` but not yet auto-started. Carried on
|
|
1273
|
+
* `task_state` events and the SSE subscribe snapshot (like `pendingSteering`) so the
|
|
1274
|
+
* composer can show each queued message's content with a recall affordance; entries leave
|
|
1275
|
+
* the list when they auto-start on idle — or when DELETE /follow-ups/:followUpId recalls one.
|
|
1276
|
+
*/
|
|
1277
|
+
interface PendingFollowUpInfo {
|
|
1278
|
+
/** Server-assigned id, stable for the entry's queued lifetime: the handle DELETE /follow-ups/:followUpId recalls it by. */
|
|
1279
|
+
id: string;
|
|
1280
|
+
/** The queued input's text parts, joined; may be empty when images/files carry the message. */
|
|
1281
|
+
text: string;
|
|
1282
|
+
/** Number of images in the queued input. */
|
|
1283
|
+
images: number;
|
|
1284
|
+
/** Number of file attachments in the queued input. */
|
|
1285
|
+
files: number;
|
|
1286
|
+
}
|
|
1287
|
+
/**
|
|
1288
|
+
* Response of the two recall endpoints — DELETE /api/sessions/:id/steer/:steerId and
|
|
1289
|
+
* DELETE /api/sessions/:id/follow-ups/:followUpId: the withdrawn message's original content,
|
|
1290
|
+
* for the composer to restore into the input box for editing and resending (#287). File
|
|
1291
|
+
* attachments are read back from the Session scratchpad (then deleted from it); one that
|
|
1292
|
+
* disappeared meanwhile is omitted rather than failing the recall. 409 `not_pending` when
|
|
1293
|
+
* the entry is no longer queued — steering already delivered to the model, or a follow-up
|
|
1294
|
+
* already auto-started (or unknown id either way).
|
|
1295
|
+
*/
|
|
1296
|
+
interface RecalledMessageResponse {
|
|
1297
|
+
text: string;
|
|
1298
|
+
/** The images as submitted (`data:` / http(s) URLs). */
|
|
1299
|
+
images: string[];
|
|
1300
|
+
/** The file attachments, re-encoded as base64 data URLs (the shape the composer submits them in). */
|
|
1301
|
+
files: {
|
|
1302
|
+
fileName: string;
|
|
1303
|
+
dataUrl: string;
|
|
1304
|
+
}[];
|
|
1305
|
+
/** Follow-up recall only: the per-turn thinking level the entry was queued with, when one was. */
|
|
1306
|
+
thinkingLevel?: ThinkingLevelName;
|
|
1307
|
+
}
|
|
922
1308
|
interface ApprovalDecisionRequest {
|
|
923
1309
|
decision: "allow" | "deny";
|
|
924
1310
|
}
|
|
@@ -944,6 +1330,8 @@ interface SessionProcessInfo {
|
|
|
944
1330
|
cwd: string;
|
|
945
1331
|
startedAt: string;
|
|
946
1332
|
running: boolean;
|
|
1333
|
+
/** The service the process serves, when detected: the last local URL its output printed, else an origin probed from its listening ports. */
|
|
1334
|
+
serviceUrl?: string;
|
|
947
1335
|
}
|
|
948
1336
|
interface SessionProcessesResponse {
|
|
949
1337
|
processes: SessionProcessInfo[];
|
|
@@ -966,6 +1354,8 @@ type ServerEvent =
|
|
|
966
1354
|
queued?: number;
|
|
967
1355
|
/** Steering messages queued but not yet delivered (absent = none): lets the composer's hint and its content survive reloads. */
|
|
968
1356
|
pendingSteering?: PendingSteeringInfo[];
|
|
1357
|
+
/** Queued follow-up tasks awaiting auto-start (absent = none): per-entry content + recall handle, alongside the `queued` count. */
|
|
1358
|
+
pendingFollowUps?: PendingFollowUpInfo[];
|
|
969
1359
|
}
|
|
970
1360
|
/** The model-generated title after the first turn has been persisted (for in-place list updates). */
|
|
971
1361
|
| {
|
|
@@ -973,6 +1363,32 @@ type ServerEvent =
|
|
|
973
1363
|
sessionId: string;
|
|
974
1364
|
title: string;
|
|
975
1365
|
}
|
|
1366
|
+
/**
|
|
1367
|
+
* The user-channel counterpart of `task_state`: the same run-state flip, named by
|
|
1368
|
+
* `sessionId`, delivered on GET /api/events.
|
|
1369
|
+
*
|
|
1370
|
+
* `task_state` is session-scoped and deliberately carries no id, so it only ever reaches the
|
|
1371
|
+
* one conversation a tab has subscribed to — every OTHER row in that tab's Session list would
|
|
1372
|
+
* otherwise keep whatever status its last list fetch returned. This event exists so the list
|
|
1373
|
+
* can stay live without polling; the per-Session contract is unchanged.
|
|
1374
|
+
*
|
|
1375
|
+
* `lastActiveAt` and `hasTrace` are the row's own fields as they stand after the flip, both
|
|
1376
|
+
* written just before publishing (`markDriven` at run start sets has_trace and stamps
|
|
1377
|
+
* last_active_at; `touchLastActive` stamps again at run end). They are what let a list act on
|
|
1378
|
+
* the flip without refetching: the stamp separates "this finished while I was looking
|
|
1379
|
+
* elsewhere" from "this finished before I last looked", and `hasTrace` separates a Session
|
|
1380
|
+
* that has now run from one that never has — a first run would otherwise settle back into the
|
|
1381
|
+
* blank "never ran" row the client still believes in.
|
|
1382
|
+
*
|
|
1383
|
+
* Published only to the user channels of the Project's owner and members.
|
|
1384
|
+
*/
|
|
1385
|
+
| {
|
|
1386
|
+
type: "session_state";
|
|
1387
|
+
sessionId: string;
|
|
1388
|
+
state: SessionStatus;
|
|
1389
|
+
lastActiveAt: string;
|
|
1390
|
+
hasTrace: boolean;
|
|
1391
|
+
}
|
|
976
1392
|
/** Last-Event-ID has been evicted from the buffer: the frontend should re-fetch the history endpoint before continuing to consume this connection. */
|
|
977
1393
|
| {
|
|
978
1394
|
type: "resync_required";
|
|
@@ -991,6 +1407,11 @@ type ServerEvent =
|
|
|
991
1407
|
| {
|
|
992
1408
|
type: "hello";
|
|
993
1409
|
}
|
|
1410
|
+
/** The served web assets were hot-swapped by a platform upgrade: clients reload to pick them up. */
|
|
1411
|
+
| {
|
|
1412
|
+
type: "web_updated";
|
|
1413
|
+
rev: string;
|
|
1414
|
+
}
|
|
994
1415
|
/** New session registered (pushed over the parent session's channel for subagent sessions): frontend refreshes the list in place. */
|
|
995
1416
|
| {
|
|
996
1417
|
type: "session_created";
|
|
@@ -1093,12 +1514,22 @@ interface TraceTaskStats {
|
|
|
1093
1514
|
taskIndex: number;
|
|
1094
1515
|
/**
|
|
1095
1516
|
* This turn is a **compaction turn** (compaction forms its own turn); the UI marks it with
|
|
1096
|
-
* a
|
|
1517
|
+
* a badge accordingly. It's treated the same as a user turn: it has Token /
|
|
1097
1518
|
* cost / duration / TPS, and **counts normally toward global stats** — the global totals are
|
|
1098
1519
|
* just the sum of the per-turn cards below, the two scopes match, so adding up the per-turn
|
|
1099
1520
|
* numbers must equal the total.
|
|
1100
1521
|
*/
|
|
1101
1522
|
compaction?: boolean;
|
|
1523
|
+
/**
|
|
1524
|
+
* Which kind of compaction turn it is, from the turn's `compaction_begin`. Additive beside
|
|
1525
|
+
* the flag rather than folded into it: `compaction` stays the sole gate on "is this a
|
|
1526
|
+
* compaction turn", so a client that only knows the boolean keeps working unchanged, and one
|
|
1527
|
+
* that reads this can name the turn for what it did — the two modes are different operations,
|
|
1528
|
+
* and only `summarize` actually compacts anything (`discard` drops the old context outright).
|
|
1529
|
+
* Absent on a turn analyzed before this field existed, or whose `compaction_begin` carried no
|
|
1530
|
+
* mode; treat an absent value as `summarize`, which is what the badge said before the split.
|
|
1531
|
+
*/
|
|
1532
|
+
compactionMode?: CompactionMode;
|
|
1102
1533
|
/**
|
|
1103
1534
|
* This turn's message index range within the **entire file** (inclusive). A single
|
|
1104
1535
|
* sequential scan on the server tells which turn each message belongs to; the frontend
|
|
@@ -1358,35 +1789,47 @@ interface UsageGroupRow {
|
|
|
1358
1789
|
cost: number | null;
|
|
1359
1790
|
hasUncosted: boolean;
|
|
1360
1791
|
}
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1792
|
+
/** Time-series precision for the usage series (`granularity` query parameter). `minute` requires the `fromTs`/`toTs` window bounds. */
|
|
1793
|
+
type UsageGranularity = "minute" | "hour" | "day" | "week" | "month";
|
|
1794
|
+
/**
|
|
1795
|
+
* One bucket of the usage time series (for the cost center's time-series charts).
|
|
1796
|
+
* Buckets are zero-filled across the whole requested range, so consecutive points
|
|
1797
|
+
* are always adjacent in time. Bucket keys by granularity: minute
|
|
1798
|
+
* `yyyy-mm-ddThh:mm` and hour `yyyy-mm-ddThh:00` (server-local clock), day
|
|
1799
|
+
* `yyyy-mm-dd`, week the ISO week's Monday `yyyy-mm-dd`, month `yyyy-mm`.
|
|
1800
|
+
*/
|
|
1801
|
+
interface UsageSeriesPoint {
|
|
1802
|
+
bucket: string;
|
|
1366
1803
|
cacheRead: number;
|
|
1367
1804
|
cacheWrite: number;
|
|
1368
1805
|
output: number;
|
|
1806
|
+
total: number;
|
|
1807
|
+
/** Cost converted at query time (USD); null when no priced Model contributed. */
|
|
1808
|
+
cost: number | null;
|
|
1809
|
+
requests: number;
|
|
1810
|
+
/** Successful requests in the bucket. */
|
|
1811
|
+
completed: number;
|
|
1812
|
+
/** Success-rate denominator: all requests minus aborted (a user interruption is not a model failure). */
|
|
1813
|
+
denominator: number;
|
|
1369
1814
|
}
|
|
1370
|
-
/**
|
|
1371
|
-
|
|
1815
|
+
/**
|
|
1816
|
+
* One entity's per-bucket request and success counts, aligned index-for-index
|
|
1817
|
+
* with `series` (the requests-and-success-rate chart draws one such entity —
|
|
1818
|
+
* or stacks them all). `denominator` excludes aborted, same as elsewhere.
|
|
1819
|
+
*/
|
|
1820
|
+
interface UsageEntitySeriesCounts {
|
|
1821
|
+
requests: number[];
|
|
1822
|
+
completed: number[];
|
|
1823
|
+
denominator: number[];
|
|
1824
|
+
}
|
|
1825
|
+
/** Per-Agent counts per bucket. */
|
|
1826
|
+
interface UsageAgentSeries extends UsageEntitySeriesCounts {
|
|
1372
1827
|
agentId: string;
|
|
1373
|
-
requests: number;
|
|
1374
|
-
total: number;
|
|
1375
1828
|
}
|
|
1376
|
-
/**
|
|
1377
|
-
interface
|
|
1829
|
+
/** Per-Model counts per bucket (entity identity is the (provider, modelId) pair). */
|
|
1830
|
+
interface UsageModelSeries extends UsageEntitySeriesCounts {
|
|
1378
1831
|
provider: string;
|
|
1379
1832
|
modelId: string;
|
|
1380
|
-
/** Number of successful requests. */
|
|
1381
|
-
completed: number;
|
|
1382
|
-
/** Success rate denominator = all requests − aborted (user-initiated interruption isn't a model failure and shouldn't lower the success rate). */
|
|
1383
|
-
total: number;
|
|
1384
|
-
/** Count of user interruptions (excluded from success rate, shown separately). */
|
|
1385
|
-
aborted: number;
|
|
1386
|
-
/** Failure breakdown (shown on hover; unknown statuses count toward total but not these three). */
|
|
1387
|
-
failed: number;
|
|
1388
|
-
timeout: number;
|
|
1389
|
-
malformed: number;
|
|
1390
1833
|
}
|
|
1391
1834
|
/** Occurrence count of an error for a given source · code (the "most common" metric in the stats center's error panel). */
|
|
1392
1835
|
interface UsageErrorCount {
|
|
@@ -1439,12 +1882,27 @@ interface UsageResponse {
|
|
|
1439
1882
|
};
|
|
1440
1883
|
groupBy: UsageGroupBy;
|
|
1441
1884
|
groups: UsageGroupRow[];
|
|
1442
|
-
/**
|
|
1443
|
-
|
|
1444
|
-
/**
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1885
|
+
/** Effective precision of `series` (the validated `granularity` query parameter; defaults to day). */
|
|
1886
|
+
granularity: UsageGranularity;
|
|
1887
|
+
/**
|
|
1888
|
+
* Usage time series over the requested from/to range (defaulting to the last 30
|
|
1889
|
+
* days), zero-filled at `granularity`; affected by agent/model filters. Carries
|
|
1890
|
+
* everything the time-series charts draw: Token buckets, cost, request count,
|
|
1891
|
+
* and per-bucket success counts.
|
|
1892
|
+
*/
|
|
1893
|
+
series: UsageSeriesPoint[];
|
|
1894
|
+
/**
|
|
1895
|
+
* Per-Agent counts per bucket, aligned index-for-index with `series`, sorted
|
|
1896
|
+
* by total requests descending. Unaffected by the agent filter — the by-Agent
|
|
1897
|
+
* chart draws the whole breakdown — but affected by date/model filters.
|
|
1898
|
+
*/
|
|
1899
|
+
byAgentSeries: UsageAgentSeries[];
|
|
1900
|
+
/**
|
|
1901
|
+
* Per-Model counts per bucket, aligned index-for-index with `series`, sorted
|
|
1902
|
+
* by total requests descending. Unaffected by the model filter — the by-Model
|
|
1903
|
+
* chart draws the whole breakdown — but affected by date/agent filters.
|
|
1904
|
+
*/
|
|
1905
|
+
byModelSeries: UsageModelSeries[];
|
|
1448
1906
|
/** Server-side error capture stats (affected by date/agent filters; unaffected by model filter). */
|
|
1449
1907
|
errors: UsageErrors;
|
|
1450
1908
|
/** List of Agent ids that have appeared in this Project (for the filter dropdown; unaffected by current filters). */
|
|
@@ -1663,6 +2121,51 @@ interface UpdateCheckResponse {
|
|
|
1663
2121
|
/** Why the lookup failed: unreachable network / GitHub rate limit / unusable response. */
|
|
1664
2122
|
error?: "network" | "rate_limited" | "bad_response";
|
|
1665
2123
|
}
|
|
2124
|
+
/**
|
|
2125
|
+
* The desktop shell's updater snapshot, pushed to the embedded server over the
|
|
2126
|
+
* utilityProcess message channel and served at GET /api/desktop/update. `state` is the
|
|
2127
|
+
* discriminator; the optional fields belong to the states named on them.
|
|
2128
|
+
*
|
|
2129
|
+
* A `downloaded` build stays the reported state until it is installed: a later periodic
|
|
2130
|
+
* check (or its failure) must not hide the actionable "restart to install" step.
|
|
2131
|
+
*/
|
|
2132
|
+
interface DesktopUpdateStatus {
|
|
2133
|
+
/** Installed shell version (Electron app.getVersion()). */
|
|
2134
|
+
appVersion: string;
|
|
2135
|
+
/**
|
|
2136
|
+
* Bumped by the shell on every updater event it folds, whether or not the visible
|
|
2137
|
+
* state changed. A row-initiated check settles when the seq has moved past its
|
|
2138
|
+
* at-click value and the state is no longer `checking` — snapshot equality can't
|
|
2139
|
+
* carry that signal (a check that ends where it started is byte-identical).
|
|
2140
|
+
*/
|
|
2141
|
+
seq?: number;
|
|
2142
|
+
state: "idle" | "checking" | "up-to-date" | "downloading" | "downloaded" | "error" | "unsupported";
|
|
2143
|
+
/** Newer release being fetched / ready to install (`downloading`, `downloaded`). */
|
|
2144
|
+
version?: string;
|
|
2145
|
+
/** Download progress 0–100 (`downloading`). */
|
|
2146
|
+
percent?: number;
|
|
2147
|
+
/** Updater failure text (`error`). */
|
|
2148
|
+
message?: string;
|
|
2149
|
+
/** Why this install form cannot update itself (`unsupported`): dev run, or a Linux install that is not an AppImage (e.g. .deb — the system package manager owns it). */
|
|
2150
|
+
reason?: "dev" | "linux-not-appimage";
|
|
2151
|
+
}
|
|
2152
|
+
/**
|
|
2153
|
+
* GET /api/desktop/update (desktop-shell sessions only): the latest shell snapshot.
|
|
2154
|
+
* `status` is null until the shell's first push lands (a beat after server start).
|
|
2155
|
+
*/
|
|
2156
|
+
interface DesktopUpdateStatusResponse {
|
|
2157
|
+
status: DesktopUpdateStatus | null;
|
|
2158
|
+
}
|
|
2159
|
+
/** Shell → server push over the utilityProcess message channel. */
|
|
2160
|
+
interface DesktopUpdaterStatusMessage {
|
|
2161
|
+
type: "desktop-updater-status";
|
|
2162
|
+
status: DesktopUpdateStatus;
|
|
2163
|
+
}
|
|
2164
|
+
/** Server → shell command over the utilityProcess message channel (relayed from POST /api/desktop/update/check|install). */
|
|
2165
|
+
interface DesktopUpdaterCommandMessage {
|
|
2166
|
+
type: "desktop-updater-command";
|
|
2167
|
+
action: "check" | "install";
|
|
2168
|
+
}
|
|
1666
2169
|
/**
|
|
1667
2170
|
* POST /api/version/update (admin only): runs the CLI self-update (`penguin update --yes`)
|
|
1668
2171
|
* on the server host. `unsupported` covers both a server not launched via the CLI and the
|
|
@@ -1678,4 +2181,4 @@ interface UpdateRunResponse {
|
|
|
1678
2181
|
needsRestart: boolean;
|
|
1679
2182
|
}
|
|
1680
2183
|
|
|
1681
|
-
export type { AdminPasswordResetRequest, AdminUserCreateRequest, AdminUserCreateResponse, AdminUsersResponse, AgentCompactionConfigDto, AgentConfigDto, AgentConfigResponse, AgentConfigUpdateRequest, AgentCreateRequest, AgentCreateResponse, AgentImportRequest, AgentImportResponse, AgentKernelUpdateResponse, AgentMemoryConfigDto, AgentModelConfigDto, AgentSchedulesConfigDto, AgentSkillsConfigDto, AgentSkillsResponse, AgentSummary, AgentTraceDateGroup, AgentTraceFileRef, AgentTraceSessionEntry, AgentTraceSessionFile, AgentTraceSessionGroup, AgentTracesResponse, AgentVaultConfigDto, AgentsResponse, ApprovalDecisionRequest, ApprovalMode, AuthLoginRequest, AuthResponse, BenchmarkCaseScore, BenchmarkCaseSummary, BenchmarkCasesResponse, BenchmarkEvaluation, BenchmarkRunScore, BenchmarkSummary, BenchmarksResponse, CaseMaterial, ChatDefaultsDto, CredentialInfo, DefaultModelResponse, DefaultModelUpdateRequest, DirEntryInfo, DirListResponse, ErrorBody, FilesStatRequest, FilesStatResponse, GoalResponse, GoalServerEvent, GoalStateView, McpServerTestResponse, MeResponse, MemberAddRequest, MemberAddResponse, MemberInfo, MembersResponse, MemoryFileInfo, MemoryFileResponse, MemoryFilesResponse, MemoryOverviewResponse, MemoryScopeInfo, MessagesLiveTail, MessagesPageInfo, MessagesResponse, ModelInfo, ModelPricingDto, ModelRefDto, ModelTestRequest, ModelTestResponse, ModelUpdateEntry, ModelsResponse, ModelsUpdateRequest, PasswordChangeRequest, PendingSteeringInfo, PrefsResponse, ProjectCreateRequest, ProjectCreateResponse, ProjectRole, ProjectSummary, ProjectUpdateRequest, ProjectUpdateResponse, ProjectsResponse, RequestSpan, RetryNowResponse, ScheduleItem, ScheduleServerEvent, ScheduleStatus, ScheduleUpsertRequest, SchedulesResponse, ServerEvent, ServerSettings, ServerSettingsResponse, ServerSettingsUpdateRequest, SessionCategory, SessionCategoryCounts, SessionCreateRequest, SessionCreateResponse, SessionInfo, SessionPatchRequest, SessionProcessInfo, SessionProcessesResponse, SessionResponse, SessionSource, SessionStatus, SessionTracesResponse, SessionsResponse, SkillArchiveInstallRequest, SkillGroupItem, SkillInstallRequest, SkillLibraryResponse, SkillMetadataItem, SteerRequest, TaskCreateRequest, TaskCreateResponse, TaskInputPart, ToolCallSpan, TraceAnalysisResponse, TraceEventsResponse, TraceFileInfo, TraceImportRequest, TraceImportResponse, TraceModelSegment, TraceOtherSpan, TraceTaskStats, TraceToolSpan, UiPrefs, UpdateCheckResponse, UpdateRunResponse,
|
|
2184
|
+
export type { AdminPasswordResetRequest, AdminUserCreateRequest, AdminUserCreateResponse, AdminUsersResponse, AgentCompactionConfigDto, AgentConfigDto, AgentConfigResponse, AgentConfigUpdateRequest, AgentCreateRequest, AgentCreateResponse, AgentImportRequest, AgentImportResponse, AgentKernelUpdateResponse, AgentMemoryConfigDto, AgentModelConfigDto, AgentSchedulesConfigDto, AgentSkillsConfigDto, AgentSkillsResponse, AgentSummary, AgentTraceDateGroup, AgentTraceFileRef, AgentTraceSessionEntry, AgentTraceSessionFile, AgentTraceSessionGroup, AgentTracesResponse, AgentVaultConfigDto, AgentsResponse, ApprovalDecisionRequest, ApprovalMode, AuthLoginRequest, AuthResponse, BenchmarkCaseScore, BenchmarkCaseSummary, BenchmarkCasesResponse, BenchmarkEvaluation, BenchmarkRunScore, BenchmarkSummary, BenchmarksResponse, CaseMaterial, ChatDefaultsDto, CommandPolicyDto, CommandPolicyRuleDto, CredentialInfo, DefaultModelResponse, DefaultModelUpdateRequest, DesktopUpdateStatus, DesktopUpdateStatusResponse, DesktopUpdaterCommandMessage, DesktopUpdaterStatusMessage, DirEntryInfo, DirListResponse, DraftShortcut, EndpointModelListRequest, EndpointModelListResponse, ErrorBody, FilesStatRequest, FilesStatResponse, GoalResponse, GoalServerEvent, GoalStateView, HistoryMessage, McpServerTestResponse, MeResponse, MemberAddRequest, MemberAddResponse, MemberInfo, MembersResponse, MemoryFileInfo, MemoryFileResponse, MemoryFilesResponse, MemoryImportMode, MemoryImportRequest, MemoryImportResponse, MemoryOverviewResponse, MemoryScopeExport, MemoryScopeInfo, MemoryTransferFile, MessagesLiveTail, MessagesPageInfo, MessagesResponse, ModelInfo, ModelPricingDto, ModelProtocolDetectRequest, ModelProtocolDetectResponse, ModelProtocolProbeDto, ModelRefDto, ModelTestRequest, ModelTestResponse, ModelUpdateEntry, ModelVisionDetectRequest, ModelVisionDetectResponse, ModelVisionOutcome, ModelsResponse, ModelsUpdateRequest, PasswordChangeRequest, PendingFollowUpInfo, PendingSteeringInfo, PrefsResponse, ProjectCreateRequest, ProjectCreateResponse, ProjectRole, ProjectSummary, ProjectUpdateRequest, ProjectUpdateResponse, ProjectsResponse, ProtocolProbeOutcome, RecalledMessageResponse, RequestSpan, RetryNowResponse, ScheduleItem, ScheduleServerEvent, ScheduleStatus, ScheduleUpsertRequest, SchedulesResponse, ServerEvent, ServerSettings, ServerSettingsResponse, ServerSettingsUpdateRequest, SessionCategory, SessionCategoryCounts, SessionCreateRequest, SessionCreateResponse, SessionForkRequest, SessionForkResponse, SessionInfo, SessionPatchRequest, SessionProcessInfo, SessionProcessesResponse, SessionResponse, SessionSource, SessionStatus, SessionTracesResponse, SessionsResponse, SkillArchiveInstallRequest, SkillGroupItem, SkillInstallRequest, SkillLibraryResponse, SkillMetadataItem, SteerRequest, TaskCreateRequest, TaskCreateResponse, TaskInputPart, ToolCallSpan, TraceAnalysisResponse, TraceEventsResponse, TraceFileInfo, TraceImportRequest, TraceImportResponse, TraceModelSegment, TraceOtherSpan, TracePosition, TraceTaskStats, TraceToolSpan, UiPrefs, UpdateCheckResponse, UpdateRunResponse, UploadLimits, UsageAgentSeries, UsageBucket, UsageEntitySeriesCounts, UsageErrorCount, UsageErrorItem, UsageErrors, UsageErrorsPage, UsageGranularity, UsageGroupBy, UsageGroupRow, UsageModelSeries, UsageResponse, UsageSeriesPoint, UsageTrendPointInTrace, UserInfo, VaultEntryInfo, VaultEntryUpdate, VaultResponse, VaultUpdateRequest, VersionResponse, WorkspaceFileEntry, WorkspaceFilesResponse };
|