openmausbot 0.1.89 → 0.1.90

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/{abnfDiagram-O67JEVCF-BwaMaZEm.js → abnfDiagram-O67JEVCF-DUyXd0kL.js} +1 -1
  2. package/dist/assets/{arc-Be-8GKxd.js → arc-q73qM-At.js} +1 -1
  3. package/dist/assets/{architectureDiagram-NJMV4G6O-Dp_U2Kv1.js → architectureDiagram-NJMV4G6O-D33O3Wur.js} +1 -1
  4. package/dist/assets/{blockDiagram-BEXU5L5S-DQjUjYUk.js → blockDiagram-BEXU5L5S-DLsJeoXC.js} +1 -1
  5. package/dist/assets/{c4Diagram-YGBWAQC7-Bd3aE4Kc.js → c4Diagram-YGBWAQC7-DnaljZnu.js} +1 -1
  6. package/dist/assets/channel-BCuyHjFV.js +1 -0
  7. package/dist/assets/{chunk-2Q5K7J3B-BijjTBeJ.js → chunk-2Q5K7J3B-Da0h2i79.js} +1 -1
  8. package/dist/assets/{chunk-3FUC2YCW-CMGdwvzW.js → chunk-3FUC2YCW-CfzHi54f.js} +2 -2
  9. package/dist/assets/{chunk-5VM5RSS4-0G09BfsZ.js → chunk-5VM5RSS4-LjE4d9Jf.js} +1 -1
  10. package/dist/assets/{chunk-GTNCS2PH-FOp3vSHe.js → chunk-GTNCS2PH-DY-UGmvc.js} +1 -1
  11. package/dist/assets/{chunk-GWA4HPMP-Dv-20VIn.js → chunk-GWA4HPMP-BqeGhyhP.js} +1 -1
  12. package/dist/assets/{chunk-JWPE2WC7-CRgrdFcz.js → chunk-JWPE2WC7-BYa9EBAg.js} +1 -1
  13. package/dist/assets/{chunk-NETBCI7D-3hP4f7QB.js → chunk-NETBCI7D-vTrDtWyb.js} +1 -1
  14. package/dist/assets/{chunk-WEXAMYUT-CG98IjlG.js → chunk-WEXAMYUT-ic5tXadM.js} +1 -1
  15. package/dist/assets/{chunk-XXDRQBXY-BrSTC9xG.js → chunk-XXDRQBXY-DvRCY-c6.js} +1 -1
  16. package/dist/assets/{classDiagram-v2-NBCMYWYE-rpQQQDFX.js → classDiagram-v2-NBCMYWYE-DVbmgz_L.js} +1 -1
  17. package/dist/assets/{cose-bilkent-JH36ORCC-G6RSafHA.js → cose-bilkent-JH36ORCC-vdUs2n57.js} +1 -1
  18. package/dist/assets/{cynefin-OW5HDTMX-CXjv-IM2.js → cynefin-OW5HDTMX-BvLGlV3U.js} +1 -1
  19. package/dist/assets/{cynefinDiagram-VND7K2PF-Dw07MR9f.js → cynefinDiagram-VND7K2PF-C4GcJQDt.js} +1 -1
  20. package/dist/assets/{dagre-6A5THRUB-BwPnlTg2.js → dagre-6A5THRUB-BMSaHpt_.js} +1 -1
  21. package/dist/assets/{diagram-22UHCM2B-Cm6xcMiz.js → diagram-22UHCM2B-D5b9UBhC.js} +1 -1
  22. package/dist/assets/{diagram-3UASUU5V-CDpogPbE.js → diagram-3UASUU5V-CIKLlB7Y.js} +1 -1
  23. package/dist/assets/{diagram-ATOU4E4O-BV8z3Pnc.js → diagram-ATOU4E4O-BzXb-7k7.js} +1 -1
  24. package/dist/assets/{diagram-CDSNMT55-CKCQhOOC.js → diagram-CDSNMT55-HsTvJ7uT.js} +1 -1
  25. package/dist/assets/{diagram-MLGK6HIB-FGvJg69C.js → diagram-MLGK6HIB-Db9ySNbQ.js} +1 -1
  26. package/dist/assets/{diagram-MPIPVDR6-CwATvgnS.js → diagram-MPIPVDR6-D6BKbpqY.js} +1 -1
  27. package/dist/assets/{ebnfDiagram-ZINNZB2B-CH_c3SSC.js → ebnfDiagram-ZINNZB2B-Bq067L0t.js} +1 -1
  28. package/dist/assets/{elk-276RUBZZ-3guZi71R.js → elk-276RUBZZ-DhaD7fNJ.js} +1 -1
  29. package/dist/assets/{erDiagram-OPXOYQCR-BMHphR2n.js → erDiagram-OPXOYQCR-fwIhfz36.js} +1 -1
  30. package/dist/assets/{flowDiagram-KWPJA3E3-Vm5DkW5x.js → flowDiagram-KWPJA3E3-DygIyu0V.js} +1 -1
  31. package/dist/assets/{ganttDiagram-FUAMR5RP-DO-1ct07.js → ganttDiagram-FUAMR5RP-DPYfSO96.js} +1 -1
  32. package/dist/assets/{gitGraphDiagram-X574FWY7-nxeksEIN.js → gitGraphDiagram-X574FWY7-DhkHeCle.js} +1 -1
  33. package/dist/assets/index-CRvo-DS2.css +1 -0
  34. package/dist/assets/index-CWYGlA63.js +588 -0
  35. package/dist/assets/{index-Oxk9x45i.js → index-G1PHKGyh.js} +1 -1
  36. package/dist/assets/{infoDiagram-VRGFBTTK-Dkcvr0p7.js → infoDiagram-VRGFBTTK-DstBLxME.js} +1 -1
  37. package/dist/assets/{ishikawaDiagram-OU5B5YK6-BwVibkoO.js → ishikawaDiagram-OU5B5YK6-CrIsGgch.js} +1 -1
  38. package/dist/assets/{journeyDiagram-ZHPQQLJL-ByiBZqgG.js → journeyDiagram-ZHPQQLJL-CYypGDbB.js} +1 -1
  39. package/dist/assets/{kanban-definition-PNTS6WVX-qqjgXBF3.js → kanban-definition-PNTS6WVX-DGjPt8E_.js} +1 -1
  40. package/dist/assets/{linear-CtJnKe6A.js → linear-Dwc3Hrru.js} +1 -1
  41. package/dist/assets/{mermaid.core-BEiDklrY.js → mermaid.core-Dc4OePBL.js} +5 -5
  42. package/dist/assets/{mindmap-definition-NLK3R4M7-DfIYHia9.js → mindmap-definition-NLK3R4M7-DV-vepj-.js} +1 -1
  43. package/dist/assets/{pegDiagram-GJSIUBJH-CYyRqa1a.js → pegDiagram-GJSIUBJH-lx5Kj-n5.js} +1 -1
  44. package/dist/assets/{pieDiagram-5QR66LMP-hOToy_zH.js → pieDiagram-5QR66LMP-Bq7Vmm15.js} +1 -1
  45. package/dist/assets/{quadrantDiagram-O4NWA36T-DKAsNN9I.js → quadrantDiagram-O4NWA36T-DeqeqOBj.js} +1 -1
  46. package/dist/assets/{railroadDiagram-XR7U4H2S-BSA-d8JU.js → railroadDiagram-XR7U4H2S-CXwRQzSC.js} +1 -1
  47. package/dist/assets/{requirementDiagram-PLB6GJNP-CSmlvb-p.js → requirementDiagram-PLB6GJNP-8tAeoB88.js} +1 -1
  48. package/dist/assets/{sankeyDiagram-IPEJSGJF-CD5F6fnG.js → sankeyDiagram-IPEJSGJF-BG5zjGWU.js} +1 -1
  49. package/dist/assets/{sequenceDiagram-PO4LG4MO-JUq5sx6d.js → sequenceDiagram-PO4LG4MO-DKF3iLcw.js} +1 -1
  50. package/dist/assets/{sizeCapture-INFHLROL-BjIS-Stk.js → sizeCapture-INFHLROL-B-y1qUgT.js} +1 -1
  51. package/dist/assets/{stateDiagram-v2-GCMORJYK-DklkUxOg.js → stateDiagram-v2-GCMORJYK-MkzPgxAc.js} +1 -1
  52. package/dist/assets/{swimlanes-2SLR337P-CsjIU6be.js → swimlanes-2SLR337P-DnbaOEwH.js} +1 -1
  53. package/dist/assets/swimlanesDiagram-TC7HE7FX-BZQ07DGE.js +8 -0
  54. package/dist/assets/{timeline-definition-EJHVYXUP-BkFqK7AB.js → timeline-definition-EJHVYXUP-Bb4xG_Bt.js} +1 -1
  55. package/dist/assets/{usecaseDiagram-POWQR4AR-70gJB1EU.js → usecaseDiagram-POWQR4AR-JgkR9pFf.js} +1 -1
  56. package/dist/assets/{vennDiagram-UO4OBE2U-83Tm62dN.js → vennDiagram-UO4OBE2U-CIPIrAYe.js} +1 -1
  57. package/dist/assets/{wardleyDiagram-VNRHLVJA-tTmseoX9.js → wardleyDiagram-VNRHLVJA-BjCLuUvJ.js} +1 -1
  58. package/dist/assets/{xychartDiagram-PMCCYNJV-R1LBA55a.js → xychartDiagram-PMCCYNJV-DKgiaYxT.js} +1 -1
  59. package/dist/index.html +2 -2
  60. package/dist-server/cloud-home-start.js +14795 -0
  61. package/dist-server/container-mcp.js +52 -4
  62. package/dist-server/drivers/agents-proxy.js +20 -10
  63. package/dist-server/index.js +8985 -6461
  64. package/dist-server/openmausbot.js +327 -145
  65. package/dist-server/pair-cli.js +327 -145
  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} +330 -328
  71. package/dist-server/server/bot-profile.js +7 -1
  72. package/dist-server/server/channel-queue.js +58 -18
  73. package/dist-server/server/checkpoints.js +98 -52
  74. package/dist-server/server/claim-idle.js +33 -0
  75. package/dist-server/server/cloud-backend.js +5 -5
  76. package/dist-server/server/cloud-home-start.js +103 -0
  77. package/dist-server/server/cloud-home.js +218 -0
  78. package/dist-server/server/cloud-overflow.js +167 -0
  79. package/dist-server/server/composio.js +5 -0
  80. package/dist-server/server/computer-observation.js +2 -2
  81. package/dist-server/server/config.js +115 -6
  82. package/dist-server/server/container-computer.js +13 -0
  83. package/dist-server/server/control-client.js +2 -2
  84. package/dist-server/server/delegations.js +11 -3
  85. package/dist-server/server/drivers/acp/core.js +5 -4
  86. package/dist-server/server/drivers/agents-call.js +5 -1
  87. package/dist-server/server/drivers/agents-catalog.js +9 -3
  88. package/dist-server/server/drivers/{boxagent.js → boatagent.js} +13 -12
  89. package/dist-server/server/drivers/builtIn.js +2 -2
  90. package/dist-server/server/drivers/{chat-box-tools.js → chat-boat-tools.js} +3 -3
  91. package/dist-server/server/drivers/chat-mcp-tools.js +2 -2
  92. package/dist-server/server/drivers/claude.js +177 -13
  93. package/dist-server/server/drivers/native.js +1 -1
  94. package/dist-server/server/drivers/openai-chat.js +15 -4
  95. package/dist-server/server/drivers/pi.js +3 -3
  96. package/dist-server/server/hosted-models.js +6 -1
  97. package/dist-server/server/index.js +1029 -479
  98. package/dist-server/server/local-vm-inventory.js +11 -1
  99. package/dist-server/server/local-vm-seat-pool.js +141 -0
  100. package/dist-server/server/managed-policy.js +4 -1
  101. package/dist-server/server/memory-capture.js +194 -0
  102. package/dist-server/server/memory-entries.js +76 -0
  103. package/dist-server/server/memory-organize.js +102 -0
  104. package/dist-server/server/memory-tidy.js +144 -0
  105. package/dist-server/server/memory-topics.js +169 -0
  106. package/dist-server/server/memory-upkeep.js +452 -0
  107. package/dist-server/server/message-db.js +49 -5
  108. package/dist-server/server/permission-proxy.js +3 -3
  109. package/dist-server/server/profile-learned.js +98 -0
  110. package/dist-server/server/profile-versions.js +45 -11
  111. package/dist-server/server/recall.js +172 -0
  112. package/dist-server/server/redact.js +1 -1
  113. package/dist-server/server/room-cwd.js +1 -1
  114. package/dist-server/server/room-handoffs.js +61 -6
  115. package/dist-server/server/routes/bot-memory.js +215 -0
  116. package/dist-server/server/routine-requests.js +27 -16
  117. package/dist-server/server/routines.js +10 -6
  118. package/dist-server/server/steer-queue.js +41 -10
  119. package/dist-server/server/store.js +25 -1
  120. package/dist-server/server/surface.js +1 -1
  121. package/dist-server/server/system-prompt.js +5 -5
  122. package/dist-server/server/team-computers.js +2 -2
  123. package/dist-server/server/tightening-requests.js +34 -4
  124. package/dist-server/server/tool-summary.js +2 -2
  125. package/dist-server/server/tts/elevenlabs.js +1 -1
  126. package/dist-server/server/turn-resources.js +87 -11
  127. package/dist-server/server/vps-computer.js +1 -1
  128. package/dist-server/server/workspace.js +57 -22
  129. package/dist-server/shared/ask-question.js +7 -5
  130. package/dist-server/shared/bot-avatar.js +19 -0
  131. package/dist-server/shared/credential-request.js +3 -3
  132. package/dist-server/shared/tool-surface.js +1 -1
  133. package/dist-server/src/lib/composer-attachments.js +9 -0
  134. package/dist-server/vps-container-mcp.js +52 -4
  135. package/dist-server/workspace-backup.worker.js +52 -4
  136. package/package.json +1 -1
  137. package/dist/assets/channel-DqY_gMLg.js +0 -1
  138. package/dist/assets/index-BIMdIbaw.css +0 -1
  139. package/dist/assets/index-BVPdbq2r.js +0 -583
  140. package/dist/assets/swimlanesDiagram-TC7HE7FX-Bk14M0_B.js +0 -8
