openmausbot 0.1.90 → 0.1.92

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 (177) hide show
  1. package/dist/assets/DesktopViewer-Do6lBa4C.js +5 -0
  2. package/dist/assets/{abnfDiagram-O67JEVCF-DUyXd0kL.js → abnfDiagram-O67JEVCF-Cd3X7Hxc.js} +1 -1
  3. package/dist/assets/{arc-q73qM-At.js → arc-DIYc7Ymx.js} +1 -1
  4. package/dist/assets/{architectureDiagram-NJMV4G6O-D33O3Wur.js → architectureDiagram-NJMV4G6O-DBmRGVyP.js} +1 -1
  5. package/dist/assets/{blockDiagram-BEXU5L5S-DLsJeoXC.js → blockDiagram-BEXU5L5S-CPFePSEE.js} +1 -1
  6. package/dist/assets/{c4Diagram-YGBWAQC7-DnaljZnu.js → c4Diagram-YGBWAQC7-DD_DO1qy.js} +1 -1
  7. package/dist/assets/channel-Dtk5Mtic.js +1 -0
  8. package/dist/assets/{chunk-2Q5K7J3B-Da0h2i79.js → chunk-2Q5K7J3B-BNEeNSjX.js} +1 -1
  9. package/dist/assets/{chunk-3FUC2YCW-CfzHi54f.js → chunk-3FUC2YCW-BbinLaqH.js} +2 -2
  10. package/dist/assets/{chunk-5VM5RSS4-LjE4d9Jf.js → chunk-5VM5RSS4-BBgYrgDR.js} +1 -1
  11. package/dist/assets/{chunk-GTNCS2PH-DY-UGmvc.js → chunk-GTNCS2PH-ezXj-kA-.js} +1 -1
  12. package/dist/assets/{chunk-GWA4HPMP-BqeGhyhP.js → chunk-GWA4HPMP-9FxZ3diV.js} +1 -1
  13. package/dist/assets/{chunk-JWPE2WC7-BYa9EBAg.js → chunk-JWPE2WC7-CO-40JpI.js} +1 -1
  14. package/dist/assets/{chunk-NETBCI7D-vTrDtWyb.js → chunk-NETBCI7D-BEhjslYE.js} +1 -1
  15. package/dist/assets/{chunk-WEXAMYUT-ic5tXadM.js → chunk-WEXAMYUT-CNeq4n7_.js} +1 -1
  16. package/dist/assets/{chunk-XXDRQBXY-DvRCY-c6.js → chunk-XXDRQBXY-OsCY7KSi.js} +1 -1
  17. package/dist/assets/{classDiagram-v2-NBCMYWYE-DVbmgz_L.js → classDiagram-v2-NBCMYWYE-CloRUEtk.js} +1 -1
  18. package/dist/assets/{cose-bilkent-JH36ORCC-vdUs2n57.js → cose-bilkent-JH36ORCC-D1BGZhp4.js} +1 -1
  19. package/dist/assets/{cynefin-OW5HDTMX-BvLGlV3U.js → cynefin-OW5HDTMX-CUf4T2CN.js} +1 -1
  20. package/dist/assets/{cynefinDiagram-VND7K2PF-C4GcJQDt.js → cynefinDiagram-VND7K2PF-DPEZrFGA.js} +1 -1
  21. package/dist/assets/{dagre-6A5THRUB-BMSaHpt_.js → dagre-6A5THRUB-bDe6GIv5.js} +1 -1
  22. package/dist/assets/{diagram-22UHCM2B-D5b9UBhC.js → diagram-22UHCM2B-CdcUQz55.js} +1 -1
  23. package/dist/assets/{diagram-3UASUU5V-CIKLlB7Y.js → diagram-3UASUU5V-BZpqGg7c.js} +1 -1
  24. package/dist/assets/{diagram-ATOU4E4O-BzXb-7k7.js → diagram-ATOU4E4O-DvGM6ugp.js} +1 -1
  25. package/dist/assets/{diagram-CDSNMT55-HsTvJ7uT.js → diagram-CDSNMT55-DSTmMm0s.js} +1 -1
  26. package/dist/assets/{diagram-MLGK6HIB-Db9ySNbQ.js → diagram-MLGK6HIB-15cucnMn.js} +1 -1
  27. package/dist/assets/{diagram-MPIPVDR6-D6BKbpqY.js → diagram-MPIPVDR6-tMbuaE6n.js} +1 -1
  28. package/dist/assets/{ebnfDiagram-ZINNZB2B-Bq067L0t.js → ebnfDiagram-ZINNZB2B-BYxYzjHI.js} +1 -1
  29. package/dist/assets/{elk-276RUBZZ-DhaD7fNJ.js → elk-276RUBZZ-v6bj852W.js} +1 -1
  30. package/dist/assets/{erDiagram-OPXOYQCR-fwIhfz36.js → erDiagram-OPXOYQCR-5lBBlnd2.js} +1 -1
  31. package/dist/assets/{flowDiagram-KWPJA3E3-DygIyu0V.js → flowDiagram-KWPJA3E3-CZyl1zIj.js} +1 -1
  32. package/dist/assets/{ganttDiagram-FUAMR5RP-DPYfSO96.js → ganttDiagram-FUAMR5RP-BiAI-ltZ.js} +1 -1
  33. package/dist/assets/{gitGraphDiagram-X574FWY7-DhkHeCle.js → gitGraphDiagram-X574FWY7-BAZISkj3.js} +1 -1
  34. package/dist/assets/index-Cdmjrl28.css +1 -0
  35. package/dist/assets/{index-G1PHKGyh.js → index-DGBaEXrM.js} +1 -1
  36. package/dist/assets/index-DR7YPMkW.js +597 -0
  37. package/dist/assets/{infoDiagram-VRGFBTTK-DstBLxME.js → infoDiagram-VRGFBTTK-B6ooOy-Z.js} +1 -1
  38. package/dist/assets/{ishikawaDiagram-OU5B5YK6-CrIsGgch.js → ishikawaDiagram-OU5B5YK6-BZ9ksi-B.js} +1 -1
  39. package/dist/assets/{journeyDiagram-ZHPQQLJL-CYypGDbB.js → journeyDiagram-ZHPQQLJL-DWqlzIEe.js} +1 -1
  40. package/dist/assets/{kanban-definition-PNTS6WVX-DGjPt8E_.js → kanban-definition-PNTS6WVX-JX6piDwL.js} +1 -1
  41. package/dist/assets/{linear-Dwc3Hrru.js → linear-CmOWzX0P.js} +1 -1
  42. package/dist/assets/{mermaid.core-Dc4OePBL.js → mermaid.core-CF1zwoQ-.js} +5 -5
  43. package/dist/assets/{mindmap-definition-NLK3R4M7-DV-vepj-.js → mindmap-definition-NLK3R4M7-CGh2K4fW.js} +1 -1
  44. package/dist/assets/{pegDiagram-GJSIUBJH-lx5Kj-n5.js → pegDiagram-GJSIUBJH-CDwYN0s7.js} +1 -1
  45. package/dist/assets/{pieDiagram-5QR66LMP-Bq7Vmm15.js → pieDiagram-5QR66LMP-1rfjJocB.js} +1 -1
  46. package/dist/assets/{quadrantDiagram-O4NWA36T-DeqeqOBj.js → quadrantDiagram-O4NWA36T-tKPvPiok.js} +1 -1
  47. package/dist/assets/{railroadDiagram-XR7U4H2S-CXwRQzSC.js → railroadDiagram-XR7U4H2S-BHLm5vXR.js} +1 -1
  48. package/dist/assets/{requirementDiagram-PLB6GJNP-8tAeoB88.js → requirementDiagram-PLB6GJNP-CB45STp7.js} +1 -1
  49. package/dist/assets/{sankeyDiagram-IPEJSGJF-BG5zjGWU.js → sankeyDiagram-IPEJSGJF-55QA_huC.js} +1 -1
  50. package/dist/assets/{sequenceDiagram-PO4LG4MO-DKF3iLcw.js → sequenceDiagram-PO4LG4MO-BckFmQHn.js} +1 -1
  51. package/dist/assets/{sizeCapture-INFHLROL-B-y1qUgT.js → sizeCapture-INFHLROL-BFCOJF11.js} +1 -1
  52. package/dist/assets/{stateDiagram-v2-GCMORJYK-MkzPgxAc.js → stateDiagram-v2-GCMORJYK-CZvmiVVN.js} +1 -1
  53. package/dist/assets/{swimlanes-2SLR337P-DnbaOEwH.js → swimlanes-2SLR337P-BpDUCEKy.js} +1 -1
  54. package/dist/assets/swimlanesDiagram-TC7HE7FX-M0GYW9Y3.js +8 -0
  55. package/dist/assets/{timeline-definition-EJHVYXUP-Bb4xG_Bt.js → timeline-definition-EJHVYXUP-BpxHq6IK.js} +1 -1
  56. package/dist/assets/{usecaseDiagram-POWQR4AR-JgkR9pFf.js → usecaseDiagram-POWQR4AR-Cj66vm02.js} +1 -1
  57. package/dist/assets/{vennDiagram-UO4OBE2U-CIPIrAYe.js → vennDiagram-UO4OBE2U-C9nRkWE_.js} +1 -1
  58. package/dist/assets/{wardleyDiagram-VNRHLVJA-BjCLuUvJ.js → wardleyDiagram-VNRHLVJA-D-me_nWj.js} +1 -1
  59. package/dist/assets/{xychartDiagram-PMCCYNJV-DKgiaYxT.js → xychartDiagram-PMCCYNJV-Dc_fL4mk.js} +1 -1
  60. package/dist/index.html +2 -2
  61. package/dist/novnc-NOTICE.txt +118 -0
  62. package/dist-server/cloud-home-start.js +128 -15
  63. package/dist-server/container-mcp.js +277 -45
  64. package/dist-server/drivers/agents-proxy.js +16 -4
  65. package/dist-server/enterprise/server/index.js +5 -1
  66. package/dist-server/index.js +46703 -39955
  67. package/dist-server/local-computer-proxy.js +128 -7
  68. package/dist-server/mcp-gate.js +11 -5
  69. package/dist-server/model-catalog/models-dev.snapshot.json +7299 -0
  70. package/dist-server/openmausbot.js +4099 -1217
  71. package/dist-server/pair-cli.js +4099 -1217
  72. package/dist-server/server/boat.js +67 -22
  73. package/dist-server/server/bot-overview.js +7 -4
  74. package/dist-server/server/browser-engine.js +10 -1
  75. package/dist-server/server/browser-live.js +46 -2
  76. package/dist-server/server/browser-runtime.js +74 -8
  77. package/dist-server/server/browser-tool-shape.js +6 -4
  78. package/dist-server/server/chief-of-staff.js +1 -1
  79. package/dist-server/server/cloud-home-start.js +136 -26
  80. package/dist-server/server/cloud-home.js +64 -5
  81. package/dist-server/server/cloud-lending.js +167 -0
  82. package/dist-server/server/cloud-move-http.js +268 -0
  83. package/dist-server/server/cloud-move.js +418 -0
  84. package/dist-server/server/cloud-owner.js +196 -0
  85. package/dist-server/server/cloud-secrets-boot.js +6 -0
  86. package/dist-server/server/cloud-secrets.js +65 -0
  87. package/dist-server/server/config.js +215 -17
  88. package/dist-server/server/container-computer.js +3 -2
  89. package/dist-server/server/decider/index.js +238 -0
  90. package/dist-server/server/decider/jev.js +183 -0
  91. package/dist-server/server/decider/log.js +62 -0
  92. package/dist-server/server/decider/relay.js +52 -0
  93. package/dist-server/server/decider/room-routing.js +88 -0
  94. package/dist-server/server/decider/types.js +5 -0
  95. package/dist-server/server/desktop-viewer-targets.js +26 -0
  96. package/dist-server/server/drivers/acp/core.js +167 -21
  97. package/dist-server/server/drivers/acp/opencode-go.js +614 -85
  98. package/dist-server/server/drivers/agents-catalog.js +22 -6
  99. package/dist-server/server/drivers/antigravity-acp.js +69 -11
  100. package/dist-server/server/drivers/antigravity-temp.js +360 -0
  101. package/dist-server/server/drivers/antigravity.js +21 -0
  102. package/dist-server/server/drivers/boatagent.js +20 -12
  103. package/dist-server/server/drivers/chatgpt-plan-auth.js +481 -0
  104. package/dist-server/server/drivers/claude.js +313 -34
  105. package/dist-server/server/drivers/codex.js +228 -18
  106. package/dist-server/server/drivers/grok.js +2 -2
  107. package/dist-server/server/drivers/mistral.js +4 -3
  108. package/dist-server/server/drivers/openai-chat-protocol.js +4 -3
  109. package/dist-server/server/drivers/openai-chat.js +41 -3
  110. package/dist-server/server/drivers/openai-compat.js +73 -23
  111. package/dist-server/server/engine-install.js +46 -12
  112. package/dist-server/server/env-path.js +15 -3
  113. package/dist-server/server/group-goal-run.js +6 -4
  114. package/dist-server/server/harness/registry.js +2 -2
  115. package/dist-server/server/harness-capabilities.js +2 -0
  116. package/dist-server/server/included-services.js +70 -0
  117. package/dist-server/server/index.js +1753 -263
  118. package/dist-server/server/lending-memory.js +479 -0
  119. package/dist-server/server/local-vm-idle.js +24 -6
  120. package/dist-server/server/managed-desktop.js +3 -0
  121. package/dist-server/server/mcp-bridge.js +5 -3
  122. package/dist-server/server/mcp-http.js +6 -3
  123. package/dist-server/server/mcp-oauth-discovery.js +133 -0
  124. package/dist-server/server/mcp-oauth-store.js +70 -0
  125. package/dist-server/server/mcp-oauth.js +550 -0
  126. package/dist-server/server/mcp-probe.js +14 -1
  127. package/dist-server/server/mcp-registry.js +43 -0
  128. package/dist-server/server/memory-upkeep.js +94 -84
  129. package/dist-server/server/model-catalog/catalog.js +374 -0
  130. package/dist-server/server/model-catalog/presets.js +176 -0
  131. package/dist-server/server/model-catalog/trim.js +219 -0
  132. package/dist-server/server/model-context-window.js +4 -4
  133. package/dist-server/server/package-export.js +17 -10
  134. package/dist-server/server/package-import.js +6 -3
  135. package/dist-server/server/package-parts.js +3 -1
  136. package/dist-server/server/provider-key-check.js +4 -2
  137. package/dist-server/server/recent-work.js +1 -1
  138. package/dist-server/server/request-auth.js +25 -0
  139. package/dist-server/server/routes/antigravity-leftovers.js +45 -0
  140. package/dist-server/server/routes/bot-memory.js +31 -6
  141. package/dist-server/server/routes/decider.js +19 -0
  142. package/dist-server/server/routes/desktop-viewer.js +194 -0
  143. package/dist-server/server/routine-requests.js +1 -1
  144. package/dist-server/server/routines.js +1 -1
  145. package/dist-server/server/sessions.js +56 -9
  146. package/dist-server/server/shared-computers.js +116 -30
  147. package/dist-server/server/skills.js +25 -10
  148. package/dist-server/server/store.js +79 -124
  149. package/dist-server/server/surface.js +13 -0
  150. package/dist-server/server/system-prompt.js +11 -0
  151. package/dist-server/server/team-backup.js +6 -2
  152. package/dist-server/server/team-manifest.js +11 -3
  153. package/dist-server/server/thread-events.js +2 -0
  154. package/dist-server/server/thread-starters.js +33 -0
  155. package/dist-server/server/thread-title.js +46 -0
  156. package/dist-server/server/tts/elevenlabs.js +11 -6
  157. package/dist-server/server/tts/fish.js +4 -5
  158. package/dist-server/server/tts/index.js +20 -11
  159. package/dist-server/server/vps-computer.js +79 -12
  160. package/dist-server/server/webhooks.js +18 -1
  161. package/dist-server/server/workspace-backup-policy.js +25 -3
  162. package/dist-server/server/workspace-backup.js +28 -8
  163. package/dist-server/server/workspace.js +65 -15
  164. package/dist-server/shared/cloud-home.js +4 -0
  165. package/dist-server/shared/package-format.js +30 -4
  166. package/dist-server/shared/team-backup.js +20 -3
  167. package/dist-server/shared/workspace-backup-client.js +1 -0
  168. package/dist-server/src/lib/citations.js +177 -0
  169. package/dist-server/src/lib/composer-attachments.js +7 -1
  170. package/dist-server/vps-container-mcp.js +278 -45
  171. package/dist-server/workspace-backup.worker.js +184 -38
  172. package/enterprise/server/index.js +5 -1
  173. package/package.json +1 -1
  174. package/dist/assets/channel-BCuyHjFV.js +0 -1
  175. package/dist/assets/index-CRvo-DS2.css +0 -1
  176. package/dist/assets/index-CWYGlA63.js +0 -588
  177. package/dist/assets/swimlanesDiagram-TC7HE7FX-BZQ07DGE.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";
