openmausbot 0.1.89 → 0.1.91

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 (168) hide show
  1. package/dist/assets/{abnfDiagram-O67JEVCF-BwaMaZEm.js → abnfDiagram-O67JEVCF-yP-w8pRq.js} +1 -1
  2. package/dist/assets/{arc-Be-8GKxd.js → arc-DsivfZEh.js} +1 -1
  3. package/dist/assets/{architectureDiagram-NJMV4G6O-Dp_U2Kv1.js → architectureDiagram-NJMV4G6O-CILw7lzT.js} +1 -1
  4. package/dist/assets/{blockDiagram-BEXU5L5S-DQjUjYUk.js → blockDiagram-BEXU5L5S-DEQUV3HF.js} +1 -1
  5. package/dist/assets/{c4Diagram-YGBWAQC7-Bd3aE4Kc.js → c4Diagram-YGBWAQC7-lSXCZoKA.js} +1 -1
  6. package/dist/assets/channel-DrfGMu7X.js +1 -0
  7. package/dist/assets/{chunk-2Q5K7J3B-BijjTBeJ.js → chunk-2Q5K7J3B-QCD5bgWP.js} +1 -1
  8. package/dist/assets/{chunk-3FUC2YCW-CMGdwvzW.js → chunk-3FUC2YCW-C5-iZJuL.js} +2 -2
  9. package/dist/assets/{chunk-5VM5RSS4-0G09BfsZ.js → chunk-5VM5RSS4-cxsawMpY.js} +1 -1
  10. package/dist/assets/{chunk-GTNCS2PH-FOp3vSHe.js → chunk-GTNCS2PH-DV8tV8H7.js} +1 -1
  11. package/dist/assets/{chunk-GWA4HPMP-Dv-20VIn.js → chunk-GWA4HPMP-CJFZyfbW.js} +1 -1
  12. package/dist/assets/{chunk-JWPE2WC7-CRgrdFcz.js → chunk-JWPE2WC7-BigbMXco.js} +1 -1
  13. package/dist/assets/{chunk-NETBCI7D-3hP4f7QB.js → chunk-NETBCI7D-oVxTfpDy.js} +1 -1
  14. package/dist/assets/{chunk-WEXAMYUT-CG98IjlG.js → chunk-WEXAMYUT-CH4BiroW.js} +1 -1
  15. package/dist/assets/{chunk-XXDRQBXY-BrSTC9xG.js → chunk-XXDRQBXY-KEDa6gax.js} +1 -1
  16. package/dist/assets/{classDiagram-v2-NBCMYWYE-rpQQQDFX.js → classDiagram-v2-NBCMYWYE-BiPjfqVv.js} +1 -1
  17. package/dist/assets/{cose-bilkent-JH36ORCC-G6RSafHA.js → cose-bilkent-JH36ORCC-Caxew3OY.js} +1 -1
  18. package/dist/assets/{cynefin-OW5HDTMX-CXjv-IM2.js → cynefin-OW5HDTMX-B_Pui369.js} +1 -1
  19. package/dist/assets/{cynefinDiagram-VND7K2PF-Dw07MR9f.js → cynefinDiagram-VND7K2PF-X64ydIhP.js} +1 -1
  20. package/dist/assets/{dagre-6A5THRUB-BwPnlTg2.js → dagre-6A5THRUB-TqYCI1E1.js} +1 -1
  21. package/dist/assets/{diagram-22UHCM2B-Cm6xcMiz.js → diagram-22UHCM2B-TeOt3rAQ.js} +1 -1
  22. package/dist/assets/{diagram-3UASUU5V-CDpogPbE.js → diagram-3UASUU5V-D70BLhDA.js} +1 -1
  23. package/dist/assets/{diagram-ATOU4E4O-BV8z3Pnc.js → diagram-ATOU4E4O-BbQDLwUC.js} +1 -1
  24. package/dist/assets/{diagram-CDSNMT55-CKCQhOOC.js → diagram-CDSNMT55-ChNJZ1u-.js} +1 -1
  25. package/dist/assets/{diagram-MLGK6HIB-FGvJg69C.js → diagram-MLGK6HIB-DMBl2APa.js} +1 -1
  26. package/dist/assets/{diagram-MPIPVDR6-CwATvgnS.js → diagram-MPIPVDR6-CEqDchOp.js} +1 -1
  27. package/dist/assets/{ebnfDiagram-ZINNZB2B-CH_c3SSC.js → ebnfDiagram-ZINNZB2B-BVDKRp_-.js} +1 -1
  28. package/dist/assets/{elk-276RUBZZ-3guZi71R.js → elk-276RUBZZ-CRkofO9B.js} +1 -1
  29. package/dist/assets/{erDiagram-OPXOYQCR-BMHphR2n.js → erDiagram-OPXOYQCR-DruOMh5e.js} +1 -1
  30. package/dist/assets/{flowDiagram-KWPJA3E3-Vm5DkW5x.js → flowDiagram-KWPJA3E3-8GMQeB7t.js} +1 -1
  31. package/dist/assets/{ganttDiagram-FUAMR5RP-DO-1ct07.js → ganttDiagram-FUAMR5RP-ORE9jcsM.js} +1 -1
  32. package/dist/assets/{gitGraphDiagram-X574FWY7-nxeksEIN.js → gitGraphDiagram-X574FWY7-BmsedsWh.js} +1 -1
  33. package/dist/assets/index-BlnCEcU6.js +588 -0
  34. package/dist/assets/{index-Oxk9x45i.js → index-DKNEM8Q6.js} +1 -1
  35. package/dist/assets/index-DVxjOvID.css +1 -0
  36. package/dist/assets/{infoDiagram-VRGFBTTK-Dkcvr0p7.js → infoDiagram-VRGFBTTK-E_p7AooJ.js} +1 -1
  37. package/dist/assets/{ishikawaDiagram-OU5B5YK6-BwVibkoO.js → ishikawaDiagram-OU5B5YK6-Y-B2mKda.js} +1 -1
  38. package/dist/assets/{journeyDiagram-ZHPQQLJL-ByiBZqgG.js → journeyDiagram-ZHPQQLJL-eA8RELcK.js} +1 -1
  39. package/dist/assets/{kanban-definition-PNTS6WVX-qqjgXBF3.js → kanban-definition-PNTS6WVX-DqIL2e8e.js} +1 -1
  40. package/dist/assets/{linear-CtJnKe6A.js → linear-yC_29R6e.js} +1 -1
  41. package/dist/assets/{mermaid.core-BEiDklrY.js → mermaid.core-VhEMkSND.js} +5 -5
  42. package/dist/assets/{mindmap-definition-NLK3R4M7-DfIYHia9.js → mindmap-definition-NLK3R4M7-oJ7kyQZy.js} +1 -1
  43. package/dist/assets/{pegDiagram-GJSIUBJH-CYyRqa1a.js → pegDiagram-GJSIUBJH-BmfYcY0O.js} +1 -1
  44. package/dist/assets/{pieDiagram-5QR66LMP-hOToy_zH.js → pieDiagram-5QR66LMP-DKvgP7w9.js} +1 -1
  45. package/dist/assets/{quadrantDiagram-O4NWA36T-DKAsNN9I.js → quadrantDiagram-O4NWA36T-BEKL3W0L.js} +1 -1
  46. package/dist/assets/{railroadDiagram-XR7U4H2S-BSA-d8JU.js → railroadDiagram-XR7U4H2S-BEsiqR5s.js} +1 -1
  47. package/dist/assets/{requirementDiagram-PLB6GJNP-CSmlvb-p.js → requirementDiagram-PLB6GJNP-DWBcWvAP.js} +1 -1
  48. package/dist/assets/{sankeyDiagram-IPEJSGJF-CD5F6fnG.js → sankeyDiagram-IPEJSGJF-rpZ2_O4s.js} +1 -1
  49. package/dist/assets/{sequenceDiagram-PO4LG4MO-JUq5sx6d.js → sequenceDiagram-PO4LG4MO-B99HQdJR.js} +1 -1
  50. package/dist/assets/{sizeCapture-INFHLROL-BjIS-Stk.js → sizeCapture-INFHLROL-BjN0qT5T.js} +1 -1
  51. package/dist/assets/{stateDiagram-v2-GCMORJYK-DklkUxOg.js → stateDiagram-v2-GCMORJYK-BbsVgGsC.js} +1 -1
  52. package/dist/assets/{swimlanes-2SLR337P-CsjIU6be.js → swimlanes-2SLR337P-DG3gKkeR.js} +1 -1
  53. package/dist/assets/swimlanesDiagram-TC7HE7FX-BCZhxl7e.js +8 -0
  54. package/dist/assets/{timeline-definition-EJHVYXUP-BkFqK7AB.js → timeline-definition-EJHVYXUP-BTHOdtF_.js} +1 -1
  55. package/dist/assets/{usecaseDiagram-POWQR4AR-70gJB1EU.js → usecaseDiagram-POWQR4AR-acLSLFwc.js} +1 -1
  56. package/dist/assets/{vennDiagram-UO4OBE2U-83Tm62dN.js → vennDiagram-UO4OBE2U-C5JzNX9G.js} +1 -1
  57. package/dist/assets/{wardleyDiagram-VNRHLVJA-tTmseoX9.js → wardleyDiagram-VNRHLVJA-DL1-PrR_.js} +1 -1
  58. package/dist/assets/{xychartDiagram-PMCCYNJV-R1LBA55a.js → xychartDiagram-PMCCYNJV-Bvr1477p.js} +1 -1
  59. package/dist/index.html +2 -2
  60. package/dist-server/cloud-home-start.js +14810 -0
  61. package/dist-server/container-mcp.js +136 -36
  62. package/dist-server/drivers/agents-proxy.js +31 -10
  63. package/dist-server/index.js +48251 -44124
  64. package/dist-server/openmausbot.js +628 -292
  65. package/dist-server/pair-cli.js +628 -292
  66. package/dist-server/permission-proxy.js +1 -1
  67. package/dist-server/server/admission.js +46 -0
  68. package/dist-server/server/{box-create-idempotency.js → boat-create-idempotency.js} +32 -31
  69. package/dist-server/server/{box-delete-journal.js → boat-delete-journal.js} +26 -25
  70. package/dist-server/server/{box.js → boat.js} +381 -334
  71. package/dist-server/server/bot-overview.js +7 -4
  72. package/dist-server/server/bot-profile.js +7 -1
  73. package/dist-server/server/channel-queue.js +58 -18
  74. package/dist-server/server/checkpoints.js +98 -52
  75. package/dist-server/server/claim-idle.js +33 -0
  76. package/dist-server/server/cloud-backend.js +5 -5
  77. package/dist-server/server/cloud-home-start.js +121 -0
  78. package/dist-server/server/cloud-home.js +241 -0
  79. package/dist-server/server/cloud-lending.js +103 -0
  80. package/dist-server/server/cloud-move-http.js +268 -0
  81. package/dist-server/server/cloud-move.js +418 -0
  82. package/dist-server/server/cloud-overflow.js +167 -0
  83. package/dist-server/server/composio.js +5 -0
  84. package/dist-server/server/computer-observation.js +2 -2
  85. package/dist-server/server/config.js +156 -9
  86. package/dist-server/server/container-computer.js +13 -0
  87. package/dist-server/server/control-client.js +2 -2
  88. package/dist-server/server/decider/index.js +238 -0
  89. package/dist-server/server/decider/jev.js +183 -0
  90. package/dist-server/server/decider/log.js +62 -0
  91. package/dist-server/server/decider/relay.js +52 -0
  92. package/dist-server/server/decider/room-routing.js +88 -0
  93. package/dist-server/server/decider/types.js +5 -0
  94. package/dist-server/server/delegations.js +11 -3
  95. package/dist-server/server/drivers/acp/core.js +5 -4
  96. package/dist-server/server/drivers/agents-call.js +5 -1
  97. package/dist-server/server/drivers/agents-catalog.js +25 -3
  98. package/dist-server/server/drivers/{boxagent.js → boatagent.js} +30 -21
  99. package/dist-server/server/drivers/builtIn.js +2 -2
  100. package/dist-server/server/drivers/{chat-box-tools.js → chat-boat-tools.js} +3 -3
  101. package/dist-server/server/drivers/chat-mcp-tools.js +2 -2
  102. package/dist-server/server/drivers/claude.js +178 -13
  103. package/dist-server/server/drivers/native.js +1 -1
  104. package/dist-server/server/drivers/openai-chat.js +15 -4
  105. package/dist-server/server/drivers/pi.js +3 -3
  106. package/dist-server/server/group-goal-run.js +6 -4
  107. package/dist-server/server/harness-capabilities.js +2 -0
  108. package/dist-server/server/hosted-models.js +6 -1
  109. package/dist-server/server/included-services.js +70 -0
  110. package/dist-server/server/index.js +1462 -576
  111. package/dist-server/server/local-vm-inventory.js +11 -1
  112. package/dist-server/server/local-vm-seat-pool.js +141 -0
  113. package/dist-server/server/managed-policy.js +4 -1
  114. package/dist-server/server/memory-capture.js +194 -0
  115. package/dist-server/server/memory-entries.js +76 -0
  116. package/dist-server/server/memory-organize.js +102 -0
  117. package/dist-server/server/memory-tidy.js +144 -0
  118. package/dist-server/server/memory-topics.js +169 -0
  119. package/dist-server/server/memory-upkeep.js +452 -0
  120. package/dist-server/server/message-db.js +49 -5
  121. package/dist-server/server/model-context-window.js +4 -4
  122. package/dist-server/server/package-export.js +17 -10
  123. package/dist-server/server/package-import.js +6 -3
  124. package/dist-server/server/package-parts.js +3 -1
  125. package/dist-server/server/permission-proxy.js +3 -3
  126. package/dist-server/server/profile-learned.js +98 -0
  127. package/dist-server/server/profile-versions.js +45 -11
  128. package/dist-server/server/recall.js +172 -0
  129. package/dist-server/server/redact.js +1 -1
  130. package/dist-server/server/request-auth.js +2 -0
  131. package/dist-server/server/room-cwd.js +1 -1
  132. package/dist-server/server/room-handoffs.js +61 -6
  133. package/dist-server/server/routes/bot-memory.js +215 -0
  134. package/dist-server/server/routes/decider.js +19 -0
  135. package/dist-server/server/routine-requests.js +27 -16
  136. package/dist-server/server/routines.js +10 -6
  137. package/dist-server/server/shared-computers.js +116 -30
  138. package/dist-server/server/steer-queue.js +41 -10
  139. package/dist-server/server/store.js +42 -3
  140. package/dist-server/server/surface.js +14 -1
  141. package/dist-server/server/system-prompt.js +16 -5
  142. package/dist-server/server/team-backup.js +6 -2
  143. package/dist-server/server/team-computers.js +2 -2
  144. package/dist-server/server/team-manifest.js +11 -3
  145. package/dist-server/server/tightening-requests.js +34 -4
  146. package/dist-server/server/tool-summary.js +2 -2
  147. package/dist-server/server/tts/elevenlabs.js +12 -7
  148. package/dist-server/server/tts/index.js +17 -10
  149. package/dist-server/server/turn-resources.js +87 -11
  150. package/dist-server/server/vps-computer.js +1 -1
  151. package/dist-server/server/workspace-backup-policy.js +22 -3
  152. package/dist-server/server/workspace-backup.js +25 -8
  153. package/dist-server/server/workspace.js +57 -22
  154. package/dist-server/shared/ask-question.js +7 -5
  155. package/dist-server/shared/bot-avatar.js +19 -0
  156. package/dist-server/shared/cloud-home.js +4 -0
  157. package/dist-server/shared/credential-request.js +3 -3
  158. package/dist-server/shared/package-format.js +30 -4
  159. package/dist-server/shared/team-backup.js +20 -3
  160. package/dist-server/shared/tool-surface.js +1 -1
  161. package/dist-server/src/lib/composer-attachments.js +9 -0
  162. package/dist-server/vps-container-mcp.js +136 -36
  163. package/dist-server/workspace-backup.worker.js +165 -35
  164. package/package.json +1 -1
  165. package/dist/assets/channel-DqY_gMLg.js +0 -1
  166. package/dist/assets/index-BIMdIbaw.css +0 -1
  167. package/dist/assets/index-BVPdbq2r.js +0 -583
  168. package/dist/assets/swimlanesDiagram-TC7HE7FX-Bk14M0_B.js +0 -8
