openmausbot 0.1.83 → 0.1.85

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 (76) hide show
  1. package/dist/assets/index-Ba9G44HI.js +310 -0
  2. package/dist/assets/{index-nqTFZTxg.js → index-CTNNoqSJ.js} +1 -1
  3. package/dist/assets/index-CkRNp7wX.css +1 -0
  4. package/dist/index.html +2 -2
  5. package/dist-server/companion/src/routes.js +1 -0
  6. package/dist-server/container-mcp.js +212 -7
  7. package/dist-server/drivers/agents-proxy.js +161 -12
  8. package/dist-server/enterprise/server/index.js +1 -0
  9. package/dist-server/hooks/omb-hook.js +74 -0
  10. package/dist-server/index.js +8025 -5661
  11. package/dist-server/local-computer-proxy.js +83 -1
  12. package/dist-server/local-computer.js +14 -2
  13. package/dist-server/openmausbot.js +796 -309
  14. package/dist-server/pair-cli.js +796 -309
  15. package/dist-server/proxy-paths.js +1 -0
  16. package/dist-server/server/agent-tool-policy.js +1 -0
  17. package/dist-server/server/bot-package.js +2 -0
  18. package/dist-server/server/box.js +23 -4
  19. package/dist-server/server/browser-engine.js +87 -10
  20. package/dist-server/server/browser-live.js +7 -5
  21. package/dist-server/server/browser-runtime.js +65 -10
  22. package/dist-server/server/checkpoints.js +71 -23
  23. package/dist-server/server/chief-of-staff.js +3 -0
  24. package/dist-server/server/cli-prompts.js +3 -1
  25. package/dist-server/server/commands.js +27 -0
  26. package/dist-server/server/compaction-summary.js +78 -0
  27. package/dist-server/server/computer-wait.js +33 -0
  28. package/dist-server/server/config.js +84 -3
  29. package/dist-server/server/context-budget.js +29 -0
  30. package/dist-server/server/context-rebuild.js +72 -0
  31. package/dist-server/server/delta-context.js +258 -0
  32. package/dist-server/server/digest.js +130 -0
  33. package/dist-server/server/drivers/acp/core.js +540 -229
  34. package/dist-server/server/drivers/agents-proxy.js +79 -12
  35. package/dist-server/server/drivers/agents-result.js +23 -0
  36. package/dist-server/server/drivers/claude.js +84 -15
  37. package/dist-server/server/drivers/codex.js +19 -5
  38. package/dist-server/server/drivers/openai-chat.js +66 -45
  39. package/dist-server/server/drivers/openai-compat.js +1 -0
  40. package/dist-server/server/hooks/omb-hook.js +103 -0
  41. package/dist-server/server/incidents.js +104 -0
  42. package/dist-server/server/index.js +1382 -318
  43. package/dist-server/server/local-computer.js +21 -2
  44. package/dist-server/server/mcp-bridge.js +10 -2
  45. package/dist-server/server/mcp-tool-images.js +37 -0
  46. package/dist-server/server/mcp-tool-schema.js +108 -0
  47. package/dist-server/server/message-db.js +80 -21
  48. package/dist-server/server/message-file.js +3 -2
  49. package/dist-server/server/notify.js +3 -1
  50. package/dist-server/server/package-export.js +1 -0
  51. package/dist-server/server/peer-roster.js +4 -2
  52. package/dist-server/server/provider-icon.js +20 -0
  53. package/dist-server/server/proxy-paths.js +1 -0
  54. package/dist-server/server/request-auth.js +1 -0
  55. package/dist-server/server/room-handoffs.js +16 -2
  56. package/dist-server/server/routine-requests.js +39 -1
  57. package/dist-server/server/routines.js +43 -9
  58. package/dist-server/server/shared-computer-control.js +31 -4
  59. package/dist-server/server/steer-queue.js +6 -0
  60. package/dist-server/server/store.js +111 -14
  61. package/dist-server/server/system-prompt.js +4 -4
  62. package/dist-server/server/team-backup.js +9 -1
  63. package/dist-server/server/tool-results.js +72 -0
  64. package/dist-server/server/tts/grok.js +74 -0
  65. package/dist-server/server/tts/index.js +19 -1
  66. package/dist-server/server/webhooks.js +28 -0
  67. package/dist-server/shared/approval-mode.js +7 -1
  68. package/dist-server/shared/digest.js +1 -0
  69. package/dist-server/shared/markdown-windows-paths.js +36 -0
  70. package/dist-server/shared/provider-icon.js +110 -0
  71. package/dist-server/shared/team-backup.js +3 -0
  72. package/dist-server/vps-container-mcp.js +217 -12
  73. package/enterprise/server/index.js +1 -0
  74. package/package.json +1 -1
  75. package/dist/assets/index-CKysBq-V.css +0 -1
  76. package/dist/assets/index-DSvqfBOf.js +0 -309
