openmausbot 0.1.98 → 0.1.99

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