@@ -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,10 @@ 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
+
15633
15642
  // server/config.ts
15634
15643
  var optionalText = external_exports.string().optional();
15635
15644
  var SSH_ALIAS = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
@@ -15671,7 +15680,8 @@ var browserEngineConfigSchema = external_exports.object({
15671
15680
  var roomConfigSchema = external_exports.object({
15672
15681
  turnTimeoutMinutes: external_exports.number().int().min(MIN_ROOM_TURN_TIMEOUT_MINUTES).max(MAX_ROOM_TURN_TIMEOUT_MINUTES),
15673
15682
  /** Room handoff tree lifetime. Active execution pauses this clock; the
15674
- * hard cap is wall-clock and bounds trees that never stop executing. */
15683
+ * hard cap is the maximum stall window, measured wall-clock from the
15684
+ * tree's last durable progress. */
15675
15685
  handoffLifetimeMinutes: external_exports.number().int().min(1).max(MAX_ROOM_TURN_TIMEOUT_MINUTES).optional(),
15676
15686
  handoffMinRunwayMinutes: external_exports.number().int().min(1).max(MAX_ROOM_TURN_TIMEOUT_MINUTES).optional(),
15677
15687
  handoffHardCapMinutes: external_exports.number().int().min(1).max(7 * MAX_ROOM_TURN_TIMEOUT_MINUTES).optional()
@@ -15680,7 +15690,7 @@ var roomConfigSchema = external_exports.object({
15680
15690
  { message: "rooms handoff bounds must satisfy handoffMinRunwayMinutes <= handoffLifetimeMinutes <= handoffHardCapMinutes" }
15681
15691
  );
15682
15692
  var localVmConfigSchema = external_exports.object({
15683
- mode: external_exports.enum(["shared", "per-bot"]).optional(),
15693
+ mode: external_exports.enum(["shared", "per-bot", "pool"]).optional(),
15684
15694
  maxInstances: external_exports.number().int().min(MIN_LOCAL_VM_MAX_INSTANCES).max(MAX_LOCAL_VM_MAX_INSTANCES).optional()
15685
15695
  });
15686
15696
  var browserProfileSchema = external_exports.object({
@@ -15799,6 +15809,10 @@ var featureConfigSchema = external_exports.object({
15799
15809
  skillAuthoring: external_exports.boolean().optional(),
15800
15810
  /** Show each tool run in the transcript. Off unless explicitly enabled. */
15801
15811
  showToolCalls: external_exports.boolean().optional(),
15812
+ /** Run a routine inside the conversation it reports to, instead of a hidden
15813
+ * thread. Off unless explicitly enabled. The run still starts from its own
15814
+ * instructions, but the messages stay in that chat. */
15815
+ routinesInConversation: external_exports.boolean().optional(),
15802
15816
  /** Experimental built-in browser. Off until explicitly enabled; each bot
15803
15817
  * also has its own switch. */
15804
15818
  browser: external_exports.boolean().optional(),
@@ -15812,8 +15826,23 @@ var featureConfigSchema = external_exports.object({
15812
15826
  claudeUserMcp: external_exports.boolean().optional(),
15813
15827
  /** LLM-generated titles for new bot threads. Off until explicitly
15814
15828
  * 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()
15829
+ * snippet in place — see llmThreadTitlesEnabled. */
15830
+ llmThreadTitles: external_exports.boolean().optional(),
15831
+ /** Before each turn, passages from the bot's own memory files and earlier
15832
+ * conversations that share words with the message ride into the turn.
15833
+ * Read-only; on unless explicitly switched off — see autoRecallEnabled. */
15834
+ autoRecall: external_exports.boolean().optional(),
15835
+ /** Idle release for computer claims (#1653): a desktop seat that stays
15836
+ * screen-quiet for 90 seconds is released to waiting turns while its
15837
+ * holder's turn still lives; the previous holder re-claims directly
15838
+ * for 10 minutes and yields to an occupied seat. Off until baked; see
15839
+ * computerClaimIdleReleaseEnabled for how to enable it by hand. */
15840
+ computerClaimIdleRelease: external_exports.boolean().optional(),
15841
+ /** Consented cloud overflow for local computer waits (#1655): a wait
15842
+ * may offer a per-second-billed cloud seat, but only through an explicit
15843
+ * consent card or a configured allowlist — never a silent Auto default.
15844
+ * Off until baked; see cloudOverflowEnabled for how to enable it by hand. */
15845
+ cloudOverflow: external_exports.boolean().optional()
15817
15846
  });
15818
15847
  var onboardingConfigSchema = external_exports.object({
15819
15848
  /** ISO timestamp of finishing (or skipping to the end of) the welcome flow. */
@@ -15920,6 +15949,8 @@ var appConfigSchema = external_exports.object({
15920
15949
  /** Project key used for Sessions, catalog and agent tools. userId/sessionId
15921
15950
  * are non-secret local identifiers used to reuse one Composio Session. */
15922
15951
  composio: external_exports.object({ apiKey: optionalText, userId: optionalText, sessionId: optionalText }).optional(),
15952
+ /** Historical config section name "box" (the persisted config.json key); the
15953
+ * provider is Boat now and the key is kept for compatibility. */
15923
15954
  box: external_exports.object({ token: optionalText }).optional(),
15924
15955
  vps: vpsConfigSchema.optional(),
15925
15956
  /** Optional OpenCode key; persisted write-only and passed only to its child. */
@@ -15969,10 +16000,26 @@ var appConfigSchema = external_exports.object({
15969
16000
  compactAt: external_exports.number().positive().max(1e7).optional(),
15970
16001
  autoCompact: external_exports.boolean().optional()
15971
16002
  }).optional(),
16003
+ /** Memory upkeep timing, for bots with Memory upkeep switched on. */
16004
+ memory: external_exports.object({
16005
+ /** Quiet time after a turn before its facts are captured (ms). */
16006
+ captureQuietMs: external_exports.number().int().min(1e3).max(24 * 60 * 6e4).optional(),
16007
+ /** Local hour (0-23) after which the nightly tidy-up runs. */
16008
+ tidyHour: external_exports.number().int().min(0).max(23).optional()
16009
+ }).strict().optional(),
15972
16010
  threads: threadsConfigSchema.optional(),
15973
16011
  /** The authorization decision log (server/decision-log.ts): days of month
15974
16012
  * files kept, at least; OMB_DECISION_RETENTION_DAYS wins when set. */
15975
16013
  decisions: external_exports.object({ retentionDays: external_exports.number().int().min(1).max(3650).optional() }).strict().optional(),
16014
+ /** #1655 cloud-overflow settings. perSecondCostUsd is the operator's own
16015
+ * verified rate: with no price configured the feature stays inert rather
16016
+ * than show an invented one. allowlistedThreads carries standing consent
16017
+ * for exact thread ids. */
16018
+ cloudOverflow: external_exports.object({
16019
+ perSecondCostUsd: external_exports.number().positive().max(10).optional(),
16020
+ idleStopMs: external_exports.number().int().positive().max(24 * 60 * 6e4).optional(),
16021
+ allowlistedThreads: external_exports.array(external_exports.string().min(1)).max(1e3).optional()
16022
+ }).strict().optional(),
15976
16023
  localVm: localVmConfigSchema.optional(),
15977
16024
  features: featureConfigSchema.optional(),
15978
16025
  onboarding: onboardingConfigSchema.optional(),
@@ -15991,6 +16038,7 @@ var storedAppConfigSchema = appConfigSchema.extend({
15991
16038
  });
15992
16039
  var appConfigPatchSchema = appConfigSchema.omit({ instances: true, mcpServers: true, cliStartup: true, customDomain: true }).extend({ threads: threadsPatchSchema.optional(), newBots: newBotsPatchSchema.optional() });
15993
16040
  var jsonObjectSchema = external_exports.record(external_exports.string(), external_exports.json());
16041
+ var DEFAULT_CAPTURE_QUIET_MS = 2 * 6e4;
15994
16042
  var DATA_DIR = process.env.OMB_DATA_DIR ?? join2(homedir2(), ".openmausbot");
15995
16043
  var LEGACY_DATA_DIR = join2(homedir2(), ".opengrokbot");
15996
16044
  var EVENTS_DIR = join2(DATA_DIR, "events");
@@ -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: {
@@ -222,8 +222,9 @@ var ROUTINE_FIELDS_SCHEMA = {
222
222
  schedule: ROUTINE_SCHEDULE_SCHEMA,
223
223
  run_on: {
224
224
  type: "string",
225
+ // "box" is Boat's historical run_on destination id (agents wire contract).
225
226
  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."
227
+ 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
228
  },
228
229
  timeout_minutes: {
229
230
  type: "integer",
@@ -383,7 +384,7 @@ var toolDefinitions = (externalRuntime) => [
383
384
  surface: {
384
385
  type: "string",
385
386
  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."
387
+ 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
388
  }
388
389
  } }
389
390
  },
@@ -625,7 +626,8 @@ var toolDefinitions = (externalRuntime) => [
625
626
  properties: {
626
627
  action: { type: "string", enum: ["append", "replace", "remove", "supersede"] },
627
628
  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." }
629
+ old_text: { type: "string", minLength: 1, description: "Exact unique existing passage for replace, supersede, or remove. Omit for append." },
630
+ 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
631
  },
630
632
  required: ["action"]
631
633
  }
@@ -717,12 +719,16 @@ var toolDefinitions = (externalRuntime) => [
717
719
  },
718
720
  {
719
721
  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,
722
+ 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
723
  inputSchema: {
722
724
  type: "object",
723
725
  additionalProperties: false,
724
726
  properties: {
725
727
  routine_id: { type: "string", minLength: 1, description: "Routine id from list_routines." },
728
+ for_bot_id: {
729
+ type: "string",
730
+ 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."
731
+ },
726
732
  action: {
727
733
  type: "string",
728
734
  enum: ["update", "pause", "resume", "run_now", "delete"],
@@ -16419,7 +16425,7 @@ function routineFields(args) {
16419
16425
  const runOn = destination(args.run_on ?? args.runOn);
16420
16426
  const timeoutMinutes = args.timeout_minutes ?? args.timeoutMinutes;
16421
16427
  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.' };
16428
+ 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
16429
  }
16424
16430
  if (timeoutMinutes != null && (typeof timeoutMinutes !== "number" || !Number.isInteger(timeoutMinutes) || timeoutMinutes < 5 || timeoutMinutes > 240)) {
16425
16431
  return { fields, error: "timeout_minutes must be a whole number from 5 to 240. Use clear_timeout to remove a limit." };
@@ -17044,11 +17050,14 @@ ${JSON.stringify(routines, null, 2)}`
17044
17050
  if (!routineId || !action) {
17045
17051
  return { text: "propose_routine_action needs a routine_id and supported action.", isError: true };
17046
17052
  }
17053
+ const forBotId = String(args.for_bot_id ?? "").trim();
17047
17054
  const body = {
17048
17055
  fromBotId: BOT_ID,
17049
17056
  fromThreadId: THREAD_ID,
17050
17057
  action,
17051
- routineId
17058
+ routineId,
17059
+ // JSON.stringify drops the key entirely when no target was named
17060
+ ...forBotId ? { forBotId } : {}
17052
17061
  };
17053
17062
  if (action === "update") {
17054
17063
  if (!jsonRecord(args.changes)) {
@@ -17141,7 +17150,8 @@ ${JSON.stringify(routines, null, 2)}`
17141
17150
  fromThreadId: THREAD_ID,
17142
17151
  action: args.action,
17143
17152
  text: args.text,
17144
- oldText: args.old_text
17153
+ oldText: args.old_text,
17154
+ ...typeof args.until === "string" && args.until.trim() ? { until: args.until.trim() } : {}
17145
17155
  })
17146
17156
  });
17147
17157
  if (r.error || r.ok !== true) {