@@ -3169,6 +3169,7 @@ var WORKSPACE_BACKUP_CLIENT_KEYS = [
3169
3169
  "omb-draft-channel-modes",
3170
3170
  "omb-skin",
3171
3171
  "omb-show-threads",
3172
+ "omb-show-run-card",
3172
3173
  "openmausbot.sidebarDensity",
3173
3174
  "openmausbot.sidebarCollapsedSections.v1",
3174
3175
  "openmausbot.sidebarSectionOrder.v1",
@@ -3178,7 +3179,7 @@ var WORKSPACE_BACKUP_CLIENT_KEYS = [
3178
3179
 
3179
3180
  // server/config.ts
3180
3181
  import { homedir } from "node:os";
3181
- import { join } from "node:path";
3182
+ import { join as join2 } from "node:path";
3182
3183
 
3183
3184
  // node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
3184
3185
  var external_exports = {};
@@ -18683,15 +18684,27 @@ var stdioEntrySchema = external_exports.object({
18683
18684
  var stdioMutationSchema = stdioEntrySchema.extend({
18684
18685
  env: external_exports.record(external_exports.string(), external_exports.union([external_exports.string().max(16384), external_exports.literal(true)])).optional()
18685
18686
  });
18687
+ var CLIENT_ID = /^[\x20-\x7e]+$/;
18688
+ var SCOPE = /^[\x21\x23-\x5b\x5d-\x7e]+$/;
18689
+ var CLIENT_SECRET_MAX = 4096;
18690
+ var oauthClientSchema = external_exports.object({
18691
+ clientId: external_exports.string().trim().min(1, "Enter the client ID of the app registered with this server's sign-in provider.").max(512).regex(CLIENT_ID, "A client ID is printable text on one line."),
18692
+ clientSecret: external_exports.string().min(1).max(CLIENT_SECRET_MAX).regex(CLIENT_ID, "A client secret is printable text on one line.").optional(),
18693
+ scopes: external_exports.array(external_exports.string().max(256).regex(SCOPE, "Scopes are single words, like offline_access or api://my-app/mcp.read.")).max(32).optional()
18694
+ }).strict();
18686
18695
  var remoteEntrySchema = external_exports.object({
18687
18696
  /** Streamable HTTP unless the entry says the older SSE transport. */
18688
18697
  type: external_exports.enum(["http", "sse"]).optional(),
18689
18698
  url: external_exports.string().trim().min(1).max(2048),
18690
18699
  headers: external_exports.record(external_exports.string(), external_exports.string().max(16384)).optional(),
18700
+ oauth: oauthClientSchema.optional(),
18691
18701
  enabled: external_exports.boolean().optional()
18692
18702
  }).strict();
18693
18703
  var remoteMutationSchema = remoteEntrySchema.extend({
18694
- headers: external_exports.record(external_exports.string(), external_exports.union([external_exports.string().max(16384), external_exports.literal(true)])).optional()
18704
+ headers: external_exports.record(external_exports.string(), external_exports.union([external_exports.string().max(16384), external_exports.literal(true)])).optional(),
18705
+ oauth: oauthClientSchema.extend({
18706
+ clientSecret: external_exports.union([external_exports.string().min(1).max(CLIENT_SECRET_MAX).regex(CLIENT_ID, "A client secret is printable text on one line."), external_exports.literal(true)]).optional()
18707
+ }).optional()
18695
18708
  });
18696
18709
 
18697
18710
  // server/schema.ts
@@ -18706,11 +18719,82 @@ function schemaIssue(error51, fallback) {
18706
18719
  var CLOUD_SEAT_IDLE_STOP_MS = 5 * 6e4;
18707
18720
  var CLOUD_SEAT_SLEEP_RETRY_MAX_MS = 10 * 6e4;
18708
18721
 
18722
+ // server/proxy-paths.ts
18723
+ import { existsSync } from "node:fs";
18724
+ import { dirname, join } from "node:path";
18725
+ import { fileURLToPath } from "node:url";
18726
+ var SERVER_ROOT = dirname(fileURLToPath(import.meta.url));
18727
+ function resolveProxy(relative2) {
18728
+ const source = join(SERVER_ROOT, `${relative2}.ts`);
18729
+ return existsSync(source) ? source : join(SERVER_ROOT, `${relative2}.js`);
18730
+ }
18731
+ var SPAWNED_PROXIES = {
18732
+ browser: resolveProxy("browser-proxy"),
18733
+ localComputer: resolveProxy("local-computer-proxy"),
18734
+ permission: resolveProxy("permission-proxy"),
18735
+ containerMcp: resolveProxy("container-mcp"),
18736
+ vpsContainerMcp: resolveProxy("vps-container-mcp"),
18737
+ agents: resolveProxy("drivers/agents-proxy"),
18738
+ dweb: resolveProxy("drivers/dweb-proxy"),
18739
+ connectors: resolveProxy("connector-proxy"),
18740
+ mcpGate: resolveProxy("mcp-gate"),
18741
+ phone: resolveProxy("drivers/phone-proxy"),
18742
+ hook: resolveProxy("hooks/omb-hook"),
18743
+ // Loaded by the external `pi` process via `-e`, not by this server — but
18744
+ // resolved through the same single source of truth so the packaged layout
18745
+ // check can assert it ships.
18746
+ piMcpExtension: resolveProxy("drivers/pi-mcp-extension")
18747
+ };
18748
+
18749
+ // server/enterprise.ts
18750
+ var layerSchema = external_exports.object({
18751
+ customer: external_exports.string().min(1),
18752
+ features: external_exports.array(external_exports.string().min(1)),
18753
+ expiresAt: external_exports.string().nullable()
18754
+ });
18755
+ var DAY_MS = 24 * 60 * 6e4;
18756
+
18757
+ // server/sessions.ts
18758
+ var PAIRING_CODE_TTL_MS = 5 * 6e4;
18759
+ function daysMs(value, fallbackDays) {
18760
+ const days = Number(value);
18761
+ const ok = Number.isInteger(days) && days >= 1 && days <= 3650;
18762
+ return (ok ? days : fallbackDays) * 24 * 60 * 6e4;
18763
+ }
18764
+ var SESSION_TTL_MS = daysMs(process.env.OMB_SESSION_TTL_DAYS, 30);
18765
+ var SESSION_MAX_AGE_MS = daysMs(process.env.OMB_SESSION_MAX_DAYS, 180);
18766
+ var SESSION_RENEW_WHEN_LEFT_MS = SESSION_TTL_MS / 2;
18767
+ var STREAM_TICKET_TTL_MS = 5 * 6e4;
18768
+ var scopeSchema = external_exports.enum(["admin", "client"]);
18769
+ var sessionSchema = external_exports.object({
18770
+ id: external_exports.string().min(1),
18771
+ tokenHash: external_exports.string().length(64),
18772
+ label: external_exports.string().max(80),
18773
+ scopes: external_exports.array(scopeSchema).min(1),
18774
+ createdAt: external_exports.number(),
18775
+ lastSeenAt: external_exports.number(),
18776
+ expiresAt: external_exports.number(),
18777
+ /** Set when the session came from an account sign-in rather than a code. */
18778
+ userId: external_exports.string().max(256).optional(),
18779
+ email: external_exports.string().max(320).optional(),
18780
+ /** Set only by the internal verified-portal issuance path, never by email or pairing input. */
18781
+ membershipAuthority: external_exports.literal("portal").optional(),
18782
+ /** A browser sign-in (PairingCode `browser`): accepted only as its browser's cookie, never as a bearer token. */
18783
+ cookieOnly: external_exports.literal(true).optional(),
18784
+ /** Whose OMB Cloud a browser sign-in signed in to (its PairingCode `owner`). */
18785
+ owner: external_exports.string().max(254).optional()
18786
+ });
18787
+ var fileSchema = external_exports.object({ version: external_exports.literal(1), sessions: external_exports.array(sessionSchema) });
18788
+
18789
+ // server/cloud-home.ts
18790
+ var CLOUD_PAIRING_NONCE_MS = 10 * 6e4;
18791
+
18709
18792
  // server/config.ts
18710
18793
  var optionalText = external_exports.string().optional();
18711
18794
  var SSH_ALIAS = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
18712
18795
  var LEGACY_BROWSER_PROFILE_ID = /^[A-Za-z0-9_-]{1,40}$/;
18713
18796
  var BROWSER_PROFILE_ID = /^[a-z0-9_-]{1,40}$/;
18797
+ var FISH_TTS_MODELS = ["s2.1-pro", "s2.1-pro-free"];
18714
18798
  var MIN_ROOM_TURN_TIMEOUT_MINUTES = 1;
18715
18799
  var MAX_ROOM_TURN_TIMEOUT_MINUTES = 1440;
18716
18800
  var DEFAULT_ROOM_HANDOFF_LIFETIME_MINUTES = 30;
@@ -18721,6 +18805,8 @@ var MIN_THREAD_EVENT_LOG_BYTES = 256 * 1024;
18721
18805
  var MAX_THREAD_EVENT_LOG_BYTES = 4 * 1024 * 1024 * 1024;
18722
18806
  var MIN_LOCAL_VM_MAX_INSTANCES = 1;
18723
18807
  var MAX_LOCAL_VM_MAX_INSTANCES = 8;
18808
+ var MIN_LOCAL_VM_IDLE_TIMEOUT_MINUTES = 5;
18809
+ var MAX_LOCAL_VM_IDLE_TIMEOUT_MINUTES = 1440;
18724
18810
  function isValidSshAlias(value) {
18725
18811
  return typeof value === "string" && SSH_ALIAS.test(value);
18726
18812
  }
@@ -18758,7 +18844,8 @@ var roomConfigSchema = external_exports.object({
18758
18844
  );
18759
18845
  var localVmConfigSchema = external_exports.object({
18760
18846
  mode: external_exports.enum(["shared", "per-bot", "pool"]).optional(),
18761
- maxInstances: external_exports.number().int().min(MIN_LOCAL_VM_MAX_INSTANCES).max(MAX_LOCAL_VM_MAX_INSTANCES).optional()
18847
+ maxInstances: external_exports.number().int().min(MIN_LOCAL_VM_MAX_INSTANCES).max(MAX_LOCAL_VM_MAX_INSTANCES).optional(),
18848
+ idleTimeoutMinutes: external_exports.number().int().min(MIN_LOCAL_VM_IDLE_TIMEOUT_MINUTES).max(MAX_LOCAL_VM_IDLE_TIMEOUT_MINUTES).optional()
18762
18849
  });
18763
18850
  var browserProfileSchema = external_exports.object({
18764
18851
  // "guest" is the throwaway session's reserved id, never a saved profile
@@ -18917,7 +19004,11 @@ var onboardingConfigSchema = external_exports.object({
18917
19004
  /** Which welcome flow was completed; a newer flow may re-show itself. */
18918
19005
  version: external_exports.number().int().min(0).max(1e3).optional(),
18919
19006
  reelSeen: external_exports.boolean().optional(),
18920
- hintsSeen: external_exports.array(external_exports.string().trim().min(1).max(60)).max(100).optional()
19007
+ hintsSeen: external_exports.array(external_exports.string().trim().min(1).max(60)).max(100).optional(),
19008
+ /** OMB Cloud home only: when a bot's turn first finished on this machine
19009
+ * (cloud-home.ts firstCloudTurnPatch). Written by the server, read by the
19010
+ * Cloud's setup checklist. */
19011
+ firstTurnAt: external_exports.string().trim().max(40).optional()
18921
19012
  }).strict();
18922
19013
  var instanceConfigSchema = external_exports.object({
18923
19014
  driver: external_exports.string().min(1),
@@ -18929,6 +19020,7 @@ var instanceConfigSchema = external_exports.object({
18929
19020
  ]).optional(),
18930
19021
  environment: external_exports.record(external_exports.string(), external_exports.string()).optional(),
18931
19022
  enabled: external_exports.boolean().optional(),
19023
+ access: external_exports.enum(["subscription", "custom", "api"]).optional(),
18932
19024
  config: external_exports.json().optional()
18933
19025
  });
18934
19026
  var instanceConfigMapSchema = external_exports.record(external_exports.string(), instanceConfigSchema);
@@ -18990,7 +19082,12 @@ var appConfigSchema = external_exports.object({
18990
19082
  /** Anthropic API key for Claude Code billed per token, handed only to
18991
19083
  * Claude instances; `url` only for a proxy or a test double. Never a
18992
19084
  * personal-login OAuth token. */
18993
- anthropic: external_exports.object({ key: optionalText, url: optionalText }).optional(),
19085
+ anthropic: external_exports.object({ key: optionalText, url: optionalText, everyClaudeBot: external_exports.boolean().optional() }).optional(),
19086
+ /** OpenAI's own API key, for the `openai` instance only. Codex keeps its
19087
+ * own ChatGPT or API login and never reads this. */
19088
+ openai: external_exports.object({ key: optionalText }).optional(),
19089
+ /** OpenRouter key, for the `openrouter` instance only. */
19090
+ openrouter: external_exports.object({ key: optionalText }).optional(),
18994
19091
  /** Monthly spend limit for the whole workspace, against the cost engines
18995
19092
  * report to the usage ledger. Enforced only with the `budgets` entitlement. */
18996
19093
  budgets: external_exports.object({
@@ -19024,8 +19121,8 @@ var appConfigSchema = external_exports.object({
19024
19121
  opencodeGo: external_exports.object({ apiKey: optionalText }).optional(),
19025
19122
  /** Voice settings and the selected voice id. `provider` picks the
19026
19123
  * engine: "elevenlabs" (default; needs `key`), "fish" (needs its own
19027
- * `fishKey`), "system" (the Mac's built-in voices, no key), or
19028
- * "xai" (Grok TTS, reusing `xai.key`), or
19124
+ * `fishKey`; `fishModel` picks its speech model), "system" (the Mac's
19125
+ * built-in voices, no key), "xai" (Grok TTS, reusing `xai.key`), or
19029
19126
  * "chatterbox" (a local OpenAI-compatible Chatterbox server; `baseUrl`
19030
19127
  * and `model` are settings, not secrets). Cloud keys stay separate so
19031
19128
  * switching providers never overwrites or misuses the other key. */
@@ -19035,7 +19132,21 @@ var appConfigSchema = external_exports.object({
19035
19132
  voice: optionalText,
19036
19133
  provider: external_exports.enum(["elevenlabs", "fish", "system", "chatterbox", "xai"]).optional(),
19037
19134
  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(),
19038
- model: optionalText
19135
+ model: optionalText,
19136
+ fishModel: external_exports.enum(FISH_TTS_MODELS).optional()
19137
+ }).optional(),
19138
+ /** The decision model (server/decider): a fast classifier that picks
19139
+ * things for bots, starting with who answers a room message. `key` is
19140
+ * write-only like every credential; `baseUrl` points at a Jev-compatible
19141
+ * server instead of TypeSafe's (an operator setting with no UI); `jobs`
19142
+ * switches each decision on or off. Not `decisions`: that section is the
19143
+ * authorization log's retention. */
19144
+ decider: external_exports.object({
19145
+ enabled: external_exports.boolean().optional(),
19146
+ provider: external_exports.enum(["jev", "off"]).optional(),
19147
+ key: optionalText,
19148
+ 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(),
19149
+ jobs: external_exports.object({ roomRouting: external_exports.boolean().optional() }).optional()
19039
19150
  }).optional(),
19040
19151
  /** Avatar provider credentials stay separate; choosing a router never reuses a cloud key. */
19041
19152
  imageGen: external_exports.object({
@@ -19111,10 +19222,38 @@ function parseStoredConfig(value) {
19111
19222
  return parsed.data;
19112
19223
  }
19113
19224
  var DEFAULT_CAPTURE_QUIET_MS = 2 * 6e4;
19114
- var DATA_DIR = process.env.OMB_DATA_DIR ?? join(homedir(), ".openmausbot");
19115
- var LEGACY_DATA_DIR = join(homedir(), ".opengrokbot");
19116
- var EVENTS_DIR = join(DATA_DIR, "events");
19117
- var NATIVE_DIR = join(DATA_DIR, "native");
19225
+ var DATA_DIR = process.env.OMB_DATA_DIR ?? join2(homedir(), ".openmausbot");
19226
+ var LEGACY_DATA_DIR = join2(homedir(), ".opengrokbot");
19227
+ var EVENTS_DIR = join2(DATA_DIR, "events");
19228
+ var NATIVE_DIR = join2(DATA_DIR, "native");
19229
+ var OPENAI_API_INSTANCE = "openai";
19230
+ var OPENROUTER_API_INSTANCE = "openrouter";
19231
+ var XAI_API_INSTANCE = "xaiApi";
19232
+ var CLAUDE_API_INSTANCE = "claudeApi";
19233
+ var API_KEY_FLEET = {
19234
+ [OPENAI_API_INSTANCE]: {
19235
+ driver: "openai-compat",
19236
+ displayName: "OpenAI",
19237
+ access: "api",
19238
+ icon: { kind: "preset", preset: "openai" },
19239
+ config: { url: "https://api.openai.com/v1", apiKeyEnv: "OMB_OPENAI_API_KEY", catalog: "openai" }
19240
+ },
19241
+ [CLAUDE_API_INSTANCE]: {
19242
+ driver: "claudeAgent",
19243
+ displayName: "Claude (API key)",
19244
+ access: "api",
19245
+ icon: { kind: "preset", preset: "anthropic" },
19246
+ config: { requireApiKey: true }
19247
+ },
19248
+ [XAI_API_INSTANCE]: { driver: "grok", displayName: "xAI", access: "api", icon: { kind: "preset", preset: "xai" } },
19249
+ [OPENROUTER_API_INSTANCE]: {
19250
+ driver: "openai-compat",
19251
+ displayName: "OpenRouter",
19252
+ access: "api",
19253
+ icon: { kind: "preset", preset: "openrouter" },
19254
+ config: { url: "https://openrouter.ai/api/v1", apiKeyEnv: "OMB_OPENROUTER_API_KEY" }
19255
+ }
19256
+ };
19118
19257
 
19119
19258
  // server/workspace-backup-policy.ts
19120
19259
  var PORTABLE_CONFIG_KEYS = [
@@ -19135,13 +19274,14 @@ function portableWorkspaceConfig(value) {
19135
19274
  }
19136
19275
  function excludedWorkspaceAuthPath(path) {
19137
19276
  if (/^command-allowlist\.json(?:$|\.\d+\.[0-9a-f-]+\.tmp$)/.test(path)) return true;
19277
+ if (/^mcp-oauth\.json(?:$|\.\d+\.[0-9a-f-]+\.tmp$)/.test(path)) return true;
19138
19278
  return /^(?:(?:providers|caddy|chrome-profile|\.agent-browser)(?:\/|$)|workspace-credentials\.json$|external-runtimes\.json$|browser-engine-key$)/.test(path) || /^(?:config\.json|webhooks\.json|workspace-credentials\.json|external-runtimes\.json|browser-engine-key|sessions\.json|tunnel-account\.json)\.\d+(?:\.[0-9a-f-]+)?\.tmp$/.test(path) || /^(?:vm-home|vm-homes\/[^/]+)\/\.browser-profiles(?:\/|$)/.test(path);
19139
19279
  }
19140
19280
  function redownloadedOrgLibraryPath(path) {
19141
19281
  return /^org-library\/(?:catalog\.json(?:\.[0-9a-f-]{36}\.tmp)?$|blobs(?:\/|$))/.test(path);
19142
19282
  }
19143
19283
  function ephemeralWorkspaceTokenPath(path) {
19144
- return /^hook-tokens(?:\/|$)/.test(path);
19284
+ return /^(?:hook-tokens(?:\/|$)|sessions\.json\.open$)/.test(path);
19145
19285
  }
19146
19286
 
19147
19287
  // server/workspace-backup.ts
@@ -19169,7 +19309,13 @@ var EXCLUDED = /* @__PURE__ */ new Set([
19169
19309
  "openmausbot-server.lease",
19170
19310
  "box-create-requests.lock",
19171
19311
  "messages.db-wal",
19172
- "messages.db-shm"
19312
+ "messages.db-shm",
19313
+ // This machine's decision-model log (server/decider/log.ts): local
19314
+ // measurement of what the classifier picked, not workspace data.
19315
+ "decider-log",
19316
+ // A Cloud home's record of who its owner was (server/cloud-owner.ts): this
19317
+ // machine's own, kept in place by a restore, which settles what it brought.
19318
+ "cloud-owner.json"
19173
19319
  ]);
19174
19320
  var EXCLUSION_NOTES = [
19175
19321
  "Device pairing, server identity, live leases and runtime files (existing destination identities are preserved).",
@@ -19197,13 +19343,13 @@ function backupRoot(dataDir2) {
19197
19343
  if (root === parse3(root).root) throw new Error("A filesystem root cannot be a workspace backup target.");
19198
19344
  const stat = lstatSync(root);
19199
19345
  if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("The workspace data directory must not be a symbolic link.");
19200
- const path = join2(root, ".backups");
19346
+ const path = join3(root, ".backups");
19201
19347
  folder(path);
19202
19348
  return path;
19203
19349
  }
19204
19350
  function jobPath(dataDir2, id) {
19205
19351
  if (!ID.test(id)) throw new Error("Invalid workspace backup identifier.");
19206
- const path = join2(backupRoot(dataDir2), id);
19352
+ const path = join3(backupRoot(dataDir2), id);
19207
19353
  if (entryExists(path)) {
19208
19354
  const stat = lstatSync(path);
19209
19355
  if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("Unsafe workspace backup job directory.");
@@ -19246,14 +19392,14 @@ function writeJson(path, value) {
19246
19392
  writeFileAtomic(path, text, { mode: 384 });
19247
19393
  }
19248
19394
  function assertLocalAuthOutsideSnapshot(dataDir2) {
19249
- const configPath = join2(dataDir2, "config.json");
19250
- const config2 = existsSync(configPath) ? privateJson(configPath) : {};
19395
+ const configPath = join3(dataDir2, "config.json");
19396
+ const config2 = existsSync2(configPath) ? privateJson(configPath) : {};
19251
19397
  const instances = record2(config2) && record2(config2.instances) ? config2.instances : {};
19252
19398
  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"];
19253
19399
  const check2 = (value, field, home) => {
19254
19400
  if (typeof value !== "string" || !value.trim()) return;
19255
19401
  const text = value.trim();
19256
- const expanded = text.startsWith("~/") || text.startsWith("~\\") ? join2(home, text.slice(2)) : text;
19402
+ const expanded = text.startsWith("~/") || text.startsWith("~\\") ? join3(home, text.slice(2)) : text;
19257
19403
  const resolved = resolve(expanded);
19258
19404
  const exists = entryExists(resolved);
19259
19405
  const path = relative(exists ? realpathSync(dataDir2) : resolve(dataDir2), exists ? realpathSync(resolved) : resolved).replaceAll("\\", "/");
@@ -19331,7 +19477,7 @@ function hashFile(path) {
19331
19477
  }
19332
19478
  }
19333
19479
  function countJsonArray(path) {
19334
- if (!existsSync(path)) return 0;
19480
+ if (!existsSync2(path)) return 0;
19335
19481
  const value = privateJson(path);
19336
19482
  if (!Array.isArray(value)) throw new Error("A workspace roster is not a valid JSON array.");
19337
19483
  const ids = /* @__PURE__ */ new Set();
@@ -19344,7 +19490,7 @@ function countJsonArray(path) {
19344
19490
  return value.length;
19345
19491
  }
19346
19492
  function databaseCounts(path) {
19347
- if (!existsSync(path)) return { threads: 0, messages: 0 };
19493
+ if (!existsSync2(path)) return { threads: 0, messages: 0 };
19348
19494
  const db = new DatabaseSync(path, { readOnly: true });
19349
19495
  try {
19350
19496
  const check2 = db.prepare("PRAGMA quick_check").all();
@@ -19363,27 +19509,27 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19363
19509
  const salt = randomBytes(16);
19364
19510
  const key = await passwordKey(options2.password, salt);
19365
19511
  const job = newJob(dataDir2, jobId2);
19366
- const snapshot = join2(job.directory, "snapshot");
19367
- folder(join2(snapshot, "data"));
19512
+ const snapshot = join3(job.directory, "snapshot");
19513
+ folder(join3(snapshot, "data"));
19368
19514
  const entries = [];
19369
19515
  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];
19370
19516
  let bytes = 0;
19371
19517
  let skippedLinks = 0;
19372
19518
  try {
19373
19519
  const root = realpathSync(dataDir2);
19374
- const sourceDb = join2(root, "messages.db");
19375
- if (existsSync(sourceDb)) {
19520
+ const sourceDb = join3(root, "messages.db");
19521
+ if (existsSync2(sourceDb)) {
19376
19522
  if (lstatSync(sourceDb).isSymbolicLink()) throw new Error("The message database must not be a symbolic link.");
19377
19523
  const db = new DatabaseSync(sourceDb, { readOnly: true });
19378
19524
  const completionPulse = setInterval(() => {
19379
19525
  }, 25);
19380
19526
  try {
19381
- await backup(db, join2(snapshot, "messages-snapshot.db"));
19527
+ await backup(db, join3(snapshot, "messages-snapshot.db"));
19382
19528
  } finally {
19383
19529
  clearInterval(completionPulse);
19384
19530
  db.close();
19385
19531
  }
19386
- const snapshotDb = new DatabaseSync(join2(snapshot, "messages-snapshot.db"));
19532
+ const snapshotDb = new DatabaseSync(join3(snapshot, "messages-snapshot.db"));
19387
19533
  try {
19388
19534
  snapshotDb.exec("PRAGMA journal_mode = DELETE");
19389
19535
  } finally {
@@ -19397,7 +19543,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19397
19543
  if (excludedWorkspaceAuthPath(path2) || ephemeralWorkspaceTokenPath(path2) || redownloadedOrgLibraryPath(path2)) continue;
19398
19544
  if (forbiddenArchivePath(path2)) throw new Error("A workspace filename conflicts with a protected authentication or runtime path.");
19399
19545
  if (!validRelative(path2)) throw new Error("A workspace filename cannot be safely restored on supported platforms.");
19400
- const source = join2(directory, name);
19546
+ const source = join3(directory, name);
19401
19547
  const stat = lstatSync(source);
19402
19548
  if (stat.isSymbolicLink()) {
19403
19549
  let target;
@@ -19417,7 +19563,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19417
19563
  continue;
19418
19564
  }
19419
19565
  if (entries.length >= MAX_WORKSPACE_BACKUP_FILES) throw new Error("The workspace exceeds the 100,000-entry backup limit.");
19420
- const destination = join2(snapshot, "data", path2);
19566
+ const destination = join3(snapshot, "data", path2);
19421
19567
  if (stat.isDirectory()) {
19422
19568
  folder(destination);
19423
19569
  entries.push({ path: path2, type: "directory", size: 0, mode: 448 });
@@ -19435,7 +19581,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19435
19581
  writeJson(destination, value);
19436
19582
  }
19437
19583
  copied = { size: lstatSync(destination).size, mode: 384, sha256: hashFile(destination) };
19438
- } else copied = copyRegular(path2 === "messages.db" ? join2(snapshot, "messages-snapshot.db") : source, destination);
19584
+ } else copied = copyRegular(path2 === "messages.db" ? join3(snapshot, "messages-snapshot.db") : source, destination);
19439
19585
  bytes += copied.size;
19440
19586
  if (bytes > MAX_WORKSPACE_BACKUP_BYTES) throw new Error("The workspace exceeds the 10 GB backup limit.");
19441
19587
  entries.push({ path: path2, type: "file", ...copied });
@@ -19453,9 +19599,9 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19453
19599
  files: entries.filter((entry) => entry.type === "file").length,
19454
19600
  directories: entries.filter((entry) => entry.type === "directory").length,
19455
19601
  bytes,
19456
- bots: countJsonArray(join2(snapshot, "data", "bots.json")),
19457
- groups: countJsonArray(join2(snapshot, "data", "groups.json")),
19458
- ...databaseCounts(join2(snapshot, "data", "messages.db")),
19602
+ bots: countJsonArray(join3(snapshot, "data", "bots.json")),
19603
+ groups: countJsonArray(join3(snapshot, "data", "groups.json")),
19604
+ ...databaseCounts(join3(snapshot, "data", "messages.db")),
19459
19605
  exclusions: EXCLUSION_NOTES,
19460
19606
  warnings
19461
19607
  };
@@ -19465,9 +19611,9 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19465
19611
  clientState: options2.clientState ?? {},
19466
19612
  entries
19467
19613
  };
19468
- writeJson(join2(snapshot, "manifest.json"), manifest);
19469
- validateManifest(privateJson(join2(snapshot, "manifest.json")));
19470
- const path = join2(job.directory, "workspace.ombbackup");
19614
+ writeJson(join3(snapshot, "manifest.json"), manifest);
19615
+ validateManifest(privateJson(join3(snapshot, "manifest.json")));
19616
+ const path = join3(job.directory, "workspace.ombbackup");
19471
19617
  const iv = randomBytes(12);
19472
19618
  const header = Buffer.concat([MAGIC, salt, iv]);
19473
19619
  const cipher = createCipheriv("aes-256-gcm", key, iv);
@@ -14728,7 +14728,11 @@ var sessionSchema = external_exports.object({
14728
14728
  userId: external_exports.string().max(256).optional(),
14729
14729
  email: external_exports.string().max(320).optional(),
14730
14730
  /** Set only by the internal verified-portal issuance path, never by email or pairing input. */
14731
- membershipAuthority: external_exports.literal("portal").optional()
14731
+ membershipAuthority: external_exports.literal("portal").optional(),
14732
+ /** A browser sign-in (PairingCode `browser`): accepted only as its browser's cookie, never as a bearer token. */
14733
+ cookieOnly: external_exports.literal(true).optional(),
14734
+ /** Whose OMB Cloud a browser sign-in signed in to (its PairingCode `owner`). */
14735
+ owner: external_exports.string().max(254).optional()
14732
14736
  });
14733
14737
  var fileSchema = external_exports.object({ version: external_exports.literal(1), sessions: external_exports.array(sessionSchema) });
14734
14738
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openmausbot",
3
- "version": "0.1.90",
3
+ "version": "0.1.92",
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-Dc4OePBL.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};