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
@@ -177,6 +177,86 @@ function probeLoginShellPath() {
177
177
  );
178
178
  }
179
179
 
180
+ // server/mcp-tool-schema.ts
181
+ var ROOT_COMBINATORS = ["anyOf", "oneOf", "allOf", "not"];
182
+ function isObject(value) {
183
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
184
+ }
185
+ function branches(value) {
186
+ return Array.isArray(value) ? value.filter(isObject) : [];
187
+ }
188
+ function objectShape(schema) {
189
+ const properties = isObject(schema.properties) ? { ...schema.properties } : {};
190
+ const required = new Set(Array.isArray(schema.required) ? schema.required.filter((key) => typeof key === "string") : []);
191
+ const adopt = (shape) => {
192
+ for (const [key, value] of Object.entries(shape.properties)) if (!(key in properties)) properties[key] = value;
193
+ };
194
+ for (const branch of branches(schema.allOf)) {
195
+ const shape = objectShape(branch);
196
+ adopt(shape);
197
+ for (const key of shape.required) required.add(key);
198
+ }
199
+ for (const keyword of ["anyOf", "oneOf"]) {
200
+ const choices = branches(schema[keyword]).map(objectShape);
201
+ if (choices.length === 0) continue;
202
+ for (const choice of choices) adopt(choice);
203
+ for (const key of choices[0].required) {
204
+ if (choices.every((choice) => choice.required.includes(key))) required.add(key);
205
+ }
206
+ }
207
+ return { properties, required: [...required] };
208
+ }
209
+ function describesObject(type) {
210
+ return type === void 0 || type === "object" || Array.isArray(type) && type.includes("object");
211
+ }
212
+ function providerSafeInputSchema(schema) {
213
+ if (!isObject(schema) || !describesObject(schema.type)) return { type: "object", properties: {} };
214
+ if (schema.type === "object" && ROOT_COMBINATORS.every((keyword) => !(keyword in schema))) return schema;
215
+ const { properties, required } = objectShape(schema);
216
+ const safe = { ...schema, type: "object", properties };
217
+ for (const keyword of ROOT_COMBINATORS) delete safe[keyword];
218
+ if (required.length > 0) safe.required = required;
219
+ else delete safe.required;
220
+ return safe;
221
+ }
222
+ function createToolListNormalizer() {
223
+ const pending = /* @__PURE__ */ new Set();
224
+ const idKey = (id) => `${typeof id}:${String(id)}`;
225
+ return {
226
+ observeRequest(line) {
227
+ let frame;
228
+ try {
229
+ frame = JSON.parse(line);
230
+ } catch {
231
+ return;
232
+ }
233
+ if (isObject(frame) && frame.method === "tools/list" && (typeof frame.id === "number" || typeof frame.id === "string")) {
234
+ pending.add(idKey(frame.id));
235
+ }
236
+ },
237
+ rewriteResponse(line) {
238
+ if (pending.size === 0) return line;
239
+ let frame;
240
+ try {
241
+ frame = JSON.parse(line);
242
+ } catch {
243
+ return line;
244
+ }
245
+ if (!isObject(frame) || "method" in frame || !pending.delete(idKey(frame.id))) return line;
246
+ if (!isObject(frame.result) || !Array.isArray(frame.result.tools)) return line;
247
+ let changed = false;
248
+ const tools = frame.result.tools.map((tool) => {
249
+ if (!isObject(tool)) return tool;
250
+ const inputSchema = providerSafeInputSchema(tool.inputSchema);
251
+ if (inputSchema === tool.inputSchema) return tool;
252
+ changed = true;
253
+ return { ...tool, inputSchema };
254
+ });
255
+ return changed ? JSON.stringify({ ...frame, result: { ...frame.result, tools } }) : line;
256
+ }
257
+ };
258
+ }
259
+
180
260
  // server/mcp-bridge.ts
181
261
  var BRIDGE_INACTIVITY_MS = 45e3;
182
262
  var PROBE_TIMEOUT_MS = 1e4;
@@ -346,8 +426,10 @@ function runMcpBridge(options) {
346
426
  }
347
427
  } : {}
348
428
  });
429
+ const toolLists = createToolListNormalizer();
349
430
  let pendingInput = Promise.resolve();
350
431
  const inbound = createLineSplitter((line) => {
432
+ toolLists.observeRequest(line);
351
433
  const completion = intercept(line);
352
434
  if (completion) pendingInput = completion;
353
435
  });
@@ -357,7 +439,7 @@ function runMcpBridge(options) {
357
439
  inbound.flush();
358
440
  void pendingInput.finally(() => child.stdin.end());
359
441
  });
360
- const outbound = createLineSplitter((line) => process.stdout.write(line + "\n"));
442
+ const outbound = createLineSplitter((line) => process.stdout.write(toolLists.rewriteResponse(line) + "\n"));
361
443
  child.stdout.on("data", (chunk) => outbound.push(chunk));
362
444
  child.stdout.on("end", () => outbound.flush());
363
445
  const detach = () => {
@@ -23,6 +23,7 @@ var SPAWNED_PROXIES = {
23
23
  connectors: resolveProxy("connector-proxy"),
24
24
  mcpGate: resolveProxy("mcp-gate"),
25
25
  phone: resolveProxy("drivers/phone-proxy"),
26
+ hook: resolveProxy("hooks/omb-hook"),
26
27
  // Loaded by the external `pi` process via `-e`, not by this server — but
27
28
  // resolved through the same single source of truth so the packaged layout
28
29
  // check can assert it ships.
@@ -208,11 +209,22 @@ function validateLinuxDescriptorRuntime(descriptorFile, raw, {
208
209
  return false;
209
210
  }
210
211
  }
212
+ function validateLegacyDescriptorRuntime(descriptorFile, platform, { uid = process.getuid?.() ?? -1 } = {}) {
213
+ try {
214
+ const stat = lstatSync(descriptorFile);
215
+ if (!stat.isFile() || stat.isSymbolicLink()) return false;
216
+ if (platform !== "win32" && (stat.uid !== uid || (stat.mode & 18) !== 0)) return false;
217
+ return true;
218
+ } catch {
219
+ return false;
220
+ }
221
+ }
211
222
  function readCuaConnection({
212
223
  platform = process.platform,
213
224
  userData = process.env.OMB_USER_DATA,
214
225
  home = homedir(),
215
- validateLinuxRuntime = validateLinuxDescriptorRuntime
226
+ validateLinuxRuntime = validateLinuxDescriptorRuntime,
227
+ validateLegacyRuntime = validateLegacyDescriptorRuntime
216
228
  } = {}) {
217
229
  const candidates = userData ? [join2(userData, "cua-connection.json")] : [];
218
230
  if (platform === "darwin") {
@@ -228,7 +240,7 @@ function readCuaConnection({
228
240
  if (decoded && validateLinuxRuntime(file, raw)) return decoded;
229
241
  } else {
230
242
  const decoded = decodeLegacyDescriptor(raw, platform);
231
- if (decoded) return decoded;
243
+ if (decoded && validateLegacyRuntime(file, platform)) return decoded;
232
244
  }
233
245
  } catch {
234
246
  }