openmausbot 0.1.65 → 0.1.67

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 (54) hide show
  1. package/dist/assets/index-A3CBTxwl.css +1 -0
  2. package/dist/assets/{index-BZeH50da.js → index-BwpNqgCm.js} +1 -1
  3. package/dist/assets/index-CDuyoVPJ.js +278 -0
  4. package/dist/index.html +2 -2
  5. package/dist-server/browser-proxy.js +121 -0
  6. package/dist-server/computer-proxy.js +14 -3
  7. package/dist-server/container-mcp.js +43 -19
  8. package/dist-server/drivers/agents-proxy.js +31 -0
  9. package/dist-server/index.js +18985 -16059
  10. package/dist-server/local-computer-proxy.js +433 -0
  11. package/dist-server/local-computer.js +48 -5
  12. package/dist-server/mcp-server.js +38 -17
  13. package/dist-server/openmausbot.js +1666 -775
  14. package/dist-server/pair-cli.js +1666 -775
  15. package/dist-server/proxy-paths.js +2 -0
  16. package/dist-server/server/account-signin.js +103 -0
  17. package/dist-server/server/attachments.js +125 -13
  18. package/dist-server/server/browser-engine-release.js +10 -8
  19. package/dist-server/server/browser-engine.js +226 -26
  20. package/dist-server/server/browser-live.js +567 -0
  21. package/dist-server/server/browser-proxy.js +129 -0
  22. package/dist-server/server/browser-runtime.js +370 -0
  23. package/dist-server/server/caddy.js +203 -0
  24. package/dist-server/server/claude-accounts.js +103 -0
  25. package/dist-server/server/cli.js +163 -22
  26. package/dist-server/server/computer-proxy.js +11 -2
  27. package/dist-server/server/config.js +41 -19
  28. package/dist-server/server/control-client.js +7 -1
  29. package/dist-server/server/custom-domain.js +14 -0
  30. package/dist-server/server/drivers/agents-proxy.js +34 -0
  31. package/dist-server/server/drivers/claude-login-auth.js +334 -0
  32. package/dist-server/server/drivers/claude.js +85 -19
  33. package/dist-server/server/environment.js +1 -0
  34. package/dist-server/server/harness/bus.js +9 -4
  35. package/dist-server/server/harness/registry.js +15 -1
  36. package/dist-server/server/index.js +1120 -379
  37. package/dist-server/server/local-computer-proxy.js +28 -0
  38. package/dist-server/server/local-computer.js +17 -0
  39. package/dist-server/server/mcp-bridge.js +27 -11
  40. package/dist-server/server/peer-approval.js +19 -6
  41. package/dist-server/server/provider-auth-sessions.js +7 -0
  42. package/dist-server/server/proxy-paths.js +2 -0
  43. package/dist-server/server/sessions.js +42 -1
  44. package/dist-server/server/steer-queue.js +10 -8
  45. package/dist-server/server/store.js +234 -34
  46. package/dist-server/server/team-backup.js +1 -0
  47. package/dist-server/server/tunnel.js +27 -1
  48. package/dist-server/server/turn-resources.js +50 -0
  49. package/dist-server/server/workspace.js +53 -3
  50. package/dist-server/src/lib/composer-attachments.js +3 -3
  51. package/dist-server/vps-container-mcp.js +43 -19
  52. package/package.json +1 -1
  53. package/dist/assets/index-BOrNJcfG.js +0 -273
  54. package/dist/assets/index-Dwzk199I.css +0 -1
@@ -25,7 +25,12 @@ function createControlClient(options) {
25
25
  const res = await fetchImpl(url2, { headers, signal: AbortSignal.timeout(2e3) });
26
26
  if (!res.ok) return UNAVAILABLE;
27
27
  const body = await res.json().catch(() => null);
28
- return { held: body?.held === true, helpOpen: body?.helpOpen === true };
28
+ if (typeof body?.held !== "boolean" || typeof body?.helpOpen !== "boolean") return UNAVAILABLE;
29
+ return {
30
+ held: body.held,
31
+ helpOpen: body.helpOpen,
32
+ ...typeof body.blockedReason === "string" && body.blockedReason.trim() ? { blockedReason: body.blockedReason } : {}
33
+ };
29
34
  } catch {
30
35
  return UNAVAILABLE;
31
36
  }
@@ -276,7 +281,7 @@ function createGateInterceptor(options) {
276
281
  options.forward(line);
277
282
  return;
278
283
  }
279
- const held = await options.isHeld().catch(() => false);
284
+ const held = await options.isHeld().catch(() => true);
280
285
  if (!held) {
281
286
  options.forward(line);
282
287
  return;
@@ -285,10 +290,11 @@ function createGateInterceptor(options) {
285
290
  JSON.stringify({
286
291
  jsonrpc: "2.0",
287
292
  id: frame.id ?? null,
288
- result: { content: [{ type: "text", text: refusalText }], isError: true }
293
+ result: { content: [{ type: "text", text: options.getRefusalReason?.() ?? refusalText }], isError: true }
289
294
  })
290
295
  );
291
296
  });
