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
@@ -16,7 +16,7 @@ import {
16
16
  cpSync,
17
17
  createReadStream,
18
18
  createWriteStream,
19
- existsSync,
19
+ existsSync as existsSync2,
20
20
  fstatSync,
21
21
  fsyncSync as fsyncSync2,
22
22
  lstatSync,
@@ -31,7 +31,7 @@ import {
31
31
  writeFileSync as writeFileSync2,
32
32
  writeSync
33
33
  } from "node:fs";
34
- import { isAbsolute, join as join2, parse as parse3, posix, relative, resolve, win32 } from "node:path";
34
+ import { isAbsolute, join as join3, parse as parse3, posix, relative, resolve, win32 } from "node:path";
35
35
  import { homedir as homedir2 } from "node:os";
36
36
  import { backup, DatabaseSync } from "node:sqlite";
37
37
  import { pipeline } from "node:stream/promises";
@@ -3178,7 +3178,7 @@ var WORKSPACE_BACKUP_CLIENT_KEYS = [
3178
3178
 
3179
3179
  // server/config.ts
3180
3180
  import { homedir } from "node:os";
3181
- import { join } from "node:path";
3181
+ import { join as join2 } from "node:path";
3182
3182
 
3183
3183
  // node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
3184
3184
  var external_exports = {};
@@ -17716,6 +17716,8 @@ function normalizeImageGenerationUrl(value) {
17716
17716
  // shared/bot-avatar.ts
17717
17717
  var BOT_AVATAR_CROPS = ["mascot", "circle", "rounded", "square"];
17718
17718
  var botAvatarCropSchema = external_exports.enum(BOT_AVATAR_CROPS);
17719
+ var AVATAR_ZOOM_MIN = 1;
17720
+ var AVATAR_ZOOM_MAX = 3;
17719
17721
  var botAvatarUrlSchema = external_exports.string().regex(
17720
17722
  /^\/api\/attachments\/[A-Za-z0-9-]+\.(?:png|jpg|gif|webp)$/,
17721
17723
  "must be a stored PNG, JPEG, GIF, or WebP attachment"
@@ -17754,6 +17756,9 @@ var profilePatchSchema = external_exports.object({
17754
17756
  error: "avatarUrl must be a stored PNG, JPEG, GIF, or WebP attachment"
17755
17757
  }).optional(),
17756
17758
  avatarCrop: botAvatarCropSchema.optional(),
17759
+ avatarZoom: external_exports.number({ error: "avatarZoom must be a number from 1 to 3" }).finite().min(AVATAR_ZOOM_MIN).max(AVATAR_ZOOM_MAX).optional(),
17760
+ avatarFocusX: external_exports.number({ error: "avatarFocusX must be a number from 0 to 1" }).finite().min(0).max(1).optional(),
17761
+ avatarFocusY: external_exports.number({ error: "avatarFocusY must be a number from 0 to 1" }).finite().min(0).max(1).optional(),
17757
17762
  mascotBody: mascotBodySchema.optional(),
17758
17763
  voice: external_exports.string({ error: "voice must be a string" }).max(BOT_PROFILE_LIMITS.voice, { error: "voice must be at most 200 characters" }).optional(),
17759
17764
  speakReplies: external_exports.boolean({ error: "speakReplies must be true or false" }).optional()
@@ -18697,6 +18702,76 @@ function schemaIssue(error51, fallback) {
18697
18702
  return path ? `${path} ${issue2.message}` : issue2.message;
18698
18703
  }
18699
18704
 
18705
+ // server/cloud-overflow.ts
18706
+ var CLOUD_SEAT_IDLE_STOP_MS = 5 * 6e4;
18707
+ var CLOUD_SEAT_SLEEP_RETRY_MAX_MS = 10 * 6e4;
18708
+
18709
+ // server/proxy-paths.ts
18710
+ import { existsSync } from "node:fs";
18711
+ import { dirname, join } from "node:path";
18712
+ import { fileURLToPath } from "node:url";
18713
+ var SERVER_ROOT = dirname(fileURLToPath(import.meta.url));
18714
+ function resolveProxy(relative2) {
18715
+ const source = join(SERVER_ROOT, `${relative2}.ts`);
18716
+ return existsSync(source) ? source : join(SERVER_ROOT, `${relative2}.js`);
18717
+ }
18718
+ var SPAWNED_PROXIES = {
18719
+ browser: resolveProxy("browser-proxy"),
18720
+ localComputer: resolveProxy("local-computer-proxy"),
18721
+ permission: resolveProxy("permission-proxy"),
18722
+ containerMcp: resolveProxy("container-mcp"),
18723
+ vpsContainerMcp: resolveProxy("vps-container-mcp"),
18724
+ agents: resolveProxy("drivers/agents-proxy"),
18725
+ dweb: resolveProxy("drivers/dweb-proxy"),
18726
+ connectors: resolveProxy("connector-proxy"),
18727
+ mcpGate: resolveProxy("mcp-gate"),
18728
+ phone: resolveProxy("drivers/phone-proxy"),
18729
+ hook: resolveProxy("hooks/omb-hook"),
18730
+ // Loaded by the external `pi` process via `-e`, not by this server — but
18731
+ // resolved through the same single source of truth so the packaged layout
18732
+ // check can assert it ships.
18733
+ piMcpExtension: resolveProxy("drivers/pi-mcp-extension")
18734
+ };
18735
+
18736
+ // server/enterprise.ts
18737
+ var layerSchema = external_exports.object({
18738
+ customer: external_exports.string().min(1),
18739
+ features: external_exports.array(external_exports.string().min(1)),
18740
+ expiresAt: external_exports.string().nullable()
18741
+ });
18742
+ var DAY_MS = 24 * 60 * 6e4;
18743
+
18744
+ // server/sessions.ts
18745
+ var PAIRING_CODE_TTL_MS = 5 * 6e4;
18746
+ function daysMs(value, fallbackDays) {
18747
+ const days = Number(value);
18748
+ const ok = Number.isInteger(days) && days >= 1 && days <= 3650;
18749
+ return (ok ? days : fallbackDays) * 24 * 60 * 6e4;
18750
+ }
18751
+ var SESSION_TTL_MS = daysMs(process.env.OMB_SESSION_TTL_DAYS, 30);
18752
+ var SESSION_MAX_AGE_MS = daysMs(process.env.OMB_SESSION_MAX_DAYS, 180);
18753
+ var SESSION_RENEW_WHEN_LEFT_MS = SESSION_TTL_MS / 2;
18754
+ var STREAM_TICKET_TTL_MS = 5 * 6e4;
18755
+ var scopeSchema = external_exports.enum(["admin", "client"]);
18756
+ var sessionSchema = external_exports.object({
18757
+ id: external_exports.string().min(1),
18758
+ tokenHash: external_exports.string().length(64),
18759
+ label: external_exports.string().max(80),
18760
+ scopes: external_exports.array(scopeSchema).min(1),
18761
+ createdAt: external_exports.number(),
18762
+ lastSeenAt: external_exports.number(),
18763
+ expiresAt: external_exports.number(),
18764
+ /** Set when the session came from an account sign-in rather than a code. */
18765
+ userId: external_exports.string().max(256).optional(),
18766
+ email: external_exports.string().max(320).optional(),
18767
+ /** Set only by the internal verified-portal issuance path, never by email or pairing input. */
18768
+ membershipAuthority: external_exports.literal("portal").optional()
18769
+ });
18770
+ var fileSchema = external_exports.object({ version: external_exports.literal(1), sessions: external_exports.array(sessionSchema) });
18771
+
18772
+ // server/cloud-home.ts
18773
+ var CLOUD_PAIRING_NONCE_MS = 10 * 6e4;
18774
+
18700
18775
  // server/config.ts
18701
18776
  var optionalText = external_exports.string().optional();
18702
18777
  var SSH_ALIAS = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
@@ -18738,7 +18813,8 @@ var browserEngineConfigSchema = external_exports.object({
18738
18813
  var roomConfigSchema = external_exports.object({
18739
18814
  turnTimeoutMinutes: external_exports.number().int().min(MIN_ROOM_TURN_TIMEOUT_MINUTES).max(MAX_ROOM_TURN_TIMEOUT_MINUTES),
18740
18815
  /** Room handoff tree lifetime. Active execution pauses this clock; the
18741
- * hard cap is wall-clock and bounds trees that never stop executing. */
18816
+ * hard cap is the maximum stall window, measured wall-clock from the
18817
+ * tree's last durable progress. */
18742
18818
  handoffLifetimeMinutes: external_exports.number().int().min(1).max(MAX_ROOM_TURN_TIMEOUT_MINUTES).optional(),
18743
18819
  handoffMinRunwayMinutes: external_exports.number().int().min(1).max(MAX_ROOM_TURN_TIMEOUT_MINUTES).optional(),
18744
18820
  handoffHardCapMinutes: external_exports.number().int().min(1).max(7 * MAX_ROOM_TURN_TIMEOUT_MINUTES).optional()
@@ -18747,7 +18823,7 @@ var roomConfigSchema = external_exports.object({
18747
18823
  { message: "rooms handoff bounds must satisfy handoffMinRunwayMinutes <= handoffLifetimeMinutes <= handoffHardCapMinutes" }
18748
18824
  );
18749
18825
  var localVmConfigSchema = external_exports.object({
18750
- mode: external_exports.enum(["shared", "per-bot"]).optional(),
18826
+ mode: external_exports.enum(["shared", "per-bot", "pool"]).optional(),
18751
18827
  maxInstances: external_exports.number().int().min(MIN_LOCAL_VM_MAX_INSTANCES).max(MAX_LOCAL_VM_MAX_INSTANCES).optional()
18752
18828
  });
18753
18829
  var browserProfileSchema = external_exports.object({
@@ -18866,6 +18942,10 @@ var featureConfigSchema = external_exports.object({
18866
18942
  skillAuthoring: external_exports.boolean().optional(),
18867
18943
  /** Show each tool run in the transcript. Off unless explicitly enabled. */
18868
18944
  showToolCalls: external_exports.boolean().optional(),
18945
+ /** Run a routine inside the conversation it reports to, instead of a hidden
18946
+ * thread. Off unless explicitly enabled. The run still starts from its own
18947
+ * instructions, but the messages stay in that chat. */
18948
+ routinesInConversation: external_exports.boolean().optional(),
18869
18949
  /** Experimental built-in browser. Off until explicitly enabled; each bot
18870
18950
  * also has its own switch. */
18871
18951
  browser: external_exports.boolean().optional(),
@@ -18879,8 +18959,23 @@ var featureConfigSchema = external_exports.object({
18879
18959
  claudeUserMcp: external_exports.boolean().optional(),
18880
18960
  /** LLM-generated titles for new bot threads. Off until explicitly
18881
18961
  * enabled; a one-shot that fails or answers junk leaves the first-message
18882
- * snippet in place — see llmThreadTitlesEnabled. */
18883
- llmThreadTitles: external_exports.boolean().optional()
18962
+ * snippet in place — see llmThreadTitlesEnabled. */
18963
+ llmThreadTitles: external_exports.boolean().optional(),
18964
+ /** Before each turn, passages from the bot's own memory files and earlier
18965
+ * conversations that share words with the message ride into the turn.
18966
+ * Read-only; on unless explicitly switched off — see autoRecallEnabled. */
18967
+ autoRecall: external_exports.boolean().optional(),
18968
+ /** Idle release for computer claims (#1653): a desktop seat that stays
18969
+ * screen-quiet for 90 seconds is released to waiting turns while its
18970
+ * holder's turn still lives; the previous holder re-claims directly
18971
+ * for 10 minutes and yields to an occupied seat. Off until baked; see
18972
+ * computerClaimIdleReleaseEnabled for how to enable it by hand. */
18973
+ computerClaimIdleRelease: external_exports.boolean().optional(),
18974
+ /** Consented cloud overflow for local computer waits (#1655): a wait
18975
+ * may offer a per-second-billed cloud seat, but only through an explicit
18976
+ * consent card or a configured allowlist — never a silent Auto default.
18977
+ * Off until baked; see cloudOverflowEnabled for how to enable it by hand. */
18978
+ cloudOverflow: external_exports.boolean().optional()
18884
18979
  });
18885
18980
  var onboardingConfigSchema = external_exports.object({
18886
18981
  /** ISO timestamp of finishing (or skipping to the end of) the welcome flow. */
@@ -18987,6 +19082,8 @@ var appConfigSchema = external_exports.object({
18987
19082
  /** Project key used for Sessions, catalog and agent tools. userId/sessionId
18988
19083
  * are non-secret local identifiers used to reuse one Composio Session. */
18989
19084
  composio: external_exports.object({ apiKey: optionalText, userId: optionalText, sessionId: optionalText }).optional(),
19085
+ /** Historical config section name "box" (the persisted config.json key); the
19086
+ * provider is Boat now and the key is kept for compatibility. */
18990
19087
  box: external_exports.object({ token: optionalText }).optional(),
18991
19088
  vps: vpsConfigSchema.optional(),
18992
19089
  /** Optional OpenCode key; persisted write-only and passed only to its child. */
@@ -19006,6 +19103,19 @@ var appConfigSchema = external_exports.object({
19006
19103
  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(),
19007
19104
  model: optionalText
19008
19105
  }).optional(),
19106
+ /** The decision model (server/decider): a fast classifier that picks
19107
+ * things for bots, starting with who answers a room message. `key` is
19108
+ * write-only like every credential; `baseUrl` points at a Jev-compatible
19109
+ * server instead of TypeSafe's (an operator setting with no UI); `jobs`
19110
+ * switches each decision on or off. Not `decisions`: that section is the
19111
+ * authorization log's retention. */
19112
+ decider: external_exports.object({
19113
+ enabled: external_exports.boolean().optional(),
19114
+ provider: external_exports.enum(["jev", "off"]).optional(),
19115
+ key: optionalText,
19116
+ 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(),
19117
+ jobs: external_exports.object({ roomRouting: external_exports.boolean().optional() }).optional()
19118
+ }).optional(),
19009
19119
  /** Avatar provider credentials stay separate; choosing a router never reuses a cloud key. */
19010
19120
  imageGen: external_exports.object({
19011
19121
  provider: external_exports.enum(["openai", "xai", "custom"]).optional(),
@@ -19036,10 +19146,26 @@ var appConfigSchema = external_exports.object({
19036
19146
  compactAt: external_exports.number().positive().max(1e7).optional(),
19037
19147
  autoCompact: external_exports.boolean().optional()
19038
19148
  }).optional(),
19149
+ /** Memory upkeep timing, for bots with Memory upkeep switched on. */
19150
+ memory: external_exports.object({
19151
+ /** Quiet time after a turn before its facts are captured (ms). */
19152
+ captureQuietMs: external_exports.number().int().min(1e3).max(24 * 60 * 6e4).optional(),
19153
+ /** Local hour (0-23) after which the nightly tidy-up runs. */
19154
+ tidyHour: external_exports.number().int().min(0).max(23).optional()
19155
+ }).strict().optional(),
19039
19156
  threads: threadsConfigSchema.optional(),
19040
19157
  /** The authorization decision log (server/decision-log.ts): days of month
19041
19158
  * files kept, at least; OMB_DECISION_RETENTION_DAYS wins when set. */
19042
19159
  decisions: external_exports.object({ retentionDays: external_exports.number().int().min(1).max(3650).optional() }).strict().optional(),
19160
+ /** #1655 cloud-overflow settings. perSecondCostUsd is the operator's own
19161
+ * verified rate: with no price configured the feature stays inert rather
19162
+ * than show an invented one. allowlistedThreads carries standing consent
19163
+ * for exact thread ids. */
19164
+ cloudOverflow: external_exports.object({
19165
+ perSecondCostUsd: external_exports.number().positive().max(10).optional(),
19166
+ idleStopMs: external_exports.number().int().positive().max(24 * 60 * 6e4).optional(),
19167
+ allowlistedThreads: external_exports.array(external_exports.string().min(1)).max(1e3).optional()
19168
+ }).strict().optional(),
19043
19169
  localVm: localVmConfigSchema.optional(),
19044
19170
  features: featureConfigSchema.optional(),
19045
19171
  onboarding: onboardingConfigSchema.optional(),
@@ -19063,10 +19189,11 @@ function parseStoredConfig(value) {
19063
19189
  if (!parsed.success) throw new Error(schemaIssue(parsed.error, "Invalid stored configuration"));
19064
19190
  return parsed.data;
19065
19191
  }
19066
- var DATA_DIR = process.env.OMB_DATA_DIR ?? join(homedir(), ".openmausbot");
19067
- var LEGACY_DATA_DIR = join(homedir(), ".opengrokbot");
19068
- var EVENTS_DIR = join(DATA_DIR, "events");
19069
- var NATIVE_DIR = join(DATA_DIR, "native");
19192
+ var DEFAULT_CAPTURE_QUIET_MS = 2 * 6e4;
19193
+ var DATA_DIR = process.env.OMB_DATA_DIR ?? join2(homedir(), ".openmausbot");
19194
+ var LEGACY_DATA_DIR = join2(homedir(), ".opengrokbot");
19195
+ var EVENTS_DIR = join2(DATA_DIR, "events");
19196
+ var NATIVE_DIR = join2(DATA_DIR, "native");
19070
19197
 
19071
19198
  // server/workspace-backup-policy.ts
19072
19199
  var PORTABLE_CONFIG_KEYS = [
@@ -19093,7 +19220,7 @@ function redownloadedOrgLibraryPath(path) {
19093
19220
  return /^org-library\/(?:catalog\.json(?:\.[0-9a-f-]{36}\.tmp)?$|blobs(?:\/|$))/.test(path);
19094
19221
  }
19095
19222
  function ephemeralWorkspaceTokenPath(path) {
19096
- return /^hook-tokens(?:\/|$)/.test(path);
19223
+ return /^(?:hook-tokens(?:\/|$)|sessions\.json\.open$)/.test(path);
19097
19224
  }
19098
19225
 
19099
19226
  // server/workspace-backup.ts
@@ -19121,7 +19248,10 @@ var EXCLUDED = /* @__PURE__ */ new Set([
19121
19248
  "openmausbot-server.lease",
19122
19249
  "box-create-requests.lock",
19123
19250
  "messages.db-wal",
19124
- "messages.db-shm"
19251
+ "messages.db-shm",
19252
+ // This machine's decision-model log (server/decider/log.ts): local
19253
+ // measurement of what the classifier picked, not workspace data.
19254
+ "decider-log"
19125
19255
  ]);
19126
19256
  var EXCLUSION_NOTES = [
19127
19257
  "Device pairing, server identity, live leases and runtime files (existing destination identities are preserved).",
@@ -19149,13 +19279,13 @@ function backupRoot(dataDir2) {
19149
19279
  if (root === parse3(root).root) throw new Error("A filesystem root cannot be a workspace backup target.");
19150
19280
  const stat = lstatSync(root);
19151
19281
  if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("The workspace data directory must not be a symbolic link.");
19152
- const path = join2(root, ".backups");
19282
+ const path = join3(root, ".backups");
19153
19283
  folder(path);
19154
19284
  return path;
19155
19285
  }
19156
19286
  function jobPath(dataDir2, id) {
19157
19287
  if (!ID.test(id)) throw new Error("Invalid workspace backup identifier.");
19158
- const path = join2(backupRoot(dataDir2), id);
19288
+ const path = join3(backupRoot(dataDir2), id);
19159
19289
  if (entryExists(path)) {
19160
19290
  const stat = lstatSync(path);
19161
19291
  if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("Unsafe workspace backup job directory.");
@@ -19198,14 +19328,14 @@ function writeJson(path, value) {
19198
19328
  writeFileAtomic(path, text, { mode: 384 });
19199
19329
  }
19200
19330
  function assertLocalAuthOutsideSnapshot(dataDir2) {
19201
- const configPath = join2(dataDir2, "config.json");
19202
- const config2 = existsSync(configPath) ? privateJson(configPath) : {};
19331
+ const configPath = join3(dataDir2, "config.json");
19332
+ const config2 = existsSync2(configPath) ? privateJson(configPath) : {};
19203
19333
  const instances = record2(config2) && record2(config2.instances) ? config2.instances : {};
19204
19334
  const fields = ["HOME", "USERPROFILE", "CLAUDE_CONFIG_DIR", "CODEX_HOME", "GROK_HOME", "KIMI_CODE_HOME", "HERMES_HOME", "FACTORY_HOME_OVERRIDE", "XDG_CONFIG_HOME", "XDG_DATA_HOME", "LOCALAPPDATA"];
19205
19335
  const check2 = (value, field, home) => {
19206
19336
  if (typeof value !== "string" || !value.trim()) return;
19207
19337
  const text = value.trim();
19208
- const expanded = text.startsWith("~/") || text.startsWith("~\\") ? join2(home, text.slice(2)) : text;
19338
+ const expanded = text.startsWith("~/") || text.startsWith("~\\") ? join3(home, text.slice(2)) : text;
19209
19339
  const resolved = resolve(expanded);
19210
19340
  const exists = entryExists(resolved);
19211
19341
  const path = relative(exists ? realpathSync(dataDir2) : resolve(dataDir2), exists ? realpathSync(resolved) : resolved).replaceAll("\\", "/");
@@ -19283,7 +19413,7 @@ function hashFile(path) {
19283
19413
  }
19284
19414
  }
19285
19415
  function countJsonArray(path) {
19286
- if (!existsSync(path)) return 0;
19416
+ if (!existsSync2(path)) return 0;
19287
19417
  const value = privateJson(path);
19288
19418
  if (!Array.isArray(value)) throw new Error("A workspace roster is not a valid JSON array.");
19289
19419
  const ids = /* @__PURE__ */ new Set();
@@ -19296,7 +19426,7 @@ function countJsonArray(path) {
19296
19426
  return value.length;
19297
19427
  }
19298
19428
  function databaseCounts(path) {
19299
- if (!existsSync(path)) return { threads: 0, messages: 0 };
19429
+ if (!existsSync2(path)) return { threads: 0, messages: 0 };
19300
19430
  const db = new DatabaseSync(path, { readOnly: true });
19301
19431
  try {
19302
19432
  const check2 = db.prepare("PRAGMA quick_check").all();
@@ -19315,27 +19445,27 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19315
19445
  const salt = randomBytes(16);
19316
19446
  const key = await passwordKey(options2.password, salt);
19317
19447
  const job = newJob(dataDir2, jobId2);
19318
- const snapshot = join2(job.directory, "snapshot");
19319
- folder(join2(snapshot, "data"));
19448
+ const snapshot = join3(job.directory, "snapshot");
19449
+ folder(join3(snapshot, "data"));
19320
19450
  const entries = [];
19321
19451
  const warnings = ["Stop external editors and managed desktops before exporting; files written outside this server cannot be frozen by the backup gate.", "Conversation text and user files are not redacted and may contain secrets you pasted. Keep the encrypted backup private.", RESTORE_WARNING];
19322
19452
  let bytes = 0;
19323
19453
  let skippedLinks = 0;
19324
19454
  try {
19325
19455
  const root = realpathSync(dataDir2);
19326
- const sourceDb = join2(root, "messages.db");
19327
- if (existsSync(sourceDb)) {
19456
+ const sourceDb = join3(root, "messages.db");
19457
+ if (existsSync2(sourceDb)) {
19328
19458
  if (lstatSync(sourceDb).isSymbolicLink()) throw new Error("The message database must not be a symbolic link.");
19329
19459
  const db = new DatabaseSync(sourceDb, { readOnly: true });
19330
19460
  const completionPulse = setInterval(() => {
19331
19461
  }, 25);
19332
19462
  try {
19333
- await backup(db, join2(snapshot, "messages-snapshot.db"));
19463
+ await backup(db, join3(snapshot, "messages-snapshot.db"));
19334
19464
  } finally {
19335
19465
  clearInterval(completionPulse);
19336
19466
  db.close();
19337
19467
  }
19338
- const snapshotDb = new DatabaseSync(join2(snapshot, "messages-snapshot.db"));
19468
+ const snapshotDb = new DatabaseSync(join3(snapshot, "messages-snapshot.db"));
19339
19469
  try {
19340
19470
  snapshotDb.exec("PRAGMA journal_mode = DELETE");
19341
19471
  } finally {
@@ -19349,7 +19479,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19349
19479
  if (excludedWorkspaceAuthPath(path2) || ephemeralWorkspaceTokenPath(path2) || redownloadedOrgLibraryPath(path2)) continue;
19350
19480
  if (forbiddenArchivePath(path2)) throw new Error("A workspace filename conflicts with a protected authentication or runtime path.");
19351
19481
  if (!validRelative(path2)) throw new Error("A workspace filename cannot be safely restored on supported platforms.");
19352
- const source = join2(directory, name);
19482
+ const source = join3(directory, name);
19353
19483
  const stat = lstatSync(source);
19354
19484
  if (stat.isSymbolicLink()) {
19355
19485
  let target;
@@ -19369,7 +19499,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19369
19499
  continue;
19370
19500
  }
19371
19501
  if (entries.length >= MAX_WORKSPACE_BACKUP_FILES) throw new Error("The workspace exceeds the 100,000-entry backup limit.");
19372
- const destination = join2(snapshot, "data", path2);
19502
+ const destination = join3(snapshot, "data", path2);
19373
19503
  if (stat.isDirectory()) {
19374
19504
  folder(destination);
19375
19505
  entries.push({ path: path2, type: "directory", size: 0, mode: 448 });
@@ -19387,7 +19517,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19387
19517
  writeJson(destination, value);
19388
19518
  }
19389
19519
  copied = { size: lstatSync(destination).size, mode: 384, sha256: hashFile(destination) };
19390
- } else copied = copyRegular(path2 === "messages.db" ? join2(snapshot, "messages-snapshot.db") : source, destination);
19520
+ } else copied = copyRegular(path2 === "messages.db" ? join3(snapshot, "messages-snapshot.db") : source, destination);
19391
19521
  bytes += copied.size;
19392
19522
  if (bytes > MAX_WORKSPACE_BACKUP_BYTES) throw new Error("The workspace exceeds the 10 GB backup limit.");
19393
19523
  entries.push({ path: path2, type: "file", ...copied });
@@ -19405,9 +19535,9 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19405
19535
  files: entries.filter((entry) => entry.type === "file").length,
19406
19536
  directories: entries.filter((entry) => entry.type === "directory").length,
19407
19537
  bytes,
19408
- bots: countJsonArray(join2(snapshot, "data", "bots.json")),
19409
- groups: countJsonArray(join2(snapshot, "data", "groups.json")),
19410
- ...databaseCounts(join2(snapshot, "data", "messages.db")),
19538
+ bots: countJsonArray(join3(snapshot, "data", "bots.json")),
19539
+ groups: countJsonArray(join3(snapshot, "data", "groups.json")),
19540
+ ...databaseCounts(join3(snapshot, "data", "messages.db")),
19411
19541
  exclusions: EXCLUSION_NOTES,
19412
19542
  warnings
19413
19543
  };
@@ -19417,9 +19547,9 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19417
19547
  clientState: options2.clientState ?? {},
19418
19548
  entries
19419
19549
  };
19420
- writeJson(join2(snapshot, "manifest.json"), manifest);
19421
- validateManifest(privateJson(join2(snapshot, "manifest.json")));
19422
- const path = join2(job.directory, "workspace.ombbackup");
19550
+ writeJson(join3(snapshot, "manifest.json"), manifest);
19551
+ validateManifest(privateJson(join3(snapshot, "manifest.json")));
19552
+ const path = join3(job.directory, "workspace.ombbackup");
19423
19553
  const iv = randomBytes(12);
19424
19554
  const header = Buffer.concat([MAGIC, salt, iv]);
19425
19555
  const cipher = createCipheriv("aes-256-gcm", key, iv);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openmausbot",
3
- "version": "0.1.89",
3
+ "version": "0.1.91",
4
4
  "description": "Run the OpenMausBot server anywhere and pair your devices to it",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -1 +0,0 @@
1
- import{U as a,C as n}from"./mermaid.core-BEiDklrY.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};