@@ -183,6 +183,86 @@ function probeLoginShellPath() {
183
183
  );
184
184
  }
185
185
 
186
+ // server/mcp-tool-schema.ts
187
+ var ROOT_COMBINATORS = ["anyOf", "oneOf", "allOf", "not"];
188
+ function isObject(value) {
189
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
190
+ }
191
+ function branches(value) {
192
+ return Array.isArray(value) ? value.filter(isObject) : [];
193
+ }
194
+ function objectShape(schema) {
195
+ const properties = isObject(schema.properties) ? { ...schema.properties } : {};
196
+ const required2 = new Set(Array.isArray(schema.required) ? schema.required.filter((key) => typeof key === "string") : []);
197
+ const adopt = (shape) => {
198
+ for (const [key, value] of Object.entries(shape.properties)) if (!(key in properties)) properties[key] = value;
199
+ };
200
+ for (const branch of branches(schema.allOf)) {
201
+ const shape = objectShape(branch);
202
+ adopt(shape);
203
+ for (const key of shape.required) required2.add(key);
204
+ }
205
+ for (const keyword of ["anyOf", "oneOf"]) {
206
+ const choices = branches(schema[keyword]).map(objectShape);
207
+ if (choices.length === 0) continue;
208
+ for (const choice of choices) adopt(choice);
209
+ for (const key of choices[0].required) {
210
+ if (choices.every((choice) => choice.required.includes(key))) required2.add(key);
211
+ }
212
+ }
213
+ return { properties, required: [...required2] };
214
+ }
215
+ function describesObject(type) {
216
+ return type === void 0 || type === "object" || Array.isArray(type) && type.includes("object");
217
+ }
218
+ function providerSafeInputSchema(schema) {
219
+ if (!isObject(schema) || !describesObject(schema.type)) return { type: "object", properties: {} };
220
+ if (schema.type === "object" && ROOT_COMBINATORS.every((keyword) => !(keyword in schema))) return schema;
221
+ const { properties, required: required2 } = objectShape(schema);
222
+ const safe = { ...schema, type: "object", properties };
223
+ for (const keyword of ROOT_COMBINATORS) delete safe[keyword];
224
+ if (required2.length > 0) safe.required = required2;
225
+ else delete safe.required;
226
+ return safe;
227
+ }
228
+ function createToolListNormalizer() {
229
+ const pending = /* @__PURE__ */ new Set();
230
+ const idKey = (id) => `${typeof id}:${String(id)}`;
231
+ return {
232
+ observeRequest(line) {
233
+ let frame;
234
+ try {
235
+ frame = JSON.parse(line);
236
+ } catch {
237
+ return;
238
+ }
239
+ if (isObject(frame) && frame.method === "tools/list" && (typeof frame.id === "number" || typeof frame.id === "string")) {
240
+ pending.add(idKey(frame.id));
241
+ }
242
+ },
243
+ rewriteResponse(line) {
244
+ if (pending.size === 0) return line;
245
+ let frame;
246
+ try {
247
+ frame = JSON.parse(line);
248
+ } catch {
249
+ return line;
250
+ }
251
+ if (!isObject(frame) || "method" in frame || !pending.delete(idKey(frame.id))) return line;
252
+ if (!isObject(frame.result) || !Array.isArray(frame.result.tools)) return line;
253
+ let changed = false;
254
+ const tools = frame.result.tools.map((tool) => {
255
+ if (!isObject(tool)) return tool;
256
+ const inputSchema = providerSafeInputSchema(tool.inputSchema);
257
+ if (inputSchema === tool.inputSchema) return tool;
258
+ changed = true;
259
+ return { ...tool, inputSchema };
260
+ });
261
+ return changed ? JSON.stringify({ ...frame, result: { ...frame.result, tools } }) : line;
262
+ }
263
+ };
264
+ }
265
+
186
266
  // server/mcp-bridge.ts
