openmausbot 0.1.92 → 0.1.94

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 (163) hide show
  1. package/dist/assets/{DesktopViewer-Do6lBa4C.js → DesktopViewer-bxM7NV3N.js} +1 -1
  2. package/dist/assets/{abnfDiagram-O67JEVCF-Cd3X7Hxc.js → abnfDiagram-O67JEVCF-BhMdJhRJ.js} +1 -1
  3. package/dist/assets/{arc-DIYc7Ymx.js → arc-B5itKDcx.js} +1 -1
  4. package/dist/assets/{architectureDiagram-NJMV4G6O-DBmRGVyP.js → architectureDiagram-NJMV4G6O-C5d7UY6U.js} +1 -1
  5. package/dist/assets/{blockDiagram-BEXU5L5S-CPFePSEE.js → blockDiagram-BEXU5L5S-BrZIhMmu.js} +1 -1
  6. package/dist/assets/{c4Diagram-YGBWAQC7-DD_DO1qy.js → c4Diagram-YGBWAQC7-7I0ArfbD.js} +1 -1
  7. package/dist/assets/channel-CdJX6i8k.js +1 -0
  8. package/dist/assets/{chunk-2Q5K7J3B-BNEeNSjX.js → chunk-2Q5K7J3B-BnEsyN36.js} +1 -1
  9. package/dist/assets/{chunk-3FUC2YCW-BbinLaqH.js → chunk-3FUC2YCW-BXATQ52s.js} +2 -2
  10. package/dist/assets/{chunk-5VM5RSS4-BBgYrgDR.js → chunk-5VM5RSS4-B0BpTkEx.js} +1 -1
  11. package/dist/assets/{chunk-GTNCS2PH-ezXj-kA-.js → chunk-GTNCS2PH-BtLTz6FR.js} +1 -1
  12. package/dist/assets/{chunk-GWA4HPMP-9FxZ3diV.js → chunk-GWA4HPMP-D6gcZOYt.js} +1 -1
  13. package/dist/assets/{chunk-JWPE2WC7-CO-40JpI.js → chunk-JWPE2WC7-DCLrosvf.js} +1 -1
  14. package/dist/assets/{chunk-NETBCI7D-BEhjslYE.js → chunk-NETBCI7D-B9JsknV9.js} +1 -1
  15. package/dist/assets/{chunk-WEXAMYUT-CNeq4n7_.js → chunk-WEXAMYUT-CsoTxw7z.js} +1 -1
  16. package/dist/assets/{chunk-XXDRQBXY-OsCY7KSi.js → chunk-XXDRQBXY-0F_frB0c.js} +1 -1
  17. package/dist/assets/{classDiagram-v2-NBCMYWYE-CloRUEtk.js → classDiagram-v2-NBCMYWYE-DkrpnflX.js} +1 -1
  18. package/dist/assets/{cose-bilkent-JH36ORCC-D1BGZhp4.js → cose-bilkent-JH36ORCC-BNDwYBt9.js} +1 -1
  19. package/dist/assets/{cynefin-OW5HDTMX-CUf4T2CN.js → cynefin-OW5HDTMX-JUkNr1Mk.js} +1 -1
  20. package/dist/assets/{cynefinDiagram-VND7K2PF-DPEZrFGA.js → cynefinDiagram-VND7K2PF-DKeh9N4M.js} +1 -1
  21. package/dist/assets/{dagre-6A5THRUB-bDe6GIv5.js → dagre-6A5THRUB-ve-6T_wX.js} +1 -1
  22. package/dist/assets/{diagram-22UHCM2B-CdcUQz55.js → diagram-22UHCM2B-BuJ2d8rT.js} +1 -1
  23. package/dist/assets/{diagram-3UASUU5V-BZpqGg7c.js → diagram-3UASUU5V-BgOs_Ni-.js} +1 -1
  24. package/dist/assets/{diagram-ATOU4E4O-DvGM6ugp.js → diagram-ATOU4E4O-DMK6VmcP.js} +1 -1
  25. package/dist/assets/{diagram-CDSNMT55-DSTmMm0s.js → diagram-CDSNMT55-DksASlcY.js} +1 -1
  26. package/dist/assets/{diagram-MLGK6HIB-15cucnMn.js → diagram-MLGK6HIB-Bgn8I5k6.js} +1 -1
  27. package/dist/assets/{diagram-MPIPVDR6-tMbuaE6n.js → diagram-MPIPVDR6-zK0jqO8N.js} +1 -1
  28. package/dist/assets/{ebnfDiagram-ZINNZB2B-BYxYzjHI.js → ebnfDiagram-ZINNZB2B-vKrbzTwr.js} +1 -1
  29. package/dist/assets/{elk-276RUBZZ-v6bj852W.js → elk-276RUBZZ-Bzv2mPNf.js} +1 -1
  30. package/dist/assets/{erDiagram-OPXOYQCR-5lBBlnd2.js → erDiagram-OPXOYQCR-CvOyYuxu.js} +1 -1
  31. package/dist/assets/{flowDiagram-KWPJA3E3-CZyl1zIj.js → flowDiagram-KWPJA3E3-CtbnDbc0.js} +1 -1
  32. package/dist/assets/{ganttDiagram-FUAMR5RP-BiAI-ltZ.js → ganttDiagram-FUAMR5RP-c4dMRYyG.js} +1 -1
  33. package/dist/assets/{gitGraphDiagram-X574FWY7-BAZISkj3.js → gitGraphDiagram-X574FWY7-B34uaQho.js} +1 -1
  34. package/dist/assets/index-CPYrGsv1.js +610 -0
  35. package/dist/assets/{index-DGBaEXrM.js → index-CPiqc_DN.js} +1 -1
  36. package/dist/assets/index-CzT42GR8.css +1 -0
  37. package/dist/assets/{infoDiagram-VRGFBTTK-B6ooOy-Z.js → infoDiagram-VRGFBTTK-o64ma4CI.js} +1 -1
  38. package/dist/assets/{ishikawaDiagram-OU5B5YK6-BZ9ksi-B.js → ishikawaDiagram-OU5B5YK6-DV4C9BAm.js} +1 -1
  39. package/dist/assets/{journeyDiagram-ZHPQQLJL-DWqlzIEe.js → journeyDiagram-ZHPQQLJL-Bf0AHk1H.js} +1 -1
  40. package/dist/assets/{kanban-definition-PNTS6WVX-JX6piDwL.js → kanban-definition-PNTS6WVX-B1UMSKmE.js} +1 -1
  41. package/dist/assets/{linear-CmOWzX0P.js → linear-BpKhuyLm.js} +1 -1
  42. package/dist/assets/{mermaid.core-CF1zwoQ-.js → mermaid.core-B_BKNCw5.js} +5 -5
  43. package/dist/assets/{mindmap-definition-NLK3R4M7-CGh2K4fW.js → mindmap-definition-NLK3R4M7-DeARruT1.js} +1 -1
  44. package/dist/assets/{pegDiagram-GJSIUBJH-CDwYN0s7.js → pegDiagram-GJSIUBJH-BOQEk_1D.js} +1 -1
  45. package/dist/assets/{pieDiagram-5QR66LMP-1rfjJocB.js → pieDiagram-5QR66LMP-EIfoiTZo.js} +1 -1
  46. package/dist/assets/{quadrantDiagram-O4NWA36T-tKPvPiok.js → quadrantDiagram-O4NWA36T-GgZwT-fi.js} +1 -1
  47. package/dist/assets/{railroadDiagram-XR7U4H2S-BHLm5vXR.js → railroadDiagram-XR7U4H2S-D9rDQomj.js} +1 -1
  48. package/dist/assets/{requirementDiagram-PLB6GJNP-CB45STp7.js → requirementDiagram-PLB6GJNP-DAh1MIeo.js} +1 -1
  49. package/dist/assets/{sankeyDiagram-IPEJSGJF-55QA_huC.js → sankeyDiagram-IPEJSGJF-CPr6Uz64.js} +1 -1
  50. package/dist/assets/{sequenceDiagram-PO4LG4MO-BckFmQHn.js → sequenceDiagram-PO4LG4MO-BU6VIdcm.js} +1 -1
  51. package/dist/assets/{sizeCapture-INFHLROL-BFCOJF11.js → sizeCapture-INFHLROL-qF2HO41r.js} +1 -1
  52. package/dist/assets/{stateDiagram-v2-GCMORJYK-CZvmiVVN.js → stateDiagram-v2-GCMORJYK-DlJ8G4MD.js} +1 -1
  53. package/dist/assets/{swimlanes-2SLR337P-BpDUCEKy.js → swimlanes-2SLR337P-DzYE8I54.js} +1 -1
  54. package/dist/assets/swimlanesDiagram-TC7HE7FX-D-U4GtLQ.js +8 -0
  55. package/dist/assets/{timeline-definition-EJHVYXUP-BpxHq6IK.js → timeline-definition-EJHVYXUP-B7wzEQ0A.js} +1 -1
  56. package/dist/assets/{usecaseDiagram-POWQR4AR-Cj66vm02.js → usecaseDiagram-POWQR4AR-BvGgrxIP.js} +1 -1
  57. package/dist/assets/{vennDiagram-UO4OBE2U-C9nRkWE_.js → vennDiagram-UO4OBE2U-CEECdgQg.js} +1 -1
  58. package/dist/assets/{wardleyDiagram-VNRHLVJA-D-me_nWj.js → wardleyDiagram-VNRHLVJA-XQHA0P_P.js} +1 -1
  59. package/dist/assets/{xychartDiagram-PMCCYNJV-Dc_fL4mk.js → xychartDiagram-PMCCYNJV-B5mLcZI2.js} +1 -1
  60. package/dist/index.html +2 -2
  61. package/dist-server/cloud-home-start.js +1 -0
  62. package/dist-server/companion/src/routes.js +45 -1
  63. package/dist-server/container-mcp.js +99 -77
  64. package/dist-server/drivers/agents-proxy.js +40 -1
  65. package/dist-server/drivers/pi-mcp-extension.ts +245 -299
  66. package/dist-server/enterprise/server/index.js +1 -0
  67. package/dist-server/index.js +18361 -13794
  68. package/dist-server/local-computer-proxy.js +5 -1
  69. package/dist-server/local-computer.js +1 -0
  70. package/dist-server/mcp-gate.js +152 -20
  71. package/dist-server/mcp-remote-proxy.js +437 -0
  72. package/dist-server/openmausbot.js +8872 -7620
  73. package/dist-server/pair-cli.js +8872 -7620
  74. package/dist-server/permission-proxy.js +65 -1
  75. package/dist-server/proxy-paths.js +1 -0
  76. package/dist-server/server/auto-approve.js +33 -11
  77. package/dist-server/server/boat.js +3 -3
  78. package/dist-server/server/browser-live.js +14 -5
  79. package/dist-server/server/browser-runtime.js +6 -0
  80. package/dist-server/server/channel-queue.js +4 -1
  81. package/dist-server/server/cli.js +32 -12
  82. package/dist-server/server/cloud-move-http.js +9 -3
  83. package/dist-server/server/cloud-move.js +18 -0
  84. package/dist-server/server/cloud-owner.js +1 -1
  85. package/dist-server/server/computer-control.js +6 -0
  86. package/dist-server/server/computer-wait.js +33 -13
  87. package/dist-server/server/config.js +57 -10
  88. package/dist-server/server/container-computer.js +43 -32
  89. package/dist-server/server/decision-log.js +9 -6
  90. package/dist-server/server/delegations.js +47 -22
  91. package/dist-server/server/digest.js +12 -2
  92. package/dist-server/server/drivers/acp/core.js +229 -20
  93. package/dist-server/server/drivers/acp/cursor.js +13 -1
  94. package/dist-server/server/drivers/acp/grok.js +208 -3
  95. package/dist-server/server/drivers/acp/quiet-status.js +257 -0
  96. package/dist-server/server/drivers/acp/qwen.js +18 -0
  97. package/dist-server/server/drivers/agents-call.js +28 -0
  98. package/dist-server/server/drivers/agents-catalog.js +10 -1
  99. package/dist-server/server/drivers/boatagent.js +2 -0
  100. package/dist-server/server/drivers/builtIn.js +2 -0
  101. package/dist-server/server/drivers/cerebras.js +108 -0
  102. package/dist-server/server/drivers/chat-mcp-tools.js +45 -15
  103. package/dist-server/server/drivers/claude.js +35 -9
  104. package/dist-server/server/drivers/codex.js +84 -10
  105. package/dist-server/server/drivers/openai-chat.js +37 -5
  106. package/dist-server/server/drivers/pi.js +48 -4
  107. package/dist-server/server/drivers/prompt-split.js +2 -0
  108. package/dist-server/server/env-path.js +6 -2
  109. package/dist-server/server/environment.js +3 -0
  110. package/dist-server/server/guarded-requests.js +2 -1
  111. package/dist-server/server/index.js +1353 -311
  112. package/dist-server/server/live-call-controller.js +868 -0
  113. package/dist-server/server/live-call.js +216 -0
  114. package/dist-server/server/local-vm-stop-reason.js +26 -0
  115. package/dist-server/server/mcp-gate-config.js +43 -12
  116. package/dist-server/server/mcp-gate.js +127 -25
  117. package/dist-server/server/mcp-http.js +46 -8
  118. package/dist-server/server/mcp-remote-proxy.js +108 -0
  119. package/dist-server/server/new-bot-defaults.js +3 -0
  120. package/dist-server/server/peer-provenance.js +4 -2
  121. package/dist-server/server/permission-proxy.js +15 -1
  122. package/dist-server/server/plan-usage.js +797 -0
  123. package/dist-server/server/provider-key-check.js +2 -1
  124. package/dist-server/server/proxy-paths.js +1 -0
  125. package/dist-server/server/redact.js +2 -0
  126. package/dist-server/server/request-auth.js +3 -2
  127. package/dist-server/server/routes/desktop-viewer.js +50 -6
  128. package/dist-server/server/routes/live.js +98 -0
  129. package/dist-server/server/routines.js +6 -3
  130. package/dist-server/server/skill-library.js +207 -0
  131. package/dist-server/server/skills-library-migration.js +235 -0
  132. package/dist-server/server/skills.js +66 -3
  133. package/dist-server/server/steer-queue.js +13 -1
  134. package/dist-server/server/store.js +86 -4
  135. package/dist-server/server/surface.js +9 -3
  136. package/dist-server/server/team-backup.js +2 -1
  137. package/dist-server/server/thread-events.js +1 -1
  138. package/dist-server/server/tunnel.js +20 -1
  139. package/dist-server/server/turn-log.js +10 -0
  140. package/dist-server/server/turn-resources.js +124 -0
  141. package/dist-server/server/vps-computer.js +1 -1
  142. package/dist-server/server/workspace-backup.js +22 -0
  143. package/dist-server/server/workspace.js +1 -1
  144. package/dist-server/shared/approval-mode.js +1 -1
  145. package/dist-server/shared/ask-question.js +13 -0
  146. package/dist-server/shared/call-consent.js +28 -0
  147. package/dist-server/shared/live-approval.js +124 -0
  148. package/dist-server/shared/live-call.js +176 -0
  149. package/dist-server/shared/redact.js +1 -0
  150. package/dist-server/shared/skill-md.js +10 -0
  151. package/dist-server/shared/team-backup.js +3 -0
  152. package/dist-server/shared/tool-name.js +22 -0
  153. package/dist-server/shared/tool-scope-support.js +25 -0
  154. package/dist-server/shared/tool-scope.js +136 -0
  155. package/dist-server/src/lib/thread-refs.js +406 -0
  156. package/dist-server/vps-container-mcp.js +99 -77
  157. package/dist-server/workspace-backup.worker.js +103 -100
  158. package/enterprise/server/index.js +1 -0
  159. package/package.json +1 -1
  160. package/dist/assets/channel-Dtk5Mtic.js +0 -1
  161. package/dist/assets/index-Cdmjrl28.css +0 -1
  162. package/dist/assets/index-DR7YPMkW.js +0 -597
  163. package/dist/assets/swimlanesDiagram-TC7HE7FX-M0GYW9Y3.js +0 -8
