openmausbot 0.1.84 → 0.1.86

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 (230) hide show
  1. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  2. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  3. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  4. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  5. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  6. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  7. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  8. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  9. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  10. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  11. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  12. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  13. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  14. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  15. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  16. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  17. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  18. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  19. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  20. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  21. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  22. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  23. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  24. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  25. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  26. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  27. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  28. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  29. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  30. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  31. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  32. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  33. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  34. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  35. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  36. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  37. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  38. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  39. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  40. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  41. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  42. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  43. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  44. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  45. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  46. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  47. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  48. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  49. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  50. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  51. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  52. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  53. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  54. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  55. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  56. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  57. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  58. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  59. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  60. package/dist/assets/abnfDiagram-O67JEVCF-DpUZNnFD.js +1 -0
  61. package/dist/assets/arc-DW7mrI4p.js +1 -0
  62. package/dist/assets/architectureDiagram-NJMV4G6O-CyeZ5WLZ.js +36 -0
  63. package/dist/assets/blockDiagram-BEXU5L5S-CBVaNjO7.js +140 -0
  64. package/dist/assets/c4Diagram-YGBWAQC7-sf8d41uT.js +38 -0
  65. package/dist/assets/channel-BXFkgus9.js +1 -0
  66. package/dist/assets/chunk-2Q5K7J3B-BOGvy7Y_.js +1 -0
  67. package/dist/assets/chunk-3FUC2YCW-BiF9zyiz.js +2 -0
  68. package/dist/assets/chunk-5VM5RSS4-EFuZ1SBZ.js +15 -0
  69. package/dist/assets/chunk-GTNCS2PH-pJLNSAT7.js +88 -0
  70. package/dist/assets/chunk-GWA4HPMP-Cb-3_3IT.js +1 -0
  71. package/dist/assets/chunk-JWPE2WC7-DAf5aogn.js +1 -0
  72. package/dist/assets/chunk-NETBCI7D-DR3kiwZz.js +1 -0
  73. package/dist/assets/chunk-WEXAMYUT-BmU8PeyM.js +1 -0
  74. package/dist/assets/chunk-XXDRQBXY-Buh8g8OT.js +1 -0
  75. package/dist/assets/classDiagram-v2-NBCMYWYE-BurfmMWM.js +217 -0
  76. package/dist/assets/cose-bilkent-JH36ORCC-KkGZUEkU.js +1 -0
  77. package/dist/assets/cynefin-OW5HDTMX-C3PpV96d.js +166 -0
  78. package/dist/assets/cynefinDiagram-VND7K2PF-Dt8JwJaI.js +62 -0
  79. package/dist/assets/cytoscape.esm-BB4DxJjf.js +321 -0
  80. package/dist/assets/dagre-6A5THRUB-DkjN8266.js +4 -0
  81. package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  82. package/dist/assets/diagram-22UHCM2B-DUAJS0JV.js +200 -0
  83. package/dist/assets/diagram-3UASUU5V-Dw4KhF1a.js +24 -0
  84. package/dist/assets/diagram-ATOU4E4O-Dd1gmQqf.js +3 -0
  85. package/dist/assets/diagram-CDSNMT55-CjwGs0Yw.js +30 -0
  86. package/dist/assets/diagram-MLGK6HIB-BL-69Zrq.js +24 -0
  87. package/dist/assets/diagram-MPIPVDR6-5Zi2N7wo.js +41 -0
  88. package/dist/assets/ebnfDiagram-ZINNZB2B-D9NekWUX.js +1 -0
  89. package/dist/assets/elk-276RUBZZ-CkaSQjxw.js +27 -0
  90. package/dist/assets/erDiagram-OPXOYQCR-CdAVBV8-.js +99 -0
  91. package/dist/assets/flowDiagram-KWPJA3E3-Bm_lWWH7.js +213 -0
  92. package/dist/assets/ganttDiagram-FUAMR5RP-FZ8ejYWJ.js +292 -0
  93. package/dist/assets/gitGraphDiagram-X574FWY7-Dlv9rizZ.js +106 -0
  94. package/dist/assets/graph-D8UmR1vK.js +1 -0
  95. package/dist/assets/index-BGgqlWPJ.css +1 -0
  96. package/dist/assets/index-BtHo8ZKl.js +577 -0
  97. package/dist/assets/{index-DNa2umw-.js → index-h9FFNwTu.js} +1 -1
  98. package/dist/assets/infoDiagram-VRGFBTTK-BdQ_gW5B.js +2 -0
  99. package/dist/assets/init-Gi6I4Gst.js +1 -0
  100. package/dist/assets/ishikawaDiagram-OU5B5YK6-EwssEp2X.js +70 -0
  101. package/dist/assets/journeyDiagram-ZHPQQLJL-BX1G1vOd.js +139 -0
  102. package/dist/assets/kanban-definition-PNTS6WVX-BB4kAsyC.js +89 -0
  103. package/dist/assets/linear-3su2TG93.js +1 -0
  104. package/dist/assets/mermaid.core-CDD1E0s9.js +311 -0
  105. package/dist/assets/mindmap-definition-NLK3R4M7-Ba50MsNK.js +96 -0
  106. package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  107. package/dist/assets/pegDiagram-GJSIUBJH-DZLkkZlM.js +1 -0
  108. package/dist/assets/pieDiagram-5QR66LMP-DaTz77Uq.js +39 -0
  109. package/dist/assets/quadrantDiagram-O4NWA36T-CpaiidpR.js +7 -0
  110. package/dist/assets/railroadDiagram-XR7U4H2S-mN4JrMeI.js +1 -0
  111. package/dist/assets/requirementDiagram-PLB6GJNP-BSNDRpg7.js +84 -0
  112. package/dist/assets/sankeyDiagram-IPEJSGJF-FngzGNug.js +40 -0
  113. package/dist/assets/sequenceDiagram-PO4LG4MO-CM4pCC3L.js +169 -0
  114. package/dist/assets/sizeCapture-INFHLROL-CRICHXkw.js +1 -0
  115. package/dist/assets/stateDiagram-v2-GCMORJYK-oyTWpxH2.js +291 -0
  116. package/dist/assets/swimlanes-2SLR337P-D9h9mPBq.js +1 -0
  117. package/dist/assets/swimlanesDiagram-TC7HE7FX-BWrvB2ak.js +8 -0
  118. package/dist/assets/timeline-definition-EJHVYXUP-BJUlN9bW.js +120 -0
  119. package/dist/assets/usecaseDiagram-POWQR4AR-3uBNkbAb.js +370 -0
  120. package/dist/assets/vennDiagram-UO4OBE2U-D2odalzT.js +34 -0
  121. package/dist/assets/wardleyDiagram-VNRHLVJA-DHgFaB9S.js +78 -0
  122. package/dist/assets/xychartDiagram-PMCCYNJV-w5GYM2h0.js +7 -0
  123. package/dist/index.html +2 -2
  124. package/dist-server/companion/src/routes.js +1 -0
  125. package/dist-server/container-mcp.js +231 -17
  126. package/dist-server/drivers/agents-proxy.js +16097 -1411
  127. package/dist-server/enterprise/LICENSE +32 -0
  128. package/dist-server/enterprise/server/index.js +6 -5
  129. package/dist-server/hooks/omb-hook.js +74 -0
  130. package/dist-server/index.js +12495 -7584
  131. package/dist-server/local-computer-proxy.js +83 -1
  132. package/dist-server/local-computer.js +14 -2
  133. package/dist-server/mcp-server.js +3 -1
  134. package/dist-server/openmausbot.js +5458 -4587
  135. package/dist-server/pair-cli.js +5458 -4587
  136. package/dist-server/proxy-paths.js +1 -0
  137. package/dist-server/server/admin-activity.js +410 -0
  138. package/dist-server/server/agent-tool-policy.js +1 -0
  139. package/dist-server/server/bot-package.js +2 -0
  140. package/dist-server/server/bot-visibility.js +462 -0
  141. package/dist-server/server/box.js +25 -5
  142. package/dist-server/server/browser-engine.js +87 -10
  143. package/dist-server/server/browser-live.js +7 -5
  144. package/dist-server/server/browser-runtime.js +66 -11
  145. package/dist-server/server/channel-queue.js +2 -0
  146. package/dist-server/server/checkpoints.js +62 -18
  147. package/dist-server/server/cli-prompts.js +26 -2
  148. package/dist-server/server/cli.js +79 -10
  149. package/dist-server/server/commands.js +27 -0
  150. package/dist-server/server/compaction-summary.js +78 -0
  151. package/dist-server/server/composio.js +49 -11
  152. package/dist-server/server/config.js +137 -14
  153. package/dist-server/server/context-budget.js +29 -0
  154. package/dist-server/server/context-rebuild.js +72 -0
  155. package/dist-server/server/decision-log.js +209 -48
  156. package/dist-server/server/default-model-selection.js +20 -3
  157. package/dist-server/server/delegations.js +11 -9
  158. package/dist-server/server/digest.js +130 -0
  159. package/dist-server/server/drivers/acp/core.js +637 -238
  160. package/dist-server/server/drivers/acp/grok.js +4 -3
  161. package/dist-server/server/drivers/agents-call.js +1123 -0
  162. package/dist-server/server/drivers/agents-catalog.js +659 -0
  163. package/dist-server/server/drivers/agents-client.js +28 -0
  164. package/dist-server/server/drivers/agents-proxy.js +18 -1683
  165. package/dist-server/server/drivers/agents-result.js +23 -0
  166. package/dist-server/server/drivers/chat-mcp-tools.js +17 -2
  167. package/dist-server/server/drivers/claude.js +83 -16
  168. package/dist-server/server/drivers/codex-mcp-names.js +44 -0
  169. package/dist-server/server/drivers/codex.js +32 -4
  170. package/dist-server/server/drivers/grok.js +2 -1
  171. package/dist-server/server/drivers/openai-chat.js +66 -45
  172. package/dist-server/server/drivers/openai-compat.js +16 -8
  173. package/dist-server/server/enterprise.js +97 -16
  174. package/dist-server/server/external-runtime.js +83 -0
  175. package/dist-server/server/guarded-requests.js +60 -0
  176. package/dist-server/server/harness/http.js +61 -0
  177. package/dist-server/server/hooks/omb-hook.js +103 -0
  178. package/dist-server/server/hosted-models.js +151 -0
  179. package/dist-server/server/hosted-slack.js +11 -0
  180. package/dist-server/server/index.js +2810 -678
  181. package/dist-server/server/local-computer.js +21 -2
  182. package/dist-server/server/managed-desktop.js +79 -14
  183. package/dist-server/server/managed-policy.js +153 -0
  184. package/dist-server/server/mcp-bridge.js +10 -2
  185. package/dist-server/server/mcp-tool-images.js +37 -0
  186. package/dist-server/server/mcp-tool-schema.js +108 -0
  187. package/dist-server/server/message-db.js +108 -21
  188. package/dist-server/server/message-file.js +3 -2
  189. package/dist-server/server/model-context-window.js +7 -0
  190. package/dist-server/server/model-prices.js +121 -0
  191. package/dist-server/server/notify.js +10 -1
  192. package/dist-server/server/package-export.js +1 -0
  193. package/dist-server/server/peer-roster.js +17 -4
  194. package/dist-server/server/provider-icon.js +20 -0
  195. package/dist-server/server/proxy-paths.js +1 -0
  196. package/dist-server/server/recent-work.js +15 -0
  197. package/dist-server/server/request-auth.js +97 -0
  198. package/dist-server/server/room-handoffs.js +41 -13
  199. package/dist-server/server/routes/hosted-slack.js +20 -0
  200. package/dist-server/server/routes/table.js +14 -0
  201. package/dist-server/server/routine-requests.js +39 -1
  202. package/dist-server/server/routines.js +65 -9
  203. package/dist-server/server/shared-computer-control.js +31 -4
  204. package/dist-server/server/spend.js +111 -16
  205. package/dist-server/server/steer-queue.js +12 -1
  206. package/dist-server/server/store.js +384 -33
  207. package/dist-server/server/system-prompt.js +4 -4
  208. package/dist-server/server/team-backup.js +19 -2
  209. package/dist-server/server/thread-starters.js +53 -0
  210. package/dist-server/server/tool-results.js +72 -0
  211. package/dist-server/server/tts/grok.js +74 -0
  212. package/dist-server/server/tts/index.js +19 -1
  213. package/dist-server/server/usage-ledger.js +31 -8
  214. package/dist-server/server/webhooks.js +28 -0
  215. package/dist-server/server/workspace-backup-policy.js +9 -2
  216. package/dist-server/server/workspace-backup.js +7 -4
  217. package/dist-server/shared/approval-mode.js +7 -1
  218. package/dist-server/shared/digest.js +1 -0
  219. package/dist-server/shared/markdown-windows-paths.js +36 -0
  220. package/dist-server/shared/mention-boundary.js +15 -0
  221. package/dist-server/shared/provider-icon.js +110 -0
  222. package/dist-server/shared/routines.js +7 -1
  223. package/dist-server/shared/team-backup.js +5 -0
  224. package/dist-server/src/lib/composer-attachments.js +16 -0
  225. package/dist-server/vps-container-mcp.js +236 -22
  226. package/enterprise/README.md +33 -12
  227. package/enterprise/server/index.js +6 -5
  228. package/package.json +1 -1
  229. package/dist/assets/index-BbU5REzd.js +0 -310
  230. package/dist/assets/index-CLGfYlx_.css +0 -1
