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
@@ -68,6 +68,8 @@ function windowsKnownDirs() {
68
68
  // x.ai installer
69
69
  join(localAppData, "agy", "bin"),
70
70
  // Antigravity installer
71
+ // Cursor installer: cursor-agent.* and its `agent` copies (MOCA-272)
72
+ join(localAppData, "cursor-agent"),
71
73
  join(home, ".local", "bin"),
72
74
  // claude native installer
73
75
  join(home, ".claude", "local"),
@@ -75,7 +77,9 @@ function windowsKnownDirs() {
75
77
  // Factory droid installer (%USERPROFILE%\bin)
76
78
  join(home, ".bun", "bin"),
77
79
  join(home, ".deno", "bin"),
78
- join(home, "go", "bin")
80
+ join(home, "go", "bin"),
81
+ join(process.env.ProgramFiles ?? "C:\\Program Files", "Docker", "Docker", "resources", "bin")
82
+ // Docker Desktop installer
79
83
  ];
80
84
  }
81
85
  var cached = null;
@@ -238,7 +242,7 @@ function resolveCliSpawn(cli, args, env) {
238
242
 
239
243
  // server/config.ts
240
244
  import { homedir as homedir2 } from "node:os";
241
- import { join as join3 } from "node:path";
245
+ import { join as join2 } from "node:path";
242
246
 
243
247
  // node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
244
248
  var external_exports = {};
@@ -15540,6 +15544,48 @@ function normalizeCronSchedule(value, after = Date.now()) {
15540
15544
  return schedule;
15541
15545
  }
15542
15546
 
15547
+ // shared/tool-scope.ts
15548
+ var SERVER_NAME = /^[a-z][a-z0-9_-]{0,31}$/;
15549
+ var CONTROL_CHARACTER = /[\x00-\x1f\x7f]/;
15550
+ var MAX_SELECTORS = 256;
15551
+ var MAX_SELECTOR_LENGTH = 1024;
15552
+ function validName(name) {
15553
+ return typeof name === "string" && name.trim().length > 0 && name.length <= MAX_SELECTOR_LENGTH && !CONTROL_CHARACTER.test(name) && !name.includes("*");
15554
+ }
15555
+ function selectorIdentity(selector) {
15556
+ if (selector.length > MAX_SELECTOR_LENGTH || CONTROL_CHARACTER.test(selector)) return;
15557
+ if (selector.startsWith("native:")) {
15558
+ const name = selector.slice(7);
15559
+ if (name === "*" || validName(name)) return { kind: "native", name };
15560
+ } else if (selector.startsWith("mcp:")) {
15561
+ const separator = selector.indexOf(":", 4);
15562
+ if (separator < 0) return;
15563
+ const server = selector.slice(4, separator);
15564
+ const name = selector.slice(separator + 1);
15565
+ if (SERVER_NAME.test(server) && (name === "*" || validName(name))) {
15566
+ return { kind: "mcp", server, name };
15567
+ }
15568
+ }
15569
+ }
15570
+ function parseToolScope(value) {
15571
+ if (value === void 0) return { ok: true, scope: void 0 };
15572
+ const invalid = { ok: false, error: "Tool selection must contain only valid allow and deny lists." };
15573
+ if (!value || typeof value !== "object" || Array.isArray(value)) return invalid;
15574
+ const prototype = Object.getPrototypeOf(value);
15575
+ if (prototype !== Object.prototype && prototype !== null) return invalid;
15576
+ const scope = {};
15577
+ for (const key of Reflect.ownKeys(value)) {
15578
+ if (key !== "allow" && key !== "deny") return invalid;
15579
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
15580
+ if (!descriptor || !("value" in descriptor)) return invalid;
15581
+ const list = descriptor.value;
15582
+ if (!Array.isArray(list) || list.length > MAX_SELECTORS) return invalid;
15583
+ if (!Array.from(list).every((entry) => typeof entry === "string" && selectorIdentity(entry))) return invalid;
15584
+ scope[key] = [...new Set(list)];
15585
+ }
15586
+ return { ok: true, scope };
15587
+ }
15588
+
15543
15589
  // server/new-bot-defaults.ts
15544
15590
  var strings = (max, length) => external_exports.array(external_exports.string().max(length)).max(max);
15545
15591
  var clock = external_exports.string().regex(/^(?:[01]\d|2[0-3]):[0-5]\d$/);
@@ -15574,6 +15620,10 @@ var botDefaultsProfileSchema = profilePatchSchema.extend({
15574
15620
  browser: external_exports.boolean().optional(),
15575
15621
  browserProfile: external_exports.string().max(100).nullable().optional(),
15576
15622
  mcpServers: strings(100, 100).nullable().optional(),
15623
+ toolScope: external_exports.custom((value) => value !== void 0 && parseToolScope(value).ok, "Invalid tool selection").transform((value) => {
15624
+ const parsed = parseToolScope(value);
15625
+ return parsed.ok ? parsed.scope : value;
15626
+ }).nullable().optional(),
15577
15627
  parkDirectMessages: external_exports.boolean().optional()
15578
15628
  }).strict();
15579
15629
  var scheduleSchema = external_exports.discriminatedUnion("type", [
@@ -15770,76 +15820,6 @@ var remoteMutationSchema = remoteEntrySchema.extend({
15770
15820
  var CLOUD_SEAT_IDLE_STOP_MS = 5 * 6e4;
15771
15821
  var CLOUD_SEAT_SLEEP_RETRY_MAX_MS = 10 * 6e4;
15772
15822
 
15773
- // server/proxy-paths.ts
15774
- import { existsSync as existsSync2 } from "node:fs";
15775
- import { dirname as dirname2, join as join2 } from "node:path";
15776
- import { fileURLToPath } from "node:url";
15777
- var SERVER_ROOT = dirname2(fileURLToPath(import.meta.url));
15778
- function resolveProxy(relative) {
15779
- const source = join2(SERVER_ROOT, `${relative}.ts`);
15780
- return existsSync2(source) ? source : join2(SERVER_ROOT, `${relative}.js`);
15781
- }
15782
- var SPAWNED_PROXIES = {
15783
- browser: resolveProxy("browser-proxy"),
15784
- localComputer: resolveProxy("local-computer-proxy"),
15785
- permission: resolveProxy("permission-proxy"),
15786
- containerMcp: resolveProxy("container-mcp"),
15787
- vpsContainerMcp: resolveProxy("vps-container-mcp"),
15788
- agents: resolveProxy("drivers/agents-proxy"),
15789
- dweb: resolveProxy("drivers/dweb-proxy"),
15790
- connectors: resolveProxy("connector-proxy"),
15791
- mcpGate: resolveProxy("mcp-gate"),
15792
- phone: resolveProxy("drivers/phone-proxy"),
15793
- hook: resolveProxy("hooks/omb-hook"),
15794
- // Loaded by the external `pi` process via `-e`, not by this server — but
15795
- // resolved through the same single source of truth so the packaged layout
15796
- // check can assert it ships.
15797
- piMcpExtension: resolveProxy("drivers/pi-mcp-extension")
15798
- };
15799
-
15800
- // server/enterprise.ts
15801
- var layerSchema = external_exports.object({
15802
- customer: external_exports.string().min(1),
15803
- features: external_exports.array(external_exports.string().min(1)),
15804
- expiresAt: external_exports.string().nullable()
15805
- });
15806
- var DAY_MS = 24 * 60 * 6e4;
15807
-
15808
- // server/sessions.ts
15809
- var PAIRING_CODE_TTL_MS = 5 * 6e4;
15810
- function daysMs(value, fallbackDays) {
15811
- const days = Number(value);
15812
- const ok = Number.isInteger(days) && days >= 1 && days <= 3650;
15813
- return (ok ? days : fallbackDays) * 24 * 60 * 6e4;
15814
- }
15815
- var SESSION_TTL_MS = daysMs(process.env.OMB_SESSION_TTL_DAYS, 30);
15816
- var SESSION_MAX_AGE_MS = daysMs(process.env.OMB_SESSION_MAX_DAYS, 180);
15817
- var SESSION_RENEW_WHEN_LEFT_MS = SESSION_TTL_MS / 2;
15818
- var STREAM_TICKET_TTL_MS = 5 * 6e4;
15819
- var scopeSchema = external_exports.enum(["admin", "client"]);
15820
- var sessionSchema = external_exports.object({
15821
- id: external_exports.string().min(1),
15822
- tokenHash: external_exports.string().length(64),
15823
- label: external_exports.string().max(80),
15824
- scopes: external_exports.array(scopeSchema).min(1),
15825
- createdAt: external_exports.number(),
15826
- lastSeenAt: external_exports.number(),
15827
- expiresAt: external_exports.number(),
15828
- /** Set when the session came from an account sign-in rather than a code. */
15829
- userId: external_exports.string().max(256).optional(),
15830
- email: external_exports.string().max(320).optional(),
15831
- /** Set only by the internal verified-portal issuance path, never by email or pairing input. */
15832
- membershipAuthority: external_exports.literal("portal").optional(),
15833
- /** A browser sign-in (PairingCode `browser`): accepted only as its browser's cookie, never as a bearer token. */
15834
- cookieOnly: external_exports.literal(true).optional(),
15835
- /** Whose OMB Cloud a browser sign-in signed in to (its PairingCode `owner`). */
15836
- owner: external_exports.string().max(254).optional()
15837
- });
15838
- var fileSchema = external_exports.object({ version: external_exports.literal(1), sessions: external_exports.array(sessionSchema) });
15839
-
15840
- // server/cloud-home.ts
15841
- var CLOUD_PAIRING_NONCE_MS = 10 * 6e4;
15842
-
15843
15823
  // server/config.ts
15844
15824
  var optionalText = external_exports.string().optional();
15845
15825
  var SSH_ALIAS = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
@@ -16047,7 +16027,11 @@ var featureConfigSchema = external_exports.object({
16047
16027
  * may offer a per-second-billed cloud seat, but only through an explicit
16048
16028
  * consent card or a configured allowlist — never a silent Auto default.
16049
16029
  * Off until baked; see cloudOverflowEnabled for how to enable it by hand. */
16050
- cloudOverflow: external_exports.boolean().optional()
16030
+ cloudOverflow: external_exports.boolean().optional(),
16031
+ /** Opt-in shared skills library: one store at the data dir that bots
16032
+ * read by assignment instead of per-workspace copies. Off until
16033
+ * explicitly enabled — see skillsLibraryEnabled. */
16034
+ skillsLibrary: external_exports.boolean().optional()
16051
16035
  });
16052
16036
  var onboardingConfigSchema = external_exports.object({
16053
16037
  /** ISO timestamp of finishing (or skipping to the end of) the welcome flow. */
@@ -16129,6 +16113,7 @@ var appConfigSchema = external_exports.object({
16129
16113
  phone: external_exports.enum(["ios", "android"]).optional()
16130
16114
  }).optional(),
16131
16115
  mistral: external_exports.object({ key: optionalText }).optional(),
16116
+ cerebras: external_exports.object({ key: optionalText }).optional(),
16132
16117
  xai: external_exports.object({ key: optionalText, url: optionalText }).optional(),
16133
16118
  /** Anthropic API key for Claude Code billed per token, handed only to
16134
16119
  * Claude instances; `url` only for a proxy or a test double. Never a
@@ -16199,6 +16184,15 @@ var appConfigSchema = external_exports.object({
16199
16184
  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(),
16200
16185
  jobs: external_exports.object({ roomRouting: external_exports.boolean().optional() }).optional()
16201
16186
  }).optional(),
16187
+ /** Live calls: an OpenAI project key for GPT-Live, kept apart from every
16188
+ * other OpenAI credential so a Live call never bills an image or engine key
16189
+ * the user did not hand to it. `voice` is a GPT-Live built-in voice name. */
16190
+ live: external_exports.object({
16191
+ key: optionalText,
16192
+ voice: external_exports.string().trim().max(40).regex(/^[a-z]*$/, "a Live voice is a lowercase built-in voice name").optional(),
16193
+ readTypedReplies: external_exports.boolean().optional(),
16194
+ idleMinutes: external_exports.number().int().min(1).max(60).optional()
16195
+ }).optional(),
16202
16196
  /** Avatar provider credentials stay separate; choosing a router never reuses a cloud key. */
16203
16197
  imageGen: external_exports.object({
16204
16198
  provider: external_exports.enum(["openai", "xai", "custom"]).optional(),
@@ -16268,10 +16262,10 @@ var storedAppConfigSchema = appConfigSchema.extend({
16268
16262
  var appConfigPatchSchema = appConfigSchema.omit({ instances: true, mcpServers: true, cliStartup: true, customDomain: true }).extend({ threads: threadsPatchSchema.optional(), newBots: newBotsPatchSchema.optional() });
16269
16263
  var jsonObjectSchema = external_exports.record(external_exports.string(), external_exports.json());
16270
16264
  var DEFAULT_CAPTURE_QUIET_MS = 2 * 6e4;
16271
- var DATA_DIR = process.env.OMB_DATA_DIR ?? join3(homedir2(), ".openmausbot");
16272
- var LEGACY_DATA_DIR = join3(homedir2(), ".opengrokbot");
16273
- var EVENTS_DIR = join3(DATA_DIR, "events");
16274
- var NATIVE_DIR = join3(DATA_DIR, "native");
16265
+ var DATA_DIR = process.env.OMB_DATA_DIR ?? join2(homedir2(), ".openmausbot");
16266
+ var LEGACY_DATA_DIR = join2(homedir2(), ".opengrokbot");
16267
+ var EVENTS_DIR = join2(DATA_DIR, "events");
16268
+ var NATIVE_DIR = join2(DATA_DIR, "native");
16275
16269
  var OPENAI_API_INSTANCE = "openai";
16276
16270
  var OPENROUTER_API_INSTANCE = "openrouter";
16277
16271
  var XAI_API_INSTANCE = "xaiApi";
@@ -16301,6 +16295,34 @@ var API_KEY_FLEET = {
16301
16295
  }
16302
16296
  };
16303
16297
 
16298
+ // server/proxy-paths.ts
16299
+ import { existsSync as existsSync2 } from "node:fs";
16300
+ import { dirname as dirname2, join as join3 } from "node:path";
16301
+ import { fileURLToPath } from "node:url";
16302
+ var SERVER_ROOT = dirname2(fileURLToPath(import.meta.url));
16303
+ function resolveProxy(relative) {
16304
+ const source = join3(SERVER_ROOT, `${relative}.ts`);
16305
+ return existsSync2(source) ? source : join3(SERVER_ROOT, `${relative}.js`);
16306
+ }
16307
+ var SPAWNED_PROXIES = {
16308
+ browser: resolveProxy("browser-proxy"),
16309
+ localComputer: resolveProxy("local-computer-proxy"),
16310
+ permission: resolveProxy("permission-proxy"),
16311
+ containerMcp: resolveProxy("container-mcp"),
16312
+ vpsContainerMcp: resolveProxy("vps-container-mcp"),
16313
+ agents: resolveProxy("drivers/agents-proxy"),
16314
+ dweb: resolveProxy("drivers/dweb-proxy"),
16315
+ connectors: resolveProxy("connector-proxy"),
16316
+ mcpGate: resolveProxy("mcp-gate"),
16317
+ mcpRemote: resolveProxy("mcp-remote-proxy"),
16318
+ phone: resolveProxy("drivers/phone-proxy"),
16319
+ hook: resolveProxy("hooks/omb-hook"),
16320
+ // Loaded by the external `pi` process via `-e`, not by this server — but
16321
+ // resolved through the same single source of truth so the packaged layout
16322
+ // check can assert it ships.
16323
+ piMcpExtension: resolveProxy("drivers/pi-mcp-extension")
16324
+ };
16325
+
16304
16326
  // server/container-computer.ts
16305
16327
  var run = promisify(execFile2);
16306
16328
  var CUA_DRIVER_VERSION = "0.20.0";
@@ -321,6 +321,15 @@ var toolDefinitions = (externalRuntime) => [
321
321
  label: { type: "string", description: "Optional short name (one line, at most 60 characters) for this job. Names the new direct assignment thread." }
322
322
  }, required: ["bot_ids", "message", "request_key"] }
323
323
  },
324
+ {
325
+ name: "send_to_bot",
326
+ description: "Send work one way to another bot in a fresh thread. This is cross-bot only: use start_thread to send independent work to yourself. The recipient owns the new thread; its results, failures and questions stay there and never resume you. Use coordinate_bots when you need the result returned here.",
327
+ inputSchema: { type: "object", additionalProperties: false, properties: {
328
+ bot_id: { type: "string", description: "One reachable teammate id from list_bots or list_room_targets." },
329
+ title: { type: "string", description: "A short one-line title, at most 80 characters." },
330
+ message: { type: "string", description: "Complete instructions; the recipient does not inherit this conversation." }
331
+ }, required: ["bot_id", "title", "message"] }
332
+ },
324
333
  {
325
334
  name: "list_bots",
326
335
  description: "List the other bots (agents) you may contact in your own team and any additional teams the owner has explicitly allowed you to coordinate, with their team, model and current status. Call this to discover exact teammate IDs before assigning work or requesting advice through your available coordination tools.",
@@ -851,7 +860,7 @@ var toolDefinitions = (externalRuntime) => [
851
860
  var SKILL_TOOL_NAMES = /* @__PURE__ */ new Set(["skills_list", "skill_manage"]);
852
861
  var SHARED_COMPUTER_TOOL_NAMES = /* @__PURE__ */ new Set(["list_shared_computers", "shared_computer"]);
853
862
  var VOICE_TOOL_NAMES = /* @__PURE__ */ new Set(["send_voice_note"]);
854
- var ROOM_ONLY_TOOLS = /* @__PURE__ */ new Set(["list_room_targets", "coordinate_bots"]);
863
+ var ROOM_ONLY_TOOLS = /* @__PURE__ */ new Set(["list_room_targets", "coordinate_bots", "send_to_bot"]);
855
864
  var ROOM_REPLACED_TOOLS = /* @__PURE__ */ new Set(["ask_bot", "delegate_bot", "check_delegation", "wait_delegation", "start_thread", "send_to_thread", "wait_thread"]);
856
865
  var EXTERNAL_TOOL_NAMES = /* @__PURE__ */ new Set(["list_bots", "ask_bot", "delegate_bot", "check_delegation", "wait_delegation"]);
857
866
  var WATCHER_TOOL_NAMES = /* @__PURE__ */ new Set(["create_options_card"]);
@@ -16168,6 +16177,8 @@ var KEY_PREFIXES = [
16168
16177
  // xai (grok)
16169
16178
  /\bgsk_[A-Za-z0-9]{40,}/g,
16170
16179
  // groq
16180
+ /\bcsk-[A-Za-z0-9]{32,}/g,
16181
+ // cerebras
16171
16182
  /\bhf_[A-Za-z0-9]{30,}/g,
16172
16183
  // hugging face
16173
16184
  /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{20,}/g,
@@ -16626,6 +16637,34 @@ async function callTool(name, args, context) {
16626
16637
  }) });
16627
16638
  return { text: JSON.stringify(r), ...r.error ? { isError: true } : {} };
16628
16639
  }
16640
+ if (name === "send_to_bot") {
16641
+ const botId = String(args.bot_id ?? "").trim();
16642
+ const title = String(args.title ?? "").trim();
16643
+ const message = String(args.message ?? "").trim();
16644
+ if (!botId || !title || !message) {
16645
+ return { text: "send_to_bot needs bot_id, title and message.", isError: true };
16646
+ }
16647
+ if (botId === context.botId) {
16648
+ return { text: "send_to_bot is cross-bot only. Use start_thread to send independent work to yourself.", isError: true };
16649
+ }
16650
+ if (turn.threadsOpenedThisTurn >= MAX_THREADS_PER_TURN) {
16651
+ return { text: `You have already opened ${MAX_THREADS_PER_TURN} threads this turn, which is the limit.`, isError: true };
16652
+ }
16653
+ const r = await api("/api/internal/threads", { method: "POST", body: JSON.stringify({
16654
+ fromBotId: context.botId,
16655
+ fromThreadId: context.threadId,
16656
+ toBotId: botId,
16657
+ title,
16658
+ message,
16659
+ depth: context.depth,
16660
+ oneWay: true
16661
+ }) });
16662
+ if (r.error) return { text: `Couldn't send to that bot: ${String(r.error)}`, isError: true };
16663
+ turn.threadsOpenedThisTurn += 1;
16664
+ const destination = `@${String(r.botName ?? "that bot")} in #${String(r.title ?? title)} [thread id: ${String(r.threadId ?? "")}]`;
16665
+ const state = r.approvalRequired === true ? `Send to ${destination} is pending approval. The person's approval card appears after this turn ends; dispatch starts once approved.` : r.state === "queued" ? `Send to ${destination} is queued ${ordinal(Number(r.position) || 1)} for a free slot and can dispatch after this turn ends.` : `Send to ${destination} is pending until this turn ends, then dispatch starts.`;
16666
+ return { text: `${state} Its result stays in that thread; nothing there will resume you.` };
16667
+ }
16629
16668
  if (name === "list_bots") {
16630
16669
  const r = await api(`/api/internal/agents?self=${encodeURIComponent(BOT_ID)}`);
16631
16670
  const bots = r.bots ?? [];