openmausbot 0.1.97 → 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-CgUgtumZ.js +1 -0
- package/dist/assets/BotSettingsDialog-lJj6oiir.js +7 -0
- package/dist/assets/CloudBackendPicker-C5-_arUz.js +1 -0
- package/dist/assets/ComputerPanel-euJ2CSlH.js +1 -0
- package/dist/assets/DesktopViewer-XCln1Pn_.js +5 -0
- package/dist/assets/InspectorPanel-DKYyQZlo.js +5 -0
- package/dist/assets/KeyboardShortcutsModal-DkkZWZRI.js +1 -0
- package/dist/assets/LocalVmWorkspace-Cwt3_XSx.js +1 -0
- package/dist/assets/MacLocalControl-B28RbdCS.js +1 -0
- 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-uOfOTfkB.js +1 -0
- package/dist/assets/SettingsModal-BTGkFbj1.js +11 -0
- package/dist/assets/TeamMapPage-DqNdJn96.js +8 -0
- package/dist/assets/TriggersPanel-c6xkG9mi.js +1 -0
- package/dist/assets/VisibilitySection-DD4ffIR5.js +12 -0
- package/dist/assets/WebhooksPanel-Cz17K-_O.js +3 -0
- package/dist/assets/{abnfDiagram-O67JEVCF-k1UCNXb7.js → abnfDiagram-O67JEVCF-CX6tDpkg.js} +1 -1
- package/dist/assets/activity-BAVWO0Zj.js +1 -0
- package/dist/assets/{arc-BUWGa9UU.js → arc-h45-9NFk.js} +1 -1
- package/dist/assets/architectureDiagram-NJMV4G6O-CgLFXbg6.js +36 -0
- package/dist/assets/{blockDiagram-BEXU5L5S-Ag9nLW4H.js → blockDiagram-BEXU5L5S-DGDFFc9M.js} +1 -1
- package/dist/assets/brain-CeCdoTb2.js +1 -0
- package/dist/assets/{c4Diagram-YGBWAQC7-Bh0sjgUa.js → c4Diagram-YGBWAQC7-B9aklAUj.js} +1 -1
- package/dist/assets/channel-TsOXCiPg.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-BFBcIIqu.js → chunk-2Q5K7J3B-BC0KmWsM.js} +1 -1
- package/dist/assets/{chunk-3FUC2YCW-Dvfpex-f.js → chunk-3FUC2YCW-BbDFHsJ1.js} +2 -2
- package/dist/assets/{chunk-5VM5RSS4-CMjP2YZW.js → chunk-5VM5RSS4-DtGbsjOM.js} +1 -1
- package/dist/assets/{chunk-GTNCS2PH-BryoeTc7.js → chunk-GTNCS2PH-VMghMcEl.js} +1 -1
- package/dist/assets/{chunk-GWA4HPMP-BhfvcchO.js → chunk-GWA4HPMP-BP_JyGWQ.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-bcCVp8rp.js → chunk-JWPE2WC7-CYFyzgAU.js} +1 -1
- package/dist/assets/{chunk-NETBCI7D-yKIjIlkQ.js → chunk-NETBCI7D-DBNa_kqm.js} +1 -1
- package/dist/assets/{chunk-WEXAMYUT-D3Zqbmup.js → chunk-WEXAMYUT-BKEeM7CJ.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-CjVoIMG6.js → chunk-XXDRQBXY-C__m3ZXl.js} +1 -1
- package/dist/assets/{classDiagram-v2-NBCMYWYE-mUCWdVyH.js → classDiagram-v2-NBCMYWYE-CBUrTSAX.js} +1 -1
- package/dist/assets/computer-control-NLov352p.js +1 -0
- package/dist/assets/core-6lvx-ypA.js +12 -0
- package/dist/assets/cose-bilkent-JH36ORCC-GRfL-1Vb.js +1 -0
- package/dist/assets/cpp-DddhVWhK.js +1 -0
- package/dist/assets/{cynefin-OW5HDTMX-BpRrxoO4.js → cynefin-OW5HDTMX-LopwGUjm.js} +1 -1
- package/dist/assets/{cynefinDiagram-VND7K2PF-D3VBWCPK.js → cynefinDiagram-VND7K2PF-DSB8ZRNS.js} +1 -1
- package/dist/assets/{dagre-6A5THRUB-DxEIACOO.js → dagre-6A5THRUB-DL3Kgdfk.js} +1 -1
- package/dist/assets/{diagram-22UHCM2B-BANgZEOS.js → diagram-22UHCM2B-DIxN34BM.js} +1 -1
- package/dist/assets/{diagram-3UASUU5V-Cnq7nJir.js → diagram-3UASUU5V-CJnSvXaI.js} +1 -1
- package/dist/assets/{diagram-ATOU4E4O-4TBDIWnz.js → diagram-ATOU4E4O-C-XF-lO8.js} +1 -1
- package/dist/assets/{diagram-CDSNMT55-CD_B39D4.js → diagram-CDSNMT55-Df2yZPi_.js} +1 -1
- package/dist/assets/{diagram-MLGK6HIB-CzvnFhEC.js → diagram-MLGK6HIB-BBs9oZFs.js} +1 -1
- package/dist/assets/{diagram-MPIPVDR6-C4w2SNml.js → diagram-MPIPVDR6-CEbK11mM.js} +1 -1
- package/dist/assets/{ebnfDiagram-ZINNZB2B-gkUEBm2s.js → ebnfDiagram-ZINNZB2B-BNq6Yv3C.js} +1 -1
- package/dist/assets/{elk-276RUBZZ-B_56X6mw.js → elk-276RUBZZ-CFbQ2bGm.js} +1 -1
- package/dist/assets/engine-javascript-D5Xfc425.js +141 -0
- package/dist/assets/{erDiagram-OPXOYQCR-C_oByoDS.js → erDiagram-OPXOYQCR-Bz8vmjN4.js} +1 -1
- package/dist/assets/{flowDiagram-KWPJA3E3-CR9xXJkC.js → flowDiagram-KWPJA3E3-cQUfEYrx.js} +1 -1
- package/dist/assets/ganttDiagram-FUAMR5RP-BY8n9tbI.js +292 -0
- package/dist/assets/{gitGraphDiagram-X574FWY7-VJ6-Tp_p.js → gitGraphDiagram-X574FWY7-KduSOMDN.js} +1 -1
- package/dist/assets/image-plus-DNIWU160.js +1 -0
- package/dist/assets/index-C8xb62XS.js +585 -0
- package/dist/assets/index-DbN_Hfjs.css +1 -0
- package/dist/assets/{infoDiagram-VRGFBTTK-2Lu9te4D.js → infoDiagram-VRGFBTTK-xBKgUkpL.js} +1 -1
- package/dist/assets/{ishikawaDiagram-OU5B5YK6-DR49XY-e.js → ishikawaDiagram-OU5B5YK6-_ei09tAJ.js} +1 -1
- package/dist/assets/{journeyDiagram-ZHPQQLJL-ZoR0M305.js → journeyDiagram-ZHPQQLJL-Fp49MkSp.js} +1 -1
- package/dist/assets/{kanban-definition-PNTS6WVX-DLKHxrO-.js → kanban-definition-PNTS6WVX-CY9lLm7V.js} +1 -1
- package/dist/assets/{linear-BASsfWly.js → linear-D2ai4eM2.js} +1 -1
- package/dist/assets/{mermaid.core-BVidiPkk.js → mermaid.core-DP6qPqu1.js} +5 -5
- package/dist/assets/{mindmap-definition-NLK3R4M7-g_Qx0U5C.js → mindmap-definition-NLK3R4M7-g1ynEw_d.js} +1 -1
- package/dist/assets/module-DCUsy2BQ.js +3 -0
- package/dist/assets/page-visible-BZn8304W.js +1 -0
- package/dist/assets/{pegDiagram-GJSIUBJH-DI9Cjs8w.js → pegDiagram-GJSIUBJH-Bt4ObsZj.js} +1 -1
- package/dist/assets/{pieDiagram-5QR66LMP-sRI0Uhr5.js → pieDiagram-5QR66LMP-CeLld8bY.js} +1 -1
- package/dist/assets/{quadrantDiagram-O4NWA36T-CamKTby3.js → quadrantDiagram-O4NWA36T-D4WWZw3x.js} +1 -1
- package/dist/assets/{railroadDiagram-XR7U4H2S-DOLlkbf3.js → railroadDiagram-XR7U4H2S-D95P5NqU.js} +1 -1
- package/dist/assets/remote-desktop-panel-DOIMmT4T.js +1 -0
- package/dist/assets/{requirementDiagram-PLB6GJNP-DrRQ5r97.js → requirementDiagram-PLB6GJNP-D12p3RhR.js} +1 -1
- package/dist/assets/ruby-Ct1eTYOr.js +1 -0
- package/dist/assets/{sankeyDiagram-IPEJSGJF-DGS_lXcX.js → sankeyDiagram-IPEJSGJF-Co26Dwcs.js} +1 -1
- package/dist/assets/{sequenceDiagram-PO4LG4MO-CkjWqwtf.js → sequenceDiagram-PO4LG4MO-y5YxaDKt.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-CepRgful.js → sizeCapture-INFHLROL-D49hZ8U5.js} +1 -1
- package/dist/assets/{stateDiagram-v2-GCMORJYK-hykr-9RS.js → stateDiagram-v2-GCMORJYK-C0sylr-r.js} +1 -1
- package/dist/assets/{swimlanes-2SLR337P-CKOHEZbI.js → swimlanes-2SLR337P-DmRWsDIs.js} +1 -1
- package/dist/assets/swimlanesDiagram-TC7HE7FX-DzhbBHtd.js +8 -0
- package/dist/assets/table-file.worker-KkMx-SNx.js +10 -0
- package/dist/assets/{timeline-definition-EJHVYXUP-CB8pJ6AC.js → timeline-definition-EJHVYXUP-DVmHYs3w.js} +1 -1
- package/dist/assets/{usecaseDiagram-POWQR4AR-DrclJHdl.js → usecaseDiagram-POWQR4AR-BQ1q0VV6.js} +1 -1
- package/dist/assets/user-B9lohN4n.js +1 -0
- package/dist/assets/{vennDiagram-UO4OBE2U-zS23qjv8.js → vennDiagram-UO4OBE2U-C_cnfST0.js} +1 -1
- package/dist/assets/{wardleyDiagram-VNRHLVJA-52jgeKxz.js → wardleyDiagram-VNRHLVJA-Bb3BSu12.js} +1 -1
- package/dist/assets/{xychartDiagram-PMCCYNJV-DSdl9rQ8.js → xychartDiagram-PMCCYNJV-CcwEuuEi.js} +1 -1
- package/dist/index.html +2 -2
- package/dist-server/cloud-home-start.js +19 -8
- package/dist-server/container-mcp.js +8 -0
- package/dist-server/desktop-entry.mjs +54 -0
- package/dist-server/drivers/agents-proxy.js +30 -12
- package/dist-server/index.js +2745 -1487
- package/dist-server/openmausbot.js +1004 -642
- package/dist-server/pair-cli.js +1004 -642
- package/dist-server/permission-proxy.js +2 -0
- package/dist-server/server/activity.js +2 -0
- package/dist-server/server/atomic.js +70 -2
- package/dist-server/server/checkpoints.js +55 -39
- package/dist-server/server/cloud-home-start.js +3 -3
- package/dist-server/server/config.js +22 -1
- package/dist-server/server/connector-card-text.js +15 -0
- package/dist-server/server/default-model-selection.js +7 -4
- package/dist-server/server/direct-apply.js +20 -0
- package/dist-server/server/drivers/acp/core.js +10 -0
- package/dist-server/server/drivers/acp/grok.js +47 -5
- package/dist-server/server/drivers/agents-call.js +1 -1
- package/dist-server/server/drivers/agents-catalog.js +34 -11
- package/dist-server/server/drivers/agents-proxy.js +1 -0
- package/dist-server/server/drivers/chat-mcp-tools.js +5 -3
- package/dist-server/server/drivers/claude-login-auth.js +1 -1
- package/dist-server/server/drivers/claude.js +35 -11
- package/dist-server/server/drivers/codex-device-auth.js +27 -319
- package/dist-server/server/drivers/codex.js +147 -24
- package/dist-server/server/drivers/device-auth.js +343 -0
- package/dist-server/server/drivers/openai-chat.js +17 -8
- package/dist-server/server/fleet-agent.js +18 -5
- package/dist-server/server/harness/http.js +5 -2
- package/dist-server/server/harness/registry.js +82 -45
- package/dist-server/server/harness-capabilities.js +7 -4
- package/dist-server/server/hosted-models.js +3 -1
- package/dist-server/server/index.js +471 -77
- package/dist-server/server/key-rejections.js +57 -0
- package/dist-server/server/mcp-oauth.js +125 -47
- package/dist-server/server/message-file.js +102 -7
- package/dist-server/server/model-requests.js +55 -4
- package/dist-server/server/permission-proxy.js +4 -0
- package/dist-server/server/profile-requests.js +80 -4
- package/dist-server/server/provider-key-check.js +5 -1
- package/dist-server/server/request-auth.js +2 -1
- package/dist-server/server/room-turn-timeout.js +28 -0
- package/dist-server/server/routes/thread-models.js +36 -0
- package/dist-server/server/routes/undo.js +17 -0
- package/dist-server/server/routine-requests.js +210 -6
- package/dist-server/server/routines.js +2 -2
- package/dist-server/server/setup-mode.js +1 -1
- package/dist-server/server/skill-learn.js +2 -2
- package/dist-server/server/skills.js +33 -2
- package/dist-server/server/store.js +148 -60
- package/dist-server/server/system-prompt.js +1 -1
- package/dist-server/server/team-backup.js +19 -4
- package/dist-server/server/thread-model.js +25 -0
- package/dist-server/server/turn-continuation.js +17 -16
- package/dist-server/server/webhook-ingress.js +8 -3
- package/dist-server/server/webhooks.js +40 -5
- package/dist-server/server/workspace-backup.js +6 -1
- package/dist-server/shared/device-sign-in.js +57 -0
- package/dist-server/shared/team-backup.js +2 -0
- package/dist-server/shared/thread-model.js +13 -0
- package/dist-server/vps-container-mcp.js +8 -0
- package/dist-server/workspace-backup.worker.js +42 -23
- 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/DesktopViewer-CPidMCtt.js +0 -5
- 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/architectureDiagram-NJMV4G6O-DiPor3UT.js +0 -36
- 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-DR8eD6QW.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/cose-bilkent-JH36ORCC-BBmR1bbX.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/ganttDiagram-FUAMR5RP-gtYBTu0B.js +0 -292
- 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-Cp4S4NOL.js +0 -153
- package/dist/assets/index-CpaIXRLp.js +0 -614
- package/dist/assets/index-Z81SMsgR.css +0 -1
- 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-D-8vqZ4-.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
|
@@ -10,6 +10,7 @@ const MAX_ATTEMPTS = 2_000;
|
|
|
10
10
|
const MAX_EVENT_CHARS = 48_000;
|
|
11
11
|
const RATE_WINDOW_MS = 60_000;
|
|
12
12
|
const RATE_LIMIT = 10;
|
|
13
|
+
const UNAUTHORIZED_REASON = "Invalid webhook URL or secret";
|
|
13
14
|
/** Unfinished (queued, running or waiting) runs one webhook may hold before
|
|
14
15
|
* new deliveries are refused with 429. A webhook can set its own limit; one
|
|
15
16
|
* fanning out a project manager's events needs more than a CI hook does. */
|
|
@@ -223,6 +224,8 @@ export class WebhookManager {
|
|
|
223
224
|
deliveries = [];
|
|
224
225
|
attempts = [];
|
|
225
226
|
rate = new Map();
|
|
227
|
+
/** Bad-secret requests folded into each webhook's rolling record. */
|
|
228
|
+
unauthorized = new Map();
|
|
226
229
|
constructor(options) {
|
|
227
230
|
this.options = options;
|
|
228
231
|
this.file = options.file ?? join(DATA_DIR, "webhooks.json");
|
|
@@ -305,6 +308,7 @@ export class WebhookManager {
|
|
|
305
308
|
this.deliveries = this.deliveries.filter((delivery) => !delivery.key.startsWith(`${trigger.endpointId}:`));
|
|
306
309
|
this.attempts = this.attempts.filter((attempt) => attempt.webhookId !== trigger.id);
|
|
307
310
|
this.rate.delete(trigger.endpointId);
|
|
311
|
+
this.unauthorized.delete(trigger.id);
|
|
308
312
|
this.options.cancelQueued?.(trigger.id, "The webhook was deleted before this delivery started");
|
|
309
313
|
this.save();
|
|
310
314
|
this.options.emit?.({ kind: "webhook.deleted", webhookId: id });
|
|
@@ -374,6 +378,33 @@ export class WebhookManager {
|
|
|
374
378
|
return null;
|
|
375
379
|
return this.recordRejectedForTrigger(trigger, statusCode, reason, event);
|
|
376
380
|
}
|
|
381
|
+
/** A request with a wrong secret can come from anyone who reaches the
|
|
382
|
+
* receiver, before any rate limit applies. Each webhook keeps one rolling
|
|
383
|
+
* record of them, updated in place and saved with the next real change, so
|
|
384
|
+
* a flood neither pushes real deliveries out of the shared history nor
|
|
385
|
+
* rewrites the file on every request. */
|
|
386
|
+
recordUnauthorized(endpointId, event = {}) {
|
|
387
|
+
const trigger = this.webhooks.find((candidate) => candidate.endpointId === endpointId);
|
|
388
|
+
if (!trigger)
|
|
389
|
+
return null;
|
|
390
|
+
const at = this.attempts.findLastIndex((attempt) => attempt.webhookId === trigger.id && attempt.outcome === "rejected" && attempt.statusCode === 401);
|
|
391
|
+
if (at === -1) {
|
|
392
|
+
this.unauthorized.set(trigger.id, 1);
|
|
393
|
+
return this.appendAttempt(trigger, event, { outcome: "rejected", statusCode: 401, reason: UNAUTHORIZED_REASON, deliveryId: event.deliveryId });
|
|
394
|
+
}
|
|
395
|
+
const count = (this.unauthorized.get(trigger.id) ?? 1) + 1;
|
|
396
|
+
this.unauthorized.set(trigger.id, count);
|
|
397
|
+
// Same id: clients replace the record they hold instead of adding one.
|
|
398
|
+
const attempt = this.buildAttempt(trigger, event, {
|
|
399
|
+
outcome: "rejected",
|
|
400
|
+
statusCode: 401,
|
|
401
|
+
reason: `${UNAUTHORIZED_REASON} (${count} requests)`,
|
|
402
|
+
deliveryId: event.deliveryId,
|
|
403
|
+
}, this.attempts[at].id);
|
|
404
|
+
this.attempts[at] = attempt;
|
|
405
|
+
this.options.emit?.({ kind: "webhook.attempt", attempt: { ...attempt } });
|
|
406
|
+
return attempt;
|
|
407
|
+
}
|
|
377
408
|
dispatch(trigger, event) {
|
|
378
409
|
if (!trigger.enabled)
|
|
379
410
|
fail(409, "This webhook is paused");
|
|
@@ -524,8 +555,16 @@ export class WebhookManager {
|
|
|
524
555
|
return attempt;
|
|
525
556
|
}
|
|
526
557
|
appendAttempt(trigger, event, details) {
|
|
558
|
+
const attempt = this.buildAttempt(trigger, event, details);
|
|
559
|
+
this.attempts.push(attempt);
|
|
560
|
+
if (this.attempts.length > MAX_ATTEMPTS)
|
|
561
|
+
this.attempts.splice(0, this.attempts.length - MAX_ATTEMPTS);
|
|
562
|
+
this.options.emit?.({ kind: "webhook.attempt", attempt: { ...attempt } });
|
|
563
|
+
return attempt;
|
|
564
|
+
}
|
|
565
|
+
buildAttempt(trigger, event, details, id = randomUUID()) {
|
|
527
566
|
const attempt = {
|
|
528
|
-
id
|
|
567
|
+
id,
|
|
529
568
|
webhookId: trigger.id,
|
|
530
569
|
receivedAt: this.now(),
|
|
531
570
|
outcome: details.outcome,
|
|
@@ -541,10 +580,6 @@ export class WebhookManager {
|
|
|
541
580
|
attempt.runId = details.runId;
|
|
542
581
|
if (details.reason)
|
|
543
582
|
attempt.reason = details.reason;
|
|
544
|
-
this.attempts.push(attempt);
|
|
545
|
-
if (this.attempts.length > MAX_ATTEMPTS)
|
|
546
|
-
this.attempts.splice(0, this.attempts.length - MAX_ATTEMPTS);
|
|
547
|
-
this.options.emit?.({ kind: "webhook.attempt", attempt: { ...attempt } });
|
|
548
583
|
return attempt;
|
|
549
584
|
}
|
|
550
585
|
emit(trigger) {
|
|
@@ -338,7 +338,12 @@ export async function createWorkspaceBackupSnapshot(dataDir, options, jobId) {
|
|
|
338
338
|
if (existsSync(sourceDb)) {
|
|
339
339
|
if (lstatSync(sourceDb).isSymbolicLink())
|
|
340
340
|
throw new Error("The message database must not be a symbolic link.");
|
|
341
|
-
|
|
341
|
+
// Another connection may still open this database meanwhile: a copy's
|
|
342
|
+
// status poll counts its chats (cloud-move.ts workspaceContents). Its
|
|
343
|
+
// open (WAL recovery) and close (checkpoint) keep a new reader out for a
|
|
344
|
+
// moment, and without a busy timeout the first backup step fails at once
|
|
345
|
+
// ("database is locked", or Node's "not an error"). Wait that moment out.
|
|
346
|
+
const db = new DatabaseSync(sourceDb, { readOnly: true, timeout: 5_000 });
|
|
342
347
|
// Node 26's native backup completion can wait for unrelated event-loop
|
|
343
348
|
// activity after an async scrypt. A scoped pulse prevents an idle server
|
|
344
349
|
// from waiting indefinitely; it owns no data and always stops here.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// Where a person enters the one-time code that signs an engine's CLI in on
|
|
2
|
+
// the machine running OpenMausBot (`codex login --device-auth`, `grok login
|
|
3
|
+
// --device-auth`). The server reads the page and the code from the CLI's
|
|
4
|
+
// output with these rules, and the app checks them again before it shows a
|
|
5
|
+
// link. Neither ever turns arbitrary output into a link, or lets a token ride
|
|
6
|
+
// along in one.
|
|
7
|
+
const CODEX_PAGE = "https://auth.openai.com/codex/device";
|
|
8
|
+
const RULES = {
|
|
9
|
+
codex: {
|
|
10
|
+
page: (value) => (/^https:\/\/auth\.openai\.com\/codex\/device\/?$/.test(value) ? CODEX_PAGE : null),
|
|
11
|
+
code: /^[A-Z0-9]{4,8}-[A-Z0-9]{4,8}$/,
|
|
12
|
+
},
|
|
13
|
+
grok: {
|
|
14
|
+
// xAI's own sign-in hosts. The page may carry the code itself (the
|
|
15
|
+
// provider's "complete" link); nothing else may ride in its query.
|
|
16
|
+
page: (value) => {
|
|
17
|
+
if (!/^https:\/\/[^\s#]+$/.test(value))
|
|
18
|
+
return null;
|
|
19
|
+
let url;
|
|
20
|
+
try {
|
|
21
|
+
url = new URL(value);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
if (url.username || url.password || url.port || !/(^|\.)(x\.ai|grok\.com)$/.test(url.hostname))
|
|
27
|
+
return null;
|
|
28
|
+
return [...url.searchParams.keys()].every((key) => key === "user_code") ? url.href : null;
|
|
29
|
+
},
|
|
30
|
+
code: /^[A-Z0-9]{4,12}(?:-[A-Z0-9]{2,12}){0,3}$/,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
/** The provider's own page for entering `userCode`, or null for anything
|
|
34
|
+
* else. A code carried in the page's link must be that same code. */
|
|
35
|
+
export function deviceSignInLink(provider, value, userCode) {
|
|
36
|
+
const page = value ? RULES[provider].page(value) : null;
|
|
37
|
+
if (!page)
|
|
38
|
+
return null;
|
|
39
|
+
return [...new URL(page).searchParams.values()].every((carried) => carried === userCode) ? page : null;
|
|
40
|
+
}
|
|
41
|
+
/** A one-time code as this provider formats it. */
|
|
42
|
+
export function isDeviceSignInCode(provider, value) {
|
|
43
|
+
return typeof value === "string" && RULES[provider].code.test(value);
|
|
44
|
+
}
|
|
45
|
+
/** The page and the code from a CLI's output, once both lines have arrived
|
|
46
|
+
* whole: output arrives in chunks that may stop halfway through a code, so
|
|
47
|
+
* the last, unfinished line is never read. `text` is already free of
|
|
48
|
+
* terminal styling. */
|
|
49
|
+
export function deviceSignInPrompt(provider, text) {
|
|
50
|
+
const lines = text.split(/\r?\n/).slice(0, -1).map((line) => line.trim());
|
|
51
|
+
const at = lines.findIndex((line) => RULES[provider].page(line) !== null);
|
|
52
|
+
if (at < 0)
|
|
53
|
+
return null;
|
|
54
|
+
const userCode = lines.slice(at + 1).map((line) => line.replace(/^code:\s*/i, "")).find((line) => isDeviceSignInCode(provider, line));
|
|
55
|
+
const authorizationUrl = userCode ? deviceSignInLink(provider, lines[at], userCode) : null;
|
|
56
|
+
return authorizationUrl && userCode ? { authorizationUrl, userCode } : null;
|
|
57
|
+
}
|
|
@@ -29,6 +29,8 @@ const task = z.object({
|
|
|
29
29
|
closedBy: z.object({ botId: key, name, at: timestamp }).optional(),
|
|
30
30
|
/** Only true travels. Absence is unpinned, including backups from before pins. */
|
|
31
31
|
pinned: z.literal(true).optional(),
|
|
32
|
+
/** A conversation's own turn ceiling. Absence keeps the group default. */
|
|
33
|
+
turnTimeoutMinutes: z.number().int().min(1).max(1_440).optional(),
|
|
32
34
|
activeLeafId: key.nullable(),
|
|
33
35
|
messages: z.array(message).max(100_000),
|
|
34
36
|
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** The same engine, model, effort and variant. */
|
|
2
|
+
export function sameModelSelection(a, b) {
|
|
3
|
+
if (!a || !b)
|
|
4
|
+
return a === b;
|
|
5
|
+
return a.instanceId === b.instanceId && a.model === b.model && a.effort === b.effort && a.variant === b.variant;
|
|
6
|
+
}
|
|
7
|
+
/** A bot's threads that run on a model of their own, different from the
|
|
8
|
+
* bot's: the ones "Switch them too" moves onto the bot's model. Reads the
|
|
9
|
+
* wire shape, where only followsBotModel === false is a thread's own pick, so
|
|
10
|
+
* a server too old to send it counts none. */
|
|
11
|
+
export function threadsOnOwnModel(botModel, tasks) {
|
|
12
|
+
return tasks.filter((task) => task.followsBotModel === false && !sameModelSelection(task.modelSelection ?? botModel, botModel));
|
|
13
|
+
}
|
|
@@ -16210,6 +16210,8 @@ var BROWSER_PROFILE_ID = /^[a-z0-9_-]{1,40}$/;
|
|
|
16210
16210
|
var FISH_TTS_MODELS = ["s2.1-pro", "s2.1-pro-free"];
|
|
16211
16211
|
var MIN_ROOM_TURN_TIMEOUT_MINUTES = 1;
|
|
16212
16212
|
var MAX_ROOM_TURN_TIMEOUT_MINUTES = 1440;
|
|
16213
|
+
var MIN_MCP_CALL_TIMEOUT_MINUTES = 1;
|
|
16214
|
+
var MAX_MCP_CALL_TIMEOUT_MINUTES = 60;
|
|
16213
16215
|
var DEFAULT_ROOM_HANDOFF_LIFETIME_MINUTES = 30;
|
|
16214
16216
|
var DEFAULT_ROOM_HANDOFF_MIN_RUNWAY_MINUTES = 10;
|
|
16215
16217
|
var DEFAULT_ROOM_HANDOFF_HARD_CAP_MINUTES = 240;
|
|
@@ -16255,6 +16257,11 @@ var roomConfigSchema = external_exports.object({
|
|
|
16255
16257
|
(rooms) => (rooms.handoffMinRunwayMinutes ?? DEFAULT_ROOM_HANDOFF_MIN_RUNWAY_MINUTES) <= (rooms.handoffLifetimeMinutes ?? DEFAULT_ROOM_HANDOFF_LIFETIME_MINUTES) && (rooms.handoffLifetimeMinutes ?? DEFAULT_ROOM_HANDOFF_LIFETIME_MINUTES) <= (rooms.handoffHardCapMinutes ?? DEFAULT_ROOM_HANDOFF_HARD_CAP_MINUTES),
|
|
16256
16258
|
{ message: "rooms handoff bounds must satisfy handoffMinRunwayMinutes <= handoffLifetimeMinutes <= handoffHardCapMinutes" }
|
|
16257
16259
|
);
|
|
16260
|
+
var mcpConfigSchema = external_exports.object({
|
|
16261
|
+
/** Ceiling (minutes) for one bot MCP tool call. Missing values resolve to
|
|
16262
|
+
* 10, preserving the historic chat-mcp-tools constant. */
|
|
16263
|
+
callTimeoutMinutes: external_exports.number().int().min(MIN_MCP_CALL_TIMEOUT_MINUTES).max(MAX_MCP_CALL_TIMEOUT_MINUTES).optional()
|
|
16264
|
+
}).strict();
|
|
16258
16265
|
var localVmConfigSchema = external_exports.object({
|
|
16259
16266
|
mode: external_exports.enum(["shared", "per-bot", "pool"]).optional(),
|
|
16260
16267
|
maxInstances: external_exports.number().int().min(MIN_LOCAL_VM_MAX_INSTANCES).max(MAX_LOCAL_VM_MAX_INSTANCES).optional(),
|
|
@@ -16593,6 +16600,7 @@ var appConfigSchema = external_exports.object({
|
|
|
16593
16600
|
* system language. Unknown tags degrade to English in the renderer. */
|
|
16594
16601
|
language: optionalText,
|
|
16595
16602
|
rooms: roomConfigSchema.optional(),
|
|
16603
|
+
mcp: mcpConfigSchema.optional(),
|
|
16596
16604
|
context: external_exports.object({
|
|
16597
16605
|
rebuildBytes: external_exports.number().int().min(1024).max(1e6).optional(),
|
|
16598
16606
|
compactAt: external_exports.number().positive().max(1e7).optional(),
|
|
@@ -12,17 +12,17 @@ import { createCipheriv, createDecipheriv, createHash, randomBytes, randomUUID a
|
|
|
12
12
|
import {
|
|
13
13
|
chmodSync,
|
|
14
14
|
closeSync as closeSync2,
|
|
15
|
-
constants,
|
|
15
|
+
constants as constants2,
|
|
16
16
|
cpSync,
|
|
17
17
|
createReadStream,
|
|
18
18
|
createWriteStream,
|
|
19
19
|
existsSync,
|
|
20
|
-
fstatSync,
|
|
20
|
+
fstatSync as fstatSync2,
|
|
21
21
|
fsyncSync as fsyncSync2,
|
|
22
|
-
lstatSync,
|
|
22
|
+
lstatSync as lstatSync2,
|
|
23
23
|
mkdirSync,
|
|
24
24
|
openSync as openSync2,
|
|
25
|
-
readFileSync,
|
|
25
|
+
readFileSync as readFileSync2,
|
|
26
26
|
readdirSync,
|
|
27
27
|
readSync,
|
|
28
28
|
realpathSync,
|
|
@@ -3007,7 +3007,18 @@ var To = (s4) => {
|
|
|
3007
3007
|
|
|
3008
3008
|
// server/atomic.ts
|
|
3009
3009
|
import { randomUUID } from "node:crypto";
|
|
3010
|
-
import {
|
|
3010
|
+
import {
|
|
3011
|
+
closeSync,
|
|
3012
|
+
constants,
|
|
3013
|
+
fstatSync,
|
|
3014
|
+
fsyncSync,
|
|
3015
|
+
lstatSync,
|
|
3016
|
+
openSync,
|
|
3017
|
+
readFileSync,
|
|
3018
|
+
renameSync,
|
|
3019
|
+
unlinkSync,
|
|
3020
|
+
writeFileSync
|
|
3021
|
+
} from "node:fs";
|
|
3011
3022
|
var RENAME_RETRY_DELAYS_MS = [5, 10, 20, 40, 80];
|
|
3012
3023
|
var RETRYABLE_RENAME_CODES = /* @__PURE__ */ new Set(["EPERM", "EACCES", "EBUSY"]);
|
|
3013
3024
|
function sleepSync(ms2) {
|
|
@@ -3031,7 +3042,7 @@ function writeFileAtomic(path, data, options2 = {}) {
|
|
|
3031
3042
|
try {
|
|
3032
3043
|
fd = openSync(tmp, "w", options2.mode);
|
|
3033
3044
|
writeFileSync(fd, data);
|
|
3034
|
-
fsyncSync(fd);
|
|
3045
|
+
if (options2.durable !== false) fsyncSync(fd);
|
|
3035
3046
|
closeSync(fd);
|
|
3036
3047
|
fd = null;
|
|
3037
3048
|
renameWithRetry(tmp, path);
|
|
@@ -18769,6 +18780,8 @@ var BROWSER_PROFILE_ID = /^[a-z0-9_-]{1,40}$/;
|
|
|
18769
18780
|
var FISH_TTS_MODELS = ["s2.1-pro", "s2.1-pro-free"];
|
|
18770
18781
|
var MIN_ROOM_TURN_TIMEOUT_MINUTES = 1;
|
|
18771
18782
|
var MAX_ROOM_TURN_TIMEOUT_MINUTES = 1440;
|
|
18783
|
+
var MIN_MCP_CALL_TIMEOUT_MINUTES = 1;
|
|
18784
|
+
var MAX_MCP_CALL_TIMEOUT_MINUTES = 60;
|
|
18772
18785
|
var DEFAULT_ROOM_HANDOFF_LIFETIME_MINUTES = 30;
|
|
18773
18786
|
var DEFAULT_ROOM_HANDOFF_MIN_RUNWAY_MINUTES = 10;
|
|
18774
18787
|
var DEFAULT_ROOM_HANDOFF_HARD_CAP_MINUTES = 240;
|
|
@@ -18814,6 +18827,11 @@ var roomConfigSchema = external_exports.object({
|
|
|
18814
18827
|
(rooms) => (rooms.handoffMinRunwayMinutes ?? DEFAULT_ROOM_HANDOFF_MIN_RUNWAY_MINUTES) <= (rooms.handoffLifetimeMinutes ?? DEFAULT_ROOM_HANDOFF_LIFETIME_MINUTES) && (rooms.handoffLifetimeMinutes ?? DEFAULT_ROOM_HANDOFF_LIFETIME_MINUTES) <= (rooms.handoffHardCapMinutes ?? DEFAULT_ROOM_HANDOFF_HARD_CAP_MINUTES),
|
|
18815
18828
|
{ message: "rooms handoff bounds must satisfy handoffMinRunwayMinutes <= handoffLifetimeMinutes <= handoffHardCapMinutes" }
|
|
18816
18829
|
);
|
|
18830
|
+
var mcpConfigSchema = external_exports.object({
|
|
18831
|
+
/** Ceiling (minutes) for one bot MCP tool call. Missing values resolve to
|
|
18832
|
+
* 10, preserving the historic chat-mcp-tools constant. */
|
|
18833
|
+
callTimeoutMinutes: external_exports.number().int().min(MIN_MCP_CALL_TIMEOUT_MINUTES).max(MAX_MCP_CALL_TIMEOUT_MINUTES).optional()
|
|
18834
|
+
}).strict();
|
|
18817
18835
|
var localVmConfigSchema = external_exports.object({
|
|
18818
18836
|
mode: external_exports.enum(["shared", "per-bot", "pool"]).optional(),
|
|
18819
18837
|
maxInstances: external_exports.number().int().min(MIN_LOCAL_VM_MAX_INSTANCES).max(MAX_LOCAL_VM_MAX_INSTANCES).optional(),
|
|
@@ -19152,6 +19170,7 @@ var appConfigSchema = external_exports.object({
|
|
|
19152
19170
|
* system language. Unknown tags degrade to English in the renderer. */
|
|
19153
19171
|
language: optionalText,
|
|
19154
19172
|
rooms: roomConfigSchema.optional(),
|
|
19173
|
+
mcp: mcpConfigSchema.optional(),
|
|
19155
19174
|
context: external_exports.object({
|
|
19156
19175
|
rebuildBytes: external_exports.number().int().min(1024).max(1e6).optional(),
|
|
19157
19176
|
compactAt: external_exports.number().positive().max(1e7).optional(),
|
|
@@ -19312,14 +19331,14 @@ function forbiddenArchivePath(path) {
|
|
|
19312
19331
|
}
|
|
19313
19332
|
function folder(path) {
|
|
19314
19333
|
mkdirSync(path, { recursive: true, mode: 448 });
|
|
19315
|
-
const stat =
|
|
19334
|
+
const stat = lstatSync2(path);
|
|
19316
19335
|
if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("The backup directory must be a real directory, not a symbolic link.");
|
|
19317
19336
|
chmodSync(path, 448);
|
|
19318
19337
|
}
|
|
19319
19338
|
function backupRoot(dataDir2) {
|
|
19320
19339
|
const root = resolve(dataDir2);
|
|
19321
19340
|
if (root === parse3(root).root) throw new Error("A filesystem root cannot be a workspace backup target.");
|
|
19322
|
-
const stat =
|
|
19341
|
+
const stat = lstatSync2(root);
|
|
19323
19342
|
if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("The workspace data directory must not be a symbolic link.");
|
|
19324
19343
|
const path = join2(root, ".backups");
|
|
19325
19344
|
folder(path);
|
|
@@ -19329,7 +19348,7 @@ function jobPath(dataDir2, id) {
|
|
|
19329
19348
|
if (!ID.test(id)) throw new Error("Invalid workspace backup identifier.");
|
|
19330
19349
|
const path = join2(backupRoot(dataDir2), id);
|
|
19331
19350
|
if (entryExists(path)) {
|
|
19332
|
-
const stat =
|
|
19351
|
+
const stat = lstatSync2(path);
|
|
19333
19352
|
if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("Unsafe workspace backup job directory.");
|
|
19334
19353
|
}
|
|
19335
19354
|
return path;
|
|
@@ -19347,7 +19366,7 @@ function record2(value) {
|
|
|
19347
19366
|
}
|
|
19348
19367
|
function entryExists(path) {
|
|
19349
19368
|
try {
|
|
19350
|
-
|
|
19369
|
+
lstatSync2(path);
|
|
19351
19370
|
return true;
|
|
19352
19371
|
} catch (error51) {
|
|
19353
19372
|
if (error51.code === "ENOENT") return false;
|
|
@@ -19355,11 +19374,11 @@ function entryExists(path) {
|
|
|
19355
19374
|
}
|
|
19356
19375
|
}
|
|
19357
19376
|
function privateJson(path) {
|
|
19358
|
-
const fd = openSync2(path,
|
|
19377
|
+
const fd = openSync2(path, constants2.O_RDONLY | constants2.O_NOFOLLOW);
|
|
19359
19378
|
try {
|
|
19360
|
-
const stat =
|
|
19379
|
+
const stat = fstatSync2(fd);
|
|
19361
19380
|
if (!stat.isFile() || stat.size > MAX_METADATA_BYTES) throw new Error("Workspace backup metadata is too large or is not a regular file.");
|
|
19362
|
-
return JSON.parse(
|
|
19381
|
+
return JSON.parse(readFileSync2(fd, "utf8"));
|
|
19363
19382
|
} finally {
|
|
19364
19383
|
closeSync2(fd);
|
|
19365
19384
|
}
|
|
@@ -19408,10 +19427,10 @@ function passwordKey(password, salt) {
|
|
|
19408
19427
|
});
|
|
19409
19428
|
}
|
|
19410
19429
|
function copyRegular(source, destination) {
|
|
19411
|
-
const input = openSync2(source,
|
|
19430
|
+
const input = openSync2(source, constants2.O_RDONLY | constants2.O_NOFOLLOW);
|
|
19412
19431
|
let output;
|
|
19413
19432
|
try {
|
|
19414
|
-
const before =
|
|
19433
|
+
const before = fstatSync2(input);
|
|
19415
19434
|
if (!before.isFile() || before.size > MAX_WORKSPACE_BACKUP_BYTES) throw new Error("A workspace file is not regular or exceeds the 10 GB backup limit.");
|
|
19416
19435
|
const mode = before.mode & 64 ? 448 : 384;
|
|
19417
19436
|
output = openSync2(destination, "wx", mode);
|
|
@@ -19427,8 +19446,8 @@ function copyRegular(source, destination) {
|
|
|
19427
19446
|
let offset = 0;
|
|
19428
19447
|
while (offset < count) offset += writeSync(output, chunk, offset, count - offset);
|
|
19429
19448
|
}
|
|
19430
|
-
const after =
|
|
19431
|
-
const current =
|
|
19449
|
+
const after = fstatSync2(input);
|
|
19450
|
+
const current = lstatSync2(source);
|
|
19432
19451
|
if (size !== before.size || after.mtimeMs !== before.mtimeMs || after.ctimeMs !== before.ctimeMs || current.ino !== before.ino || current.dev !== before.dev || current.isSymbolicLink()) {
|
|
19433
19452
|
throw new Error("A workspace file changed during backup. Stop its writer and retry.");
|
|
19434
19453
|
}
|
|
@@ -19440,9 +19459,9 @@ function copyRegular(source, destination) {
|
|
|
19440
19459
|
}
|
|
19441
19460
|
}
|
|
19442
19461
|
function hashFile(path) {
|
|
19443
|
-
const fd = openSync2(path,
|
|
19462
|
+
const fd = openSync2(path, constants2.O_RDONLY | constants2.O_NOFOLLOW);
|
|
19444
19463
|
try {
|
|
19445
|
-
if (!
|
|
19464
|
+
if (!fstatSync2(fd).isFile()) throw new Error("The workspace archive contains an unsafe file.");
|
|
19446
19465
|
const hash2 = createHash("sha256");
|
|
19447
19466
|
const chunk = Buffer.allocUnsafe(1024 * 1024);
|
|
19448
19467
|
for (; ; ) {
|
|
@@ -19499,8 +19518,8 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
|
|
|
19499
19518
|
const root = realpathSync(dataDir2);
|
|
19500
19519
|
const sourceDb = join2(root, "messages.db");
|
|
19501
19520
|
if (existsSync(sourceDb)) {
|
|
19502
|
-
if (
|
|
19503
|
-
const db = new DatabaseSync(sourceDb, { readOnly: true });
|
|
19521
|
+
if (lstatSync2(sourceDb).isSymbolicLink()) throw new Error("The message database must not be a symbolic link.");
|
|
19522
|
+
const db = new DatabaseSync(sourceDb, { readOnly: true, timeout: 5e3 });
|
|
19504
19523
|
const completionPulse = setInterval(() => {
|
|
19505
19524
|
}, 25);
|
|
19506
19525
|
try {
|
|
@@ -19524,7 +19543,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
|
|
|
19524
19543
|
if (forbiddenArchivePath(path2)) throw new Error("A workspace filename conflicts with a protected authentication or runtime path.");
|
|
19525
19544
|
if (!validRelative(path2)) throw new Error("A workspace filename cannot be safely restored on supported platforms.");
|
|
19526
19545
|
const source = join2(directory, name);
|
|
19527
|
-
const stat =
|
|
19546
|
+
const stat = lstatSync2(source);
|
|
19528
19547
|
if (name === "node_modules" && (stat.isDirectory() || stat.isSymbolicLink())) {
|
|
19529
19548
|
skippedDependencies++;
|
|
19530
19549
|
continue;
|
|
@@ -19568,7 +19587,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
|
|
|
19568
19587
|
}
|
|
19569
19588
|
writeJson(destination, value);
|
|
19570
19589
|
}
|
|
19571
|
-
copied = { size:
|
|
19590
|
+
copied = { size: lstatSync2(destination).size, mode: 384, sha256: hashFile(destination) };
|
|
19572
19591
|
} else copied = copyRegular(path2 === "messages.db" ? join2(snapshot, "messages-snapshot.db") : source, destination);
|
|
19573
19592
|
bytes += copied.size;
|
|
19574
19593
|
if (bytes > MAX_WORKSPACE_BACKUP_BYTES) throw new Error("The workspace exceeds the 10 GB backup limit.");
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: create-verification-skill
|
|
3
|
-
description: "Create one
|
|
3
|
+
description: "Create one skill that teaches a bot how to launch, drive, and verify a specific app or project. Use only when the user explicitly asks for a verification skill."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Create a verification skill
|
|
7
7
|
|
|
8
|
-
Create one compact, project-specific `SKILL.md` through
|
|
9
|
-
|
|
10
|
-
silently add scripts to the user's project.
|
|
8
|
+
Create one compact, project-specific `SKILL.md` through `skill_manage`, which
|
|
9
|
+
shows the person every change with an Undo. Do not install skill files
|
|
10
|
+
directly or silently add scripts to the user's project.
|
|
11
11
|
|
|
12
12
|
## 1. Inspect before drafting
|
|
13
13
|
|
|
@@ -52,13 +52,14 @@ The proposed `SKILL.md` must contain YAML frontmatter and these sections:
|
|
|
52
52
|
Keep it concise. Evidence about the user path is input to the draft—not
|
|
53
53
|
permission to retain secrets, audio, screenshots, or coordinates.
|
|
54
54
|
|
|
55
|
-
## 4.
|
|
55
|
+
## 4. Save it
|
|
56
56
|
|
|
57
57
|
Call `skills_list` first. If an existing skill already covers the project,
|
|
58
58
|
report that and do not overwrite it. Otherwise call `skill_manage` with
|
|
59
59
|
`action="create"`, the complete `skill_md`, a short `gist`, and the exact
|
|
60
60
|
source used (repository path, URL, or `conversation`).
|
|
61
61
|
|
|
62
|
-
`skill_manage`
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
Read the `skill_manage` result. If it applied, tell the user the skill's name,
|
|
63
|
+
that it is on, and that they can undo it from the chat. Only if it is pending,
|
|
64
|
+
tell them it stays inactive until they decide on the in-app card. Never claim
|
|
65
|
+
it was enabled without an applied result.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "create-verification-skill",
|
|
3
3
|
"name": "Create Verification Skill",
|
|
4
4
|
"version": "0.1.0",
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "Write one verification skill for a specific app or project.",
|
|
6
6
|
"defaultEnabled": true,
|
|
7
7
|
"triggerTerms": [
|
|
8
8
|
"/create-verification-skill",
|