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
@@ -242,7 +242,7 @@ function resolveCliSpawn(cli, args, env) {
242
242
 
243
243
  // server/config.ts
244
244
  import { homedir as homedir2 } from "node:os";
245
- import { join as join3 } from "node:path";
245
+ import { join as join2 } from "node:path";
246
246
 
247
247
  // node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
248
248
  var external_exports = {};
@@ -15544,6 +15544,48 @@ function normalizeCronSchedule(value, after = Date.now()) {
15544
15544
  return schedule;
15545
15545
  }
15546
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
+
15547
15589
  // server/new-bot-defaults.ts
15548
15590
  var strings = (max, length) => external_exports.array(external_exports.string().max(length)).max(max);
15549
15591
  var clock = external_exports.string().regex(/^(?:[01]\d|2[0-3]):[0-5]\d$/);
@@ -15578,6 +15620,10 @@ var botDefaultsProfileSchema = profilePatchSchema.extend({
15578
15620
  browser: external_exports.boolean().optional(),
15579
15621
  browserProfile: external_exports.string().max(100).nullable().optional(),
15580
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(),
15581
15627
  parkDirectMessages: external_exports.boolean().optional()
15582
15628
  }).strict();
15583
15629
  var scheduleSchema = external_exports.discriminatedUnion("type", [
@@ -15774,76 +15820,6 @@ var remoteMutationSchema = remoteEntrySchema.extend({
15774
15820
  var CLOUD_SEAT_IDLE_STOP_MS = 5 * 6e4;
15775
15821
  var CLOUD_SEAT_SLEEP_RETRY_MAX_MS = 10 * 6e4;
15776
15822
 
15777
- // server/proxy-paths.ts
15778
- import { existsSync as existsSync2 } from "node:fs";
15779
- import { dirname as dirname2, join as join2 } from "node:path";
15780
- import { fileURLToPath } from "node:url";
15781
- var SERVER_ROOT = dirname2(fileURLToPath(import.meta.url));
15782
- function resolveProxy(relative) {
15783
- const source = join2(SERVER_ROOT, `${relative}.ts`);
15784
- return existsSync2(source) ? source : join2(SERVER_ROOT, `${relative}.js`);
15785
- }
15786
- var SPAWNED_PROXIES = {
15787
- browser: resolveProxy("browser-proxy"),
15788
- localComputer: resolveProxy("local-computer-proxy"),
15789
- permission: resolveProxy("permission-proxy"),
15790
- containerMcp: resolveProxy("container-mcp"),
15791
- vpsContainerMcp: resolveProxy("vps-container-mcp"),
15792
- agents: resolveProxy("drivers/agents-proxy"),
15793
- dweb: resolveProxy("drivers/dweb-proxy"),
15794
- connectors: resolveProxy("connector-proxy"),
15795
- mcpGate: resolveProxy("mcp-gate"),
15796
- phone: resolveProxy("drivers/phone-proxy"),
15797
- hook: resolveProxy("hooks/omb-hook"),
15798
- // Loaded by the external `pi` process via `-e`, not by this server — but
15799
- // resolved through the same single source of truth so the packaged layout
15800
- // check can assert it ships.
15801
- piMcpExtension: resolveProxy("drivers/pi-mcp-extension")
15802
- };
15803
-
15804
- // server/enterprise.ts
15805
- var layerSchema = external_exports.object({
15806
- customer: external_exports.string().min(1),
15807
- features: external_exports.array(external_exports.string().min(1)),
15808
- expiresAt: external_exports.string().nullable()
15809
- });
15810
- var DAY_MS = 24 * 60 * 6e4;
15811
-
15812
- // server/sessions.ts
15813
- var PAIRING_CODE_TTL_MS = 5 * 6e4;
15814
- function daysMs(value, fallbackDays) {
15815
- const days = Number(value);
15816
- const ok = Number.isInteger(days) && days >= 1 && days <= 3650;
15817
- return (ok ? days : fallbackDays) * 24 * 60 * 6e4;
15818
- }
15819
- var SESSION_TTL_MS = daysMs(process.env.OMB_SESSION_TTL_DAYS, 30);
15820
- var SESSION_MAX_AGE_MS = daysMs(process.env.OMB_SESSION_MAX_DAYS, 180);
15821
- var SESSION_RENEW_WHEN_LEFT_MS = SESSION_TTL_MS / 2;
15822
- var STREAM_TICKET_TTL_MS = 5 * 6e4;
15823
- var scopeSchema = external_exports.enum(["admin", "client"]);
15824
- var sessionSchema = external_exports.object({
15825
- id: external_exports.string().min(1),
15826
- tokenHash: external_exports.string().length(64),
15827
- label: external_exports.string().max(80),
15828
- scopes: external_exports.array(scopeSchema).min(1),
15829
- createdAt: external_exports.number(),
15830
- lastSeenAt: external_exports.number(),
15831
- expiresAt: external_exports.number(),
15832
- /** Set when the session came from an account sign-in rather than a code. */
15833
- userId: external_exports.string().max(256).optional(),
15834
- email: external_exports.string().max(320).optional(),
15835
- /** Set only by the internal verified-portal issuance path, never by email or pairing input. */
15836
- membershipAuthority: external_exports.literal("portal").optional(),
15837
- /** A browser sign-in (PairingCode `browser`): accepted only as its browser's cookie, never as a bearer token. */
15838
- cookieOnly: external_exports.literal(true).optional(),
15839
- /** Whose OMB Cloud a browser sign-in signed in to (its PairingCode `owner`). */
15840
- owner: external_exports.string().max(254).optional()
15841
- });
15842
- var fileSchema = external_exports.object({ version: external_exports.literal(1), sessions: external_exports.array(sessionSchema) });
15843
-
15844
- // server/cloud-home.ts
15845
- var CLOUD_PAIRING_NONCE_MS = 10 * 6e4;
15846
-
15847
15823
  // server/config.ts
15848
15824
  var optionalText = external_exports.string().optional();
15849
15825
  var SSH_ALIAS = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
@@ -16051,7 +16027,11 @@ var featureConfigSchema = external_exports.object({
16051
16027
  * may offer a per-second-billed cloud seat, but only through an explicit
16052
16028
  * consent card or a configured allowlist — never a silent Auto default.
16053
16029
  * Off until baked; see cloudOverflowEnabled for how to enable it by hand. */
16054
- 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()
16055
16035
  });
16056
16036
  var onboardingConfigSchema = external_exports.object({
16057
16037
  /** ISO timestamp of finishing (or skipping to the end of) the welcome flow. */
@@ -16204,6 +16184,15 @@ var appConfigSchema = external_exports.object({
16204
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(),
16205
16185
  jobs: external_exports.object({ roomRouting: external_exports.boolean().optional() }).optional()
16206
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(),
16207
16196
  /** Avatar provider credentials stay separate; choosing a router never reuses a cloud key. */
16208
16197
  imageGen: external_exports.object({
16209
16198
  provider: external_exports.enum(["openai", "xai", "custom"]).optional(),
@@ -16273,10 +16262,10 @@ var storedAppConfigSchema = appConfigSchema.extend({
16273
16262
  var appConfigPatchSchema = appConfigSchema.omit({ instances: true, mcpServers: true, cliStartup: true, customDomain: true }).extend({ threads: threadsPatchSchema.optional(), newBots: newBotsPatchSchema.optional() });
16274
16263
  var jsonObjectSchema = external_exports.record(external_exports.string(), external_exports.json());
16275
16264
  var DEFAULT_CAPTURE_QUIET_MS = 2 * 6e4;
16276
- var DATA_DIR = process.env.OMB_DATA_DIR ?? join3(homedir2(), ".openmausbot");
16277
- var LEGACY_DATA_DIR = join3(homedir2(), ".opengrokbot");
16278
- var EVENTS_DIR = join3(DATA_DIR, "events");
16279
- 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");
16280
16269
  var OPENAI_API_INSTANCE = "openai";
16281
16270
  var OPENROUTER_API_INSTANCE = "openrouter";
16282
16271
  var XAI_API_INSTANCE = "xaiApi";
@@ -16306,6 +16295,34 @@ var API_KEY_FLEET = {
16306
16295
  }
16307
16296
  };
16308
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
+
16309
16326
  // server/container-computer.ts
16310
16327
  var run = promisify(execFile2);
16311
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"]);
@@ -16628,6 +16637,34 @@ async function callTool(name, args, context) {
16628
16637
  }) });
16629
16638
  return { text: JSON.stringify(r), ...r.error ? { isError: true } : {} };
16630
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
+ }
16631
16668
  if (name === "list_bots") {
16632
16669
  const r = await api(`/api/internal/agents?self=${encodeURIComponent(BOT_ID)}`);
16633
16670
  const bots = r.bots ?? [];