297
+ return queue;
292
298
  };
293
299
  }
294
300
  function createMcpBridgeInterceptor(options) {
@@ -296,8 +302,11 @@ function createMcpBridgeInterceptor(options) {
296
302
  isHeld: options.gate.isHeld,
297
303
  forward: options.forward,
298
304
  refuse: options.answer,
299
- refusalText: options.gate.refusalText
300
- }) : options.forward;
305
+ refusalText: options.gate.refusalText,
306
+ getRefusalReason: options.gate.getRefusalReason
307
+ }) : (line) => {
308
+ options.forward(line);
309
+ };
301
310
  return (line) => {
302
311
  let frame = null;
303
312
  try {
@@ -310,37 +319,47 @@ function createMcpBridgeInterceptor(options) {
310
319
  }
311
320
  return;
312
321
  }
313
- afterPing(line);
322
+ return afterPing(line);
314
323
  };
315
324
  }
316
325
  function runMcpBridge(options) {
317
326
  const child = spawn(options.command, options.args, {
318
327
  shell: false,
319
- env: { ...process.env, PATH: augmentedPath() },
328
+ env: options.env ?? { ...process.env, PATH: augmentedPath() },
320
329
  stdio: ["pipe", "pipe", "pipe"]
321
330
  });
322
331
  child.stdin.on("error", () => {
323
332
  });
324
333
  child.stderr.pipe(process.stderr);
325
334
  const client = options.gate ? createControlClient({ url: options.gate.url, token: options.gate.token }) : null;
335
+ let refusalReason;
326
336
  const answer = (line) => process.stdout.write(line + "\n");
327
337
  const forward = (line) => child.stdin.write(line + "\n");
328
- const inbound = createLineSplitter(
329
- createMcpBridgeInterceptor({
330
- answer,
331
- forward,
332
- ...options.gate ? {
333
- gate: {
334
- isHeld: async () => (await client.state(true)).held
335
- }
336
- } : {}
337
- })
338
- );
338
+ const intercept = createMcpBridgeInterceptor({
339
+ answer,
340
+ forward,
341
+ ...options.gate ? {
342
+ gate: {
343
+ isHeld: async () => {
344
+ refusalReason = void 0;
345
+ const state = await client.state(true);
346
+ refusalReason = state.blockedReason;
347
+ return state.held;
348
+ },
349
+ getRefusalReason: () => refusalReason
350
+ }
351
+ } : {}
352
+ });
353
+ let pendingInput = Promise.resolve();
354
+ const inbound = createLineSplitter((line) => {
355
+ const completion = intercept(line);
356
+ if (completion) pendingInput = completion;
357
+ });
339
358
  const onStdin = (chunk) => inbound.push(chunk);
340
359
  process.stdin.on("data", onStdin);
341
360
  process.stdin.on("end", () => {
342
361
  inbound.flush();
343
- child.stdin.end();
362
+ void pendingInput.finally(() => child.stdin.end());
344
363
  });
345
364
  const outbound = createLineSplitter((line) => process.stdout.write(line + "\n"));
346
365
  child.stdout.on("data", (chunk) => outbound.push(chunk));
@@ -15088,6 +15107,9 @@ var defaultModelSelectionSchema = external_exports.object({
15088
15107
  var appConfigSchema = external_exports.object({
15089
15108
  /** Verified by the dedicated domain endpoint, never a generic config patch. */
15090
15109
  customDomain: external_exports.string().optional(),
15110
+ /** Who may sign in with an emailed code (server/account-signin.ts):
15111
+ * addresses or `@domain` entries; admins get every scope, members chat only. */
15112
+ signIn: external_exports.object({ admins: external_exports.array(external_exports.string().max(320)).max(500).optional(), members: external_exports.array(external_exports.string().max(320)).max(5e3).optional() }).optional(),
15091
15113
  defaultModelSelection: defaultModelSelectionSchema.optional(),
15092
15114
  /** CLI-only launch preferences. Never enable remote access implicitly. */
15093
15115
  cliStartup: external_exports.object({
@@ -15148,7 +15170,9 @@ function resolveProxy(relative) {
15148
15170
  return existsSync2(source) ? source : join3(SERVER_ROOT, `${relative}.js`);
15149
15171
  }
15150
15172
  var SPAWNED_PROXIES = {
15173
+ browser: resolveProxy("browser-proxy"),
15151
15174
  computer: resolveProxy("computer-proxy"),
15175
+ localComputer: resolveProxy("local-computer-proxy"),
15152
15176
  permission: resolveProxy("permission-proxy"),
15153
15177
  containerMcp: resolveProxy("container-mcp"),
15154
15178
  vpsContainerMcp: resolveProxy("vps-container-mcp"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openmausbot",
3
- "version": "0.1.65",
3
+ "version": "0.1.67",
4
4
  "description": "Run the OpenMausBot server anywhere and pair your devices to it",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",