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.
Files changed (434) hide show
  1. package/dist/assets/ActivityPanel-CgUgtumZ.js +1 -0
  2. package/dist/assets/BotSettingsDialog-lJj6oiir.js +7 -0
  3. package/dist/assets/CloudBackendPicker-C5-_arUz.js +1 -0
  4. package/dist/assets/ComputerPanel-euJ2CSlH.js +1 -0
  5. package/dist/assets/DesktopViewer-XCln1Pn_.js +5 -0
  6. package/dist/assets/InspectorPanel-DKYyQZlo.js +5 -0
  7. package/dist/assets/KeyboardShortcutsModal-DkkZWZRI.js +1 -0
  8. package/dist/assets/LocalVmWorkspace-Cwt3_XSx.js +1 -0
  9. package/dist/assets/MacLocalControl-B28RbdCS.js +1 -0
  10. package/dist/assets/NewBotDialog-dMWDs5xm.js +2 -0
  11. package/dist/assets/RemoteAgentSettingsPanel-B5KWXnqH.js +1 -0
  12. package/dist/assets/RoutinesPage-DOosRYDK.js +1 -0
  13. package/dist/assets/RoutinesSection-uOfOTfkB.js +1 -0
  14. package/dist/assets/SettingsModal-BTGkFbj1.js +11 -0
  15. package/dist/assets/TeamMapPage-DqNdJn96.js +8 -0
  16. package/dist/assets/TriggersPanel-c6xkG9mi.js +1 -0
  17. package/dist/assets/VisibilitySection-DD4ffIR5.js +12 -0
  18. package/dist/assets/WebhooksPanel-Cz17K-_O.js +3 -0
  19. package/dist/assets/{abnfDiagram-O67JEVCF-k1UCNXb7.js → abnfDiagram-O67JEVCF-CX6tDpkg.js} +1 -1
  20. package/dist/assets/activity-BAVWO0Zj.js +1 -0
  21. package/dist/assets/{arc-BUWGa9UU.js → arc-h45-9NFk.js} +1 -1
  22. package/dist/assets/architectureDiagram-NJMV4G6O-CgLFXbg6.js +36 -0
  23. package/dist/assets/{blockDiagram-BEXU5L5S-Ag9nLW4H.js → blockDiagram-BEXU5L5S-DGDFFc9M.js} +1 -1
  24. package/dist/assets/brain-CeCdoTb2.js +1 -0
  25. package/dist/assets/{c4Diagram-YGBWAQC7-Bh0sjgUa.js → c4Diagram-YGBWAQC7-B9aklAUj.js} +1 -1
  26. package/dist/assets/channel-TsOXCiPg.js +1 -0
  27. package/dist/assets/{chunk-2Q5K7J3B-BFBcIIqu.js → chunk-2Q5K7J3B-BC0KmWsM.js} +1 -1
  28. package/dist/assets/{chunk-3FUC2YCW-Dvfpex-f.js → chunk-3FUC2YCW-BbDFHsJ1.js} +2 -2
  29. package/dist/assets/{chunk-5VM5RSS4-CMjP2YZW.js → chunk-5VM5RSS4-DtGbsjOM.js} +1 -1
  30. package/dist/assets/{chunk-GTNCS2PH-BryoeTc7.js → chunk-GTNCS2PH-VMghMcEl.js} +1 -1
  31. package/dist/assets/{chunk-GWA4HPMP-BhfvcchO.js → chunk-GWA4HPMP-BP_JyGWQ.js} +1 -1
  32. package/dist/assets/{chunk-JWPE2WC7-bcCVp8rp.js → chunk-JWPE2WC7-CYFyzgAU.js} +1 -1
  33. package/dist/assets/{chunk-NETBCI7D-yKIjIlkQ.js → chunk-NETBCI7D-DBNa_kqm.js} +1 -1
  34. package/dist/assets/{chunk-WEXAMYUT-D3Zqbmup.js → chunk-WEXAMYUT-BKEeM7CJ.js} +1 -1
  35. package/dist/assets/{chunk-XXDRQBXY-CjVoIMG6.js → chunk-XXDRQBXY-C__m3ZXl.js} +1 -1
  36. package/dist/assets/{classDiagram-v2-NBCMYWYE-mUCWdVyH.js → classDiagram-v2-NBCMYWYE-CBUrTSAX.js} +1 -1
  37. package/dist/assets/computer-control-NLov352p.js +1 -0
  38. package/dist/assets/core-6lvx-ypA.js +12 -0
  39. package/dist/assets/cose-bilkent-JH36ORCC-GRfL-1Vb.js +1 -0
  40. package/dist/assets/cpp-DddhVWhK.js +1 -0
  41. package/dist/assets/{cynefin-OW5HDTMX-BpRrxoO4.js → cynefin-OW5HDTMX-LopwGUjm.js} +1 -1
  42. package/dist/assets/{cynefinDiagram-VND7K2PF-D3VBWCPK.js → cynefinDiagram-VND7K2PF-DSB8ZRNS.js} +1 -1
  43. package/dist/assets/{dagre-6A5THRUB-DxEIACOO.js → dagre-6A5THRUB-DL3Kgdfk.js} +1 -1
  44. package/dist/assets/{diagram-22UHCM2B-BANgZEOS.js → diagram-22UHCM2B-DIxN34BM.js} +1 -1
  45. package/dist/assets/{diagram-3UASUU5V-Cnq7nJir.js → diagram-3UASUU5V-CJnSvXaI.js} +1 -1
  46. package/dist/assets/{diagram-ATOU4E4O-4TBDIWnz.js → diagram-ATOU4E4O-C-XF-lO8.js} +1 -1
  47. package/dist/assets/{diagram-CDSNMT55-CD_B39D4.js → diagram-CDSNMT55-Df2yZPi_.js} +1 -1
  48. package/dist/assets/{diagram-MLGK6HIB-CzvnFhEC.js → diagram-MLGK6HIB-BBs9oZFs.js} +1 -1
  49. package/dist/assets/{diagram-MPIPVDR6-C4w2SNml.js → diagram-MPIPVDR6-CEbK11mM.js} +1 -1
  50. package/dist/assets/{ebnfDiagram-ZINNZB2B-gkUEBm2s.js → ebnfDiagram-ZINNZB2B-BNq6Yv3C.js} +1 -1
  51. package/dist/assets/{elk-276RUBZZ-B_56X6mw.js → elk-276RUBZZ-CFbQ2bGm.js} +1 -1
  52. package/dist/assets/engine-javascript-D5Xfc425.js +141 -0
  53. package/dist/assets/{erDiagram-OPXOYQCR-C_oByoDS.js → erDiagram-OPXOYQCR-Bz8vmjN4.js} +1 -1
  54. package/dist/assets/{flowDiagram-KWPJA3E3-CR9xXJkC.js → flowDiagram-KWPJA3E3-cQUfEYrx.js} +1 -1
  55. package/dist/assets/ganttDiagram-FUAMR5RP-BY8n9tbI.js +292 -0
  56. package/dist/assets/{gitGraphDiagram-X574FWY7-VJ6-Tp_p.js → gitGraphDiagram-X574FWY7-KduSOMDN.js} +1 -1
  57. package/dist/assets/image-plus-DNIWU160.js +1 -0
  58. package/dist/assets/index-C8xb62XS.js +585 -0
  59. package/dist/assets/index-DbN_Hfjs.css +1 -0
  60. package/dist/assets/{infoDiagram-VRGFBTTK-2Lu9te4D.js → infoDiagram-VRGFBTTK-xBKgUkpL.js} +1 -1
  61. package/dist/assets/{ishikawaDiagram-OU5B5YK6-DR49XY-e.js → ishikawaDiagram-OU5B5YK6-_ei09tAJ.js} +1 -1
  62. package/dist/assets/{journeyDiagram-ZHPQQLJL-ZoR0M305.js → journeyDiagram-ZHPQQLJL-Fp49MkSp.js} +1 -1
  63. package/dist/assets/{kanban-definition-PNTS6WVX-DLKHxrO-.js → kanban-definition-PNTS6WVX-CY9lLm7V.js} +1 -1
  64. package/dist/assets/{linear-BASsfWly.js → linear-D2ai4eM2.js} +1 -1
  65. package/dist/assets/{mermaid.core-BVidiPkk.js → mermaid.core-DP6qPqu1.js} +5 -5
  66. package/dist/assets/{mindmap-definition-NLK3R4M7-g_Qx0U5C.js → mindmap-definition-NLK3R4M7-g1ynEw_d.js} +1 -1
  67. package/dist/assets/module-DCUsy2BQ.js +3 -0
  68. package/dist/assets/page-visible-BZn8304W.js +1 -0
  69. package/dist/assets/{pegDiagram-GJSIUBJH-DI9Cjs8w.js → pegDiagram-GJSIUBJH-Bt4ObsZj.js} +1 -1
  70. package/dist/assets/{pieDiagram-5QR66LMP-sRI0Uhr5.js → pieDiagram-5QR66LMP-CeLld8bY.js} +1 -1
  71. package/dist/assets/{quadrantDiagram-O4NWA36T-CamKTby3.js → quadrantDiagram-O4NWA36T-D4WWZw3x.js} +1 -1
  72. package/dist/assets/{railroadDiagram-XR7U4H2S-DOLlkbf3.js → railroadDiagram-XR7U4H2S-D95P5NqU.js} +1 -1
  73. package/dist/assets/remote-desktop-panel-DOIMmT4T.js +1 -0
  74. package/dist/assets/{requirementDiagram-PLB6GJNP-DrRQ5r97.js → requirementDiagram-PLB6GJNP-D12p3RhR.js} +1 -1
  75. package/dist/assets/ruby-Ct1eTYOr.js +1 -0
  76. package/dist/assets/{sankeyDiagram-IPEJSGJF-DGS_lXcX.js → sankeyDiagram-IPEJSGJF-Co26Dwcs.js} +1 -1
  77. package/dist/assets/{sequenceDiagram-PO4LG4MO-CkjWqwtf.js → sequenceDiagram-PO4LG4MO-y5YxaDKt.js} +1 -1
  78. package/dist/assets/{sizeCapture-INFHLROL-CepRgful.js → sizeCapture-INFHLROL-D49hZ8U5.js} +1 -1
  79. package/dist/assets/{stateDiagram-v2-GCMORJYK-hykr-9RS.js → stateDiagram-v2-GCMORJYK-C0sylr-r.js} +1 -1
  80. package/dist/assets/{swimlanes-2SLR337P-CKOHEZbI.js → swimlanes-2SLR337P-DmRWsDIs.js} +1 -1
  81. package/dist/assets/swimlanesDiagram-TC7HE7FX-DzhbBHtd.js +8 -0
  82. package/dist/assets/table-file.worker-KkMx-SNx.js +10 -0
  83. package/dist/assets/{timeline-definition-EJHVYXUP-CB8pJ6AC.js → timeline-definition-EJHVYXUP-DVmHYs3w.js} +1 -1
  84. package/dist/assets/{usecaseDiagram-POWQR4AR-DrclJHdl.js → usecaseDiagram-POWQR4AR-BQ1q0VV6.js} +1 -1
  85. package/dist/assets/user-B9lohN4n.js +1 -0
  86. package/dist/assets/{vennDiagram-UO4OBE2U-zS23qjv8.js → vennDiagram-UO4OBE2U-C_cnfST0.js} +1 -1
  87. package/dist/assets/{wardleyDiagram-VNRHLVJA-52jgeKxz.js → wardleyDiagram-VNRHLVJA-Bb3BSu12.js} +1 -1
  88. package/dist/assets/{xychartDiagram-PMCCYNJV-DSdl9rQ8.js → xychartDiagram-PMCCYNJV-CcwEuuEi.js} +1 -1
  89. package/dist/index.html +2 -2
  90. package/dist-server/cloud-home-start.js +19 -8
  91. package/dist-server/container-mcp.js +8 -0
  92. package/dist-server/desktop-entry.mjs +54 -0
  93. package/dist-server/drivers/agents-proxy.js +30 -12
  94. package/dist-server/index.js +2745 -1487
  95. package/dist-server/openmausbot.js +1004 -642
  96. package/dist-server/pair-cli.js +1004 -642
  97. package/dist-server/permission-proxy.js +2 -0
  98. package/dist-server/server/activity.js +2 -0
  99. package/dist-server/server/atomic.js +70 -2
  100. package/dist-server/server/checkpoints.js +55 -39
  101. package/dist-server/server/cloud-home-start.js +3 -3
  102. package/dist-server/server/config.js +22 -1
  103. package/dist-server/server/connector-card-text.js +15 -0
  104. package/dist-server/server/default-model-selection.js +7 -4
  105. package/dist-server/server/direct-apply.js +20 -0
  106. package/dist-server/server/drivers/acp/core.js +10 -0
  107. package/dist-server/server/drivers/acp/grok.js +47 -5
  108. package/dist-server/server/drivers/agents-call.js +1 -1
  109. package/dist-server/server/drivers/agents-catalog.js +34 -11
  110. package/dist-server/server/drivers/agents-proxy.js +1 -0
  111. package/dist-server/server/drivers/chat-mcp-tools.js +5 -3
  112. package/dist-server/server/drivers/claude-login-auth.js +1 -1
  113. package/dist-server/server/drivers/claude.js +35 -11
  114. package/dist-server/server/drivers/codex-device-auth.js +27 -319
  115. package/dist-server/server/drivers/codex.js +147 -24
  116. package/dist-server/server/drivers/device-auth.js +343 -0
  117. package/dist-server/server/drivers/openai-chat.js +17 -8
  118. package/dist-server/server/fleet-agent.js +18 -5
  119. package/dist-server/server/harness/http.js +5 -2
  120. package/dist-server/server/harness/registry.js +82 -45
  121. package/dist-server/server/harness-capabilities.js +7 -4
  122. package/dist-server/server/hosted-models.js +3 -1
  123. package/dist-server/server/index.js +471 -77
  124. package/dist-server/server/key-rejections.js +57 -0
  125. package/dist-server/server/mcp-oauth.js +125 -47
  126. package/dist-server/server/message-file.js +102 -7
  127. package/dist-server/server/model-requests.js +55 -4
  128. package/dist-server/server/permission-proxy.js +4 -0
  129. package/dist-server/server/profile-requests.js +80 -4
  130. package/dist-server/server/provider-key-check.js +5 -1
  131. package/dist-server/server/request-auth.js +2 -1
  132. package/dist-server/server/room-turn-timeout.js +28 -0
  133. package/dist-server/server/routes/thread-models.js +36 -0
  134. package/dist-server/server/routes/undo.js +17 -0
  135. package/dist-server/server/routine-requests.js +210 -6
  136. package/dist-server/server/routines.js +2 -2
  137. package/dist-server/server/setup-mode.js +1 -1
  138. package/dist-server/server/skill-learn.js +2 -2
  139. package/dist-server/server/skills.js +33 -2
  140. package/dist-server/server/store.js +148 -60
  141. package/dist-server/server/system-prompt.js +1 -1
  142. package/dist-server/server/team-backup.js +19 -4
  143. package/dist-server/server/thread-model.js +25 -0
  144. package/dist-server/server/turn-continuation.js +17 -16
  145. package/dist-server/server/webhook-ingress.js +8 -3
  146. package/dist-server/server/webhooks.js +40 -5
  147. package/dist-server/server/workspace-backup.js +6 -1
  148. package/dist-server/shared/device-sign-in.js +57 -0
  149. package/dist-server/shared/team-backup.js +2 -0
  150. package/dist-server/shared/thread-model.js +13 -0
  151. package/dist-server/vps-container-mcp.js +8 -0
  152. package/dist-server/workspace-backup.worker.js +42 -23
  153. package/package.json +1 -1
  154. package/skills/create-verification-skill/SKILL.md +9 -8
  155. package/skills/create-verification-skill/manifest.json +1 -1
  156. package/dist/assets/DesktopViewer-CPidMCtt.js +0 -5
  157. package/dist/assets/abap-BdImnpbu.js +0 -1
  158. package/dist/assets/actionscript-3-B3316cI-.js +0 -1
  159. package/dist/assets/ada-bCR0ucgS.js +0 -1
  160. package/dist/assets/ahk-CsyLZFj1.js +0 -1
  161. package/dist/assets/ahk2-8Zs4aa1G.js +0 -1
  162. package/dist/assets/andromeeda-C4gqWexZ.js +0 -1
  163. package/dist/assets/angular-html-DA-rfuFy.js +0 -1
  164. package/dist/assets/angular-ts-BrjP3tb8.js +0 -1
  165. package/dist/assets/apache-Pmp26Uib.js +0 -1
  166. package/dist/assets/apex-DhZFqWV2.js +0 -1
  167. package/dist/assets/apl-CORt7UWP.js +0 -1
  168. package/dist/assets/applescript-Co6uUVPk.js +0 -1
  169. package/dist/assets/ara-BRHolxvo.js +0 -1
  170. package/dist/assets/architectureDiagram-NJMV4G6O-DiPor3UT.js +0 -36
  171. package/dist/assets/asciidoc-CSVQ5wI8.js +0 -1
  172. package/dist/assets/asm-D_Q5rh1f.js +0 -1
  173. package/dist/assets/astro-HNnZUWAn.js +0 -1
  174. package/dist/assets/aurora-x-D-2ljcwZ.js +0 -1
  175. package/dist/assets/awk-DMzUqQB5.js +0 -1
  176. package/dist/assets/ayu-dark-DYE7WIF3.js +0 -1
  177. package/dist/assets/ayu-light-BA47KaF1.js +0 -1
  178. package/dist/assets/ayu-mirage-32ctXXKs.js +0 -1
  179. package/dist/assets/ballerina-BFfxhgS-.js +0 -1
  180. package/dist/assets/bat-CickPsom.js +0 -1
  181. package/dist/assets/beancount-k_qm7-4y.js +0 -1
  182. package/dist/assets/berry-uYugtg8r.js +0 -1
  183. package/dist/assets/bibtex-CHM0blh-.js +0 -1
  184. package/dist/assets/bicep-Bmn6On1c.js +0 -1
  185. package/dist/assets/bird2-Bx8U0n9b.js +0 -1
  186. package/dist/assets/blade-2xfisSek.js +0 -1
  187. package/dist/assets/bsl-DlhNcFeZ.js +0 -1
  188. package/dist/assets/c3-Dp5svz6Z.js +0 -1
  189. package/dist/assets/cadence-Bv_4Rxtq.js +0 -1
  190. package/dist/assets/cairo-KRGpt6FW.js +0 -1
  191. package/dist/assets/catppuccin-frappe-CZL1YF0i.js +0 -1
  192. package/dist/assets/catppuccin-latte-DH-8KZSZ.js +0 -1
  193. package/dist/assets/catppuccin-macchiato-B7yYVSCf.js +0 -1
  194. package/dist/assets/catppuccin-mocha-Ct7hS0mc.js +0 -1
  195. package/dist/assets/channel-DR8eD6QW.js +0 -1
  196. package/dist/assets/chapel-DTp_pixX.js +0 -1
  197. package/dist/assets/clarity-Dn5IMItf.js +0 -1
  198. package/dist/assets/clojure-P80f7IUj.js +0 -1
  199. package/dist/assets/cmake-D1j8_8rp.js +0 -1
  200. package/dist/assets/cobol-nBiQ_Alo.js +0 -1
  201. package/dist/assets/codeowners-Bp6g37R7.js +0 -1
  202. package/dist/assets/codeql-DsOJ9woJ.js +0 -1
  203. package/dist/assets/coffee-Ch7k5sss.js +0 -1
  204. package/dist/assets/common-lisp-Cg-RD9OK.js +0 -1
  205. package/dist/assets/coq-C7JzOVbR.js +0 -1
  206. package/dist/assets/cose-bilkent-JH36ORCC-BBmR1bbX.js +0 -1
  207. package/dist/assets/cpp-BMRokrvK.js +0 -1
  208. package/dist/assets/crystal-DGywbUpC.js +0 -1
  209. package/dist/assets/csv-fuZLfV_i.js +0 -1
  210. package/dist/assets/cue-D82EKSYY.js +0 -1
  211. package/dist/assets/cypher-COkxafJQ.js +0 -1
  212. package/dist/assets/d-85-TOEBH.js +0 -1
  213. package/dist/assets/dark-plus-C3mMm8J8.js +0 -1
  214. package/dist/assets/dax-CEL-wOlO.js +0 -1
  215. package/dist/assets/desktop-BmXAJ9_W.js +0 -1
  216. package/dist/assets/dotenv-Da5cRb03.js +0 -1
  217. package/dist/assets/dracula-BzJJZx-M.js +0 -1
  218. package/dist/assets/dracula-soft-BXkSAIEj.js +0 -1
  219. package/dist/assets/dream-maker-BtqSS_iP.js +0 -1
  220. package/dist/assets/edge-FbVlp4U3.js +0 -1
  221. package/dist/assets/elixir-CkH2-t6x.js +0 -1
  222. package/dist/assets/elm-DbKCFpqz.js +0 -1
  223. package/dist/assets/emacs-lisp-C_m_b--Z.js +0 -1
  224. package/dist/assets/erb-DXfck5VN.js +0 -1
  225. package/dist/assets/erlang-DsQrWhSR.js +0 -1
  226. package/dist/assets/everforest-dark-BgDCqdQA.js +0 -1
  227. package/dist/assets/everforest-light-C8M2exoo.js +0 -1
  228. package/dist/assets/fennel-BYunw83y.js +0 -1
  229. package/dist/assets/fluent-C4IJs8-o.js +0 -1
  230. package/dist/assets/fortran-fixed-form-CkoXwp7k.js +0 -1
  231. package/dist/assets/fortran-free-form-BxgE0vQu.js +0 -1
  232. package/dist/assets/fsharp-CXgrBDvD.js +0 -1
  233. package/dist/assets/ganttDiagram-FUAMR5RP-gtYBTu0B.js +0 -292
  234. package/dist/assets/gdresource-TyuKm33G.js +0 -1
  235. package/dist/assets/gdscript-DqcFQ5yU.js +0 -1
  236. package/dist/assets/gdshader-DkwncUOv.js +0 -1
  237. package/dist/assets/genie-D0YGMca9.js +0 -1
  238. package/dist/assets/gherkin-DyxjwDmM.js +0 -1
  239. package/dist/assets/git-commit-F4YmCXRG.js +0 -1
  240. package/dist/assets/git-rebase-r7XF79zn.js +0 -1
  241. package/dist/assets/github-dark-DHJKELXO.js +0 -1
  242. package/dist/assets/github-dark-dimmed-DH5Ifo-i.js +0 -1
  243. package/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -1
  244. package/dist/assets/github-light-DAi9KRSo.js +0 -1
  245. package/dist/assets/github-light-high-contrast-BfjtVDDH.js +0 -1
  246. package/dist/assets/gleam-BspZqrRM.js +0 -1
  247. package/dist/assets/glimmer-js-ByusRIyA.js +0 -1
  248. package/dist/assets/glimmer-ts-BfAWNZQY.js +0 -1
  249. package/dist/assets/glsl-DplSGwfg.js +0 -1
  250. package/dist/assets/gn-n2N0HUVH.js +0 -1
  251. package/dist/assets/gnuplot-DdkO51Og.js +0 -1
  252. package/dist/assets/groovy-gcz8RCvz.js +0 -1
  253. package/dist/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -1
  254. package/dist/assets/gruvbox-dark-medium-GsRaNv29.js +0 -1
  255. package/dist/assets/gruvbox-dark-soft-CVdnzihN.js +0 -1
  256. package/dist/assets/gruvbox-light-hard-CH1njM8p.js +0 -1
  257. package/dist/assets/gruvbox-light-medium-DRw_LuNl.js +0 -1
  258. package/dist/assets/gruvbox-light-soft-hJgmCMqR.js +0 -1
  259. package/dist/assets/hack-BWmVpMyf.js +0 -1
  260. package/dist/assets/haml-D5jkg6IW.js +0 -1
  261. package/dist/assets/handlebars-BpdQsYii.js +0 -1
  262. package/dist/assets/haskell-Df6bDoY_.js +0 -1
  263. package/dist/assets/haxe-CfZj7gIn.js +0 -1
  264. package/dist/assets/hcl-BWvSN4gD.js +0 -1
  265. package/dist/assets/hjson-D5-asLiD.js +0 -1
  266. package/dist/assets/hlsl-D3lLCCz7.js +0 -1
  267. package/dist/assets/horizon-BUw7H-hv.js +0 -1
  268. package/dist/assets/horizon-bright-CUuTKBJd.js +0 -1
  269. package/dist/assets/houston-DnULxvSX.js +0 -1
  270. package/dist/assets/html-derivative-DlHx6ybY.js +0 -1
  271. package/dist/assets/http-jrhK8wxY.js +0 -1
  272. package/dist/assets/hurl-irOxFIW8.js +0 -1
  273. package/dist/assets/hxml-2-FPmUDs.js +0 -1
  274. package/dist/assets/hy-DFXneXwc.js +0 -1
  275. package/dist/assets/imba-DGztddWO.js +0 -1
  276. package/dist/assets/index-Cp4S4NOL.js +0 -153
  277. package/dist/assets/index-CpaIXRLp.js +0 -614
  278. package/dist/assets/index-Z81SMsgR.css +0 -1
  279. package/dist/assets/ini-BEwlwnbL.js +0 -1
  280. package/dist/assets/jinja-f2NsQr07.js +0 -1
  281. package/dist/assets/jison-wvAkD_A8.js +0 -1
  282. package/dist/assets/jsonl-DcaNXYhu.js +0 -1
  283. package/dist/assets/jsonnet-DFQXde-d.js +0 -1
  284. package/dist/assets/jssm-C2t-YnRu.js +0 -1
  285. package/dist/assets/julia-5Bft2YPA.js +0 -1
  286. package/dist/assets/just-Cwhn7H3k.js +0 -1
  287. package/dist/assets/kanagawa-dragon-BuwD2xS4.js +0 -1
  288. package/dist/assets/kanagawa-lotus-C3DzagqV.js +0 -1
  289. package/dist/assets/kanagawa-wave-DFGoQZhC.js +0 -1
  290. package/dist/assets/kdl-DV7GczEv.js +0 -1
  291. package/dist/assets/kusto-wEQ09or8.js +0 -1
  292. package/dist/assets/laserwave-DUszq2jm.js +0 -1
  293. package/dist/assets/latex-D5pSuvFb.js +0 -1
  294. package/dist/assets/lean-BZvkOJ9d.js +0 -1
  295. package/dist/assets/light-plus-B7mTdjB0.js +0 -1
  296. package/dist/assets/liquid-C0sCDyMI.js +0 -1
  297. package/dist/assets/llvm-BZoOZj88.js +0 -1
  298. package/dist/assets/log-2UxHyX5q.js +0 -1
  299. package/dist/assets/logo-BtOb2qkB.js +0 -1
  300. package/dist/assets/luau-BnpPk5vE.js +0 -1
  301. package/dist/assets/marko-DjSrsDqO.js +0 -1
  302. package/dist/assets/material-theme-D5KoaKCx.js +0 -1
  303. package/dist/assets/material-theme-darker-BfHTSMKl.js +0 -1
  304. package/dist/assets/material-theme-lighter-B0m2ddpp.js +0 -1
  305. package/dist/assets/material-theme-ocean-CyktbL80.js +0 -1
  306. package/dist/assets/material-theme-palenight-Csfq5Kiy.js +0 -1
  307. package/dist/assets/matlab-D7o27uSR.js +0 -1
  308. package/dist/assets/mdc-D1_yUvq7.js +0 -1
  309. package/dist/assets/mermaid-CQcHuHx7.js +0 -1
  310. package/dist/assets/min-dark-CafNBF8u.js +0 -1
  311. package/dist/assets/min-light-CTRr51gU.js +0 -1
  312. package/dist/assets/mipsasm-CKIfxQSi.js +0 -1
  313. package/dist/assets/mojo-DJz3ZmWd.js +0 -1
  314. package/dist/assets/monokai-BRVnQi9A.js +0 -1
  315. package/dist/assets/moonbit-CHtswR0a.js +0 -1
  316. package/dist/assets/move-el3G9tDJ.js +0 -1
  317. package/dist/assets/narrat-DRg8JJMk.js +0 -1
  318. package/dist/assets/nextflow-C-mBbutL.js +0 -1
  319. package/dist/assets/nextflow-groovy-vE_lwT2v.js +0 -1
  320. package/dist/assets/nginx-BpAMiNFr.js +0 -1
  321. package/dist/assets/night-owl-C39BiMTA.js +0 -1
  322. package/dist/assets/night-owl-light-CMTm3GFP.js +0 -1
  323. package/dist/assets/nim-BIad80T-.js +0 -1
  324. package/dist/assets/nix-CwoSXNpI.js +0 -1
  325. package/dist/assets/nord-Ddv68eIx.js +0 -1
  326. package/dist/assets/nsis-BlV79W_Q.js +0 -1
  327. package/dist/assets/nushell-D3jzshHO.js +0 -1
  328. package/dist/assets/objective-c-DXmwc3jG.js +0 -1
  329. package/dist/assets/objective-cpp-CLxacb5B.js +0 -1
  330. package/dist/assets/ocaml-C0hk2d4L.js +0 -1
  331. package/dist/assets/odin-BBf5iR-q.js +0 -1
  332. package/dist/assets/one-dark-pro-DVMEJ2y_.js +0 -1
  333. package/dist/assets/one-light-C3Wv6jpd.js +0 -1
  334. package/dist/assets/openscad-C4EeE6gA.js +0 -1
  335. package/dist/assets/org-DM6o9KBp.js +0 -1
  336. package/dist/assets/pascal-D93ZcfNL.js +0 -1
  337. package/dist/assets/perl-B9cMNwum.js +0 -1
  338. package/dist/assets/pkl-u5AG7uiY.js +0 -1
  339. package/dist/assets/plastic-3e1v2bzS.js +0 -1
  340. package/dist/assets/plsql-ChMvpjG-.js +0 -1
  341. package/dist/assets/po-BTJTHyun.js +0 -1
  342. package/dist/assets/poimandres-CS3Unz2-.js +0 -1
  343. package/dist/assets/polar-C0HS_06l.js +0 -1
  344. package/dist/assets/postcss-CXtECtnM.js +0 -1
  345. package/dist/assets/powerquery-CEu0bR-o.js +0 -1
  346. package/dist/assets/prisma-Vru482bI.js +0 -1
  347. package/dist/assets/prolog-CbFg5uaA.js +0 -1
  348. package/dist/assets/pug-DKIMFp6K.js +0 -1
  349. package/dist/assets/puppet-BMWR74SV.js +0 -1
  350. package/dist/assets/purescript-CklMAg4u.js +0 -1
  351. package/dist/assets/qml-3beO22l8.js +0 -1
  352. package/dist/assets/qmldir-C8lEn-DE.js +0 -1
  353. package/dist/assets/qss-IeuSbFQv.js +0 -1
  354. package/dist/assets/racket-BqYA7rlc.js +0 -1
  355. package/dist/assets/raku-DXvB9xmW.js +0 -1
  356. package/dist/assets/razor-BjBPvh-w.js +0 -1
  357. package/dist/assets/rbs-CpoqiR4B.js +0 -1
  358. package/dist/assets/red-hvxz__6c.js +0 -1
  359. package/dist/assets/reg-C-SQnVFl.js +0 -1
  360. package/dist/assets/regexp-CDVJQ6XC.js +0 -1
  361. package/dist/assets/rel-C3B-1QV4.js +0 -1
  362. package/dist/assets/riscv-BM1_JUlF.js +0 -1
  363. package/dist/assets/ron-D8l8udqQ.js +0 -1
  364. package/dist/assets/rose-pine-5qJOZa0Y.js +0 -1
  365. package/dist/assets/rose-pine-dawn-zx0QlTCp.js +0 -1
  366. package/dist/assets/rose-pine-moon-C9pEdX9L.js +0 -1
  367. package/dist/assets/rosmsg-BJDFO7_C.js +0 -1
  368. package/dist/assets/rst-bs7f0vWN.js +0 -1
  369. package/dist/assets/ruby-C0TQ7zu5.js +0 -1
  370. package/dist/assets/sas-DEy46yEz.js +0 -1
  371. package/dist/assets/scala-CqE71os6.js +0 -1
  372. package/dist/assets/scheme-C98Dy4si.js +0 -1
  373. package/dist/assets/sdbl-DVxCFoDh.js +0 -1
  374. package/dist/assets/shaderlab-Dg9Lc6iA.js +0 -1
  375. package/dist/assets/shellsession-BADoaaVG.js +0 -1
  376. package/dist/assets/slack-dark-BthQWCQV.js +0 -1
  377. package/dist/assets/slack-ochin-DqwNpetd.js +0 -1
  378. package/dist/assets/smalltalk-BOQMe2GC.js +0 -1
  379. package/dist/assets/smithy-cds9vsN8.js +0 -1
  380. package/dist/assets/snazzy-light-Bw305WKR.js +0 -1
  381. package/dist/assets/solarized-dark-CpvCGNkr.js +0 -1
  382. package/dist/assets/solarized-light-Dlz6yCKv.js +0 -1
  383. package/dist/assets/solidity-DijEV5ha.js +0 -1
  384. package/dist/assets/soy-8wufbnw4.js +0 -1
  385. package/dist/assets/sparql-rVzFXLq3.js +0 -1
  386. package/dist/assets/splunk-BtCnVYZw.js +0 -1
  387. package/dist/assets/ssh-config-_ykCGR6B.js +0 -1
  388. package/dist/assets/stata-DI20mbqo.js +0 -1
  389. package/dist/assets/stylus-BEDo0Tqx.js +0 -1
  390. package/dist/assets/surrealql-Cjom0U5J.js +0 -1
  391. package/dist/assets/svelte-Cy7k_4gC.js +0 -1
  392. package/dist/assets/swimlanesDiagram-TC7HE7FX-D-8vqZ4-.js +0 -8
  393. package/dist/assets/synthwave-84-CbfX1IO0.js +0 -1
  394. package/dist/assets/system-verilog-0hqHdDBg.js +0 -1
  395. package/dist/assets/systemd-4A_iFExJ.js +0 -1
  396. package/dist/assets/talonscript-CkByrt1z.js +0 -1
  397. package/dist/assets/tasl-QIJgUcNo.js +0 -1
  398. package/dist/assets/tcl-dwOrl1Do.js +0 -1
  399. package/dist/assets/templ-DhtptRzy.js +0 -1
  400. package/dist/assets/terraform-BETggiCN.js +0 -1
  401. package/dist/assets/tex-D96PA37w.js +0 -1
  402. package/dist/assets/tokyo-night-hegEt444.js +0 -1
  403. package/dist/assets/ts-tags-D351s5mN.js +0 -1
  404. package/dist/assets/tsv-B_m7g4N7.js +0 -1
  405. package/dist/assets/turtle-BsS91CYL.js +0 -1
  406. package/dist/assets/twig-27uCiNez.js +0 -1
  407. package/dist/assets/typespec-CAFt9gP4.js +0 -1
  408. package/dist/assets/typst-BUadGCkm.js +0 -1
  409. package/dist/assets/v-BGw2Nkan.js +0 -1
  410. package/dist/assets/vala-CsfeWuGM.js +0 -1
  411. package/dist/assets/vb-Cu-pLBUe.js +0 -1
  412. package/dist/assets/verilog-nZwndyjY.js +0 -1
  413. package/dist/assets/vesper-DRje8inN.js +0 -1
  414. package/dist/assets/vhdl-CeAyd5Ju.js +0 -1
  415. package/dist/assets/viml-CJc9bBzg.js +0 -1
  416. package/dist/assets/vitesse-black-Bkuqu6BP.js +0 -1
  417. package/dist/assets/vitesse-dark-D0r3Knsf.js +0 -1
  418. package/dist/assets/vitesse-light-CVO1_9PV.js +0 -1
  419. package/dist/assets/vue-BqiEGhQt.js +0 -1
  420. package/dist/assets/vue-html-AaS7Mt5G.js +0 -1
  421. package/dist/assets/vue-vine-BoDAl6tE.js +0 -1
  422. package/dist/assets/vyper-CDx5xZoG.js +0 -1
  423. package/dist/assets/wasm-CG6Dc4jp.js +0 -1
  424. package/dist/assets/wenyan-BV7otONQ.js +0 -1
  425. package/dist/assets/wgsl-Dx-B1_4e.js +0 -1
  426. package/dist/assets/wikitext-BhOHFoWU.js +0 -1
  427. package/dist/assets/wit-5i3qLPDT.js +0 -1
  428. package/dist/assets/wolfram-lXgVvXCa.js +0 -1
  429. package/dist/assets/xsl-CtQFsRM5.js +0 -1
  430. package/dist/assets/zenscript-DVFEvuxE.js +0 -1
  431. package/dist/assets/zig-VOosw3JB.js +0 -1
  432. /package/dist/assets/{shellscript-Yzrsuije.js → bash-Yzrsuije.js} +0 -0
  433. /package/dist/assets/{docker-BcOcwvcX.js → dockerfile-BcOcwvcX.js} +0 -0
  434. /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: randomUUID(),
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
- const db = new DatabaseSync(sourceDb, { readOnly: true });
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 { closeSync, fsyncSync, openSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
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 = lstatSync(path);
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 = lstatSync(root);
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 = lstatSync(path);
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
- lstatSync(path);
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, constants.O_RDONLY | constants.O_NOFOLLOW);
19377
+ const fd = openSync2(path, constants2.O_RDONLY | constants2.O_NOFOLLOW);
19359
19378
  try {
19360
- const stat = fstatSync(fd);
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(readFileSync(fd, "utf8"));
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, constants.O_RDONLY | constants.O_NOFOLLOW);
19430
+ const input = openSync2(source, constants2.O_RDONLY | constants2.O_NOFOLLOW);
19412
19431
  let output;