187
267
  var BRIDGE_INACTIVITY_MS = 45e3;
188
268
  var PROBE_TIMEOUT_MS = 1e4;
@@ -352,8 +432,10 @@ function runMcpBridge(options) {
352
432
  }
353
433
  } : {}
354
434
  });
435
+ const toolLists = createToolListNormalizer();
355
436
  let pendingInput = Promise.resolve();
356
437
  const inbound = createLineSplitter((line) => {
438
+ toolLists.observeRequest(line);
357
439
  const completion = intercept(line);
358
440
  if (completion) pendingInput = completion;
359
441
  });
@@ -363,7 +445,7 @@ function runMcpBridge(options) {
363
445
  inbound.flush();
364
446
  void pendingInput.finally(() => child.stdin.end());
365
447
  });
366
- const outbound = createLineSplitter((line) => process.stdout.write(line + "\n"));
448
+ const outbound = createLineSplitter((line) => process.stdout.write(toolLists.rewriteResponse(line) + "\n"));
367
449
  child.stdout.on("data", (chunk) => outbound.push(chunk));
368
450
  child.stdout.on("end", () => outbound.flush());
369
451
  const detach = () => {
@@ -1056,7 +1138,7 @@ __export(util_exports, {
1056
1138
  getParsedType: () => getParsedType,
1057
1139
  getSizableOrigin: () => getSizableOrigin,
1058
1140
  hexToUint8Array: () => hexToUint8Array,
1059
- isObject: () => isObject,
1141
+ isObject: () => isObject2,
1060
1142
  isPlainObject: () => isPlainObject,
1061
1143
  issue: () => issue,
1062
1144
  joinValues: () => joinValues,
@@ -1219,7 +1301,7 @@ function slugify(input) {
1219
1301
  }
1220
1302
  var captureStackTrace = "captureStackTrace" in Error ? Error.captureStackTrace : (..._args) => {
1221
1303
  };
1222
- function isObject(data) {
1304
+ function isObject2(data) {
1223
1305
  return typeof data === "object" && data !== null && !Array.isArray(data);
1224
1306
  }
1225
1307
  var allowsEval = /* @__PURE__ */ cached2(() => {
@@ -1238,7 +1320,7 @@ var allowsEval = /* @__PURE__ */ cached2(() => {
1238
1320
  }
1239
1321
  });
1240
1322
  function isPlainObject(o) {
1241
- if (isObject(o) === false)
1323
+ if (isObject2(o) === false)
1242
1324
  return false;
1243
1325
  const ctor = o.constructor;
1244
1326
  if (ctor === void 0)
@@ -1246,7 +1328,7 @@ function isPlainObject(o) {
1246
1328
  if (typeof ctor !== "function")
1247
1329
  return true;
1248
1330
  const prot = ctor.prototype;
1249
- if (isObject(prot) === false)
1331
+ if (isObject2(prot) === false)
1250
1332
  return false;
1251
1333
  if (Object.prototype.hasOwnProperty.call(prot, "isPrototypeOf") === false) {
1252
1334
  return false;
@@ -3459,13 +3541,13 @@ var $ZodObject = /* @__PURE__ */ $constructor("$ZodObject", (inst, def) => {
3459
3541
  }
3460
3542
  return propValues;
3461
3543
  });
3462
- const isObject2 = isObject;
3544
+ const isObject3 = isObject2;
3463
3545
  const catchall = def.catchall;
3464
3546
  let value;
3465
3547
  inst._zod.parse = (payload, ctx) => {
3466
3548
  value ?? (value = _normalized.value);
3467
3549
  const input = payload.value;
3468
- if (!isObject2(input)) {
3550
+ if (!isObject3(input)) {
3469
3551
  payload.issues.push({
3470
3552
  expected: "object",
3471
3553
  code: "invalid_type",
@@ -3592,7 +3674,7 @@ var $ZodObjectJIT = /* @__PURE__ */ $constructor("$ZodObjectJIT", (inst, def) =>
3592
3674
  return (payload, ctx) => fn(shape, payload, ctx);
3593
3675
  };
3594
3676
  let fastpass;
3595
- const isObject2 = isObject;
3677
+ const isObject3 = isObject2;
3596
3678
  const jit = !globalConfig.jitless;
3597
3679
  const allowsEval2 = allowsEval;
3598
3680
  const fastEnabled = jit && allowsEval2.value;
@@ -3601,7 +3683,7 @@ var $ZodObjectJIT = /* @__PURE__ */ $constructor("$ZodObjectJIT", (inst, def) =>
3601
3683
  inst._zod.parse = (payload, ctx) => {
3602
3684
  value ?? (value = _normalized.value);
3603
3685
  const input = payload.value;
3604
- if (!isObject2(input)) {
3686
+ if (!isObject3(input)) {
3605
3687
  payload.issues.push({
3606
3688
  expected: "object",
3607
3689
  code: "invalid_type",
@@ -3777,7 +3859,7 @@ var $ZodDiscriminatedUnion = /* @__PURE__ */ $constructor("$ZodDiscriminatedUnio
3777
3859
  });
3778
3860
  inst._zod.parse = (payload, ctx) => {
3779
3861
  const input = payload.value;
3780
- if (!isObject(input)) {
3862
+ if (!isObject2(input)) {
3781
3863
  payload.issues.push({
3782
3864
  code: "invalid_type",
3783
3865
  expected: "object",
@@ -14962,6 +15044,97 @@ function isModelVariant(value) {
14962
15044
  return typeof value === "string" && value.length > 0 && value.length <= 256 && value.trim() === value && !new RegExp("\\p{Cc}", "u").test(value);
14963
15045
  }
14964
15046
 
15047
+ // shared/provider-icon.ts
15048
+ var PROVIDER_ICON_PRESETS = [
15049
+ "openai",
15050
+ "anthropic",
15051
+ "google",
15052
+ "azure",
15053
+ "aws",
15054
+ "xai",
15055
+ "deepseek",
15056
+ "meta",
15057
+ "mistral",
15058
+ "qwen",
15059
+ "moonshot",
15060
+ "cohere",
15061
+ "openrouter"
15062
+ ];
15063
+ var PROVIDER_ICON_MAX_BYTES = 128 * 1024;
15064
+ var PROVIDER_ICON_MAX_DIMENSION = 1024;
15065
+ function decodedBase64Bytes(value) {
15066
+ const padding = value.endsWith("==") ? 2 : value.endsWith("=") ? 1 : 0;
15067
+ return Math.floor(value.length * 3 / 4) - padding;
15068
+ }
15069
+ function imageDimensions(bytes, mime) {
15070
+ const u16be = (offset) => bytes[offset] * 256 + bytes[offset + 1];
15071
+ const u16le = (offset) => bytes[offset] + bytes[offset + 1] * 256;
15072
+ const u24le = (offset) => bytes[offset] + bytes[offset + 1] * 256 + bytes[offset + 2] * 65536;
15073
+ const u32le = (offset) => bytes[offset] + bytes[offset + 1] * 256 + bytes[offset + 2] * 65536 + bytes[offset + 3] * 16777216;
15074
+ const u32be = (offset) => bytes[offset] * 16777216 + bytes[offset + 1] * 65536 + bytes[offset + 2] * 256 + bytes[offset + 3];
15075
+ if (mime === "image/png") {
15076
+ 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;
15077
+ return { width: u32be(16), height: u32be(20) };
15078
+ }
15079
+ if (mime === "image/jpeg") {
15080
+ if (bytes.length < 12 || bytes[0] !== 255 || bytes[1] !== 216 || bytes.at(-2) !== 255 || bytes.at(-1) !== 217) return null;
15081
+ for (let offset = 2; offset + 8 < bytes.length; ) {
15082
+ if (bytes[offset] !== 255) {
15083
+ offset += 1;
15084
+ continue;
15085
+ }
15086
+ const marker = bytes[offset + 1];
15087
+ if ([192, 193, 194, 195, 197, 198, 199, 201, 202, 203, 205, 206, 207].includes(marker)) {
15088
+ return { height: u16be(offset + 5), width: u16be(offset + 7) };
15089
+ }
15090
+ if (marker === 216 || marker === 217 || marker === 1 || marker >= 208 && marker <= 215) {
15091
+ offset += 2;
15092
+ continue;
15093
+ }
15094
+ const length = u16be(offset + 2);
15095
+ if (length < 2) return null;
15096
+ offset += length + 2;
15097
+ }
15098
+ return null;
15099
+ }
15100
+ 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;
15101
+ const format = String.fromCharCode(...bytes.slice(12, 16));
15102
+ if (format === "VP8X") return { width: u24le(24) + 1, height: u24le(27) + 1 };
15103
+ if (format === "VP8L" && bytes[20] === 47) {
15104
+ const bits = bytes[21] | bytes[22] << 8 | bytes[23] << 16 | bytes[24] << 24;
15105
+ return { width: (bits & 16383) + 1, height: (bits >>> 14 & 16383) + 1 };
15106
+ }
15107
+ if (format === "VP8 " && bytes[23] === 157 && bytes[24] === 1 && bytes[25] === 42) {
15108
+ return { width: u16le(26) & 16383, height: u16le(28) & 16383 };
15109
+ }
15110
+ return null;
15111
+ }
15112
+ function providerIconError(icon) {
15113
+ if (icon.kind === "preset") {
15114
+ return PROVIDER_ICON_PRESETS.includes(icon.preset) ? null : "Choose a supported provider icon.";
15115
+ }
15116
+ const match = /^data:(image\/(?:png|jpeg|webp));base64,([A-Za-z0-9+/]+={0,2})$/.exec(icon.dataUrl);
15117
+ if (!match) return "Upload a PNG, JPEG, or WebP image.";
15118
+ const byteLength = decodedBase64Bytes(match[2]);
15119
+ if (byteLength > PROVIDER_ICON_MAX_BYTES) {
15120
+ return "Provider icons must be 128 KB or smaller.";
15121
+ }
15122
+ let decoded;
15123
+ try {
15124
+ decoded = atob(match[2]);
15125
+ } catch {
15126
+ return "The uploaded image is not valid base64.";
15127
+ }
15128
+ if (decoded.length !== byteLength) return "The uploaded image is not valid base64.";
15129
+ const bytes = Uint8Array.from(decoded, (value) => value.charCodeAt(0));
15130
+ const dimensions = imageDimensions(bytes, match[1]);
15131
+ if (!dimensions) return "The uploaded image is incomplete or does not match its file type.";
15132
+ 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) {
15133
+ return `Provider icons must be at most ${PROVIDER_ICON_MAX_DIMENSION} \xD7 ${PROVIDER_ICON_MAX_DIMENSION} pixels.`;
15134
+ }
15135
+ return null;
15136
+ }
15137
+
14965
15138
  // server/mcp-registry.ts
14966
15139
  var MAX_ARGS = 64;
14967
15140
  var stdioEntrySchema = external_exports.object({
@@ -15002,11 +15175,26 @@ var MAX_LOCAL_VM_MAX_INSTANCES = 4;
15002
15175
  function isValidSshAlias(value) {
15003
15176
  return typeof value === "string" && SSH_ALIAS.test(value);
15004
15177
  }
15178
+ var CDP_PORT = /^[0-9]{1,5}$/;
15179
+ var CDP_URL = /^(https?|wss?):\/\/\S+$/i;
15180
+ function isValidCdpTarget(value) {
15181
+ if (typeof value !== "string" || value === "") return false;
15182
+ if (CDP_PORT.test(value)) {
15183
+ const port = Number(value);
15184
+ return port >= 1 && port <= 65535;
15185
+ }
15186
+ return CDP_URL.test(value);
15187
+ }
15005
15188
  var vpsConfigSchema = external_exports.object({
15006
15189
  sshAlias: external_exports.string().refine((value) => value === "" || isValidSshAlias(value), {
15007
15190
  message: "must be a simple SSH config alias"
15008
15191
  }).optional()
15009
15192
  });
15193
+ var browserEngineConfigSchema = external_exports.object({
15194
+ attachCdpUrl: external_exports.string().trim().max(2048).refine((value) => value === "" || isValidCdpTarget(value), {
15195
+ message: "browserEngine.attachCdpUrl must be a CDP port (1-65535) or an http(s)/ws(s) URL"
15196
+ }).optional()
15197
+ });
15010
15198
  var roomConfigSchema = external_exports.object({
15011
15199
  turnTimeoutMinutes: external_exports.number().int().min(MIN_ROOM_TURN_TIMEOUT_MINUTES).max(MAX_ROOM_TURN_TIMEOUT_MINUTES),
15012
15200
  /** Room handoff tree lifetime. Active execution pauses this clock; the
@@ -15148,7 +15336,11 @@ var featureConfigSchema = external_exports.object({
15148
15336
  /** Claude bots also load the MCP servers and connectors from this
15149
15337
  * machine's own Claude Code setup (Plugins → MCP servers switch). Off by
15150
15338
  * default: each extra tool costs tokens on every model call. */
15151
- claudeUserMcp: external_exports.boolean().optional()
15339
+ claudeUserMcp: external_exports.boolean().optional(),
15340
+ /** LLM-generated titles for new bot threads. Off until explicitly
15341
+ * enabled; a one-shot that fails or answers junk leaves the first-message
15342
+ * snippet in place — see llmThreadTitlesEnabled. */
15343
+ llmThreadTitles: external_exports.boolean().optional()
15152
15344
  });
15153
15345
  var onboardingConfigSchema = external_exports.object({
15154
15346
  /** ISO timestamp of finishing (or skipping to the end of) the welcome flow. */
@@ -15162,6 +15354,10 @@ var instanceConfigSchema = external_exports.object({
15162
15354
  driver: external_exports.string().min(1),
15163
15355
  displayName: optionalText,
15164
15356
  accentColor: optionalText,
15357
+ icon: external_exports.discriminatedUnion("kind", [
15358
+ external_exports.object({ kind: external_exports.literal("preset"), preset: external_exports.enum(PROVIDER_ICON_PRESETS) }).strict(),
15359
+ external_exports.object({ kind: external_exports.literal("custom"), dataUrl: external_exports.string() }).strict().refine((icon) => providerIconError(icon) === null, { message: "Invalid provider icon" })
15360
+ ]).optional(),
15165
15361
  environment: external_exports.record(external_exports.string(), external_exports.string()).optional(),
15166
15362
  enabled: external_exports.boolean().optional(),
15167
15363
  config: external_exports.json().optional()
@@ -15226,6 +15422,7 @@ var appConfigSchema = external_exports.object({
15226
15422
  /** Voice settings and the selected voice id. `provider` picks the
15227
15423
  * engine: "elevenlabs" (default; needs `key`), "fish" (needs its own
15228
15424
  * `fishKey`), "system" (the Mac's built-in voices, no key), or
15425
+ * "xai" (Grok TTS, reusing `xai.key`), or
15229
15426
  * "chatterbox" (a local OpenAI-compatible Chatterbox server; `baseUrl`
15230
15427
  * and `model` are settings, not secrets). Cloud keys stay separate so
15231
15428
  * switching providers never overwrites or misuses the other key. */
@@ -15233,7 +15430,7 @@ var appConfigSchema = external_exports.object({
15233
15430
  key: optionalText,
15234
15431
  fishKey: optionalText,
15235
15432
  voice: optionalText,
15236
- provider: external_exports.enum(["elevenlabs", "fish", "system", "chatterbox"]).optional(),
15433
+ provider: external_exports.enum(["elevenlabs", "fish", "system", "chatterbox", "xai"]).optional(),
15237
15434
  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(),
15238
15435
  model: optionalText
15239
15436
  }).optional(),
@@ -15262,6 +15459,11 @@ var appConfigSchema = external_exports.object({
15262
15459
  * system language. Unknown tags degrade to English in the renderer. */
15263
15460
  language: optionalText,
15264
15461
  rooms: roomConfigSchema.optional(),
15462
+ context: external_exports.object({
15463
+ rebuildBytes: external_exports.number().int().min(1024).max(1e6).optional(),
15464
+ compactAt: external_exports.number().positive().max(1e7).optional(),
15465
+ autoCompact: external_exports.boolean().optional()
15466
+ }).optional(),
15265
15467
  threads: external_exports.object({
15266
15468
  maxConcurrentPerBot: external_exports.number().int().min(1).max(MAX_CONCURRENT_BOT_THREADS),
15267
15469
  /** Cap each per-thread events/ and native/ NDJSON log at this many
@@ -15274,6 +15476,8 @@ var appConfigSchema = external_exports.object({
15274
15476
  localVm: localVmConfigSchema.optional(),
15275
15477
  features: featureConfigSchema.optional(),
15276
15478
  onboarding: onboardingConfigSchema.optional(),
15479
+ /** CDP attach target for a bot's browser; see browserEngineConfigSchema. */
15480
+ browserEngine: browserEngineConfigSchema.optional(),
15277
15481
  browserProfiles: browserProfilesSchema.optional(),
15278
15482
  instances: instanceConfigMapSchema.optional(),
15279
15483
  /** User-configured MCP servers, mounted into every capable engine. Kept
@@ -15312,6 +15516,7 @@ var SPAWNED_PROXIES = {
15312
15516
  connectors: resolveProxy("connector-proxy"),
15313
15517
  mcpGate: resolveProxy("mcp-gate"),
15314
15518
  phone: resolveProxy("drivers/phone-proxy"),
15519
+ hook: resolveProxy("hooks/omb-hook"),
15315
15520
  // Loaded by the external `pi` process via `-e`, not by this server — but
15316
15521
  // resolved through the same single source of truth so the packaged layout
15317
15522
  // check can assert it ships.
@@ -14602,6 +14602,7 @@ var SPAWNED_PROXIES = {
14602
14602
  connectors: resolveProxy("connector-proxy"),
14603
14603
  mcpGate: resolveProxy("mcp-gate"),
14604
14604
  phone: resolveProxy("drivers/phone-proxy"),
14605
+ hook: resolveProxy("hooks/omb-hook"),
14605
14606
  // Loaded by the external `pi` process via `-e`, not by this server — but
14606
14607
  // resolved through the same single source of truth so the packaged layout
14607
14608
  // check can assert it ships.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openmausbot",
3
- "version": "0.1.83",
3
+ "version": "0.1.85",
4
4
  "description": "Run the OpenMausBot server anywhere and pair your devices to it",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",