openmausbot 0.1.98 → 0.1.99
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/dist/assets/{ActivityPanel-H6D3SD39.js → ActivityPanel-CgUgtumZ.js} +1 -1
- package/dist/assets/BotSettingsDialog-lJj6oiir.js +7 -0
- package/dist/assets/{CloudBackendPicker-iezpJFpF.js → CloudBackendPicker-C5-_arUz.js} +1 -1
- package/dist/assets/{ComputerPanel-DZPj-IWu.js → ComputerPanel-euJ2CSlH.js} +1 -1
- package/dist/assets/{DesktopViewer-utONms1p.js → DesktopViewer-XCln1Pn_.js} +1 -1
- package/dist/assets/InspectorPanel-DKYyQZlo.js +5 -0
- package/dist/assets/{KeyboardShortcutsModal-gk9mvHj_.js → KeyboardShortcutsModal-DkkZWZRI.js} +1 -1
- package/dist/assets/{LocalVmWorkspace-DLIvd2kC.js → LocalVmWorkspace-Cwt3_XSx.js} +1 -1
- package/dist/assets/{MacLocalControl-bJv8yiPB.js → MacLocalControl-B28RbdCS.js} +1 -1
- package/dist/assets/NewBotDialog-dMWDs5xm.js +2 -0
- package/dist/assets/RemoteAgentSettingsPanel-B5KWXnqH.js +1 -0
- package/dist/assets/RoutinesPage-DOosRYDK.js +1 -0
- package/dist/assets/{RoutinesSection-Dny9ra-c.js → RoutinesSection-uOfOTfkB.js} +1 -1
- package/dist/assets/{SettingsModal-gC6XJJmt.js → SettingsModal-BTGkFbj1.js} +3 -3
- package/dist/assets/{TeamMapPage-B6fuu4r_.js → TeamMapPage-DqNdJn96.js} +1 -1
- package/dist/assets/{TriggersPanel-j0qTP2CO.js → TriggersPanel-c6xkG9mi.js} +1 -1
- package/dist/assets/{VisibilitySection-DT0FqPvu.js → VisibilitySection-DD4ffIR5.js} +1 -1
- package/dist/assets/WebhooksPanel-Cz17K-_O.js +3 -0
- package/dist/assets/{abnfDiagram-O67JEVCF-BsjcFX0-.js → abnfDiagram-O67JEVCF-CX6tDpkg.js} +1 -1
- package/dist/assets/{activity-BxOkayvD.js → activity-BAVWO0Zj.js} +1 -1
- package/dist/assets/{arc-CJNA94c6.js → arc-h45-9NFk.js} +1 -1
- package/dist/assets/{architectureDiagram-NJMV4G6O-dz2ud7lP.js → architectureDiagram-NJMV4G6O-CgLFXbg6.js} +1 -1
- package/dist/assets/{blockDiagram-BEXU5L5S-ChBEALoR.js → blockDiagram-BEXU5L5S-DGDFFc9M.js} +1 -1
- package/dist/assets/{brain-CFZ7PEXc.js → brain-CeCdoTb2.js} +1 -1
- package/dist/assets/{c4Diagram-YGBWAQC7-KZNRKDQe.js → c4Diagram-YGBWAQC7-B9aklAUj.js} +1 -1
- package/dist/assets/channel-TsOXCiPg.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-BLLwmCET.js → chunk-2Q5K7J3B-BC0KmWsM.js} +1 -1
- package/dist/assets/{chunk-3FUC2YCW-CQxyreBZ.js → chunk-3FUC2YCW-BbDFHsJ1.js} +2 -2
- package/dist/assets/{chunk-5VM5RSS4-D6sFMW0u.js → chunk-5VM5RSS4-DtGbsjOM.js} +1 -1
- package/dist/assets/{chunk-GTNCS2PH-BaZ1YgLF.js → chunk-GTNCS2PH-VMghMcEl.js} +1 -1
- package/dist/assets/{chunk-GWA4HPMP-CcalphmC.js → chunk-GWA4HPMP-BP_JyGWQ.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-CSk8R3ve.js → chunk-JWPE2WC7-CYFyzgAU.js} +1 -1
- package/dist/assets/{chunk-NETBCI7D-CTmLjA57.js → chunk-NETBCI7D-DBNa_kqm.js} +1 -1
- package/dist/assets/{chunk-WEXAMYUT-CM9Z77Ne.js → chunk-WEXAMYUT-BKEeM7CJ.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-B1fxpMS2.js → chunk-XXDRQBXY-C__m3ZXl.js} +1 -1
- package/dist/assets/{classDiagram-v2-NBCMYWYE-DCCyoLpj.js → classDiagram-v2-NBCMYWYE-CBUrTSAX.js} +1 -1
- package/dist/assets/core-6lvx-ypA.js +12 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-KyImBKvE.js → cose-bilkent-JH36ORCC-GRfL-1Vb.js} +1 -1
- package/dist/assets/cpp-DddhVWhK.js +1 -0
- package/dist/assets/{cynefin-OW5HDTMX-fsZc6MGa.js → cynefin-OW5HDTMX-LopwGUjm.js} +1 -1
- package/dist/assets/{cynefinDiagram-VND7K2PF-CGmHsShB.js → cynefinDiagram-VND7K2PF-DSB8ZRNS.js} +1 -1
- package/dist/assets/{dagre-6A5THRUB-Dah1h-CH.js → dagre-6A5THRUB-DL3Kgdfk.js} +1 -1
- package/dist/assets/{diagram-22UHCM2B-BIu71OyV.js → diagram-22UHCM2B-DIxN34BM.js} +1 -1
- package/dist/assets/{diagram-3UASUU5V-gxhUB_Mu.js → diagram-3UASUU5V-CJnSvXaI.js} +1 -1
- package/dist/assets/{diagram-ATOU4E4O-CBhusUBn.js → diagram-ATOU4E4O-C-XF-lO8.js} +1 -1
- package/dist/assets/{diagram-CDSNMT55-BdPrc86x.js → diagram-CDSNMT55-Df2yZPi_.js} +1 -1
- package/dist/assets/{diagram-MLGK6HIB-Clp110R_.js → diagram-MLGK6HIB-BBs9oZFs.js} +1 -1
- package/dist/assets/{diagram-MPIPVDR6-DJKfbugw.js → diagram-MPIPVDR6-CEbK11mM.js} +1 -1
- package/dist/assets/{ebnfDiagram-ZINNZB2B-DnsltoBu.js → ebnfDiagram-ZINNZB2B-BNq6Yv3C.js} +1 -1
- package/dist/assets/{elk-276RUBZZ-jWdq6gqH.js → elk-276RUBZZ-CFbQ2bGm.js} +1 -1
- package/dist/assets/engine-javascript-D5Xfc425.js +141 -0
- package/dist/assets/{erDiagram-OPXOYQCR-DArPVf8u.js → erDiagram-OPXOYQCR-Bz8vmjN4.js} +1 -1
- package/dist/assets/{flowDiagram-KWPJA3E3-D2HZ-2f7.js → flowDiagram-KWPJA3E3-cQUfEYrx.js} +1 -1
- package/dist/assets/{ganttDiagram-FUAMR5RP--o0KIxEo.js → ganttDiagram-FUAMR5RP-BY8n9tbI.js} +1 -1
- package/dist/assets/{gitGraphDiagram-X574FWY7-CsoXr2D7.js → gitGraphDiagram-X574FWY7-KduSOMDN.js} +1 -1
- package/dist/assets/{image-plus-BbVjGHin.js → image-plus-DNIWU160.js} +1 -1
- package/dist/assets/{index-C3NqfdVU.js → index-C8xb62XS.js} +205 -205
- package/dist/assets/{index-BrPW5HDO.css → index-DbN_Hfjs.css} +1 -1
- package/dist/assets/{infoDiagram-VRGFBTTK-g-6lNp7r.js → infoDiagram-VRGFBTTK-xBKgUkpL.js} +1 -1
- package/dist/assets/{ishikawaDiagram-OU5B5YK6-B1d6qVTV.js → ishikawaDiagram-OU5B5YK6-_ei09tAJ.js} +1 -1
- package/dist/assets/{journeyDiagram-ZHPQQLJL-BTPuiU6T.js → journeyDiagram-ZHPQQLJL-Fp49MkSp.js} +1 -1
- package/dist/assets/{kanban-definition-PNTS6WVX-bDDuRJvP.js → kanban-definition-PNTS6WVX-CY9lLm7V.js} +1 -1
- package/dist/assets/{linear-BVVKbEMy.js → linear-D2ai4eM2.js} +1 -1
- package/dist/assets/{mermaid.core-JJdoKyKB.js → mermaid.core-DP6qPqu1.js} +5 -5
- package/dist/assets/{mindmap-definition-NLK3R4M7-B4aE3T0q.js → mindmap-definition-NLK3R4M7-g1ynEw_d.js} +1 -1
- package/dist/assets/{page-visible-BBo_Zm8g.js → page-visible-BZn8304W.js} +1 -1
- package/dist/assets/{pegDiagram-GJSIUBJH-DFKQWpR7.js → pegDiagram-GJSIUBJH-Bt4ObsZj.js} +1 -1
- package/dist/assets/{pieDiagram-5QR66LMP-Iv7OKVJi.js → pieDiagram-5QR66LMP-CeLld8bY.js} +1 -1
- package/dist/assets/{quadrantDiagram-O4NWA36T-U2YnfwBk.js → quadrantDiagram-O4NWA36T-D4WWZw3x.js} +1 -1
- package/dist/assets/{railroadDiagram-XR7U4H2S-CuPy6RqM.js → railroadDiagram-XR7U4H2S-D95P5NqU.js} +1 -1
- package/dist/assets/{remote-desktop-panel-BNEj7tUx.js → remote-desktop-panel-DOIMmT4T.js} +1 -1
- package/dist/assets/{requirementDiagram-PLB6GJNP-bMI5AK7T.js → requirementDiagram-PLB6GJNP-D12p3RhR.js} +1 -1
- package/dist/assets/ruby-Ct1eTYOr.js +1 -0
- package/dist/assets/{sankeyDiagram-IPEJSGJF-BKcFE2WQ.js → sankeyDiagram-IPEJSGJF-Co26Dwcs.js} +1 -1
- package/dist/assets/{sequenceDiagram-PO4LG4MO-Bn9q88kl.js → sequenceDiagram-PO4LG4MO-y5YxaDKt.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-Cvmdq9HD.js → sizeCapture-INFHLROL-D49hZ8U5.js} +1 -1
- package/dist/assets/{stateDiagram-v2-GCMORJYK-JJQYw3eQ.js → stateDiagram-v2-GCMORJYK-C0sylr-r.js} +1 -1
- package/dist/assets/{swimlanes-2SLR337P-BkSCBEwp.js → swimlanes-2SLR337P-DmRWsDIs.js} +1 -1
- package/dist/assets/swimlanesDiagram-TC7HE7FX-DzhbBHtd.js +8 -0
- package/dist/assets/{timeline-definition-EJHVYXUP-DsaM4GHr.js → timeline-definition-EJHVYXUP-DVmHYs3w.js} +1 -1
- package/dist/assets/{usecaseDiagram-POWQR4AR-3FOwLq7B.js → usecaseDiagram-POWQR4AR-BQ1q0VV6.js} +1 -1
- package/dist/assets/{user-DcZBnAuv.js → user-B9lohN4n.js} +1 -1
- package/dist/assets/{vennDiagram-UO4OBE2U-DyNjJsKt.js → vennDiagram-UO4OBE2U-C_cnfST0.js} +1 -1
- package/dist/assets/{wardleyDiagram-VNRHLVJA-Y4ZMcnBC.js → wardleyDiagram-VNRHLVJA-Bb3BSu12.js} +1 -1
- package/dist/assets/{xychartDiagram-PMCCYNJV-BXZpg955.js → xychartDiagram-PMCCYNJV-CcwEuuEi.js} +1 -1
- package/dist/index.html +2 -2
- package/dist-server/drivers/agents-proxy.js +10 -9
- package/dist-server/index.js +1474 -807
- package/dist-server/openmausbot.js +248 -152
- package/dist-server/pair-cli.js +248 -152
- package/dist-server/server/activity.js +2 -0
- package/dist-server/server/checkpoints.js +55 -39
- package/dist-server/server/direct-apply.js +20 -0
- package/dist-server/server/drivers/agents-call.js +1 -1
- package/dist-server/server/drivers/agents-catalog.js +11 -8
- package/dist-server/server/drivers/codex.js +147 -24
- package/dist-server/server/drivers/device-auth.js +5 -4
- package/dist-server/server/drivers/openai-chat.js +5 -4
- package/dist-server/server/harness/registry.js +63 -45
- package/dist-server/server/index.js +203 -23
- package/dist-server/server/mcp-oauth.js +125 -47
- package/dist-server/server/message-file.js +95 -3
- package/dist-server/server/model-requests.js +55 -4
- package/dist-server/server/profile-requests.js +80 -4
- package/dist-server/server/request-auth.js +1 -0
- package/dist-server/server/routes/undo.js +17 -0
- package/dist-server/server/routine-requests.js +210 -6
- package/dist-server/server/setup-mode.js +1 -1
- package/dist-server/server/skill-learn.js +2 -2
- package/dist-server/server/skills.js +30 -0
- package/dist-server/server/system-prompt.js +1 -1
- package/dist-server/server/turn-continuation.js +13 -18
- package/dist-server/server/workspace-backup.js +6 -1
- package/dist-server/workspace-backup.worker.js +1 -1
- package/package.json +1 -1
- package/skills/create-verification-skill/SKILL.md +9 -8
- package/skills/create-verification-skill/manifest.json +1 -1
- package/dist/assets/BotSettingsDialog-Dqz_AiBZ.js +0 -7
- package/dist/assets/InspectorPanel-OVaBVrzC.js +0 -5
- package/dist/assets/NewBotDialog-1qGOAdUM.js +0 -2
- package/dist/assets/RemoteAgentSettingsPanel-DqKr0HkO.js +0 -1
- package/dist/assets/RoutinesPage-BM2D4qGi.js +0 -1
- package/dist/assets/WebhooksPanel--YQyCjKO.js +0 -3
- package/dist/assets/abap-BdImnpbu.js +0 -1
- package/dist/assets/actionscript-3-B3316cI-.js +0 -1
- package/dist/assets/ada-bCR0ucgS.js +0 -1
- package/dist/assets/ahk-CsyLZFj1.js +0 -1
- package/dist/assets/ahk2-8Zs4aa1G.js +0 -1
- package/dist/assets/andromeeda-C4gqWexZ.js +0 -1
- package/dist/assets/angular-html-DA-rfuFy.js +0 -1
- package/dist/assets/angular-ts-BrjP3tb8.js +0 -1
- package/dist/assets/apache-Pmp26Uib.js +0 -1
- package/dist/assets/apex-DhZFqWV2.js +0 -1
- package/dist/assets/apl-CORt7UWP.js +0 -1
- package/dist/assets/applescript-Co6uUVPk.js +0 -1
- package/dist/assets/ara-BRHolxvo.js +0 -1
- package/dist/assets/asciidoc-CSVQ5wI8.js +0 -1
- package/dist/assets/asm-D_Q5rh1f.js +0 -1
- package/dist/assets/astro-HNnZUWAn.js +0 -1
- package/dist/assets/aurora-x-D-2ljcwZ.js +0 -1
- package/dist/assets/awk-DMzUqQB5.js +0 -1
- package/dist/assets/ayu-dark-DYE7WIF3.js +0 -1
- package/dist/assets/ayu-light-BA47KaF1.js +0 -1
- package/dist/assets/ayu-mirage-32ctXXKs.js +0 -1
- package/dist/assets/ballerina-BFfxhgS-.js +0 -1
- package/dist/assets/bat-CickPsom.js +0 -1
- package/dist/assets/beancount-k_qm7-4y.js +0 -1
- package/dist/assets/berry-uYugtg8r.js +0 -1
- package/dist/assets/bibtex-CHM0blh-.js +0 -1
- package/dist/assets/bicep-Bmn6On1c.js +0 -1
- package/dist/assets/bird2-Bx8U0n9b.js +0 -1
- package/dist/assets/blade-2xfisSek.js +0 -1
- package/dist/assets/bsl-DlhNcFeZ.js +0 -1
- package/dist/assets/c3-Dp5svz6Z.js +0 -1
- package/dist/assets/cadence-Bv_4Rxtq.js +0 -1
- package/dist/assets/cairo-KRGpt6FW.js +0 -1
- package/dist/assets/catppuccin-frappe-CZL1YF0i.js +0 -1
- package/dist/assets/catppuccin-latte-DH-8KZSZ.js +0 -1
- package/dist/assets/catppuccin-macchiato-B7yYVSCf.js +0 -1
- package/dist/assets/catppuccin-mocha-Ct7hS0mc.js +0 -1
- package/dist/assets/channel-WhFyujhZ.js +0 -1
- package/dist/assets/chapel-DTp_pixX.js +0 -1
- package/dist/assets/clarity-Dn5IMItf.js +0 -1
- package/dist/assets/clojure-P80f7IUj.js +0 -1
- package/dist/assets/cmake-D1j8_8rp.js +0 -1
- package/dist/assets/cobol-nBiQ_Alo.js +0 -1
- package/dist/assets/codeowners-Bp6g37R7.js +0 -1
- package/dist/assets/codeql-DsOJ9woJ.js +0 -1
- package/dist/assets/coffee-Ch7k5sss.js +0 -1
- package/dist/assets/common-lisp-Cg-RD9OK.js +0 -1
- package/dist/assets/coq-C7JzOVbR.js +0 -1
- package/dist/assets/cpp-BMRokrvK.js +0 -1
- package/dist/assets/crystal-DGywbUpC.js +0 -1
- package/dist/assets/csv-fuZLfV_i.js +0 -1
- package/dist/assets/cue-D82EKSYY.js +0 -1
- package/dist/assets/cypher-COkxafJQ.js +0 -1
- package/dist/assets/d-85-TOEBH.js +0 -1
- package/dist/assets/dark-plus-C3mMm8J8.js +0 -1
- package/dist/assets/dax-CEL-wOlO.js +0 -1
- package/dist/assets/desktop-BmXAJ9_W.js +0 -1
- package/dist/assets/dotenv-Da5cRb03.js +0 -1
- package/dist/assets/dracula-BzJJZx-M.js +0 -1
- package/dist/assets/dracula-soft-BXkSAIEj.js +0 -1
- package/dist/assets/dream-maker-BtqSS_iP.js +0 -1
- package/dist/assets/edge-FbVlp4U3.js +0 -1
- package/dist/assets/elixir-CkH2-t6x.js +0 -1
- package/dist/assets/elm-DbKCFpqz.js +0 -1
- package/dist/assets/emacs-lisp-C_m_b--Z.js +0 -1
- package/dist/assets/erb-DXfck5VN.js +0 -1
- package/dist/assets/erlang-DsQrWhSR.js +0 -1
- package/dist/assets/everforest-dark-BgDCqdQA.js +0 -1
- package/dist/assets/everforest-light-C8M2exoo.js +0 -1
- package/dist/assets/fennel-BYunw83y.js +0 -1
- package/dist/assets/fluent-C4IJs8-o.js +0 -1
- package/dist/assets/fortran-fixed-form-CkoXwp7k.js +0 -1
- package/dist/assets/fortran-free-form-BxgE0vQu.js +0 -1
- package/dist/assets/fsharp-CXgrBDvD.js +0 -1
- package/dist/assets/gdresource-TyuKm33G.js +0 -1
- package/dist/assets/gdscript-DqcFQ5yU.js +0 -1
- package/dist/assets/gdshader-DkwncUOv.js +0 -1
- package/dist/assets/genie-D0YGMca9.js +0 -1
- package/dist/assets/gherkin-DyxjwDmM.js +0 -1
- package/dist/assets/git-commit-F4YmCXRG.js +0 -1
- package/dist/assets/git-rebase-r7XF79zn.js +0 -1
- package/dist/assets/github-dark-DHJKELXO.js +0 -1
- package/dist/assets/github-dark-dimmed-DH5Ifo-i.js +0 -1
- package/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -1
- package/dist/assets/github-light-DAi9KRSo.js +0 -1
- package/dist/assets/github-light-high-contrast-BfjtVDDH.js +0 -1
- package/dist/assets/gleam-BspZqrRM.js +0 -1
- package/dist/assets/glimmer-js-ByusRIyA.js +0 -1
- package/dist/assets/glimmer-ts-BfAWNZQY.js +0 -1
- package/dist/assets/glsl-DplSGwfg.js +0 -1
- package/dist/assets/gn-n2N0HUVH.js +0 -1
- package/dist/assets/gnuplot-DdkO51Og.js +0 -1
- package/dist/assets/groovy-gcz8RCvz.js +0 -1
- package/dist/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -1
- package/dist/assets/gruvbox-dark-medium-GsRaNv29.js +0 -1
- package/dist/assets/gruvbox-dark-soft-CVdnzihN.js +0 -1
- package/dist/assets/gruvbox-light-hard-CH1njM8p.js +0 -1
- package/dist/assets/gruvbox-light-medium-DRw_LuNl.js +0 -1
- package/dist/assets/gruvbox-light-soft-hJgmCMqR.js +0 -1
- package/dist/assets/hack-BWmVpMyf.js +0 -1
- package/dist/assets/haml-D5jkg6IW.js +0 -1
- package/dist/assets/handlebars-BpdQsYii.js +0 -1
- package/dist/assets/haskell-Df6bDoY_.js +0 -1
- package/dist/assets/haxe-CfZj7gIn.js +0 -1
- package/dist/assets/hcl-BWvSN4gD.js +0 -1
- package/dist/assets/hjson-D5-asLiD.js +0 -1
- package/dist/assets/hlsl-D3lLCCz7.js +0 -1
- package/dist/assets/horizon-BUw7H-hv.js +0 -1
- package/dist/assets/horizon-bright-CUuTKBJd.js +0 -1
- package/dist/assets/houston-DnULxvSX.js +0 -1
- package/dist/assets/html-derivative-DlHx6ybY.js +0 -1
- package/dist/assets/http-jrhK8wxY.js +0 -1
- package/dist/assets/hurl-irOxFIW8.js +0 -1
- package/dist/assets/hxml-2-FPmUDs.js +0 -1
- package/dist/assets/hy-DFXneXwc.js +0 -1
- package/dist/assets/imba-DGztddWO.js +0 -1
- package/dist/assets/index-CJTp9JEp.js +0 -153
- package/dist/assets/ini-BEwlwnbL.js +0 -1
- package/dist/assets/jinja-f2NsQr07.js +0 -1
- package/dist/assets/jison-wvAkD_A8.js +0 -1
- package/dist/assets/jsonl-DcaNXYhu.js +0 -1
- package/dist/assets/jsonnet-DFQXde-d.js +0 -1
- package/dist/assets/jssm-C2t-YnRu.js +0 -1
- package/dist/assets/julia-5Bft2YPA.js +0 -1
- package/dist/assets/just-Cwhn7H3k.js +0 -1
- package/dist/assets/kanagawa-dragon-BuwD2xS4.js +0 -1
- package/dist/assets/kanagawa-lotus-C3DzagqV.js +0 -1
- package/dist/assets/kanagawa-wave-DFGoQZhC.js +0 -1
- package/dist/assets/kdl-DV7GczEv.js +0 -1
- package/dist/assets/kusto-wEQ09or8.js +0 -1
- package/dist/assets/laserwave-DUszq2jm.js +0 -1
- package/dist/assets/latex-D5pSuvFb.js +0 -1
- package/dist/assets/lean-BZvkOJ9d.js +0 -1
- package/dist/assets/light-plus-B7mTdjB0.js +0 -1
- package/dist/assets/liquid-C0sCDyMI.js +0 -1
- package/dist/assets/llvm-BZoOZj88.js +0 -1
- package/dist/assets/log-2UxHyX5q.js +0 -1
- package/dist/assets/logo-BtOb2qkB.js +0 -1
- package/dist/assets/luau-BnpPk5vE.js +0 -1
- package/dist/assets/marko-DjSrsDqO.js +0 -1
- package/dist/assets/material-theme-D5KoaKCx.js +0 -1
- package/dist/assets/material-theme-darker-BfHTSMKl.js +0 -1
- package/dist/assets/material-theme-lighter-B0m2ddpp.js +0 -1
- package/dist/assets/material-theme-ocean-CyktbL80.js +0 -1
- package/dist/assets/material-theme-palenight-Csfq5Kiy.js +0 -1
- package/dist/assets/matlab-D7o27uSR.js +0 -1
- package/dist/assets/mdc-D1_yUvq7.js +0 -1
- package/dist/assets/mermaid-CQcHuHx7.js +0 -1
- package/dist/assets/min-dark-CafNBF8u.js +0 -1
- package/dist/assets/min-light-CTRr51gU.js +0 -1
- package/dist/assets/mipsasm-CKIfxQSi.js +0 -1
- package/dist/assets/mojo-DJz3ZmWd.js +0 -1
- package/dist/assets/monokai-BRVnQi9A.js +0 -1
- package/dist/assets/moonbit-CHtswR0a.js +0 -1
- package/dist/assets/move-el3G9tDJ.js +0 -1
- package/dist/assets/narrat-DRg8JJMk.js +0 -1
- package/dist/assets/nextflow-C-mBbutL.js +0 -1
- package/dist/assets/nextflow-groovy-vE_lwT2v.js +0 -1
- package/dist/assets/nginx-BpAMiNFr.js +0 -1
- package/dist/assets/night-owl-C39BiMTA.js +0 -1
- package/dist/assets/night-owl-light-CMTm3GFP.js +0 -1
- package/dist/assets/nim-BIad80T-.js +0 -1
- package/dist/assets/nix-CwoSXNpI.js +0 -1
- package/dist/assets/nord-Ddv68eIx.js +0 -1
- package/dist/assets/nsis-BlV79W_Q.js +0 -1
- package/dist/assets/nushell-D3jzshHO.js +0 -1
- package/dist/assets/objective-c-DXmwc3jG.js +0 -1
- package/dist/assets/objective-cpp-CLxacb5B.js +0 -1
- package/dist/assets/ocaml-C0hk2d4L.js +0 -1
- package/dist/assets/odin-BBf5iR-q.js +0 -1
- package/dist/assets/one-dark-pro-DVMEJ2y_.js +0 -1
- package/dist/assets/one-light-C3Wv6jpd.js +0 -1
- package/dist/assets/openscad-C4EeE6gA.js +0 -1
- package/dist/assets/org-DM6o9KBp.js +0 -1
- package/dist/assets/pascal-D93ZcfNL.js +0 -1
- package/dist/assets/perl-B9cMNwum.js +0 -1
- package/dist/assets/pkl-u5AG7uiY.js +0 -1
- package/dist/assets/plastic-3e1v2bzS.js +0 -1
- package/dist/assets/plsql-ChMvpjG-.js +0 -1
- package/dist/assets/po-BTJTHyun.js +0 -1
- package/dist/assets/poimandres-CS3Unz2-.js +0 -1
- package/dist/assets/polar-C0HS_06l.js +0 -1
- package/dist/assets/postcss-CXtECtnM.js +0 -1
- package/dist/assets/powerquery-CEu0bR-o.js +0 -1
- package/dist/assets/prisma-Vru482bI.js +0 -1
- package/dist/assets/prolog-CbFg5uaA.js +0 -1
- package/dist/assets/pug-DKIMFp6K.js +0 -1
- package/dist/assets/puppet-BMWR74SV.js +0 -1
- package/dist/assets/purescript-CklMAg4u.js +0 -1
- package/dist/assets/qml-3beO22l8.js +0 -1
- package/dist/assets/qmldir-C8lEn-DE.js +0 -1
- package/dist/assets/qss-IeuSbFQv.js +0 -1
- package/dist/assets/racket-BqYA7rlc.js +0 -1
- package/dist/assets/raku-DXvB9xmW.js +0 -1
- package/dist/assets/razor-BjBPvh-w.js +0 -1
- package/dist/assets/rbs-CpoqiR4B.js +0 -1
- package/dist/assets/red-hvxz__6c.js +0 -1
- package/dist/assets/reg-C-SQnVFl.js +0 -1
- package/dist/assets/regexp-CDVJQ6XC.js +0 -1
- package/dist/assets/rel-C3B-1QV4.js +0 -1
- package/dist/assets/riscv-BM1_JUlF.js +0 -1
- package/dist/assets/ron-D8l8udqQ.js +0 -1
- package/dist/assets/rose-pine-5qJOZa0Y.js +0 -1
- package/dist/assets/rose-pine-dawn-zx0QlTCp.js +0 -1
- package/dist/assets/rose-pine-moon-C9pEdX9L.js +0 -1
- package/dist/assets/rosmsg-BJDFO7_C.js +0 -1
- package/dist/assets/rst-bs7f0vWN.js +0 -1
- package/dist/assets/ruby-C0TQ7zu5.js +0 -1
- package/dist/assets/sas-DEy46yEz.js +0 -1
- package/dist/assets/scala-CqE71os6.js +0 -1
- package/dist/assets/scheme-C98Dy4si.js +0 -1
- package/dist/assets/sdbl-DVxCFoDh.js +0 -1
- package/dist/assets/shaderlab-Dg9Lc6iA.js +0 -1
- package/dist/assets/shellsession-BADoaaVG.js +0 -1
- package/dist/assets/slack-dark-BthQWCQV.js +0 -1
- package/dist/assets/slack-ochin-DqwNpetd.js +0 -1
- package/dist/assets/smalltalk-BOQMe2GC.js +0 -1
- package/dist/assets/smithy-cds9vsN8.js +0 -1
- package/dist/assets/snazzy-light-Bw305WKR.js +0 -1
- package/dist/assets/solarized-dark-CpvCGNkr.js +0 -1
- package/dist/assets/solarized-light-Dlz6yCKv.js +0 -1
- package/dist/assets/solidity-DijEV5ha.js +0 -1
- package/dist/assets/soy-8wufbnw4.js +0 -1
- package/dist/assets/sparql-rVzFXLq3.js +0 -1
- package/dist/assets/splunk-BtCnVYZw.js +0 -1
- package/dist/assets/ssh-config-_ykCGR6B.js +0 -1
- package/dist/assets/stata-DI20mbqo.js +0 -1
- package/dist/assets/stylus-BEDo0Tqx.js +0 -1
- package/dist/assets/surrealql-Cjom0U5J.js +0 -1
- package/dist/assets/svelte-Cy7k_4gC.js +0 -1
- package/dist/assets/swimlanesDiagram-TC7HE7FX-CmTirbVT.js +0 -8
- package/dist/assets/synthwave-84-CbfX1IO0.js +0 -1
- package/dist/assets/system-verilog-0hqHdDBg.js +0 -1
- package/dist/assets/systemd-4A_iFExJ.js +0 -1
- package/dist/assets/talonscript-CkByrt1z.js +0 -1
- package/dist/assets/tasl-QIJgUcNo.js +0 -1
- package/dist/assets/tcl-dwOrl1Do.js +0 -1
- package/dist/assets/templ-DhtptRzy.js +0 -1
- package/dist/assets/terraform-BETggiCN.js +0 -1
- package/dist/assets/tex-D96PA37w.js +0 -1
- package/dist/assets/tokyo-night-hegEt444.js +0 -1
- package/dist/assets/ts-tags-D351s5mN.js +0 -1
- package/dist/assets/tsv-B_m7g4N7.js +0 -1
- package/dist/assets/turtle-BsS91CYL.js +0 -1
- package/dist/assets/twig-27uCiNez.js +0 -1
- package/dist/assets/typespec-CAFt9gP4.js +0 -1
- package/dist/assets/typst-BUadGCkm.js +0 -1
- package/dist/assets/v-BGw2Nkan.js +0 -1
- package/dist/assets/vala-CsfeWuGM.js +0 -1
- package/dist/assets/vb-Cu-pLBUe.js +0 -1
- package/dist/assets/verilog-nZwndyjY.js +0 -1
- package/dist/assets/vesper-DRje8inN.js +0 -1
- package/dist/assets/vhdl-CeAyd5Ju.js +0 -1
- package/dist/assets/viml-CJc9bBzg.js +0 -1
- package/dist/assets/vitesse-black-Bkuqu6BP.js +0 -1
- package/dist/assets/vitesse-dark-D0r3Knsf.js +0 -1
- package/dist/assets/vitesse-light-CVO1_9PV.js +0 -1
- package/dist/assets/vue-BqiEGhQt.js +0 -1
- package/dist/assets/vue-html-AaS7Mt5G.js +0 -1
- package/dist/assets/vue-vine-BoDAl6tE.js +0 -1
- package/dist/assets/vyper-CDx5xZoG.js +0 -1
- package/dist/assets/wasm-CG6Dc4jp.js +0 -1
- package/dist/assets/wenyan-BV7otONQ.js +0 -1
- package/dist/assets/wgsl-Dx-B1_4e.js +0 -1
- package/dist/assets/wikitext-BhOHFoWU.js +0 -1
- package/dist/assets/wit-5i3qLPDT.js +0 -1
- package/dist/assets/wolfram-lXgVvXCa.js +0 -1
- package/dist/assets/xsl-CtQFsRM5.js +0 -1
- package/dist/assets/zenscript-DVFEvuxE.js +0 -1
- package/dist/assets/zig-VOosw3JB.js +0 -1
- /package/dist/assets/{shellscript-Yzrsuije.js → bash-Yzrsuije.js} +0 -0
- /package/dist/assets/{docker-BcOcwvcX.js → dockerfile-BcOcwvcX.js} +0 -0
- /package/dist/assets/{make-CHLpvVh8.js → makefile-CHLpvVh8.js} +0 -0
|
@@ -50,54 +50,72 @@ export class ProviderRegistry {
|
|
|
50
50
|
this.driversByKind = new Map(drivers.map((d) => [d.driverKind, d]));
|
|
51
51
|
}
|
|
52
52
|
async load(configs, decorate) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
});
|
|
53
|
+
// Create instances concurrently: a driver's create may probe its CLI with
|
|
54
|
+
// a multi-second timeout, and N slow CLIs must not queue on each other.
|
|
55
|
+
// Each entry resolves to the RegistryEntry it becomes — a create or
|
|
56
|
+
// decode failure stays local to its instance, exactly as before.
|
|
57
|
+
const loaded = await Promise.all(Object.entries(configs).map(async ([instanceId, entry]) => {
|
|
58
|
+
const ready = await this.createEntry(instanceId, entry, decorate);
|
|
59
|
+
// Usable as soon as it is ready, not after the slowest CLI.
|
|
60
|
+
this.byId.set(instanceId, ready);
|
|
61
|
+
return ready;
|
|
62
|
+
}));
|
|
63
|
+
// Config order, not completion order: entries()/describe() are the UI's
|
|
64
|
+
// list and must not shuffle when a slow CLI lands last. An entry that a
|
|
65
|
+
// dispose replaced or removed meanwhile is no longer this load's to place.
|
|
66
|
+
for (const entry of loaded) {
|
|
67
|
+
if (this.byId.get(entry.instanceId) !== entry)
|
|
69
68
|
continue;
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
69
|
+
this.byId.delete(entry.instanceId);
|
|
70
|
+
this.byId.set(entry.instanceId, entry);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async createEntry(instanceId, entry, decorate) {
|
|
74
|
+
// Account edits replace only their own process/session state.
|
|
75
|
+
await this.dispose(instanceId);
|
|
76
|
+
const driver = this.driversByKind.get(entry.driver);
|
|
77
|
+
if (!driver) {
|
|
78
|
+
return {
|
|
79
|
+
instanceId,
|
|
80
|
+
shadow: {
|
|
80
81
|
instanceId,
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
82
|
+
driverKind: entry.driver,
|
|
83
|
+
displayName: entry.displayName,
|
|
84
|
+
cli: cliOfRaw(entry.config),
|
|
85
|
+
shadow: true,
|
|
86
|
+
reason: `unknown driver "${entry.driver}" — kept as configured, unavailable here`,
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const config = entry.config === undefined ? driver.defaultConfig() : driver.decodeConfig(entry.config);
|
|
92
|
+
// Override detection is on the RAW config, never the decoded one:
|
|
93
|
+
// decodeConfig fills in the driver default ("claude", "codex", …),
|
|
94
|
+
// so reading `cli` there would flag every instance as overridden.
|
|
95
|
+
const rawCli = cliOfRaw(entry.config);
|
|
96
|
+
if (rawCli)
|
|
97
|
+
this.cliByInstance.set(instanceId, rawCli);
|
|
98
|
+
const live = await driver.create({
|
|
99
|
+
instanceId,
|
|
100
|
+
displayName: entry.displayName ?? driver.metadata.displayName,
|
|
101
|
+
environment: entry.environment ?? {},
|
|
102
|
+
enabled: entry.enabled ?? true,
|
|
103
|
+
config,
|
|
104
|
+
});
|
|
105
|
+
return { instanceId, live: decorate ? decorate(live) : live };
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
return {
|
|
109
|
+
instanceId,
|
|
110
|
+
shadow: {
|
|
90
111
|
instanceId,
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
}
|
|
112
|
+
driverKind: entry.driver,
|
|
113
|
+
displayName: entry.displayName ?? driver.metadata.displayName,
|
|
114
|
+
cli: cliOfRaw(entry.config),
|
|
115
|
+
shadow: true,
|
|
116
|
+
reason: e instanceof Error ? e.message : String(e),
|
|
117
|
+
},
|
|
118
|
+
};
|
|
101
119
|
}
|
|
102
120
|
}
|
|
103
121
|
get(instanceId) {
|
|
@@ -48,7 +48,7 @@ import { buildTurnDigest, coverageForDriver, digestPromptLine, renderDigest, too
|
|
|
48
48
|
import { appendDecision, bindDecisionRetention, boundRetentionDays, decisionRetentionDays, decisionsCsv, flushDecisionLog, pruneDecisions, readDecisionRange, readDecisions, withDecisionActor } from "./decision-log.js";
|
|
49
49
|
import { validateBotCwd } from "./bot-cwd.js";
|
|
50
50
|
import { ATTACHMENTS_DIR, attachmentExists, cleanupStaleAttachmentPartials, deleteAttachment, extensionForMime, FILE_MAX_BYTES, IMAGE_MAX_BYTES, parseAudioRange, readAttachment, saveAudio, saveFile, saveImage, saveImageUpload, validateAttachmentUploadId, } from "./attachments.js";
|
|
51
|
-
import { messageFileDisposition, messageFileDownloadName, messageAttachmentName, messageFileRoots, messageImageTargetAt, messageReferencesFile, openMessageFile, } from "./message-file.js";
|
|
51
|
+
import { messageFileDisposition, messageFileDownloadName, messageAttachmentName, messageFileRoots, messageImageTargetAt, messageReferencesFile, listMessageFolder, messageFolderEntryName, openMessageFile, openMessageFolderEntry, } from "./message-file.js";
|
|
52
52
|
import { avatarGenerationRequestSchema, avatarGenerationStateMatches, generateAvatarImage, avatarImageStatus, snapshotAvatarGenerationState, } from "./avatar-image.js";
|
|
53
53
|
import { fitsOnOneLine, parseBotProfilePatch } from "./bot-profile.js";
|
|
54
54
|
import { groupTurnCwd } from "./room-cwd.js";
|
|
@@ -97,7 +97,7 @@ import { RETRY_MAX_ATTEMPTS } from "./drivers/retry.js";
|
|
|
97
97
|
import { recoveryCapabilityError } from "./automatic-recovery.js";
|
|
98
98
|
import { decodeGeneratedImage } from "./generated-image.js";
|
|
99
99
|
import { addDisabledMcpServer, MAX_MCP_SERVERS, isRemoteMcpServer, listMcpServers, mcpServerNameError, parseMcpServerMutation, parseMcpServersImport, parseStoredMcpServer, } from "./mcp-registry.js";
|
|
100
|
-
import { McpOAuthError, McpSignInError, McpOAuthManager, mcpOAuthRedirectUri, withMcpSignIn, withoutPendingSignIn } from "./mcp-oauth.js";
|
|
100
|
+
import { MCP_OAUTH_CALLBACK_PATH, McpOAuthError, McpSignInError, McpOAuthManager, mcpCallbackOrigin, mcpOAuthRedirectUri, withMcpSignIn, withoutPendingSignIn } from "./mcp-oauth.js";
|
|
101
101
|
import { probeMcpServer } from "./mcp-probe.js";
|
|
102
102
|
import { GROUP_GOAL_MAX_TURNS, groupGoalAssignmentKey, groupGoalCompletionTurnId, groupGoalCoordinatorInstructions, groupGoalWorkerInstructions, parseGroupGoalDecision, resolveGroupGoalMember, selectGroupGoalCoordinator, } from "./group-goal-run.js";
|
|
103
103
|
import { BUILT_IN_DRIVERS } from "./drivers/builtIn.js";
|
|
@@ -153,7 +153,7 @@ import { ensureWorkspace, ensureTaskWorkspace, workspaceLocationsPrompt, support
|
|
|
153
153
|
import { listMemoryTopics, memoryDate, readMemoryFile, readMemoryTopic, writeMemoryFile, writeMemoryTopic } from "./workspace.js";
|
|
154
154
|
import { beginMemoryTurn, endMemoryTurn, flushAllMemoryJournals, journalMemoryWrite, } from "./memory-journal.js";
|
|
155
155
|
import { readSectionContext, readSections, sectionContextKey, sectionContextLabel, sectionContextSystemPrompt, writeSectionContext, SECTION_CONTEXT_MAX_BYTES, } from "./section-context.js";
|
|
156
|
-
import { applyStagedSkillWrite, applySkillWriteWithReceipt, getStagedSkillWrite, installOrgSkill, installSkill, listBotSkillsWithOrigin, resolveBotSkills, parseSkillMd, scanSkillText, listSkills, listStagedSkillWrites, isSkillName, readSkillFile, rejectStagedSkillWrite, removeSkill, setSkillEnabled, skillPackageStamps, skillsSystemPrompt, stageSkillWrite, } from "./skills.js";
|
|
156
|
+
import { applyStagedSkillWrite, applySkillWriteWithReceipt, getStagedSkillWrite, installOrgSkill, installSkill, listBotSkillsWithOrigin, resolveBotSkills, parseSkillMd, scanSkillText, listSkills, listStagedSkillWrites, isSkillName, readSkillFile, rejectStagedSkillWrite, removeSkill, setSkillEnabled, skillPackageStamps, skillsSystemPrompt, stageSkillWrite, undoSkillWrite, } from "./skills.js";
|
|
157
157
|
import { fetchSkillFromSource } from "./skill-fetch.js";
|
|
158
158
|
import { pickBotName } from "./names.js";
|
|
159
159
|
import { botSkillTemplateSchema, newBotDefaultsSchema, resolveBotCreationDefaults } from "./new-bot-defaults.js";
|
|
@@ -179,6 +179,7 @@ import { agentBrowserFrame, agentBrowserIntegration, browserEngineEncryptionKey,
|
|
|
179
179
|
import { createScreenFrameSource } from "./screen-frame-source.js";
|
|
180
180
|
import { screenFrameHash, screenSurfaceForTool, screenTouchingTool, settledFrameIsNews } from "./screen-frame-gate.js";
|
|
181
181
|
import { asSchedule, RoutineRequestService } from "./routine-requests.js";
|
|
182
|
+
import { directApply, UNDO_STALE } from "./direct-apply.js";
|
|
182
183
|
import { createOptionsCard } from "./options-card.js";
|
|
183
184
|
import { buildBotOverview, connectedAppsFacts } from "./bot-overview.js";
|
|
184
185
|
import { ProfileRequestService } from "./profile-requests.js";
|
|
@@ -231,7 +232,7 @@ import { applyPendingWorkspaceRestore, readLastWorkspaceRestore } from "./worksp
|
|
|
231
232
|
import { createCustomDomainVerifier, customDomainIpv4, normalizeCustomDomain } from "./custom-domain.js";
|
|
232
233
|
import { allowedScopes, createEmailSignIn, parseAllowList } from "./account-signin.js";
|
|
233
234
|
import { ProviderAuthSessions } from "./provider-auth-sessions.js";
|
|
234
|
-
import { clearSessionCookie, clientBotPatchViolation, clientGroupPatchViolation, isLoopbackHost, isProxied, labelFromUserAgent, requestOrigin, requestSource, requiredScope, resolveLoopbackTrust, resolveRequestAuth, parseCookies, serializeSessionCookie, sessionCookieName, } from "./request-auth.js";
|
|
235
|
+
import { clearSessionCookie, clientBotPatchViolation, clientGroupPatchViolation, isLoopbackHost, isProxied, labelFromUserAgent, provesSameOrigin, requestOrigin, requestSource, requiredScope, resolveLoopbackTrust, resolveRequestAuth, parseCookies, serializeSessionCookie, sessionCookieName, } from "./request-auth.js";
|
|
235
236
|
import { cookieMaxAgeSeconds, formatPairingCode, SessionRegistry } from "./sessions.js";
|
|
236
237
|
import { ThreadStarters } from "./thread-starters.js";
|
|
237
238
|
import { activityCsv, activityEntries, appendAdminAction, botAuditSnapshot, botChangeRows, configChangeRows, parseActivityWhat, flushAdminActivity, pruneAdminActivity, readAdminActivityRange, sharedSignIn, signInListsOf, } from "./admin-activity.js";
|
|
@@ -248,6 +249,7 @@ import { createBotPresetRoutes } from "./routes/bot-presets.js";
|
|
|
248
249
|
import { createBotMemoryRoutes } from "./routes/bot-memory.js";
|
|
249
250
|
import { createDeciderRoutes } from "./routes/decider.js";
|
|
250
251
|
import { createThreadModelRoutes } from "./routes/thread-models.js";
|
|
252
|
+
import { createUndoRoutes } from "./routes/undo.js";
|
|
251
253
|
import { createDesktopViewer, desktopViewerUrl } from "./routes/desktop-viewer.js";
|
|
252
254
|
import { localDesktopTarget, localVmViewerStatus, viewerTargetId } from "./desktop-viewer-targets.js";
|
|
253
255
|
import { createAntigravityLeftoverRoutes } from "./routes/antigravity-leftovers.js";
|
|
@@ -3562,6 +3564,24 @@ function sourceApprovalMode(botId, threadId) {
|
|
|
3562
3564
|
function fullAccessForSource(botId, threadId) {
|
|
3563
3565
|
return sourceApprovalMode(botId, threadId) === "full";
|
|
3564
3566
|
}
|
|
3567
|
+
/** On a Cloud home a turn a guest drives keeps a card for every change,
|
|
3568
|
+
* even one to the bot itself. */
|
|
3569
|
+
function selfApplyBlocked(threadId) {
|
|
3570
|
+
return cloudGuestDriven(threadId);
|
|
3571
|
+
}
|
|
3572
|
+
/** Whether a bot's routine, skill, profile or model change applies without
|
|
3573
|
+
* a person, and why: Full access applies everything as it always has, and
|
|
3574
|
+
* at any level a change to the bot itself applies, shown as a one-line
|
|
3575
|
+
* receipt with Undo (server/direct-apply.ts). Team setup and peer approvals
|
|
3576
|
+
* stay Full access only (fullAccessForSource). */
|
|
3577
|
+
function appliesDirectly(botId, threadId, targetBotId) {
|
|
3578
|
+
return directApply({
|
|
3579
|
+
fullAccess: fullAccessForSource(botId, threadId),
|
|
3580
|
+
botId,
|
|
3581
|
+
targetBotId,
|
|
3582
|
+
blocked: selfApplyBlocked(threadId) || !connectorThread(botId, threadId),
|
|
3583
|
+
});
|
|
3584
|
+
}
|
|
3565
3585
|
function peerReviewRequired(bot, threadId) {
|
|
3566
3586
|
return Boolean(bot.approvePeerComms && !fullAccessForSource(bot.id, threadId));
|
|
3567
3587
|
}
|
|
@@ -10896,7 +10916,7 @@ async function cloudRoutineReadiness(botId, threadId) {
|
|
|
10896
10916
|
const routineRequests = new RoutineRequestService({
|
|
10897
10917
|
store,
|
|
10898
10918
|
routines,
|
|
10899
|
-
autoApply:
|
|
10919
|
+
autoApply: appliesDirectly,
|
|
10900
10920
|
cloudReady: cloudRoutineReadiness,
|
|
10901
10921
|
canPersist: proposalPersistence,
|
|
10902
10922
|
// Cross-bot routines: the confirmation card can sit open indefinitely, so
|
|
@@ -11229,14 +11249,14 @@ function resolveAndSendTrust(res, threadId, requestId, behavior) {
|
|
|
11229
11249
|
}
|
|
11230
11250
|
const profileRequests = new ProfileRequestService({
|
|
11231
11251
|
store,
|
|
11232
|
-
autoApply:
|
|
11252
|
+
autoApply: appliesDirectly,
|
|
11233
11253
|
canPersist: proposalPersistence,
|
|
11234
11254
|
// A Chief may change a section peer; anyone else only itself. Re-checked at confirm.
|
|
11235
11255
|
validateTarget: chiefPeerTargetRule("profile"),
|
|
11236
11256
|
});
|
|
11237
11257
|
const modelRequests = new ModelRequestService({
|
|
11238
11258
|
store,
|
|
11239
|
-
autoApply:
|
|
11259
|
+
autoApply: appliesDirectly,
|
|
11240
11260
|
canPersist: proposalPersistence,
|
|
11241
11261
|
// Same authority rule as profile proposals: a Chief may name one section peer.
|
|
11242
11262
|
validateTarget: chiefPeerTargetRule("default model"),
|
|
@@ -11554,6 +11574,104 @@ function resolveAndSendModel(res, args) {
|
|
|
11554
11574
|
json(res, 200, { ok: true, outcome: "rejected" });
|
|
11555
11575
|
return true;
|
|
11556
11576
|
}
|
|
11577
|
+
/** Undo for a learned skill a bot wrote without a person (undoSkillWrite). */
|
|
11578
|
+
function undoSkillCard(botId, threadId, messageId) {
|
|
11579
|
+
const message = store.messagesFor(threadId).find((candidate) => candidate.id === messageId);
|
|
11580
|
+
const card = message?.card;
|
|
11581
|
+
const request = card?.skillRequest;
|
|
11582
|
+
if (!message || !card || !request)
|
|
11583
|
+
return { claimed: false };
|
|
11584
|
+
if (card.undone)
|
|
11585
|
+
return { claimed: true, state: "already_undone" };
|
|
11586
|
+
if (!card.autoApplied || card.answered !== "allow") {
|
|
11587
|
+
return { claimed: true, state: "invalid", error: "Only a change that applied on its own can be undone here.", status: 409 };
|
|
11588
|
+
}
|
|
11589
|
+
if (request.botId !== botId || request.threadId !== threadId) {
|
|
11590
|
+
return { claimed: true, state: "invalid", error: "this skill request belongs to a different bot", status: 403 };
|
|
11591
|
+
}
|
|
11592
|
+
const undone = undoSkillWrite(botId, {
|
|
11593
|
+
stagedId: request.stagedId,
|
|
11594
|
+
name: request.name,
|
|
11595
|
+
action: request.action,
|
|
11596
|
+
...(request.previous ? { previous: { skillMd: request.previous.preview, source: request.previous.source } } : {}),
|
|
11597
|
+
});
|
|
11598
|
+
if ("stale" in undone)
|
|
11599
|
+
return { claimed: true, state: "invalid", error: UNDO_STALE, status: 409, stale: true };
|
|
11600
|
+
if ("error" in undone)
|
|
11601
|
+
return { claimed: true, state: "invalid", error: undone.error, status: 409 };
|
|
11602
|
+
store.patchMessage(threadId, message.id, { card: { ...card, undone: true } });
|
|
11603
|
+
return { claimed: true, state: "undone" };
|
|
11604
|
+
}
|
|
11605
|
+
/** Undo on the one-line receipt of a change that applied without a person
|
|
11606
|
+
* (a bot's change to itself, or Full access). The caller authorizes it
|
|
11607
|
+
* exactly like answering that card; the card remembers it was undone. */
|
|
11608
|
+
function undoAppliedChange(res, threadId, requestId) {
|
|
11609
|
+
const message = store.messagesFor(threadId).find((candidate) => candidate.card?.requestId === requestId);
|
|
11610
|
+
const card = message?.card;
|
|
11611
|
+
if (!message || !card)
|
|
11612
|
+
return json(res, 404, { error: "this change is no longer in the conversation" });
|
|
11613
|
+
// The proposing bot comes from the conversation (a room card's trusted
|
|
11614
|
+
// sender, else the thread's bot), never from the card payload.
|
|
11615
|
+
const botId = message.from?.botId ?? store.botByThread(threadId)?.id;
|
|
11616
|
+
if (!botId)
|
|
11617
|
+
return json(res, 400, { error: "this change has no valid owner" });
|
|
11618
|
+
let result = { claimed: false };
|
|
11619
|
+
if (card.routineRequest) {
|
|
11620
|
+
const undone = routineRequests.undo({ botId, threadId, requestId });
|
|
11621
|
+
// On a Cloud home a routine Undo removed is forgotten, and one it put
|
|
11622
|
+
// back is the owner's only if it was theirs before the change.
|
|
11623
|
+
if (undone.claimed && undone.state === "undone" && cloudRoutineAuthors) {
|
|
11624
|
+
if (undone.action === "create")
|
|
11625
|
+
cloudRoutineAuthors.remove(undone.routineId);
|
|
11626
|
+
else if (undone.action === "update") {
|
|
11627
|
+
if (undone.ownersBefore)
|
|
11628
|
+
cloudOwnersRoutine(undone.routineId);
|
|
11629
|
+
else
|
|
11630
|
+
cloudRoutineAuthors.forget(undone.routineId);
|
|
11631
|
+
}
|
|
11632
|
+
else if (undone.action === "delete" && undone.restoredId) {
|
|
11633
|
+
if (undone.ownersBefore)
|
|
11634
|
+
cloudOwnersRoutine(undone.restoredId);
|
|
11635
|
+
else
|
|
11636
|
+
cloudRoutineAuthors.wrote(undone.restoredId, CLOUD_NOBODY_KEY);
|
|
11637
|
+
}
|
|
11638
|
+
}
|
|
11639
|
+
result = undone;
|
|
11640
|
+
}
|
|
11641
|
+
else if (card.profileRequest) {
|
|
11642
|
+
const undone = profileRequests.undo({ botId, threadId, requestId });
|
|
11643
|
+
if (undone.claimed && undone.state === "undone") {
|
|
11644
|
+
const target = store.bot(undone.targetBotId);
|
|
11645
|
+
if (target)
|
|
11646
|
+
broadcast({ kind: "bot", bot: wireBot(target) });
|
|
11647
|
+
}
|
|
11648
|
+
result = undone;
|
|
11649
|
+
}
|
|
11650
|
+
else if (card.modelRequest) {
|
|
11651
|
+
const undone = modelRequests.undo({ botId, threadId, requestId });
|
|
11652
|
+
if (undone.claimed && undone.state === "undone") {
|
|
11653
|
+
const target = store.bot(undone.targetBotId);
|
|
11654
|
+
if (target)
|
|
11655
|
+
broadcast({ kind: "bot", bot: wireBot(target) });
|
|
11656
|
+
}
|
|
11657
|
+
result = undone;
|
|
11658
|
+
}
|
|
11659
|
+
else if (card.skillRequest) {
|
|
11660
|
+
result = undoSkillCard(botId, threadId, message.id);
|
|
11661
|
+
}
|
|
11662
|
+
if (!result.claimed)
|
|
11663
|
+
return json(res, 409, { error: "Only a change that applied on its own can be undone here." });
|
|
11664
|
+
if (result.state === "invalid") {
|
|
11665
|
+
return json(res, result.status, { error: result.error, ...(result.stale ? { code: "changed-since" } : {}) });
|
|
11666
|
+
}
|
|
11667
|
+
if (result.state === "undone") {
|
|
11668
|
+
appendDecision(DATA_DIR, {
|
|
11669
|
+
threadId, requestId, botId, botName: store.bot(botId)?.name,
|
|
11670
|
+
tool: card.tool, summary: card.subtitle, decision: "user-undone", source: "user",
|
|
11671
|
+
});
|
|
11672
|
+
}
|
|
11673
|
+
json(res, 200, { ok: true, undone: true, ...(result.state === "already_undone" ? { alreadyUndone: true } : {}) });
|
|
11674
|
+
}
|
|
11557
11675
|
// Webhook definitions are independent from calendar schedules, but every
|
|
11558
11676
|
// delivery joins the same RoutineManager queue. That keeps unattended work
|
|
11559
11677
|
// ordered behind a busy MAUS and gives webhook runs the same durable receipts.
|
|
@@ -13512,14 +13630,16 @@ function roomPostEligibility(bot, group) {
|
|
|
13512
13630
|
}
|
|
13513
13631
|
return { ok: true };
|
|
13514
13632
|
}
|
|
13515
|
-
|
|
13633
|
+
/** `opensCard` false for a change that applies directly: it adds no open
|
|
13634
|
+
* card, so the open-card budget does not hold it back. */
|
|
13635
|
+
function proposalPersistence(botId, threadId, opensCard = true) {
|
|
13516
13636
|
if (!store.bot(botId)) {
|
|
13517
13637
|
return { ok: false, status: 403, error: "unknown sender" };
|
|
13518
13638
|
}
|
|
13519
13639
|
if (!connectorThread(botId, threadId)) {
|
|
13520
13640
|
return { ok: false, status: 403, error: "source conversation does not belong to sender" };
|
|
13521
13641
|
}
|
|
13522
|
-
if (fullAccessForSource(botId, threadId))
|
|
13642
|
+
if (!opensCard || fullAccessForSource(botId, threadId))
|
|
13523
13643
|
return { ok: true };
|
|
13524
13644
|
// Only cards on the visible branch can be acted on from the composer.
|
|
13525
13645
|
// Abandoned branches must not permanently consume the proposal quota.
|
|
@@ -13532,14 +13652,14 @@ function proposalPersistence(botId, threadId) {
|
|
|
13532
13652
|
? { ok: false, status: 429, error: "confirm or cancel an existing proposal first" }
|
|
13533
13653
|
: { ok: true };
|
|
13534
13654
|
}
|
|
13535
|
-
function skillProposalPersistence(botId, threadId) {
|
|
13655
|
+
function skillProposalPersistence(botId, threadId, opensCard = true) {
|
|
13536
13656
|
if (!store.bot(botId)) {
|
|
13537
13657
|
return { ok: false, status: 403, error: "unknown sender" };
|
|
13538
13658
|
}
|
|
13539
13659
|
if (!connectorThread(botId, threadId)) {
|
|
13540
13660
|
return { ok: false, status: 403, error: "source conversation does not belong to sender" };
|
|
13541
13661
|
}
|
|
13542
|
-
if (fullAccessForSource(botId, threadId))
|
|
13662
|
+
if (!opensCard || fullAccessForSource(botId, threadId))
|
|
13543
13663
|
return { ok: true };
|
|
13544
13664
|
const openRequests = store.activePath(threadId).filter((message) => message.card?.skillRequest?.botId === botId &&
|
|
13545
13665
|
!message.card.answered &&
|
|
@@ -13606,6 +13726,7 @@ function appendSkillRequestCard(args) {
|
|
|
13606
13726
|
sha256: args.staged.sha256,
|
|
13607
13727
|
warnings: args.staged.warnings,
|
|
13608
13728
|
createdAt: Date.now(),
|
|
13729
|
+
...(args.applied && args.previous ? { previous: args.previous } : {}),
|
|
13609
13730
|
};
|
|
13610
13731
|
const from = store.bot(args.botId);
|
|
13611
13732
|
store.appendMessage(args.threadId, {
|
|
@@ -13616,7 +13737,7 @@ function appendSkillRequestCard(args) {
|
|
|
13616
13737
|
title: copy.title,
|
|
13617
13738
|
subtitle: copy.subtitle,
|
|
13618
13739
|
options: args.applied ? [] : [args.staged.action === "create" ? "Enable" : "Update", "Deny"],
|
|
13619
|
-
...(args.applied ? { answered: "allow", title: `Skill "${args.staged.name}" ${args.staged.action === "create" ? "enabled" : "updated"}` } : {}),
|
|
13740
|
+
...(args.applied ? { answered: "allow", autoApplied: true, title: `Skill "${args.staged.name}" ${args.staged.action === "create" ? "enabled" : "updated"}` } : {}),
|
|
13620
13741
|
requestId,
|
|
13621
13742
|
tool: copy.tool,
|
|
13622
13743
|
skillRequest: payload,
|
|
@@ -14902,6 +15023,11 @@ ROUTES.push(createThreadModelRoutes({
|
|
|
14902
15023
|
mayChangeModel: (auth) => !CLOUD_HOME || cloudOwnerSession(auth),
|
|
14903
15024
|
reply: (botId) => publicBot(store.bot(botId)),
|
|
14904
15025
|
}));
|
|
15026
|
+
// Undo on the one-line receipt of a change that applied without a person.
|
|
15027
|
+
ROUTES.push(createUndoRoutes({
|
|
15028
|
+
refusal: (auth, threadId, requestId) => cardAnswerRefusal(auth, threadId, requestId, "allow"),
|
|
15029
|
+
undo: (auth, res, threadId, requestId) => withDecisionActor(decisionActorFor(auth), () => undoAppliedChange(res, threadId, requestId)),
|
|
15030
|
+
}));
|
|
14905
15031
|
ROUTES.push(createAntigravityLeftoverRoutes({
|
|
14906
15032
|
hosted: Boolean(hostedModels),
|
|
14907
15033
|
isAntigravity: (instanceId) => registry.get(instanceId)?.driverKind === "antigravityAgent",
|
|
@@ -15054,6 +15180,17 @@ const handleRequest = async (req, res) => {
|
|
|
15054
15180
|
if (refusal)
|
|
15055
15181
|
return json(res, 403, { error: refusal, code: "managed_policy" });
|
|
15056
15182
|
}
|
|
15183
|
+
// An MCP server's sign-in, started in a browser on another computer,
|
|
15184
|
+
// comes back here (server/mcp-oauth.ts). Public like the loopback
|
|
15185
|
+
// listener it stands in for: the state is the credential, checked once.
|
|
15186
|
+
if (path === MCP_OAUTH_CALLBACK_PATH) {
|
|
15187
|
+
const answer = method === "GET"
|
|
15188
|
+
? await mcpOAuth.publicCallback(req.headers.host, url.search)
|
|
15189
|
+
: { status: 400, text: "Invalid sign-in callback. Return to OpenMausBot and try again." };
|
|
15190
|
+
res.writeHead(answer.status, { "content-type": "text/plain; charset=utf-8", "cache-control": "no-store", "referrer-policy": "no-referrer" });
|
|
15191
|
+
res.end(answer.text);
|
|
15192
|
+
return;
|
|
15193
|
+
}
|
|
15057
15194
|
// ── who is asking (server/request-auth.ts) ──────────────────────────
|
|
15058
15195
|
// Two public routes come first: what this server is, and turning a pairing
|
|
15059
15196
|
// code into a session. Everything else needs the loopback owner or a
|
|
@@ -16119,7 +16256,9 @@ const handleRequest = async (req, res) => {
|
|
|
16119
16256
|
forBot = { botId: target.id, name: target.name };
|
|
16120
16257
|
}
|
|
16121
16258
|
}
|
|
16122
|
-
|
|
16259
|
+
// Sender and conversation only: the service checks the open-card
|
|
16260
|
+
// budget once it knows whether this change opens a card at all.
|
|
16261
|
+
const persistence = proposalPersistence(from.id, fromThreadId, false);
|
|
16123
16262
|
if (!persistence.ok) {
|
|
16124
16263
|
return json(res, persistence.status, { error: persistence.error });
|
|
16125
16264
|
}
|
|
@@ -16153,6 +16292,12 @@ const handleRequest = async (req, res) => {
|
|
|
16153
16292
|
cloudRoutineAuthors?.forget(applied.resultId);
|
|
16154
16293
|
cloudRoutineAuthors?.wrote(applied.resultId, CLOUD_NOBODY_KEY);
|
|
16155
16294
|
}
|
|
16295
|
+
// Undo puts an updated or deleted routine back as the owner's only
|
|
16296
|
+
// if it was theirs before this change.
|
|
16297
|
+
if (applied && wasOwners && proposedCard?.autoApplied && proposedCard.routineRequest?.undo) {
|
|
16298
|
+
store.patchMessage(fromThreadId, proposed.messageId, { card: { ...proposedCard,
|
|
16299
|
+
routineRequest: { ...proposedCard.routineRequest, undo: { ...proposedCard.routineRequest.undo, ownersBefore: true } } } });
|
|
16300
|
+
}
|
|
16156
16301
|
appendDecision(DATA_DIR, {
|
|
16157
16302
|
threadId: fromThreadId,
|
|
16158
16303
|
requestId: proposed.requestId,
|
|
@@ -16163,7 +16308,7 @@ const handleRequest = async (req, res) => {
|
|
|
16163
16308
|
// response returned to the model.
|
|
16164
16309
|
summary: proposedCard?.subtitle ?? proposed.summary,
|
|
16165
16310
|
decision: proposed.state === "applied" ? "auto-approved" : "card-shown",
|
|
16166
|
-
source: proposed.state === "applied" ? "full-access" : "routine",
|
|
16311
|
+
source: proposed.state === "applied" ? proposed.appliedBy ?? "full-access" : "routine",
|
|
16167
16312
|
});
|
|
16168
16313
|
return json(res, 201, proposed);
|
|
16169
16314
|
}
|
|
@@ -16248,7 +16393,7 @@ const handleRequest = async (req, res) => {
|
|
|
16248
16393
|
appendDecision(DATA_DIR, {
|
|
16249
16394
|
threadId: body.fromThreadId, requestId: proposed.requestId, botId: from.id, botName: from.name,
|
|
16250
16395
|
tool: "update_profile", summary: proposed.detail, decision: proposed.state === "applied" ? "auto-approved" : "card-shown",
|
|
16251
|
-
source: proposed.state === "applied" ? "full-access" : "profile",
|
|
16396
|
+
source: proposed.state === "applied" ? proposed.appliedBy ?? "full-access" : "profile",
|
|
16252
16397
|
});
|
|
16253
16398
|
return json(res, 201, proposed);
|
|
16254
16399
|
}
|
|
@@ -16280,7 +16425,7 @@ const handleRequest = async (req, res) => {
|
|
|
16280
16425
|
appendDecision(DATA_DIR, {
|
|
16281
16426
|
threadId: body.fromThreadId, requestId: proposed.requestId, botId: from.id, botName: from.name,
|
|
16282
16427
|
tool: "update_model", summary: proposed.detail, decision: proposed.state === "applied" ? "auto-approved" : "card-shown",
|
|
16283
|
-
source: proposed.state === "applied" ? "full-access" : "model",
|
|
16428
|
+
source: proposed.state === "applied" ? proposed.appliedBy ?? "full-access" : "model",
|
|
16284
16429
|
});
|
|
16285
16430
|
return json(res, 201, proposed);
|
|
16286
16431
|
}
|
|
@@ -16492,7 +16637,10 @@ const handleRequest = async (req, res) => {
|
|
|
16492
16637
|
if (!connectorThread(from.id, fromThreadId)) {
|
|
16493
16638
|
return json(res, 403, { error: "source conversation does not belong to sender" });
|
|
16494
16639
|
}
|
|
16495
|
-
|
|
16640
|
+
// Skills written here are always the sender's own, so they apply at
|
|
16641
|
+
// any level, with a one-line receipt and Undo (appliesDirectly).
|
|
16642
|
+
const direct = appliesDirectly(from.id, fromThreadId, from.id);
|
|
16643
|
+
const persistence = skillProposalPersistence(from.id, fromThreadId, !direct);
|
|
16496
16644
|
if (!persistence.ok)
|
|
16497
16645
|
return json(res, persistence.status, { error: persistence.error });
|
|
16498
16646
|
const action = body.action === "create" || body.action === "update" ? body.action : "";
|
|
@@ -16518,11 +16666,15 @@ const handleRequest = async (req, res) => {
|
|
|
16518
16666
|
});
|
|
16519
16667
|
if ("error" in staged)
|
|
16520
16668
|
return json(res, 422, { error: staged.error });
|
|
16521
|
-
if (
|
|
16669
|
+
if (direct) {
|
|
16670
|
+
// What an update replaces, so Undo can put it back.
|
|
16671
|
+
const previousSkillMd = staged.action === "update" ? readSkillFile(from.id, staged.name) : null;
|
|
16672
|
+
const previousSource = listSkills(from.id).find((skill) => skill.name === staged.name)?.source;
|
|
16673
|
+
const previous = previousSkillMd !== null && previousSource ? { preview: previousSkillMd, source: previousSource } : undefined;
|
|
16522
16674
|
const applied = applySkillWriteWithReceipt(from.id, staged, () => {
|
|
16523
|
-
const receipt = appendSkillRequestCard({ botId: from.id, threadId: fromThreadId, staged, applied: true });
|
|
16675
|
+
const receipt = appendSkillRequestCard({ botId: from.id, threadId: fromThreadId, staged, applied: true, previous });
|
|
16524
16676
|
appendDecision(DATA_DIR, { threadId: fromThreadId, requestId: receipt.requestId, botId: from.id, botName: from.name,
|
|
16525
|
-
tool: "stage_skill", summary: receipt.summary, decision: "auto-approved", source:
|
|
16677
|
+
tool: "stage_skill", summary: receipt.summary, decision: "auto-approved", source: direct });
|
|
16526
16678
|
});
|
|
16527
16679
|
if ("error" in applied) {
|
|
16528
16680
|
rejectStagedSkillWrite(from.id, staged.id);
|
|
@@ -18758,7 +18910,28 @@ const handleRequest = async (req, res) => {
|
|
|
18758
18910
|
}
|
|
18759
18911
|
roots = messageFileRootsForThread(senderId, threadId);
|
|
18760
18912
|
}
|
|
18761
|
-
|
|
18913
|
+
// A link to a folder answers with its files; each one is then fetched
|
|
18914
|
+
// by plain name under the same message grant and file checks.
|
|
18915
|
+
const folderEntry = method === "POST" && body.entry !== undefined
|
|
18916
|
+
? messageFolderEntryName(body.entry)
|
|
18917
|
+
: undefined;
|
|
18918
|
+
if (folderEntry === null)
|
|
18919
|
+
return json(res, 400, { error: "entry must be one file name" });
|
|
18920
|
+
let file;
|
|
18921
|
+
try {
|
|
18922
|
+
file = folderEntry
|
|
18923
|
+
? await openMessageFolderEntry(href, folderEntry, roots)
|
|
18924
|
+
: await openMessageFile(href, roots);
|
|
18925
|
+
}
|
|
18926
|
+
catch (error) {
|
|
18927
|
+
// Only a client that asks for listings gets one; older clients keep the 400.
|
|
18928
|
+
if (body?.listFolder !== true || folderEntry || error?.code !== "directory")
|
|
18929
|
+
throw error;
|
|
18930
|
+
const listing = await listMessageFolder(href, roots);
|
|
18931
|
+
res.setHeader("x-openmausbot-folder", "1");
|
|
18932
|
+
res.setHeader("cache-control", "private, no-store");
|
|
18933
|
+
return json(res, 200, listing);
|
|
18934
|
+
}
|
|
18762
18935
|
if ((streamsMessageImage || botAttachment?.kind === "image") && !file.mime.startsWith("image/")) {
|
|
18763
18936
|
await file.handle.close();
|
|
18764
18937
|
return json(res, 415, { error: "only images can be previewed here" });
|
|
@@ -23709,7 +23882,7 @@ const handleRequest = async (req, res) => {
|
|
|
23709
23882
|
mcpProbesInFlight -= 1;
|
|
23710
23883
|
}
|
|
23711
23884
|
}
|
|
23712
|
-
// The loopback listener and authenticated paste-back complete the same flow.
|
|
23885
|
+
// The loopback listener, the public callback and authenticated paste-back complete the same flow.
|
|
23713
23886
|
const mcpSignIn = /^\/api\/mcp\/servers\/([a-z][a-z0-9_-]{0,31})\/(sign-in|sign-out)(?:\/([0-9a-f-]{36}))?$/.exec(path);
|
|
23714
23887
|
if (mcpSignIn) {
|
|
23715
23888
|
const [, name, action, flowId] = mcpSignIn;
|
|
@@ -23745,7 +23918,14 @@ const handleRequest = async (req, res) => {
|
|
|
23745
23918
|
return json(res, 200, { auth: await mcpOAuth.completeCallback(name, flowId, body.callbackUrl, owner) });
|
|
23746
23919
|
}
|
|
23747
23920
|
if (action === "sign-in" && method === "POST" && !flowId) {
|
|
23748
|
-
|
|
23921
|
+
// A browser on another computer cannot reach this machine's
|
|
23922
|
+
// loopback: it comes back to the https address it is using now,
|
|
23923
|
+
// when that is one this server vouches for (mcpCallbackOrigin).
|
|
23924
|
+
const remote = auth.kind === "session" && (isProxied(req) || !isLoopbackHost(req.headers.host));
|
|
23925
|
+
const origin = remote
|
|
23926
|
+
? mcpCallbackOrigin(provesSameOrigin(req) ? requestOrigin(req) : null, [CLOUD_HOME?.publicOrigin, hostedWorkspaceConfiguration()?.tenant.origin, savedCustomDomain(), FALLBACK_PUBLIC_URL])
|
|
23927
|
+
: null;
|
|
23928
|
+
const started = await mcpOAuth.start(name, url, undefined, owner, { remote, origin });
|
|
23749
23929
|
if (auth.kind === "session" && !sessions.isLive(auth.session.id)) {
|
|
23750
23930
|
mcpOAuth.revokeOwner(owner);
|
|
23751
23931
|
return json(res, 401, { error: "Your session ended. Start a new sign-in." });
|