@@ -3157,13 +3157,13 @@ var $ZodObject = /* @__PURE__ */ $constructor("$ZodObject", (inst, def) => {
3157
3157
  }
3158
3158
  return propValues;
3159
3159
  });
3160
- const isObject2 = isObject;
3160
+ const isObject3 = isObject;
3161
3161
  const catchall = def.catchall;
3162
3162
  let value;
3163
3163
  inst._zod.parse = (payload, ctx) => {
3164
3164
  value ?? (value = _normalized.value);
3165
3165
  const input = payload.value;
3166
- if (!isObject2(input)) {
3166
+ if (!isObject3(input)) {
3167
3167
  payload.issues.push({
3168
3168
  expected: "object",
3169
3169
  code: "invalid_type",
@@ -3290,7 +3290,7 @@ var $ZodObjectJIT = /* @__PURE__ */ $constructor("$ZodObjectJIT", (inst, def) =>
3290
3290
  return (payload, ctx) => fn(shape, payload, ctx);
3291
3291
  };
3292
3292
  let fastpass;
3293
- const isObject2 = isObject;
3293
+ const isObject3 = isObject;
3294
3294
  const jit = !globalConfig.jitless;
3295
3295
  const allowsEval2 = allowsEval;
3296
3296
  const fastEnabled = jit && allowsEval2.value;
@@ -3299,7 +3299,7 @@ var $ZodObjectJIT = /* @__PURE__ */ $constructor("$ZodObjectJIT", (inst, def) =>
3299
3299
  inst._zod.parse = (payload, ctx) => {
3300
3300
  value ?? (value = _normalized.value);
3301
3301
  const input = payload.value;
3302
- if (!isObject2(input)) {
3302
+ if (!isObject3(input)) {
3303
3303
  payload.issues.push({
3304
3304
  expected: "object",
3305
3305
  code: "invalid_type",
@@ -14660,6 +14660,97 @@ function isModelVariant(value) {
14660
14660
  return typeof value === "string" && value.length > 0 && value.length <= 256 && value.trim() === value && !new RegExp("\\p{Cc}", "u").test(value);
14661
14661
  }
14662
14662
 
14663
+ // shared/provider-icon.ts
14664
+ var PROVIDER_ICON_PRESETS = [
14665
+ "openai",
14666
+ "anthropic",
14667
+ "google",
14668
+ "azure",
14669
+ "aws",
14670
+ "xai",
14671
+ "deepseek",
14672
+ "meta",
14673
+ "mistral",
14674
+ "qwen",
14675
+ "moonshot",
14676
+ "cohere",
14677
+ "openrouter"
14678
+ ];
14679
+ var PROVIDER_ICON_MAX_BYTES = 128 * 1024;
14680
+ var PROVIDER_ICON_MAX_DIMENSION = 1024;
14681
+ function decodedBase64Bytes(value) {
14682
+ const padding = value.endsWith("==") ? 2 : value.endsWith("=") ? 1 : 0;
14683
+ return Math.floor(value.length * 3 / 4) - padding;
14684
+ }
14685
+ function imageDimensions(bytes, mime) {
14686
+ const u16be = (offset) => bytes[offset] * 256 + bytes[offset + 1];
14687
+ const u16le = (offset) => bytes[offset] + bytes[offset + 1] * 256;
14688
+ const u24le = (offset) => bytes[offset] + bytes[offset + 1] * 256 + bytes[offset + 2] * 65536;
14689
+ const u32le = (offset) => bytes[offset] + bytes[offset + 1] * 256 + bytes[offset + 2] * 65536 + bytes[offset + 3] * 16777216;
14690
+ const u32be = (offset) => bytes[offset] * 16777216 + bytes[offset + 1] * 65536 + bytes[offset + 2] * 256 + bytes[offset + 3];
14691
+ if (mime === "image/png") {
14692
+ if (bytes.length < 33 || bytes.slice(0, 8).join(",") !== "137,80,78,71,13,10,26,10" || String.fromCharCode(...bytes.slice(12, 16)) !== "IHDR" || bytes.slice(-8).join(",") !== "73,69,78,68,174,66,96,130") return null;
14693
+ return { width: u32be(16), height: u32be(20) };
14694
+ }
14695
+ if (mime === "image/jpeg") {
14696
+ if (bytes.length < 12 || bytes[0] !== 255 || bytes[1] !== 216 || bytes.at(-2) !== 255 || bytes.at(-1) !== 217) return null;
14697
+ for (let offset = 2; offset + 8 < bytes.length; ) {
14698
+ if (bytes[offset] !== 255) {
14699
+ offset += 1;
14700
+ continue;
14701
+ }
14702
+ const marker = bytes[offset + 1];
14703
+ if ([192, 193, 194, 195, 197, 198, 199, 201, 202, 203, 205, 206, 207].includes(marker)) {
14704
+ return { height: u16be(offset + 5), width: u16be(offset + 7) };
14705
+ }
14706
+ if (marker === 216 || marker === 217 || marker === 1 || marker >= 208 && marker <= 215) {
14707
+ offset += 2;
14708
+ continue;
14709
+ }
14710
+ const length = u16be(offset + 2);
14711
+ if (length < 2) return null;
14712
+ offset += length + 2;
14713
+ }
14714
+ return null;
14715
+ }
14716
+ if (bytes.length < 30 || String.fromCharCode(...bytes.slice(0, 4)) !== "RIFF" || String.fromCharCode(...bytes.slice(8, 12)) !== "WEBP" || u32le(4) + 8 !== bytes.length) return null;
14717
+ const format = String.fromCharCode(...bytes.slice(12, 16));
14718
+ if (format === "VP8X") return { width: u24le(24) + 1, height: u24le(27) + 1 };
14719
+ if (format === "VP8L" && bytes[20] === 47) {
14720
+ const bits = bytes[21] | bytes[22] << 8 | bytes[23] << 16 | bytes[24] << 24;
14721
+ return { width: (bits & 16383) + 1, height: (bits >>> 14 & 16383) + 1 };
14722
+ }
14723
+ if (format === "VP8 " && bytes[23] === 157 && bytes[24] === 1 && bytes[25] === 42) {
14724
+ return { width: u16le(26) & 16383, height: u16le(28) & 16383 };
14725
+ }
14726
+ return null;
14727
+ }
14728
+ function providerIconError(icon) {
14729
+ if (icon.kind === "preset") {
14730
+ return PROVIDER_ICON_PRESETS.includes(icon.preset) ? null : "Choose a supported provider icon.";
14731
+ }
14732
+ const match = /^data:(image\/(?:png|jpeg|webp));base64,([A-Za-z0-9+/]+={0,2})$/.exec(icon.dataUrl);
14733
+ if (!match) return "Upload a PNG, JPEG, or WebP image.";
14734
+ const byteLength = decodedBase64Bytes(match[2]);
14735
+ if (byteLength > PROVIDER_ICON_MAX_BYTES) {
14736
+ return "Provider icons must be 128 KB or smaller.";
14737
+ }
14738
+ let decoded;
14739
+ try {
14740
+ decoded = atob(match[2]);
14741
+ } catch {
14742
+ return "The uploaded image is not valid base64.";
14743
+ }
14744
+ if (decoded.length !== byteLength) return "The uploaded image is not valid base64.";
14745
+ const bytes = Uint8Array.from(decoded, (value) => value.charCodeAt(0));
14746
+ const dimensions = imageDimensions(bytes, match[1]);
14747
+ if (!dimensions) return "The uploaded image is incomplete or does not match its file type.";
14748
+ if (dimensions.width < 1 || dimensions.height < 1 || dimensions.width > PROVIDER_ICON_MAX_DIMENSION || dimensions.height > PROVIDER_ICON_MAX_DIMENSION || dimensions.width * dimensions.height > PROVIDER_ICON_MAX_DIMENSION ** 2) {
14749
+ return `Provider icons must be at most ${PROVIDER_ICON_MAX_DIMENSION} \xD7 ${PROVIDER_ICON_MAX_DIMENSION} pixels.`;
14750
+ }
14751
+ return null;
14752
+ }
14753
+
14663
14754
  // server/mcp-registry.ts
14664
14755
  var MAX_ARGS = 64;
14665
14756
  var stdioEntrySchema = external_exports.object({
@@ -14700,11 +14791,26 @@ var MAX_LOCAL_VM_MAX_INSTANCES = 4;
14700
14791
  function isValidSshAlias(value) {
14701
14792
  return typeof value === "string" && SSH_ALIAS.test(value);
14702
14793
  }
14794
+ var CDP_PORT = /^[0-9]{1,5}$/;
14795
+ var CDP_URL = /^(https?|wss?):\/\/\S+$/i;
14796
+ function isValidCdpTarget(value) {
14797
+ if (typeof value !== "string" || value === "") return false;
14798
+ if (CDP_PORT.test(value)) {
14799
+ const port = Number(value);
14800
+ return port >= 1 && port <= 65535;
14801
+ }
14802
+ return CDP_URL.test(value);
14803
+ }
14703
14804
  var vpsConfigSchema = external_exports.object({
14704
14805
  sshAlias: external_exports.string().refine((value) => value === "" || isValidSshAlias(value), {
14705
14806
  message: "must be a simple SSH config alias"
14706
14807
  }).optional()
14707
14808
  });
14809
+ var browserEngineConfigSchema = external_exports.object({
14810
+ attachCdpUrl: external_exports.string().trim().max(2048).refine((value) => value === "" || isValidCdpTarget(value), {
14811
+ message: "browserEngine.attachCdpUrl must be a CDP port (1-65535) or an http(s)/ws(s) URL"
14812
+ }).optional()
14813
+ });
14708
14814
  var roomConfigSchema = external_exports.object({
14709
14815
  turnTimeoutMinutes: external_exports.number().int().min(MIN_ROOM_TURN_TIMEOUT_MINUTES).max(MAX_ROOM_TURN_TIMEOUT_MINUTES),
14710
14816
  /** Room handoff tree lifetime. Active execution pauses this clock; the
@@ -14846,7 +14952,11 @@ var featureConfigSchema = external_exports.object({
14846
14952
  /** Claude bots also load the MCP servers and connectors from this
14847
14953
  * machine's own Claude Code setup (Plugins → MCP servers switch). Off by
14848
14954
  * default: each extra tool costs tokens on every model call. */
14849
- claudeUserMcp: external_exports.boolean().optional()
14955
+ claudeUserMcp: external_exports.boolean().optional(),
14956
+ /** LLM-generated titles for new bot threads. Off until explicitly
14957
+ * enabled; a one-shot that fails or answers junk leaves the first-message
14958
+ * snippet in place — see llmThreadTitlesEnabled. */
14959
+ llmThreadTitles: external_exports.boolean().optional()
14850
14960
  });
14851
14961
  var onboardingConfigSchema = external_exports.object({
14852
14962
  /** ISO timestamp of finishing (or skipping to the end of) the welcome flow. */
@@ -14860,6 +14970,10 @@ var instanceConfigSchema = external_exports.object({
14860
14970
  driver: external_exports.string().min(1),
14861
14971
  displayName: optionalText,
14862
14972
  accentColor: optionalText,
14973
+ icon: external_exports.discriminatedUnion("kind", [
14974
+ external_exports.object({ kind: external_exports.literal("preset"), preset: external_exports.enum(PROVIDER_ICON_PRESETS) }).strict(),
14975
+ external_exports.object({ kind: external_exports.literal("custom"), dataUrl: external_exports.string() }).strict().refine((icon) => providerIconError(icon) === null, { message: "Invalid provider icon" })
14976
+ ]).optional(),
14863
14977
  environment: external_exports.record(external_exports.string(), external_exports.string()).optional(),
14864
14978
  enabled: external_exports.boolean().optional(),
14865
14979
  config: external_exports.json().optional()
@@ -14874,6 +14988,20 @@ var defaultModelSelectionSchema = external_exports.object({
14874
14988
  (selection) => selection.variant === void 0 || selection.effort === void 0,
14875
14989
  "choose either a model variant or an effort level"
14876
14990
  );
14991
+ var threadsConfigSchema = external_exports.object({
14992
+ maxConcurrentPerBot: external_exports.number().int().min(1).max(MAX_CONCURRENT_BOT_THREADS),
14993
+ /** Cap each per-thread events/ and native/ NDJSON log at this many
14994
+ * bytes; absent (the default) keeps today's unbounded growth (#1280). */
14995
+ eventLogMaxBytes: external_exports.number().int().min(MIN_THREAD_EVENT_LOG_BYTES).max(MAX_THREAD_EVENT_LOG_BYTES).optional(),
14996
+ /** Days a closed or archived thread's event logs survive (#1280).
14997
+ * Absent keeps them forever. */
14998
+ eventLogRetentionDays: external_exports.number().int().min(1).max(3650).optional()
14999
+ }).strict();
15000
+ var threadsPatchSchema = threadsConfigSchema.extend({
15001
+ maxConcurrentPerBot: threadsConfigSchema.shape.maxConcurrentPerBot.optional(),
15002
+ eventLogMaxBytes: threadsConfigSchema.shape.eventLogMaxBytes.nullable(),
15003
+ eventLogRetentionDays: threadsConfigSchema.shape.eventLogRetentionDays.nullable()
15004
+ });
14877
15005
  var appConfigSchema = external_exports.object({
14878
15006
  /** Verified by the dedicated domain endpoint, never a generic config patch. */
14879
15007
  customDomain: external_exports.string().optional(),
@@ -14924,6 +15052,7 @@ var appConfigSchema = external_exports.object({
14924
15052
  /** Voice settings and the selected voice id. `provider` picks the
14925
15053
  * engine: "elevenlabs" (default; needs `key`), "fish" (needs its own
14926
15054
  * `fishKey`), "system" (the Mac's built-in voices, no key), or
15055
+ * "xai" (Grok TTS, reusing `xai.key`), or
14927
15056
  * "chatterbox" (a local OpenAI-compatible Chatterbox server; `baseUrl`
14928
15057
  * and `model` are settings, not secrets). Cloud keys stay separate so
14929
15058
  * switching providers never overwrites or misuses the other key. */
@@ -14931,7 +15060,7 @@ var appConfigSchema = external_exports.object({
14931
15060
  key: optionalText,
14932
15061
  fishKey: optionalText,
14933
15062
  voice: optionalText,
14934
- provider: external_exports.enum(["elevenlabs", "fish", "system", "chatterbox"]).optional(),
15063
+ provider: external_exports.enum(["elevenlabs", "fish", "system", "chatterbox", "xai"]).optional(),
14935
15064
  baseUrl: external_exports.string().trim().max(2048).refine((value) => !value || /^https?:\/\//i.test(value), "the Chatterbox server address must start with http:// or https://").optional(),
14936
15065
  model: optionalText
14937
15066
  }).optional(),
@@ -14960,18 +15089,20 @@ var appConfigSchema = external_exports.object({
14960
15089
  * system language. Unknown tags degrade to English in the renderer. */
14961
15090
  language: optionalText,
14962
15091
  rooms: roomConfigSchema.optional(),
14963
- threads: external_exports.object({
14964
- maxConcurrentPerBot: external_exports.number().int().min(1).max(MAX_CONCURRENT_BOT_THREADS),
14965
- /** Cap each per-thread events/ and native/ NDJSON log at this many
14966
- * bytes; absent (the default) keeps today's unbounded growth (#1280). */
14967
- eventLogMaxBytes: external_exports.number().int().min(MIN_THREAD_EVENT_LOG_BYTES).max(MAX_THREAD_EVENT_LOG_BYTES).optional(),
14968
- /** Days a closed or archived thread's event logs survive (#1280).
14969
- * Absent keeps them forever. */
14970
- eventLogRetentionDays: external_exports.number().int().min(1).max(3650).optional()
14971
- }).strict().optional(),
15092
+ context: external_exports.object({
15093
+ rebuildBytes: external_exports.number().int().min(1024).max(1e6).optional(),
15094
+ compactAt: external_exports.number().positive().max(1e7).optional(),
15095
+ autoCompact: external_exports.boolean().optional()
15096
+ }).optional(),
15097
+ threads: threadsConfigSchema.optional(),
15098
+ /** The authorization decision log (server/decision-log.ts): days of month
15099
+ * files kept, at least; OMB_DECISION_RETENTION_DAYS wins when set. */
15100
+ decisions: external_exports.object({ retentionDays: external_exports.number().int().min(1).max(3650).optional() }).strict().optional(),
14972
15101
  localVm: localVmConfigSchema.optional(),
14973
15102
  features: featureConfigSchema.optional(),
14974
15103
  onboarding: onboardingConfigSchema.optional(),
15104
+ /** CDP attach target for a bot's browser; see browserEngineConfigSchema. */
15105
+ browserEngine: browserEngineConfigSchema.optional(),
14975
15106
  browserProfiles: browserProfilesSchema.optional(),
14976
15107
  instances: instanceConfigMapSchema.optional(),
14977
15108
  /** User-configured MCP servers, mounted into every capable engine. Kept
@@ -14983,7 +15114,7 @@ var appConfigSchema = external_exports.object({
14983
15114
  var storedAppConfigSchema = appConfigSchema.extend({
14984
15115
  browserProfiles: storedBrowserProfilesSchema.optional()
14985
15116
  });
14986
- var appConfigPatchSchema = appConfigSchema.omit({ instances: true, mcpServers: true, cliStartup: true, customDomain: true });
15117
+ var appConfigPatchSchema = appConfigSchema.omit({ instances: true, mcpServers: true, cliStartup: true, customDomain: true }).extend({ threads: threadsPatchSchema.optional() });
14987
15118
  var jsonObjectSchema = external_exports.record(external_exports.string(), external_exports.json());
14988
15119
  var DATA_DIR = process.env.OMB_DATA_DIR ?? join2(homedir2(), ".openmausbot");
14989
15120
  var LEGACY_DATA_DIR = join2(homedir2(), ".opengrokbot");
@@ -15010,6 +15141,7 @@ var SPAWNED_PROXIES = {
15010
15141
  connectors: resolveProxy("connector-proxy"),
15011
15142
  mcpGate: resolveProxy("mcp-gate"),
15012
15143
  phone: resolveProxy("drivers/phone-proxy"),
15144
+ hook: resolveProxy("hooks/omb-hook"),
15013
15145
  // Loaded by the external `pi` process via `-e`, not by this server — but
15014
15146
  // resolved through the same single source of truth so the packaged layout
15015
15147
  // check can assert it ships.
@@ -15125,6 +15257,86 @@ function createControlClient(options) {
15125
15257
  }
15126
15258
  var CONTROL_REFUSAL_PLAIN = "A person has taken control of this computer, so this call was NOT performed. Do not retry it \u2014 the screen is changing under their hands. Pause this task, tell the person you are waiting for them to hand control back, and take a fresh screenshot before your next action once they have.";
15127
15259
 
15260
+ // server/mcp-tool-schema.ts
15261
+ var ROOT_COMBINATORS = ["anyOf", "oneOf", "allOf", "not"];
15262
+ function isObject2(value) {
15263
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
15264
+ }
15265
+ function branches(value) {
15266
+ return Array.isArray(value) ? value.filter(isObject2) : [];
15267
+ }
15268
+ function objectShape(schema) {
15269
+ const properties = isObject2(schema.properties) ? { ...schema.properties } : {};
15270
+ const required2 = new Set(Array.isArray(schema.required) ? schema.required.filter((key) => typeof key === "string") : []);
15271
+ const adopt = (shape) => {
15272
+ for (const [key, value] of Object.entries(shape.properties)) if (!(key in properties)) properties[key] = value;
15273
+ };
15274
+ for (const branch of branches(schema.allOf)) {
15275
+ const shape = objectShape(branch);
15276
+ adopt(shape);
15277
+ for (const key of shape.required) required2.add(key);
15278
+ }
15279
+ for (const keyword of ["anyOf", "oneOf"]) {
15280
+ const choices = branches(schema[keyword]).map(objectShape);
15281
+ if (choices.length === 0) continue;
15282
+ for (const choice of choices) adopt(choice);
15283
+ for (const key of choices[0].required) {
15284
+ if (choices.every((choice) => choice.required.includes(key))) required2.add(key);
15285
+ }
15286
+ }
15287
+ return { properties, required: [...required2] };
15288
+ }
15289
+ function describesObject(type) {
15290
+ return type === void 0 || type === "object" || Array.isArray(type) && type.includes("object");
15291
+ }
15292
+ function providerSafeInputSchema(schema) {
15293
+ if (!isObject2(schema) || !describesObject(schema.type)) return { type: "object", properties: {} };
15294
+ if (schema.type === "object" && ROOT_COMBINATORS.every((keyword) => !(keyword in schema))) return schema;
15295
+ const { properties, required: required2 } = objectShape(schema);
15296
+ const safe = { ...schema, type: "object", properties };
15297
+ for (const keyword of ROOT_COMBINATORS) delete safe[keyword];
15298
+ if (required2.length > 0) safe.required = required2;
15299
+ else delete safe.required;
15300
+ return safe;
15301
+ }
15302
+ function createToolListNormalizer() {
15303
+ const pending = /* @__PURE__ */ new Set();
15304
+ const idKey = (id) => `${typeof id}:${String(id)}`;
15305
+ return {
15306
+ observeRequest(line) {
15307
+ let frame;
15308
+ try {
15309
+ frame = JSON.parse(line);
15310
+ } catch {
15311
+ return;
15312
+ }
15313
+ if (isObject2(frame) && frame.method === "tools/list" && (typeof frame.id === "number" || typeof frame.id === "string")) {
15314
+ pending.add(idKey(frame.id));
15315
+ }
15316
+ },
15317
+ rewriteResponse(line) {
15318
+ if (pending.size === 0) return line;
15319
+ let frame;
15320
+ try {
15321
+ frame = JSON.parse(line);
15322
+ } catch {
15323
+ return line;
15324
+ }
15325
+ if (!isObject2(frame) || "method" in frame || !pending.delete(idKey(frame.id))) return line;
15326
+ if (!isObject2(frame.result) || !Array.isArray(frame.result.tools)) return line;
15327
+ let changed = false;
15328
+ const tools = frame.result.tools.map((tool) => {
15329
+ if (!isObject2(tool)) return tool;
15330
+ const inputSchema = providerSafeInputSchema(tool.inputSchema);
15331
+ if (inputSchema === tool.inputSchema) return tool;
15332
+ changed = true;
15333
+ return { ...tool, inputSchema };
15334
+ });
15335
+ return changed ? JSON.stringify({ ...frame, result: { ...frame.result, tools } }) : line;
15336
+ }
15337
+ };
15338
+ }
15339
+
15128
15340
  // server/mcp-bridge.ts
15129
15341
  var BRIDGE_INACTIVITY_MS = 45e3;
15130
15342
  var PROBE_TIMEOUT_MS = 1e4;
@@ -15294,8 +15506,10 @@ function runMcpBridge(options) {
15294
15506
  }
15295
15507
  } : {}
15296
15508
  });
15509
+ const toolLists = createToolListNormalizer();
15297
15510
  let pendingInput = Promise.resolve();
15298
15511
  const inbound = createLineSplitter((line) => {
15512
+ toolLists.observeRequest(line);
15299
15513
  const completion = intercept(line);
15300
15514
  if (completion) pendingInput = completion;
15301
15515
  });
@@ -15305,7 +15519,7 @@ function runMcpBridge(options) {
15305
15519
  inbound.flush();
15306
15520
  void pendingInput.finally(() => child.stdin.end());
15307
15521
  });
15308
- const outbound = createLineSplitter((line) => process.stdout.write(line + "\n"));
15522
+ const outbound = createLineSplitter((line) => process.stdout.write(toolLists.rewriteResponse(line) + "\n"));
15309
15523
  child.stdout.on("data", (chunk) => outbound.push(chunk));
15310
15524
  child.stdout.on("end", () => outbound.flush());
15311
15525
  const detach = () => {