openmausbot 0.1.93 → 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 (140) hide show
  1. package/dist/assets/{DesktopViewer-CKNR3SEW.js → DesktopViewer-bxM7NV3N.js} +1 -1
  2. package/dist/assets/{abnfDiagram-O67JEVCF-Ckrm1I1X.js → abnfDiagram-O67JEVCF-BhMdJhRJ.js} +1 -1
  3. package/dist/assets/{arc-BBdBuCgB.js → arc-B5itKDcx.js} +1 -1
  4. package/dist/assets/{architectureDiagram-NJMV4G6O-CDdA3Hjs.js → architectureDiagram-NJMV4G6O-C5d7UY6U.js} +1 -1
  5. package/dist/assets/{blockDiagram-BEXU5L5S-AUrsx1YR.js → blockDiagram-BEXU5L5S-BrZIhMmu.js} +1 -1
  6. package/dist/assets/{c4Diagram-YGBWAQC7-BEqQ0Unh.js → c4Diagram-YGBWAQC7-7I0ArfbD.js} +1 -1
  7. package/dist/assets/channel-CdJX6i8k.js +1 -0
  8. package/dist/assets/{chunk-2Q5K7J3B-CEEuvd4C.js → chunk-2Q5K7J3B-BnEsyN36.js} +1 -1
  9. package/dist/assets/{chunk-3FUC2YCW-DyANCiHl.js → chunk-3FUC2YCW-BXATQ52s.js} +2 -2
  10. package/dist/assets/{chunk-5VM5RSS4-Dx_Slpw9.js → chunk-5VM5RSS4-B0BpTkEx.js} +1 -1
  11. package/dist/assets/{chunk-GTNCS2PH-Dl7h7iiD.js → chunk-GTNCS2PH-BtLTz6FR.js} +1 -1
  12. package/dist/assets/{chunk-GWA4HPMP-BLx07SPb.js → chunk-GWA4HPMP-D6gcZOYt.js} +1 -1
  13. package/dist/assets/{chunk-JWPE2WC7-BMxDj3n7.js → chunk-JWPE2WC7-DCLrosvf.js} +1 -1
  14. package/dist/assets/{chunk-NETBCI7D-CN66PT4H.js → chunk-NETBCI7D-B9JsknV9.js} +1 -1
  15. package/dist/assets/{chunk-WEXAMYUT-6HwhsDKw.js → chunk-WEXAMYUT-CsoTxw7z.js} +1 -1
  16. package/dist/assets/{chunk-XXDRQBXY-gWnLt7SN.js → chunk-XXDRQBXY-0F_frB0c.js} +1 -1
  17. package/dist/assets/{classDiagram-v2-NBCMYWYE-CMS5l2ea.js → classDiagram-v2-NBCMYWYE-DkrpnflX.js} +1 -1
  18. package/dist/assets/{cose-bilkent-JH36ORCC-CV7sQwIG.js → cose-bilkent-JH36ORCC-BNDwYBt9.js} +1 -1
  19. package/dist/assets/{cynefin-OW5HDTMX-CSyl-7vl.js → cynefin-OW5HDTMX-JUkNr1Mk.js} +1 -1
  20. package/dist/assets/{cynefinDiagram-VND7K2PF-BCLKL6az.js → cynefinDiagram-VND7K2PF-DKeh9N4M.js} +1 -1
  21. package/dist/assets/{dagre-6A5THRUB-DiaZs6S1.js → dagre-6A5THRUB-ve-6T_wX.js} +1 -1
  22. package/dist/assets/{diagram-22UHCM2B-BeTtmt3I.js → diagram-22UHCM2B-BuJ2d8rT.js} +1 -1
  23. package/dist/assets/{diagram-3UASUU5V-CsdBG-QQ.js → diagram-3UASUU5V-BgOs_Ni-.js} +1 -1
  24. package/dist/assets/{diagram-ATOU4E4O-BczvdbR1.js → diagram-ATOU4E4O-DMK6VmcP.js} +1 -1
  25. package/dist/assets/{diagram-CDSNMT55-DHTTTMhi.js → diagram-CDSNMT55-DksASlcY.js} +1 -1
  26. package/dist/assets/{diagram-MLGK6HIB-RTjHyd8z.js → diagram-MLGK6HIB-Bgn8I5k6.js} +1 -1
  27. package/dist/assets/{diagram-MPIPVDR6-BDenHEH_.js → diagram-MPIPVDR6-zK0jqO8N.js} +1 -1
  28. package/dist/assets/{ebnfDiagram-ZINNZB2B-BSiRSbtL.js → ebnfDiagram-ZINNZB2B-vKrbzTwr.js} +1 -1
  29. package/dist/assets/{elk-276RUBZZ-BCAElss-.js → elk-276RUBZZ-Bzv2mPNf.js} +1 -1
  30. package/dist/assets/{erDiagram-OPXOYQCR-C4_1ZPJe.js → erDiagram-OPXOYQCR-CvOyYuxu.js} +1 -1
  31. package/dist/assets/{flowDiagram-KWPJA3E3-Bcb4Z75S.js → flowDiagram-KWPJA3E3-CtbnDbc0.js} +1 -1
  32. package/dist/assets/{ganttDiagram-FUAMR5RP-BiPOzxzb.js → ganttDiagram-FUAMR5RP-c4dMRYyG.js} +1 -1
  33. package/dist/assets/{gitGraphDiagram-X574FWY7-B1wtF3ZS.js → gitGraphDiagram-X574FWY7-B34uaQho.js} +1 -1
  34. package/dist/assets/index-CPYrGsv1.js +610 -0
  35. package/dist/assets/{index-BkYwilkG.js → index-CPiqc_DN.js} +1 -1
  36. package/dist/assets/index-CzT42GR8.css +1 -0
  37. package/dist/assets/{infoDiagram-VRGFBTTK-A19No71U.js → infoDiagram-VRGFBTTK-o64ma4CI.js} +1 -1
  38. package/dist/assets/{ishikawaDiagram-OU5B5YK6-BQsqJ_cV.js → ishikawaDiagram-OU5B5YK6-DV4C9BAm.js} +1 -1
  39. package/dist/assets/{journeyDiagram-ZHPQQLJL-DAO0pVan.js → journeyDiagram-ZHPQQLJL-Bf0AHk1H.js} +1 -1
  40. package/dist/assets/{kanban-definition-PNTS6WVX-NepmKEe2.js → kanban-definition-PNTS6WVX-B1UMSKmE.js} +1 -1
  41. package/dist/assets/{linear-bq1PTDTW.js → linear-BpKhuyLm.js} +1 -1
  42. package/dist/assets/{mermaid.core-s4LTbQle.js → mermaid.core-B_BKNCw5.js} +5 -5
  43. package/dist/assets/{mindmap-definition-NLK3R4M7-LtdbgHFH.js → mindmap-definition-NLK3R4M7-DeARruT1.js} +1 -1
  44. package/dist/assets/{pegDiagram-GJSIUBJH-tdbaCxiK.js → pegDiagram-GJSIUBJH-BOQEk_1D.js} +1 -1
  45. package/dist/assets/{pieDiagram-5QR66LMP-DvkbpW8l.js → pieDiagram-5QR66LMP-EIfoiTZo.js} +1 -1
  46. package/dist/assets/{quadrantDiagram-O4NWA36T-Do4KaH-E.js → quadrantDiagram-O4NWA36T-GgZwT-fi.js} +1 -1
  47. package/dist/assets/{railroadDiagram-XR7U4H2S-BQWULOAs.js → railroadDiagram-XR7U4H2S-D9rDQomj.js} +1 -1
  48. package/dist/assets/{requirementDiagram-PLB6GJNP-w9kei1FU.js → requirementDiagram-PLB6GJNP-DAh1MIeo.js} +1 -1
  49. package/dist/assets/{sankeyDiagram-IPEJSGJF-D2gRy0e8.js → sankeyDiagram-IPEJSGJF-CPr6Uz64.js} +1 -1
  50. package/dist/assets/{sequenceDiagram-PO4LG4MO-a2sO5_Eo.js → sequenceDiagram-PO4LG4MO-BU6VIdcm.js} +1 -1
  51. package/dist/assets/{sizeCapture-INFHLROL-CiPJmFEB.js → sizeCapture-INFHLROL-qF2HO41r.js} +1 -1
  52. package/dist/assets/{stateDiagram-v2-GCMORJYK-DAkUUlL7.js → stateDiagram-v2-GCMORJYK-DlJ8G4MD.js} +1 -1
  53. package/dist/assets/{swimlanes-2SLR337P-DANf2R8Y.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-BKpQmzrT.js → timeline-definition-EJHVYXUP-B7wzEQ0A.js} +1 -1
  56. package/dist/assets/{usecaseDiagram-POWQR4AR-BtI7qLN-.js → usecaseDiagram-POWQR4AR-BvGgrxIP.js} +1 -1
  57. package/dist/assets/{vennDiagram-UO4OBE2U-gXJXrAG_.js → vennDiagram-UO4OBE2U-CEECdgQg.js} +1 -1
  58. package/dist/assets/{wardleyDiagram-VNRHLVJA-GU8Po5-n.js → wardleyDiagram-VNRHLVJA-XQHA0P_P.js} +1 -1
  59. package/dist/assets/{xychartDiagram-PMCCYNJV-BF4J30g6.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 +21 -0
  63. package/dist-server/container-mcp.js +93 -76
  64. package/dist-server/drivers/agents-proxy.js +38 -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 +16942 -13191
  68. package/dist-server/local-computer.js +1 -0
  69. package/dist-server/mcp-gate.js +147 -19
  70. package/dist-server/mcp-remote-proxy.js +437 -0
  71. package/dist-server/openmausbot.js +8233 -7651
  72. package/dist-server/pair-cli.js +8233 -7651
  73. package/dist-server/permission-proxy.js +65 -1
  74. package/dist-server/proxy-paths.js +1 -0
  75. package/dist-server/server/auto-approve.js +33 -11
  76. package/dist-server/server/browser-live.js +14 -5
  77. package/dist-server/server/browser-runtime.js +6 -0
  78. package/dist-server/server/channel-queue.js +4 -1
  79. package/dist-server/server/cli.js +32 -12
  80. package/dist-server/server/cloud-move-http.js +9 -3
  81. package/dist-server/server/cloud-move.js +18 -0
  82. package/dist-server/server/computer-wait.js +33 -13
  83. package/dist-server/server/config.js +44 -10
  84. package/dist-server/server/decision-log.js +9 -6
  85. package/dist-server/server/delegations.js +47 -22
  86. package/dist-server/server/drivers/acp/core.js +57 -8
  87. package/dist-server/server/drivers/acp/grok.js +208 -3
  88. package/dist-server/server/drivers/agents-call.js +28 -0
  89. package/dist-server/server/drivers/agents-catalog.js +10 -1
  90. package/dist-server/server/drivers/boatagent.js +2 -0
  91. package/dist-server/server/drivers/chat-mcp-tools.js +27 -14
  92. package/dist-server/server/drivers/claude.js +18 -6
  93. package/dist-server/server/drivers/codex.js +84 -10
  94. package/dist-server/server/drivers/openai-chat.js +11 -3
  95. package/dist-server/server/drivers/pi.js +48 -4
  96. package/dist-server/server/environment.js +3 -0
  97. package/dist-server/server/guarded-requests.js +2 -1
  98. package/dist-server/server/index.js +1143 -254
  99. package/dist-server/server/live-call-controller.js +868 -0
  100. package/dist-server/server/live-call.js +216 -0
  101. package/dist-server/server/mcp-gate-config.js +43 -12
  102. package/dist-server/server/mcp-gate.js +127 -25
  103. package/dist-server/server/mcp-http.js +46 -8
  104. package/dist-server/server/mcp-remote-proxy.js +108 -0
  105. package/dist-server/server/new-bot-defaults.js +3 -0
  106. package/dist-server/server/peer-provenance.js +4 -2
  107. package/dist-server/server/permission-proxy.js +15 -1
  108. package/dist-server/server/plan-usage.js +797 -0
  109. package/dist-server/server/proxy-paths.js +1 -0
  110. package/dist-server/server/redact.js +2 -0
  111. package/dist-server/server/request-auth.js +3 -2
  112. package/dist-server/server/routes/live.js +98 -0
  113. package/dist-server/server/skill-library.js +207 -0
  114. package/dist-server/server/skills-library-migration.js +235 -0
  115. package/dist-server/server/skills.js +66 -3
  116. package/dist-server/server/steer-queue.js +13 -1
  117. package/dist-server/server/store.js +32 -4
  118. package/dist-server/server/surface.js +9 -3
  119. package/dist-server/server/team-backup.js +2 -1
  120. package/dist-server/server/thread-events.js +1 -1
  121. package/dist-server/server/tunnel.js +20 -1
  122. package/dist-server/server/turn-log.js +10 -0
  123. package/dist-server/server/turn-resources.js +124 -0
  124. package/dist-server/shared/ask-question.js +13 -0
  125. package/dist-server/shared/call-consent.js +28 -0
  126. package/dist-server/shared/live-approval.js +124 -0
  127. package/dist-server/shared/live-call.js +176 -0
  128. package/dist-server/shared/skill-md.js +10 -0
  129. package/dist-server/shared/team-backup.js +3 -0
  130. package/dist-server/shared/tool-scope-support.js +25 -0
  131. package/dist-server/shared/tool-scope.js +136 -0
  132. package/dist-server/src/lib/thread-refs.js +406 -0
  133. package/dist-server/vps-container-mcp.js +93 -76
  134. package/dist-server/workspace-backup.worker.js +89 -100
  135. package/enterprise/server/index.js +1 -0
  136. package/package.json +1 -1
  137. package/dist/assets/channel-BU94VpxE.js +0 -1
  138. package/dist/assets/index-Biji-bfL.css +0 -1
  139. package/dist/assets/index-DZlhoES0.js +0 -597
  140. package/dist/assets/swimlanesDiagram-TC7HE7FX-CdHxG8aM.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. */
@@ -19149,6 +19129,15 @@ var appConfigSchema = external_exports.object({
19149
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(),
19150
19130
  jobs: external_exports.object({ roomRouting: external_exports.boolean().optional() }).optional()
19151
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(),
19152
19141
  /** Avatar provider credentials stay separate; choosing a router never reuses a cloud key. */
19153
19142
  imageGen: external_exports.object({
19154
19143
  provider: external_exports.enum(["openai", "xai", "custom"]).optional(),
@@ -19223,10 +19212,10 @@ function parseStoredConfig(value) {
19223
19212
  return parsed.data;
19224
19213
  }
19225
19214
  var DEFAULT_CAPTURE_QUIET_MS = 2 * 6e4;
19226
- var DATA_DIR = process.env.OMB_DATA_DIR ?? join2(homedir(), ".openmausbot");
19227
- var LEGACY_DATA_DIR = join2(homedir(), ".opengrokbot");
19228
- var EVENTS_DIR = join2(DATA_DIR, "events");
19229
- 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");
19230
19219
  var OPENAI_API_INSTANCE = "openai";
19231
19220
  var OPENROUTER_API_INSTANCE = "openrouter";
19232
19221
  var XAI_API_INSTANCE = "xaiApi";
@@ -19345,13 +19334,13 @@ function backupRoot(dataDir2) {
19345
19334
  if (root === parse3(root).root) throw new Error("A filesystem root cannot be a workspace backup target.");
19346
19335
  const stat = lstatSync(root);
19347
19336
  if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("The workspace data directory must not be a symbolic link.");
19348
- const path = join3(root, ".backups");
19337
+ const path = join2(root, ".backups");
19349
19338
  folder(path);
19350
19339
  return path;
19351
19340
  }
19352
19341
  function jobPath(dataDir2, id) {
19353
19342
  if (!ID.test(id)) throw new Error("Invalid workspace backup identifier.");
19354
- const path = join3(backupRoot(dataDir2), id);
19343
+ const path = join2(backupRoot(dataDir2), id);
19355
19344
  if (entryExists(path)) {
19356
19345
  const stat = lstatSync(path);
19357
19346
  if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("Unsafe workspace backup job directory.");
@@ -19394,14 +19383,14 @@ function writeJson(path, value) {
19394
19383
  writeFileAtomic(path, text, { mode: 384 });
19395
19384
  }
19396
19385
  function assertLocalAuthOutsideSnapshot(dataDir2) {
19397
- const configPath = join3(dataDir2, "config.json");
19398
- const config2 = existsSync2(configPath) ? privateJson(configPath) : {};
19386
+ const configPath = join2(dataDir2, "config.json");
19387
+ const config2 = existsSync(configPath) ? privateJson(configPath) : {};
19399
19388
  const instances = record2(config2) && record2(config2.instances) ? config2.instances : {};
19400
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"];
19401
19390
  const check2 = (value, field, home) => {
19402
19391
  if (typeof value !== "string" || !value.trim()) return;
19403
19392
  const text = value.trim();
19404
- 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;
19405
19394
  const resolved = resolve(expanded);
19406
19395
  const exists = entryExists(resolved);
19407
19396
  const path = relative(exists ? realpathSync(dataDir2) : resolve(dataDir2), exists ? realpathSync(resolved) : resolved).replaceAll("\\", "/");
@@ -19479,7 +19468,7 @@ function hashFile(path) {
19479
19468
  }
19480
19469
  }
19481
19470
  function countJsonArray(path) {
19482
- if (!existsSync2(path)) return 0;
19471
+ if (!existsSync(path)) return 0;
19483
19472
  const value = privateJson(path);
19484
19473
  if (!Array.isArray(value)) throw new Error("A workspace roster is not a valid JSON array.");
19485
19474
  const ids = /* @__PURE__ */ new Set();
@@ -19492,7 +19481,7 @@ function countJsonArray(path) {
19492
19481
  return value.length;
19493
19482
  }
19494
19483
  function databaseCounts(path) {
19495
- if (!existsSync2(path)) return { threads: 0, messages: 0 };
19484
+ if (!existsSync(path)) return { threads: 0, messages: 0 };
19496
19485
  const db = new DatabaseSync(path, { readOnly: true });
19497
19486
  try {
19498
19487
  const check2 = db.prepare("PRAGMA quick_check").all();
@@ -19511,8 +19500,8 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19511
19500
  const salt = randomBytes(16);
19512
19501
  const key = await passwordKey(options2.password, salt);
19513
19502
  const job = newJob(dataDir2, jobId2);
19514
- const snapshot = join3(job.directory, "snapshot");
19515
- folder(join3(snapshot, "data"));
19503
+ const snapshot = join2(job.directory, "snapshot");
19504
+ folder(join2(snapshot, "data"));
19516
19505
  const entries = [];
19517
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];
19518
19507
  let bytes = 0;
@@ -19521,19 +19510,19 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19521
19510
  let skippedWorkLinks = 0;
19522
19511
  try {
19523
19512
  const root = realpathSync(dataDir2);
19524
- const sourceDb = join3(root, "messages.db");
19525
- if (existsSync2(sourceDb)) {
19513
+ const sourceDb = join2(root, "messages.db");
19514
+ if (existsSync(sourceDb)) {
19526
19515
  if (lstatSync(sourceDb).isSymbolicLink()) throw new Error("The message database must not be a symbolic link.");
19527
19516
  const db = new DatabaseSync(sourceDb, { readOnly: true });
19528
19517
  const completionPulse = setInterval(() => {
19529
19518
  }, 25);
19530
19519
  try {
19531
- await backup(db, join3(snapshot, "messages-snapshot.db"));
19520
+ await backup(db, join2(snapshot, "messages-snapshot.db"));
19532
19521
  } finally {
19533
19522
  clearInterval(completionPulse);
19534
19523
  db.close();
19535
19524
  }
19536
- const snapshotDb = new DatabaseSync(join3(snapshot, "messages-snapshot.db"));
19525
+ const snapshotDb = new DatabaseSync(join2(snapshot, "messages-snapshot.db"));
19537
19526
  try {
19538
19527
  snapshotDb.exec("PRAGMA journal_mode = DELETE");
19539
19528
  } finally {
@@ -19547,7 +19536,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19547
19536
  if (excludedWorkspaceAuthPath(path2) || ephemeralWorkspaceTokenPath(path2) || redownloadedOrgLibraryPath(path2)) continue;
19548
19537
  if (forbiddenArchivePath(path2)) throw new Error("A workspace filename conflicts with a protected authentication or runtime path.");
19549
19538
  if (!validRelative(path2)) throw new Error("A workspace filename cannot be safely restored on supported platforms.");
19550
- const source = join3(directory, name);
19539
+ const source = join2(directory, name);
19551
19540
  const stat = lstatSync(source);
19552
19541
  if (name === "node_modules" && (stat.isDirectory() || stat.isSymbolicLink())) {
19553
19542
  skippedDependencies++;
@@ -19575,7 +19564,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19575
19564
  continue;
19576
19565
  }
19577
19566
  if (entries.length >= MAX_WORKSPACE_BACKUP_FILES) throw new Error("The workspace exceeds the 100,000-entry backup limit.");
19578
- const destination = join3(snapshot, "data", path2);
19567
+ const destination = join2(snapshot, "data", path2);
19579
19568
  if (stat.isDirectory()) {
19580
19569
  folder(destination);
19581
19570
  entries.push({ path: path2, type: "directory", size: 0, mode: 448 });
@@ -19593,7 +19582,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19593
19582
  writeJson(destination, value);
19594
19583
  }
19595
19584
  copied = { size: lstatSync(destination).size, mode: 384, sha256: hashFile(destination) };
19596
- } 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);
19597
19586
  bytes += copied.size;
19598
19587
  if (bytes > MAX_WORKSPACE_BACKUP_BYTES) throw new Error("The workspace exceeds the 10 GB backup limit.");
19599
19588
  entries.push({ path: path2, type: "file", ...copied });
@@ -19613,9 +19602,9 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19613
19602
  files: entries.filter((entry) => entry.type === "file").length,
19614
19603
  directories: entries.filter((entry) => entry.type === "directory").length,
19615
19604
  bytes,
19616
- bots: countJsonArray(join3(snapshot, "data", "bots.json")),
19617
- groups: countJsonArray(join3(snapshot, "data", "groups.json")),
19618
- ...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")),
19619
19608
  exclusions: EXCLUSION_NOTES,
19620
19609
  warnings
19621
19610
  };
@@ -19625,9 +19614,9 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19625
19614
  clientState: options2.clientState ?? {},
19626
19615
  entries
19627
19616
  };
19628
- writeJson(join3(snapshot, "manifest.json"), manifest);
19629
- validateManifest(privateJson(join3(snapshot, "manifest.json")));
19630
- 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");
19631
19620
  const iv = randomBytes(12);
19632
19621
  const header = Buffer.concat([MAGIC, salt, iv]);
19633
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.93",
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-s4LTbQle.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};