@@ -16,7 +16,7 @@ import {
16
16
  cpSync,
17
17
  createReadStream,
18
18
  createWriteStream,
19
- existsSync as existsSync2,
19
+ existsSync,
20
20
  fstatSync,
21
21
  fsyncSync as fsyncSync2,
22
22
  lstatSync,
@@ -31,7 +31,7 @@ import {
31
31
  writeFileSync as writeFileSync2,
32
32
  writeSync
33
33
  } from "node:fs";
34
- import { isAbsolute, join as join3, parse as parse3, posix, relative, resolve, win32 } from "node:path";
34
+ import { isAbsolute, join as join2, parse as parse3, posix, relative, resolve, win32 } from "node:path";
35
35
  import { homedir as homedir2 } from "node:os";
36
36
  import { backup, DatabaseSync } from "node:sqlite";
37
37
  import { pipeline } from "node:stream/promises";
@@ -3179,7 +3179,7 @@ var WORKSPACE_BACKUP_CLIENT_KEYS = [
3179
3179
 
3180
3180
  // server/config.ts
3181
3181
  import { homedir } from "node:os";
3182
- import { join as join2 } from "node:path";
3182
+ import { join } from "node:path";
3183
3183
 
3184
3184
  // node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
3185
3185
  var external_exports = {};
@@ -18481,6 +18481,48 @@ function normalizeCronSchedule(value, after = Date.now()) {
18481
18481
  return schedule;
18482
18482
  }
18483
18483
 
18484
+ // shared/tool-scope.ts
18485
+ var SERVER_NAME = /^[a-z][a-z0-9_-]{0,31}$/;
18486
+ var CONTROL_CHARACTER = /[\x00-\x1f\x7f]/;
18487
+ var MAX_SELECTORS = 256;
18488
+ var MAX_SELECTOR_LENGTH = 1024;
18489
+ function validName(name) {
18490
+ return typeof name === "string" && name.trim().length > 0 && name.length <= MAX_SELECTOR_LENGTH && !CONTROL_CHARACTER.test(name) && !name.includes("*");
18491
+ }
18492
+ function selectorIdentity(selector) {
18493
+ if (selector.length > MAX_SELECTOR_LENGTH || CONTROL_CHARACTER.test(selector)) return;
18494
+ if (selector.startsWith("native:")) {
18495
+ const name = selector.slice(7);
18496
+ if (name === "*" || validName(name)) return { kind: "native", name };
18497
+ } else if (selector.startsWith("mcp:")) {
18498
+ const separator = selector.indexOf(":", 4);
18499
+ if (separator < 0) return;
18500
+ const server = selector.slice(4, separator);
18501
+ const name = selector.slice(separator + 1);
18502
+ if (SERVER_NAME.test(server) && (name === "*" || validName(name))) {
18503
+ return { kind: "mcp", server, name };
18504
+ }
18505
+ }
18506
+ }
18507
+ function parseToolScope(value) {
18508
+ if (value === void 0) return { ok: true, scope: void 0 };
18509
+ const invalid = { ok: false, error: "Tool selection must contain only valid allow and deny lists." };
18510
+ if (!value || typeof value !== "object" || Array.isArray(value)) return invalid;
18511
+ const prototype = Object.getPrototypeOf(value);
18512
+ if (prototype !== Object.prototype && prototype !== null) return invalid;
18513
+ const scope = {};
18514
+ for (const key of Reflect.ownKeys(value)) {
18515
+ if (key !== "allow" && key !== "deny") return invalid;
18516
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
18517
+ if (!descriptor || !("value" in descriptor)) return invalid;
18518
+ const list = descriptor.value;
18519
+ if (!Array.isArray(list) || list.length > MAX_SELECTORS) return invalid;
18520
+ if (!Array.from(list).every((entry) => typeof entry === "string" && selectorIdentity(entry))) return invalid;
18521
+ scope[key] = [...new Set(list)];
18522
+ }
18523
+ return { ok: true, scope };
18524
+ }
18525
+
18484
18526
  // server/new-bot-defaults.ts
18485
18527
  var strings = (max, length) => external_exports.array(external_exports.string().max(length)).max(max);
18486
18528
  var clock = external_exports.string().regex(/^(?:[01]\d|2[0-3]):[0-5]\d$/);
@@ -18515,6 +18557,10 @@ var botDefaultsProfileSchema = profilePatchSchema.extend({
18515
18557
  browser: external_exports.boolean().optional(),
18516
18558
  browserProfile: external_exports.string().max(100).nullable().optional(),
18517
18559
  mcpServers: strings(100, 100).nullable().optional(),
18560
+ toolScope: external_exports.custom((value) => value !== void 0 && parseToolScope(value).ok, "Invalid tool selection").transform((value) => {
18561
+ const parsed = parseToolScope(value);
18562
+ return parsed.ok ? parsed.scope : value;
18563
+ }).nullable().optional(),
18518
18564
  parkDirectMessages: external_exports.boolean().optional()
18519
18565
  }).strict();
18520
18566
  var scheduleSchema = external_exports.discriminatedUnion("type", [
@@ -18719,76 +18765,6 @@ function schemaIssue(error51, fallback) {
18719
18765
  var CLOUD_SEAT_IDLE_STOP_MS = 5 * 6e4;
18720
18766
  var CLOUD_SEAT_SLEEP_RETRY_MAX_MS = 10 * 6e4;
18721
18767
 
18722
- // server/proxy-paths.ts
18723
- import { existsSync } from "node:fs";
18724
- import { dirname, join } from "node:path";
18725
- import { fileURLToPath } from "node:url";
18726
- var SERVER_ROOT = dirname(fileURLToPath(import.meta.url));
18727
- function resolveProxy(relative2) {
18728
- const source = join(SERVER_ROOT, `${relative2}.ts`);
18729
- return existsSync(source) ? source : join(SERVER_ROOT, `${relative2}.js`);
18730
- }
18731
- var SPAWNED_PROXIES = {
18732
- browser: resolveProxy("browser-proxy"),
18733
- localComputer: resolveProxy("local-computer-proxy"),
18734
- permission: resolveProxy("permission-proxy"),
18735
- containerMcp: resolveProxy("container-mcp"),
18736
- vpsContainerMcp: resolveProxy("vps-container-mcp"),
18737
- agents: resolveProxy("drivers/agents-proxy"),
18738
- dweb: resolveProxy("drivers/dweb-proxy"),
18739
- connectors: resolveProxy("connector-proxy"),
18740
- mcpGate: resolveProxy("mcp-gate"),
18741
- phone: resolveProxy("drivers/phone-proxy"),
18742
- hook: resolveProxy("hooks/omb-hook"),
18743
- // Loaded by the external `pi` process via `-e`, not by this server — but
18744
- // resolved through the same single source of truth so the packaged layout
18745
- // check can assert it ships.
18746
- piMcpExtension: resolveProxy("drivers/pi-mcp-extension")
18747
- };
18748
-
18749
- // server/enterprise.ts
18750
- var layerSchema = external_exports.object({
18751
- customer: external_exports.string().min(1),
18752
- features: external_exports.array(external_exports.string().min(1)),
18753
- expiresAt: external_exports.string().nullable()
18754
- });
18755
- var DAY_MS = 24 * 60 * 6e4;
18756
-
18757
- // server/sessions.ts
18758
- var PAIRING_CODE_TTL_MS = 5 * 6e4;
18759
- function daysMs(value, fallbackDays) {
18760
- const days = Number(value);
18761
- const ok = Number.isInteger(days) && days >= 1 && days <= 3650;
18762
- return (ok ? days : fallbackDays) * 24 * 60 * 6e4;
18763
- }
18764
- var SESSION_TTL_MS = daysMs(process.env.OMB_SESSION_TTL_DAYS, 30);
18765
- var SESSION_MAX_AGE_MS = daysMs(process.env.OMB_SESSION_MAX_DAYS, 180);
18766
- var SESSION_RENEW_WHEN_LEFT_MS = SESSION_TTL_MS / 2;
18767
- var STREAM_TICKET_TTL_MS = 5 * 6e4;
18768
- var scopeSchema = external_exports.enum(["admin", "client"]);
18769
- var sessionSchema = external_exports.object({
18770
- id: external_exports.string().min(1),
18771
- tokenHash: external_exports.string().length(64),
18772
- label: external_exports.string().max(80),
18773
- scopes: external_exports.array(scopeSchema).min(1),
18774
- createdAt: external_exports.number(),
18775
- lastSeenAt: external_exports.number(),
18776
- expiresAt: external_exports.number(),
18777
- /** Set when the session came from an account sign-in rather than a code. */
18778
- userId: external_exports.string().max(256).optional(),
18779
- email: external_exports.string().max(320).optional(),
18780
- /** Set only by the internal verified-portal issuance path, never by email or pairing input. */
18781
- membershipAuthority: external_exports.literal("portal").optional(),
18782
- /** A browser sign-in (PairingCode `browser`): accepted only as its browser's cookie, never as a bearer token. */
18783
- cookieOnly: external_exports.literal(true).optional(),
18784
- /** Whose OMB Cloud a browser sign-in signed in to (its PairingCode `owner`). */
18785
- owner: external_exports.string().max(254).optional()
18786
- });
18787
- var fileSchema = external_exports.object({ version: external_exports.literal(1), sessions: external_exports.array(sessionSchema) });
18788
-
18789
- // server/cloud-home.ts
18790
- var CLOUD_PAIRING_NONCE_MS = 10 * 6e4;
18791
-
18792
18768
  // server/config.ts
18793
18769
  var optionalText = external_exports.string().optional();
18794
18770
  var SSH_ALIAS = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
@@ -18996,7 +18972,11 @@ var featureConfigSchema = external_exports.object({
18996
18972
  * may offer a per-second-billed cloud seat, but only through an explicit
18997
18973
  * consent card or a configured allowlist — never a silent Auto default.
18998
18974
  * Off until baked; see cloudOverflowEnabled for how to enable it by hand. */
18999
- cloudOverflow: external_exports.boolean().optional()
18975
+ cloudOverflow: external_exports.boolean().optional(),
18976
+ /** Opt-in shared skills library: one store at the data dir that bots
18977
+ * read by assignment instead of per-workspace copies. Off until
18978
+ * explicitly enabled — see skillsLibraryEnabled. */
18979
+ skillsLibrary: external_exports.boolean().optional()
19000
18980
  });
19001
18981
  var onboardingConfigSchema = external_exports.object({
19002
18982
  /** ISO timestamp of finishing (or skipping to the end of) the welcome flow. */
@@ -19078,6 +19058,7 @@ var appConfigSchema = external_exports.object({
19078
19058
  phone: external_exports.enum(["ios", "android"]).optional()
19079
19059
  }).optional(),
19080
19060
  mistral: external_exports.object({ key: optionalText }).optional(),
19061
+ cerebras: external_exports.object({ key: optionalText }).optional(),
19081
19062
  xai: external_exports.object({ key: optionalText, url: optionalText }).optional(),
19082
19063
  /** Anthropic API key for Claude Code billed per token, handed only to
19083
19064
  * Claude instances; `url` only for a proxy or a test double. Never a
@@ -19148,6 +19129,15 @@ var appConfigSchema = external_exports.object({
19148
19129
  baseUrl: external_exports.string().trim().max(2048).refine((value) => !value || /^https?:\/\//i.test(value), "the decision model address must start with http:// or https://").optional(),
19149
19130
  jobs: external_exports.object({ roomRouting: external_exports.boolean().optional() }).optional()
19150
19131
  }).optional(),
19132
+ /** Live calls: an OpenAI project key for GPT-Live, kept apart from every
19133
+ * other OpenAI credential so a Live call never bills an image or engine key
19134
+ * the user did not hand to it. `voice` is a GPT-Live built-in voice name. */
19135
+ live: external_exports.object({
19136
+ key: optionalText,
19137
+ voice: external_exports.string().trim().max(40).regex(/^[a-z]*$/, "a Live voice is a lowercase built-in voice name").optional(),
19138
+ readTypedReplies: external_exports.boolean().optional(),
19139
+ idleMinutes: external_exports.number().int().min(1).max(60).optional()
19140
+ }).optional(),
19151
19141
  /** Avatar provider credentials stay separate; choosing a router never reuses a cloud key. */
19152
19142
  imageGen: external_exports.object({
19153
19143
  provider: external_exports.enum(["openai", "xai", "custom"]).optional(),
@@ -19222,10 +19212,10 @@ function parseStoredConfig(value) {
19222
19212
  return parsed.data;
19223
19213
  }
19224
19214
  var DEFAULT_CAPTURE_QUIET_MS = 2 * 6e4;
19225
- var DATA_DIR = process.env.OMB_DATA_DIR ?? join2(homedir(), ".openmausbot");
19226
- var LEGACY_DATA_DIR = join2(homedir(), ".opengrokbot");
19227
- var EVENTS_DIR = join2(DATA_DIR, "events");
19228
- var NATIVE_DIR = join2(DATA_DIR, "native");
19215
+ var DATA_DIR = process.env.OMB_DATA_DIR ?? join(homedir(), ".openmausbot");
19216
+ var LEGACY_DATA_DIR = join(homedir(), ".opengrokbot");
19217
+ var EVENTS_DIR = join(DATA_DIR, "events");
19218
+ var NATIVE_DIR = join(DATA_DIR, "native");
19229
19219
  var OPENAI_API_INSTANCE = "openai";
19230
19220
  var OPENROUTER_API_INSTANCE = "openrouter";
19231
19221
  var XAI_API_INSTANCE = "xaiApi";
@@ -19321,6 +19311,7 @@ var EXCLUSION_NOTES = [
19321
19311
  "Device pairing, server identity, live leases and runtime files (existing destination identities are preserved).",
19322
19312
  "Saved credentials, provider and MCP connections, managed provider login homes and browser login profiles are not transferred. Destination connections are preserved; reconnect on a new device.",
19323
19313
  "Downloaded tools and caches; these can be installed again.",
19314
+ "Installed dependency folders (node_modules) and symbolic links inside conversation work folders; reinstall or recreate them in the project.",
19324
19315
  "External project folders, CLI login homes, browser session homes, OS keychains, companion devices and other servers.",
19325
19316
  "VM/container disk layers and remote cloud data; durable files inside this workspace are included."
19326
19317
  ];
@@ -19343,13 +19334,13 @@ function backupRoot(dataDir2) {
19343
19334
  if (root === parse3(root).root) throw new Error("A filesystem root cannot be a workspace backup target.");
19344
19335
  const stat = lstatSync(root);
19345
19336
  if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("The workspace data directory must not be a symbolic link.");
19346
- const path = join3(root, ".backups");
19337
+ const path = join2(root, ".backups");
19347
19338
  folder(path);
19348
19339
  return path;
19349
19340
  }
19350
19341
  function jobPath(dataDir2, id) {
19351
19342
  if (!ID.test(id)) throw new Error("Invalid workspace backup identifier.");
19352
- const path = join3(backupRoot(dataDir2), id);
19343
+ const path = join2(backupRoot(dataDir2), id);
19353
19344
  if (entryExists(path)) {
19354
19345
  const stat = lstatSync(path);
19355
19346
  if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("Unsafe workspace backup job directory.");
@@ -19392,14 +19383,14 @@ function writeJson(path, value) {
19392
19383
  writeFileAtomic(path, text, { mode: 384 });
19393
19384
  }
19394
19385
  function assertLocalAuthOutsideSnapshot(dataDir2) {
19395
- const configPath = join3(dataDir2, "config.json");
19396
- const config2 = existsSync2(configPath) ? privateJson(configPath) : {};
19386
+ const configPath = join2(dataDir2, "config.json");
19387
+ const config2 = existsSync(configPath) ? privateJson(configPath) : {};
19397
19388
  const instances = record2(config2) && record2(config2.instances) ? config2.instances : {};
19398
19389
  const fields = ["HOME", "USERPROFILE", "CLAUDE_CONFIG_DIR", "CODEX_HOME", "GROK_HOME", "KIMI_CODE_HOME", "HERMES_HOME", "FACTORY_HOME_OVERRIDE", "XDG_CONFIG_HOME", "XDG_DATA_HOME", "LOCALAPPDATA"];
19399
19390
  const check2 = (value, field, home) => {
19400
19391
  if (typeof value !== "string" || !value.trim()) return;
19401
19392
  const text = value.trim();
19402
- const expanded = text.startsWith("~/") || text.startsWith("~\\") ? join3(home, text.slice(2)) : text;
19393
+ const expanded = text.startsWith("~/") || text.startsWith("~\\") ? join2(home, text.slice(2)) : text;
19403
19394
  const resolved = resolve(expanded);
19404
19395
  const exists = entryExists(resolved);
19405
19396
  const path = relative(exists ? realpathSync(dataDir2) : resolve(dataDir2), exists ? realpathSync(resolved) : resolved).replaceAll("\\", "/");
@@ -19477,7 +19468,7 @@ function hashFile(path) {
19477
19468
  }
19478
19469
  }
19479
19470
  function countJsonArray(path) {
19480
- if (!existsSync2(path)) return 0;
19471
+ if (!existsSync(path)) return 0;
19481
19472
  const value = privateJson(path);
19482
19473
  if (!Array.isArray(value)) throw new Error("A workspace roster is not a valid JSON array.");
19483
19474
  const ids = /* @__PURE__ */ new Set();
@@ -19490,7 +19481,7 @@ function countJsonArray(path) {
19490
19481
  return value.length;
19491
19482
  }
19492
19483
  function databaseCounts(path) {
19493
- if (!existsSync2(path)) return { threads: 0, messages: 0 };
19484
+ if (!existsSync(path)) return { threads: 0, messages: 0 };
19494
19485
  const db = new DatabaseSync(path, { readOnly: true });
19495
19486
  try {
19496
19487
  const check2 = db.prepare("PRAGMA quick_check").all();
@@ -19509,27 +19500,29 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19509
19500
  const salt = randomBytes(16);
19510
19501
  const key = await passwordKey(options2.password, salt);
19511
19502
  const job = newJob(dataDir2, jobId2);
19512
- const snapshot = join3(job.directory, "snapshot");
19513
- folder(join3(snapshot, "data"));
19503
+ const snapshot = join2(job.directory, "snapshot");
19504
+ folder(join2(snapshot, "data"));
19514
19505
  const entries = [];
19515
19506
  const warnings = ["Stop external editors and managed desktops before exporting; files written outside this server cannot be frozen by the backup gate.", "Conversation text and user files are not redacted and may contain secrets you pasted. Keep the encrypted backup private.", RESTORE_WARNING];
19516
19507
  let bytes = 0;
19517
19508
  let skippedLinks = 0;
19509
+ let skippedDependencies = 0;
19510
+ let skippedWorkLinks = 0;
19518
19511
  try {
19519
19512
  const root = realpathSync(dataDir2);
19520
- const sourceDb = join3(root, "messages.db");
19521
- if (existsSync2(sourceDb)) {
19513
+ const sourceDb = join2(root, "messages.db");
19514
+ if (existsSync(sourceDb)) {
19522
19515
  if (lstatSync(sourceDb).isSymbolicLink()) throw new Error("The message database must not be a symbolic link.");
19523
19516
  const db = new DatabaseSync(sourceDb, { readOnly: true });
19524
19517
  const completionPulse = setInterval(() => {
19525
19518
  }, 25);
19526
19519
  try {
19527
- await backup(db, join3(snapshot, "messages-snapshot.db"));
19520
+ await backup(db, join2(snapshot, "messages-snapshot.db"));
19528
19521
  } finally {
19529
19522
  clearInterval(completionPulse);
19530
19523
  db.close();
19531
19524
  }
19532
- const snapshotDb = new DatabaseSync(join3(snapshot, "messages-snapshot.db"));
19525
+ const snapshotDb = new DatabaseSync(join2(snapshot, "messages-snapshot.db"));
19533
19526
  try {
19534
19527
  snapshotDb.exec("PRAGMA journal_mode = DELETE");
19535
19528
  } finally {
@@ -19543,8 +19536,16 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19543
19536
  if (excludedWorkspaceAuthPath(path2) || ephemeralWorkspaceTokenPath(path2) || redownloadedOrgLibraryPath(path2)) continue;
19544
19537
  if (forbiddenArchivePath(path2)) throw new Error("A workspace filename conflicts with a protected authentication or runtime path.");
19545
19538
  if (!validRelative(path2)) throw new Error("A workspace filename cannot be safely restored on supported platforms.");
19546
- const source = join3(directory, name);
19539
+ const source = join2(directory, name);
19547
19540
  const stat = lstatSync(source);
19541
+ if (name === "node_modules" && (stat.isDirectory() || stat.isSymbolicLink())) {
19542
+ skippedDependencies++;
19543
+ continue;
19544
+ }
19545
+ if (stat.isSymbolicLink() && path2.startsWith("task-workspaces/")) {
19546
+ skippedWorkLinks++;
19547
+ continue;
19548
+ }
19548
19549
  if (stat.isSymbolicLink()) {
19549
19550
  let target;
19550
19551
  try {
@@ -19563,7 +19564,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19563
19564
  continue;
19564
19565
  }
19565
19566
  if (entries.length >= MAX_WORKSPACE_BACKUP_FILES) throw new Error("The workspace exceeds the 100,000-entry backup limit.");
19566
- const destination = join3(snapshot, "data", path2);
19567
+ const destination = join2(snapshot, "data", path2);
19567
19568
  if (stat.isDirectory()) {
19568
19569
  folder(destination);
19569
19570
  entries.push({ path: path2, type: "directory", size: 0, mode: 448 });
@@ -19581,7 +19582,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19581
19582
  writeJson(destination, value);
19582
19583
  }
19583
19584
  copied = { size: lstatSync(destination).size, mode: 384, sha256: hashFile(destination) };
19584
- } else copied = copyRegular(path2 === "messages.db" ? join3(snapshot, "messages-snapshot.db") : source, destination);
19585
+ } else copied = copyRegular(path2 === "messages.db" ? join2(snapshot, "messages-snapshot.db") : source, destination);
19585
19586
  bytes += copied.size;
19586
19587
  if (bytes > MAX_WORKSPACE_BACKUP_BYTES) throw new Error("The workspace exceeds the 10 GB backup limit.");
19587
19588
  entries.push({ path: path2, type: "file", ...copied });
@@ -19590,6 +19591,8 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19590
19591
  };
19591
19592
  walk(root);
19592
19593
  if (skippedLinks) warnings.push(`${skippedLinks} managed skill discovery link(s) were omitted and are recreated by the app.`);
19594
+ if (skippedDependencies) warnings.push(`${skippedDependencies} installed dependency folder(s) (node_modules) were omitted; reinstall them in the project after restoring.`);
19595
+ if (skippedWorkLinks) warnings.push(`${skippedWorkLinks} symbolic link(s) in conversation work folders were omitted; what they point to is outside this backup.`);
19593
19596
  const summary = {
19594
19597
  format: "openmaus.workspace-backup",
19595
19598
  version: 1,
@@ -19599,9 +19602,9 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19599
19602
  files: entries.filter((entry) => entry.type === "file").length,
19600
19603
  directories: entries.filter((entry) => entry.type === "directory").length,
19601
19604
  bytes,
19602
- bots: countJsonArray(join3(snapshot, "data", "bots.json")),
19603
- groups: countJsonArray(join3(snapshot, "data", "groups.json")),
19604
- ...databaseCounts(join3(snapshot, "data", "messages.db")),
19605
+ bots: countJsonArray(join2(snapshot, "data", "bots.json")),
19606
+ groups: countJsonArray(join2(snapshot, "data", "groups.json")),
19607
+ ...databaseCounts(join2(snapshot, "data", "messages.db")),
19605
19608
  exclusions: EXCLUSION_NOTES,
19606
19609
  warnings
19607
19610
  };
@@ -19611,9 +19614,9 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19611
19614
  clientState: options2.clientState ?? {},
19612
19615
  entries
19613
19616
  };
19614
- writeJson(join3(snapshot, "manifest.json"), manifest);
19615
- validateManifest(privateJson(join3(snapshot, "manifest.json")));
19616
- const path = join3(job.directory, "workspace.ombbackup");
19617
+ writeJson(join2(snapshot, "manifest.json"), manifest);
19618
+ validateManifest(privateJson(join2(snapshot, "manifest.json")));
19619
+ const path = join2(job.directory, "workspace.ombbackup");
19617
19620
  const iv = randomBytes(12);
19618
19621
  const header = Buffer.concat([MAGIC, salt, iv]);
19619
19622
  const cipher = createCipheriv("aes-256-gcm", key, iv);
@@ -14598,6 +14598,7 @@ var SPAWNED_PROXIES = {
14598
14598
  dweb: resolveProxy("drivers/dweb-proxy"),
14599
14599
  connectors: resolveProxy("connector-proxy"),
14600
14600
  mcpGate: resolveProxy("mcp-gate"),
14601
+ mcpRemote: resolveProxy("mcp-remote-proxy"),
14601
14602
  phone: resolveProxy("drivers/phone-proxy"),
14602
14603
  hook: resolveProxy("hooks/omb-hook"),
14603
14604
  // Loaded by the external `pi` process via `-e`, not by this server — but
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openmausbot",
3
- "version": "0.1.92",
3
+ "version": "0.1.94",
4
4
  "description": "Run the OpenMausBot server anywhere and pair your devices to it",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -1 +0,0 @@
1
- import{U as a,C as n}from"./mermaid.core-CF1zwoQ-.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};