19413
19432
  try {
19414
- const before = fstatSync(input);
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 = fstatSync(input);
19431
- const current = lstatSync(source);
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, constants.O_RDONLY | constants.O_NOFOLLOW);
19462
+ const fd = openSync2(path, constants2.O_RDONLY | constants2.O_NOFOLLOW);
19444
19463
  try {
19445
- if (!fstatSync(fd).isFile()) throw new Error("The workspace archive contains an unsafe file.");
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 (lstatSync(sourceDb).isSymbolicLink()) throw new Error("The message database must not be a symbolic link.");
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 = lstatSync(source);
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: lstatSync(destination).size, mode: 384, sha256: hashFile(destination) };
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,6 +1,6 @@
1
1
  {
2
2
  "name": "openmausbot",
3
- "version": "0.1.97",
3
+ "version": "0.1.99",
4
4
  "description": "Run the OpenMausBot server anywhere and pair your devices to it",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: create-verification-skill
3
- description: "Create one reviewed 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."
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 OpenMausBot's normal
9
- skill review flow. Do not install files directly, enable a skill yourself, or
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. Stage it for review
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` only stages the proposal. Tell the user its name and that it is
63
- inactive until they approve the in-app review card. Never claim it was enabled
64
- or scheduled automatically.
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": "Stage one reviewed verification skill for a specific app or project.",
5
+ "description": "Write one verification skill for a specific app or project.",
6
6
  "defaultEnabled": true,
7
7
  "triggerTerms": [
8
8
  "/create-verification-skill",