@@ -119,7 +119,7 @@ function probeLoginShellPath() {
119
119
 
120
120
  // server/config.ts
121
121
  import { homedir as homedir2 } from "node:os";
122
- import { join as join2 } from "node:path";
122
+ import { join as join3 } from "node:path";
123
123
 
124
124
  // node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
125
125
  var external_exports = {};
@@ -14657,6 +14657,8 @@ function normalizeImageGenerationUrl(value) {
14657
14657
  // shared/bot-avatar.ts
14658
14658
  var BOT_AVATAR_CROPS = ["mascot", "circle", "rounded", "square"];
14659
14659
  var botAvatarCropSchema = external_exports.enum(BOT_AVATAR_CROPS);
14660
+ var AVATAR_ZOOM_MIN = 1;
14661
+ var AVATAR_ZOOM_MAX = 3;
14660
14662
  var botAvatarUrlSchema = external_exports.string().regex(
14661
14663
  /^\/api\/attachments\/[A-Za-z0-9-]+\.(?:png|jpg|gif|webp)$/,
14662
14664
  "must be a stored PNG, JPEG, GIF, or WebP attachment"
@@ -14695,6 +14697,9 @@ var profilePatchSchema = external_exports.object({
14695
14697
  error: "avatarUrl must be a stored PNG, JPEG, GIF, or WebP attachment"
14696
14698
  }).optional(),
14697
14699
  avatarCrop: botAvatarCropSchema.optional(),
14700
+ avatarZoom: external_exports.number({ error: "avatarZoom must be a number from 1 to 3" }).finite().min(AVATAR_ZOOM_MIN).max(AVATAR_ZOOM_MAX).optional(),
14701
+ avatarFocusX: external_exports.number({ error: "avatarFocusX must be a number from 0 to 1" }).finite().min(0).max(1).optional(),
14702
+ avatarFocusY: external_exports.number({ error: "avatarFocusY must be a number from 0 to 1" }).finite().min(0).max(1).optional(),
14698
14703
  mascotBody: mascotBodySchema.optional(),
14699
14704
  voice: external_exports.string({ error: "voice must be a string" }).max(BOT_PROFILE_LIMITS.voice, { error: "voice must be at most 200 characters" }).optional(),
14700
14705
  speakReplies: external_exports.boolean({ error: "speakReplies must be true or false" }).optional()
@@ -15630,6 +15635,76 @@ var remoteMutationSchema = remoteEntrySchema.extend({
15630
15635
  headers: external_exports.record(external_exports.string(), external_exports.union([external_exports.string().max(16384), external_exports.literal(true)])).optional()
15631
15636
  });
15632
15637
 
15638
+ // server/cloud-overflow.ts
15639
+ var CLOUD_SEAT_IDLE_STOP_MS = 5 * 6e4;
15640
+ var CLOUD_SEAT_SLEEP_RETRY_MAX_MS = 10 * 6e4;
15641
+
15642
+ // server/proxy-paths.ts
15643
+ import { existsSync as existsSync2 } from "node:fs";
15644
+ import { dirname as dirname2, join as join2 } from "node:path";
15645
+ import { fileURLToPath } from "node:url";
15646
+ var SERVER_ROOT = dirname2(fileURLToPath(import.meta.url));
15647
+ function resolveProxy(relative) {
15648
+ const source = join2(SERVER_ROOT, `${relative}.ts`);
15649
+ return existsSync2(source) ? source : join2(SERVER_ROOT, `${relative}.js`);
15650
+ }
15651
+ var SPAWNED_PROXIES = {
15652
+ browser: resolveProxy("browser-proxy"),
15653
+ localComputer: resolveProxy("local-computer-proxy"),
15654
+ permission: resolveProxy("permission-proxy"),
15655
+ containerMcp: resolveProxy("container-mcp"),
15656
+ vpsContainerMcp: resolveProxy("vps-container-mcp"),
15657
+ agents: resolveProxy("drivers/agents-proxy"),
15658
+ dweb: resolveProxy("drivers/dweb-proxy"),
15659
+ connectors: resolveProxy("connector-proxy"),
15660
+ mcpGate: resolveProxy("mcp-gate"),
15661
+ phone: resolveProxy("drivers/phone-proxy"),
15662
+ hook: resolveProxy("hooks/omb-hook"),
15663
+ // Loaded by the external `pi` process via `-e`, not by this server — but
15664
+ // resolved through the same single source of truth so the packaged layout
15665
+ // check can assert it ships.
15666
+ piMcpExtension: resolveProxy("drivers/pi-mcp-extension")
15667
+ };
15668
+
15669
+ // server/enterprise.ts
15670
+ var layerSchema = external_exports.object({
15671
+ customer: external_exports.string().min(1),
15672
+ features: external_exports.array(external_exports.string().min(1)),
15673
+ expiresAt: external_exports.string().nullable()
15674
+ });
15675
+ var DAY_MS = 24 * 60 * 6e4;
15676
+
15677
+ // server/sessions.ts
15678
+ var PAIRING_CODE_TTL_MS = 5 * 6e4;
15679
+ function daysMs(value, fallbackDays) {
15680
+ const days = Number(value);
15681
+ const ok = Number.isInteger(days) && days >= 1 && days <= 3650;
15682
+ return (ok ? days : fallbackDays) * 24 * 60 * 6e4;
15683
+ }
15684
+ var SESSION_TTL_MS = daysMs(process.env.OMB_SESSION_TTL_DAYS, 30);
15685
+ var SESSION_MAX_AGE_MS = daysMs(process.env.OMB_SESSION_MAX_DAYS, 180);
15686
+ var SESSION_RENEW_WHEN_LEFT_MS = SESSION_TTL_MS / 2;
15687
+ var STREAM_TICKET_TTL_MS = 5 * 6e4;
15688
+ var scopeSchema = external_exports.enum(["admin", "client"]);
15689
+ var sessionSchema = external_exports.object({
15690
+ id: external_exports.string().min(1),
15691
+ tokenHash: external_exports.string().length(64),
15692
+ label: external_exports.string().max(80),
15693
+ scopes: external_exports.array(scopeSchema).min(1),
15694
+ createdAt: external_exports.number(),
15695
+ lastSeenAt: external_exports.number(),
15696
+ expiresAt: external_exports.number(),
15697
+ /** Set when the session came from an account sign-in rather than a code. */
15698
+ userId: external_exports.string().max(256).optional(),
15699
+ email: external_exports.string().max(320).optional(),
15700
+ /** Set only by the internal verified-portal issuance path, never by email or pairing input. */
15701
+ membershipAuthority: external_exports.literal("portal").optional()
15702
+ });
15703
+ var fileSchema = external_exports.object({ version: external_exports.literal(1), sessions: external_exports.array(sessionSchema) });
15704
+
15705
+ // server/cloud-home.ts
15706
+ var CLOUD_PAIRING_NONCE_MS = 10 * 6e4;
15707
+
15633
15708
  // server/config.ts
15634
15709
  var optionalText = external_exports.string().optional();
15635
15710
  var SSH_ALIAS = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
@@ -15671,7 +15746,8 @@ var browserEngineConfigSchema = external_exports.object({
15671
15746
  var roomConfigSchema = external_exports.object({
15672
15747
  turnTimeoutMinutes: external_exports.number().int().min(MIN_ROOM_TURN_TIMEOUT_MINUTES).max(MAX_ROOM_TURN_TIMEOUT_MINUTES),
15673
15748
  /** Room handoff tree lifetime. Active execution pauses this clock; the
15674
- * hard cap is wall-clock and bounds trees that never stop executing. */
15749
+ * hard cap is the maximum stall window, measured wall-clock from the
15750
+ * tree's last durable progress. */
15675
15751
  handoffLifetimeMinutes: external_exports.number().int().min(1).max(MAX_ROOM_TURN_TIMEOUT_MINUTES).optional(),
15676
15752
  handoffMinRunwayMinutes: external_exports.number().int().min(1).max(MAX_ROOM_TURN_TIMEOUT_MINUTES).optional(),
15677
15753
  handoffHardCapMinutes: external_exports.number().int().min(1).max(7 * MAX_ROOM_TURN_TIMEOUT_MINUTES).optional()
@@ -15680,7 +15756,7 @@ var roomConfigSchema = external_exports.object({
15680
15756
  { message: "rooms handoff bounds must satisfy handoffMinRunwayMinutes <= handoffLifetimeMinutes <= handoffHardCapMinutes" }
15681
15757
  );
15682
15758
  var localVmConfigSchema = external_exports.object({
15683
- mode: external_exports.enum(["shared", "per-bot"]).optional(),
15759
+ mode: external_exports.enum(["shared", "per-bot", "pool"]).optional(),
15684
15760
  maxInstances: external_exports.number().int().min(MIN_LOCAL_VM_MAX_INSTANCES).max(MAX_LOCAL_VM_MAX_INSTANCES).optional()
15685
15761
  });
15686
15762
  var browserProfileSchema = external_exports.object({
@@ -15799,6 +15875,10 @@ var featureConfigSchema = external_exports.object({
15799
15875
  skillAuthoring: external_exports.boolean().optional(),
15800
15876
  /** Show each tool run in the transcript. Off unless explicitly enabled. */
15801
15877
  showToolCalls: external_exports.boolean().optional(),
15878
+ /** Run a routine inside the conversation it reports to, instead of a hidden
15879
+ * thread. Off unless explicitly enabled. The run still starts from its own
15880
+ * instructions, but the messages stay in that chat. */
15881
+ routinesInConversation: external_exports.boolean().optional(),
15802
15882
  /** Experimental built-in browser. Off until explicitly enabled; each bot
15803
15883
  * also has its own switch. */
15804
15884
  browser: external_exports.boolean().optional(),
@@ -15812,8 +15892,23 @@ var featureConfigSchema = external_exports.object({
15812
15892
  claudeUserMcp: external_exports.boolean().optional(),
15813
15893
  /** LLM-generated titles for new bot threads. Off until explicitly
15814
15894
  * enabled; a one-shot that fails or answers junk leaves the first-message
15815
- * snippet in place — see llmThreadTitlesEnabled. */
15816
- llmThreadTitles: external_exports.boolean().optional()
15895
+ * snippet in place — see llmThreadTitlesEnabled. */
15896
+ llmThreadTitles: external_exports.boolean().optional(),
15897
+ /** Before each turn, passages from the bot's own memory files and earlier
15898
+ * conversations that share words with the message ride into the turn.
15899
+ * Read-only; on unless explicitly switched off — see autoRecallEnabled. */
15900
+ autoRecall: external_exports.boolean().optional(),
15901
+ /** Idle release for computer claims (#1653): a desktop seat that stays
15902
+ * screen-quiet for 90 seconds is released to waiting turns while its
15903
+ * holder's turn still lives; the previous holder re-claims directly
15904
+ * for 10 minutes and yields to an occupied seat. Off until baked; see
15905
+ * computerClaimIdleReleaseEnabled for how to enable it by hand. */
15906
+ computerClaimIdleRelease: external_exports.boolean().optional(),
15907
+ /** Consented cloud overflow for local computer waits (#1655): a wait
15908
+ * may offer a per-second-billed cloud seat, but only through an explicit
15909
+ * consent card or a configured allowlist — never a silent Auto default.
15910
+ * Off until baked; see cloudOverflowEnabled for how to enable it by hand. */
15911
+ cloudOverflow: external_exports.boolean().optional()
15817
15912
  });
15818
15913
  var onboardingConfigSchema = external_exports.object({
15819
15914
  /** ISO timestamp of finishing (or skipping to the end of) the welcome flow. */
@@ -15920,6 +16015,8 @@ var appConfigSchema = external_exports.object({
15920
16015
  /** Project key used for Sessions, catalog and agent tools. userId/sessionId
15921
16016
  * are non-secret local identifiers used to reuse one Composio Session. */
15922
16017
  composio: external_exports.object({ apiKey: optionalText, userId: optionalText, sessionId: optionalText }).optional(),
16018
+ /** Historical config section name "box" (the persisted config.json key); the
16019
+ * provider is Boat now and the key is kept for compatibility. */
15923
16020
  box: external_exports.object({ token: optionalText }).optional(),
15924
16021
  vps: vpsConfigSchema.optional(),
15925
16022
  /** Optional OpenCode key; persisted write-only and passed only to its child. */
@@ -15939,6 +16036,19 @@ var appConfigSchema = external_exports.object({
15939
16036
  baseUrl: external_exports.string().trim().max(2048).refine((value) => !value || /^https?:\/\//i.test(value), "the Chatterbox server address must start with http:// or https://").optional(),
15940
16037
  model: optionalText
15941
16038
  }).optional(),
16039
+ /** The decision model (server/decider): a fast classifier that picks
16040
+ * things for bots, starting with who answers a room message. `key` is
16041
+ * write-only like every credential; `baseUrl` points at a Jev-compatible
16042
+ * server instead of TypeSafe's (an operator setting with no UI); `jobs`
16043
+ * switches each decision on or off. Not `decisions`: that section is the
16044
+ * authorization log's retention. */
16045
+ decider: external_exports.object({
16046
+ enabled: external_exports.boolean().optional(),
16047
+ provider: external_exports.enum(["jev", "off"]).optional(),
16048
+ key: optionalText,
16049
+ 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(),
16050
+ jobs: external_exports.object({ roomRouting: external_exports.boolean().optional() }).optional()
16051
+ }).optional(),
15942
16052
  /** Avatar provider credentials stay separate; choosing a router never reuses a cloud key. */
15943
16053
  imageGen: external_exports.object({
15944
16054
  provider: external_exports.enum(["openai", "xai", "custom"]).optional(),
@@ -15969,10 +16079,26 @@ var appConfigSchema = external_exports.object({
15969
16079
  compactAt: external_exports.number().positive().max(1e7).optional(),
15970
16080
  autoCompact: external_exports.boolean().optional()
15971
16081
  }).optional(),
16082
+ /** Memory upkeep timing, for bots with Memory upkeep switched on. */
16083
+ memory: external_exports.object({
16084
+ /** Quiet time after a turn before its facts are captured (ms). */
16085
+ captureQuietMs: external_exports.number().int().min(1e3).max(24 * 60 * 6e4).optional(),
16086
+ /** Local hour (0-23) after which the nightly tidy-up runs. */
16087
+ tidyHour: external_exports.number().int().min(0).max(23).optional()
16088
+ }).strict().optional(),
15972
16089
  threads: threadsConfigSchema.optional(),
15973
16090
  /** The authorization decision log (server/decision-log.ts): days of month
15974
16091
  * files kept, at least; OMB_DECISION_RETENTION_DAYS wins when set. */
15975
16092
  decisions: external_exports.object({ retentionDays: external_exports.number().int().min(1).max(3650).optional() }).strict().optional(),
16093
+ /** #1655 cloud-overflow settings. perSecondCostUsd is the operator's own
16094
+ * verified rate: with no price configured the feature stays inert rather
16095
+ * than show an invented one. allowlistedThreads carries standing consent
16096
+ * for exact thread ids. */
16097
+ cloudOverflow: external_exports.object({
16098
+ perSecondCostUsd: external_exports.number().positive().max(10).optional(),
16099
+ idleStopMs: external_exports.number().int().positive().max(24 * 60 * 6e4).optional(),
16100
+ allowlistedThreads: external_exports.array(external_exports.string().min(1)).max(1e3).optional()
16101
+ }).strict().optional(),
15976
16102
  localVm: localVmConfigSchema.optional(),
15977
16103
  features: featureConfigSchema.optional(),
15978
16104
  onboarding: onboardingConfigSchema.optional(),
@@ -15991,37 +16117,11 @@ var storedAppConfigSchema = appConfigSchema.extend({
15991
16117
  });
15992
16118
  var appConfigPatchSchema = appConfigSchema.omit({ instances: true, mcpServers: true, cliStartup: true, customDomain: true }).extend({ threads: threadsPatchSchema.optional(), newBots: newBotsPatchSchema.optional() });
15993
16119
  var jsonObjectSchema = external_exports.record(external_exports.string(), external_exports.json());
15994
- var DATA_DIR = process.env.OMB_DATA_DIR ?? join2(homedir2(), ".openmausbot");
15995
- var LEGACY_DATA_DIR = join2(homedir2(), ".opengrokbot");
15996
- var EVENTS_DIR = join2(DATA_DIR, "events");
15997
- var NATIVE_DIR = join2(DATA_DIR, "native");
15998
-
15999
- // server/proxy-paths.ts
16000
- import { existsSync as existsSync2 } from "node:fs";
16001
- import { dirname as dirname2, join as join3 } from "node:path";
16002
- import { fileURLToPath } from "node:url";
16003
- var SERVER_ROOT = dirname2(fileURLToPath(import.meta.url));
16004
- function resolveProxy(relative) {
16005
- const source = join3(SERVER_ROOT, `${relative}.ts`);
16006
- return existsSync2(source) ? source : join3(SERVER_ROOT, `${relative}.js`);
16007
- }
16008
- var SPAWNED_PROXIES = {
16009
- browser: resolveProxy("browser-proxy"),
16010
- localComputer: resolveProxy("local-computer-proxy"),
16011
- permission: resolveProxy("permission-proxy"),
16012
- containerMcp: resolveProxy("container-mcp"),
16013
- vpsContainerMcp: resolveProxy("vps-container-mcp"),
16014
- agents: resolveProxy("drivers/agents-proxy"),
16015
- dweb: resolveProxy("drivers/dweb-proxy"),
16016
- connectors: resolveProxy("connector-proxy"),
16017
- mcpGate: resolveProxy("mcp-gate"),
16018
- phone: resolveProxy("drivers/phone-proxy"),
16019
- hook: resolveProxy("hooks/omb-hook"),
16020
- // Loaded by the external `pi` process via `-e`, not by this server — but
16021
- // resolved through the same single source of truth so the packaged layout
16022
- // check can assert it ships.
16023
- piMcpExtension: resolveProxy("drivers/pi-mcp-extension")
16024
- };
16120
+ var DEFAULT_CAPTURE_QUIET_MS = 2 * 6e4;
16121
+ var DATA_DIR = process.env.OMB_DATA_DIR ?? join3(homedir2(), ".openmausbot");
16122
+ var LEGACY_DATA_DIR = join3(homedir2(), ".opengrokbot");
16123
+ var EVENTS_DIR = join3(DATA_DIR, "events");
16124
+ var NATIVE_DIR = join3(DATA_DIR, "native");
16025
16125
 
16026
16126
  // server/container-computer.ts
16027
16127
  var run = promisify(execFile2);
@@ -16,9 +16,9 @@ var CREDENTIAL_TARGETS = {
16
16
  helpUrl: "https://console.x.ai/"
17
17
  },
18
18
  boxToken: {
19
- label: "Box API key",
20
- description: "Gives bots an isolated cloud computer when Box is selected.",
21
- placeholder: "Paste your Box API key",
19
+ label: "Boat API key",
20
+ description: "Gives bots an isolated cloud computer when Boat is selected.",
21
+ placeholder: "Paste your Boat API key",
22
22
  helpUrl: "https://docs.boat.dev/api-keys"
23
23
  },
24
24
  opencodeGoApiKey: {
@@ -129,6 +129,7 @@ function catalogProfileFromEnv(env) {
129
129
  skillAuthoring: env.OMB_SKILL_AUTHORING_ENABLED === "1",
130
130
  sharedComputers: env.OMB_SHARED_COMPUTERS_ENABLED === "1",
131
131
  voiceNotes: env.OMB_VOICE_NOTES === "1",
132
+ cloudHome: env.OMB_CLOUD_HOME === "1",
132
133
  botId: env.OMB_BOT_ID ?? ""
133
134
  };
134
135
  }
@@ -222,8 +223,9 @@ var ROUTINE_FIELDS_SCHEMA = {
222
223
  schedule: ROUTINE_SCHEDULE_SCHEMA,
223
224
  run_on: {
224
225
  type: "string",
226
+ // "box" is Boat's historical run_on destination id (agents wire contract).
225
227
  enum: ["maus", "box"],
226
- description: "Default maus keeps the bot's selected model and configured computer, INCLUDING a self-hosted VPS. Omit this field for normal schedules. box explicitly switches the agent to the Box-hosted runner; it requires Box setup and is not the generic cloud/VPS option. Legacy cloud values from list_routines mean box, not VPS."
228
+ description: "Default maus keeps the bot's selected model and configured computer, INCLUDING a self-hosted VPS. Omit this field for normal schedules. box explicitly switches the agent to the Boat-hosted runner; it requires Boat setup and is not the generic cloud/VPS option. Legacy cloud values from list_routines mean box, not VPS."
227
229
  },
228
230
  timeout_minutes: {
229
231
  type: "integer",
@@ -383,7 +385,7 @@ var toolDefinitions = (externalRuntime) => [
383
385
  surface: {
384
386
  type: "string",
385
387
  enum: ["auto", "cloud", "vm", "local", "browser"],
386
- description: "auto = suitable configured computer, cloud = remote Box/VPS, vm = isolated Local VM, local = user's own desktop, browser = built-in browser. Omit to list."
388
+ description: "auto = suitable configured computer, cloud = remote Boat/VPS, vm = isolated Local VM, local = user's own desktop, browser = built-in browser. Omit to list."
387
389
  }
388
390
  } }
389
391
  },
@@ -625,7 +627,8 @@ var toolDefinitions = (externalRuntime) => [
625
627
  properties: {
626
628
  action: { type: "string", enum: ["append", "replace", "remove", "supersede"] },
627
629
  text: { type: "string", minLength: 1, description: "Non-blank new text for append, replace, or supersede: the fact itself, without a date or bullet. Omit for remove; use remove to delete a passage." },
628
- old_text: { type: "string", minLength: 1, description: "Exact unique existing passage for replace, supersede, or remove. Omit for append." }
630
+ old_text: { type: "string", minLength: 1, description: "Exact unique existing passage for replace, supersede, or remove. Omit for append." },
631
+ until: { type: "string", pattern: "^\\d{4}-\\d{2}-\\d{2}$", description: "Optional, for append or supersede: YYYY-MM-DD, the last day a temporary fact holds (an exam this weekend, a trip next week). After that day the entry is hidden from your memory." }
629
632
  },
630
633
  required: ["action"]
631
634
  }
@@ -717,12 +720,16 @@ var toolDefinitions = (externalRuntime) => [
717
720
  },
718
721
  {
719
722
  name: "propose_routine_action",
720
- description: "Prepare a user-requested change to one of this bot's existing routines. Use list_routines first to get the routine id." + PROPOSAL_OUTCOME,
723
+ description: "Prepare a user-requested change to one of this bot's existing routines. Use list_routines first to get the routine id. If the user asks to change ANOTHER bot's routine and that bot is in your section, call list_bots and pass that bot's id as for_bot_id; the routine keeps its owner and every run keeps that bot's engine and permissions." + PROPOSAL_OUTCOME,
721
724
  inputSchema: {
722
725
  type: "object",
723
726
  additionalProperties: false,
724
727
  properties: {
725
728
  routine_id: { type: "string", minLength: 1, description: "Routine id from list_routines." },
729
+ for_bot_id: {
730
+ type: "string",
731
+ description: "Only when the requested change targets ANOTHER bot's routine and that bot is in your section: that bot's id from list_bots. Learn the routine id from that bot's own routines (it can run list_routines). Omit to change one of your own routines."
732
+ },
726
733
  action: {
727
734
  type: "string",
728
735
  enum: ["update", "pause", "resume", "run_now", "delete"],
@@ -847,7 +854,17 @@ var ROOM_ONLY_TOOLS = /* @__PURE__ */ new Set(["list_room_targets", "coordinate_
847
854
  var ROOM_REPLACED_TOOLS = /* @__PURE__ */ new Set(["ask_bot", "delegate_bot", "check_delegation", "wait_delegation", "start_thread", "send_to_thread", "wait_thread"]);
848
855
  var EXTERNAL_TOOL_NAMES = /* @__PURE__ */ new Set(["list_bots", "ask_bot", "delegate_bot", "check_delegation", "wait_delegation"]);
849
856
  var WATCHER_TOOL_NAMES = /* @__PURE__ */ new Set(["create_options_card"]);
857
+ var LOCAL_VM_TOOL_NAMES = /* @__PURE__ */ new Set(["vm_exec"]);
858
+ var CLOUD_HOME_SURFACE = {
859
+ type: "string",
860
+ enum: ["auto", "cloud", "browser"],
861
+ description: "auto = suitable configured computer, cloud = remote Boat/VPS, browser = built-in browser. Omit to list. This server runs in the cloud: the user's own computer and a Local VM are not places here."
862
+ };
850
863
  function availableTools(profile) {
864
+ const tools = catalogTools(profile);
865
+ return profile.cloudHome ? tools.filter((tool) => !LOCAL_VM_TOOL_NAMES.has(tool.name)).map((tool) => tool.name === "select_computer" ? { ...tool, inputSchema: { ...tool.inputSchema, properties: { surface: CLOUD_HOME_SURFACE } } } : tool) : tools;
866
+ }
867
+ function catalogTools(profile) {
851
868
  const TOOLS = toolDefinitions(profile.externalRuntime);
852
869
  const BOT_SCOPED_TOOLS = profile.botId === WATCHER_OPTIONS_CARD_BOT_ID ? TOOLS : TOOLS.filter((tool) => !WATCHER_TOOL_NAMES.has(tool.name));
853
870
  const AUTHORING_TOOLS = profile.skillAuthoring ? BOT_SCOPED_TOOLS : BOT_SCOPED_TOOLS.filter((tool) => !SKILL_TOOL_NAMES.has(tool.name));
@@ -16419,7 +16436,7 @@ function routineFields(args) {
16419
16436
  const runOn = destination(args.run_on ?? args.runOn);
16420
16437
  const timeoutMinutes = args.timeout_minutes ?? args.timeoutMinutes;
16421
16438
  if (runOn != null && runOn !== "maus" && runOn !== "cloud") {
16422
- return { fields, error: 'Use run_on="maus" for the bot\u2019s current model and configured computer (including VPS), or run_on="box" only for the Box-hosted agent. Legacy "cloud" also means Box.' };
16439
+ return { fields, error: 'Use run_on="maus" for the bot\u2019s current model and configured computer (including VPS), or run_on="box" only for the Boat-hosted agent. Legacy "cloud" also means Boat.' };
16423
16440
  }
16424
16441
  if (timeoutMinutes != null && (typeof timeoutMinutes !== "number" || !Number.isInteger(timeoutMinutes) || timeoutMinutes < 5 || timeoutMinutes > 240)) {
16425
16442
  return { fields, error: "timeout_minutes must be a whole number from 5 to 240. Use clear_timeout to remove a limit." };
@@ -17044,11 +17061,14 @@ ${JSON.stringify(routines, null, 2)}`
17044
17061
  if (!routineId || !action) {
17045
17062
  return { text: "propose_routine_action needs a routine_id and supported action.", isError: true };
17046
17063
  }
17064
+ const forBotId = String(args.for_bot_id ?? "").trim();
17047
17065
  const body = {
17048
17066
  fromBotId: BOT_ID,
17049
17067
  fromThreadId: THREAD_ID,
17050
17068
  action,
17051
- routineId
17069
+ routineId,
17070
+ // JSON.stringify drops the key entirely when no target was named
17071
+ ...forBotId ? { forBotId } : {}
17052
17072
  };
17053
17073
  if (action === "update") {
17054
17074
  if (!jsonRecord(args.changes)) {
@@ -17141,7 +17161,8 @@ ${JSON.stringify(routines, null, 2)}`
17141
17161
  fromThreadId: THREAD_ID,
17142
17162
  action: args.action,
17143
17163
  text: args.text,
17144
- oldText: args.old_text
17164
+ oldText: args.old_text,
17165
+ ...typeof args.until === "string" && args.until.trim() ? { until: args.until.trim() } : {}
17145
17166
  })
17146
17167
  });
17147
17168
  if (r.error || r.ok !== true) {