openmausbot 0.1.90 → 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 (112) hide show
  1. package/dist/assets/{abnfDiagram-O67JEVCF-DUyXd0kL.js → abnfDiagram-O67JEVCF-yP-w8pRq.js} +1 -1
  2. package/dist/assets/{arc-q73qM-At.js → arc-DsivfZEh.js} +1 -1
  3. package/dist/assets/{architectureDiagram-NJMV4G6O-D33O3Wur.js → architectureDiagram-NJMV4G6O-CILw7lzT.js} +1 -1
  4. package/dist/assets/{blockDiagram-BEXU5L5S-DLsJeoXC.js → blockDiagram-BEXU5L5S-DEQUV3HF.js} +1 -1
  5. package/dist/assets/{c4Diagram-YGBWAQC7-DnaljZnu.js → c4Diagram-YGBWAQC7-lSXCZoKA.js} +1 -1
  6. package/dist/assets/channel-DrfGMu7X.js +1 -0
  7. package/dist/assets/{chunk-2Q5K7J3B-Da0h2i79.js → chunk-2Q5K7J3B-QCD5bgWP.js} +1 -1
  8. package/dist/assets/{chunk-3FUC2YCW-CfzHi54f.js → chunk-3FUC2YCW-C5-iZJuL.js} +2 -2
  9. package/dist/assets/{chunk-5VM5RSS4-LjE4d9Jf.js → chunk-5VM5RSS4-cxsawMpY.js} +1 -1
  10. package/dist/assets/{chunk-GTNCS2PH-DY-UGmvc.js → chunk-GTNCS2PH-DV8tV8H7.js} +1 -1
  11. package/dist/assets/{chunk-GWA4HPMP-BqeGhyhP.js → chunk-GWA4HPMP-CJFZyfbW.js} +1 -1
  12. package/dist/assets/{chunk-JWPE2WC7-BYa9EBAg.js → chunk-JWPE2WC7-BigbMXco.js} +1 -1
  13. package/dist/assets/{chunk-NETBCI7D-vTrDtWyb.js → chunk-NETBCI7D-oVxTfpDy.js} +1 -1
  14. package/dist/assets/{chunk-WEXAMYUT-ic5tXadM.js → chunk-WEXAMYUT-CH4BiroW.js} +1 -1
  15. package/dist/assets/{chunk-XXDRQBXY-DvRCY-c6.js → chunk-XXDRQBXY-KEDa6gax.js} +1 -1
  16. package/dist/assets/{classDiagram-v2-NBCMYWYE-DVbmgz_L.js → classDiagram-v2-NBCMYWYE-BiPjfqVv.js} +1 -1
  17. package/dist/assets/{cose-bilkent-JH36ORCC-vdUs2n57.js → cose-bilkent-JH36ORCC-Caxew3OY.js} +1 -1
  18. package/dist/assets/{cynefin-OW5HDTMX-BvLGlV3U.js → cynefin-OW5HDTMX-B_Pui369.js} +1 -1
  19. package/dist/assets/{cynefinDiagram-VND7K2PF-C4GcJQDt.js → cynefinDiagram-VND7K2PF-X64ydIhP.js} +1 -1
  20. package/dist/assets/{dagre-6A5THRUB-BMSaHpt_.js → dagre-6A5THRUB-TqYCI1E1.js} +1 -1
  21. package/dist/assets/{diagram-22UHCM2B-D5b9UBhC.js → diagram-22UHCM2B-TeOt3rAQ.js} +1 -1
  22. package/dist/assets/{diagram-3UASUU5V-CIKLlB7Y.js → diagram-3UASUU5V-D70BLhDA.js} +1 -1
  23. package/dist/assets/{diagram-ATOU4E4O-BzXb-7k7.js → diagram-ATOU4E4O-BbQDLwUC.js} +1 -1
  24. package/dist/assets/{diagram-CDSNMT55-HsTvJ7uT.js → diagram-CDSNMT55-ChNJZ1u-.js} +1 -1
  25. package/dist/assets/{diagram-MLGK6HIB-Db9ySNbQ.js → diagram-MLGK6HIB-DMBl2APa.js} +1 -1
  26. package/dist/assets/{diagram-MPIPVDR6-D6BKbpqY.js → diagram-MPIPVDR6-CEqDchOp.js} +1 -1
  27. package/dist/assets/{ebnfDiagram-ZINNZB2B-Bq067L0t.js → ebnfDiagram-ZINNZB2B-BVDKRp_-.js} +1 -1
  28. package/dist/assets/{elk-276RUBZZ-DhaD7fNJ.js → elk-276RUBZZ-CRkofO9B.js} +1 -1
  29. package/dist/assets/{erDiagram-OPXOYQCR-fwIhfz36.js → erDiagram-OPXOYQCR-DruOMh5e.js} +1 -1
  30. package/dist/assets/{flowDiagram-KWPJA3E3-DygIyu0V.js → flowDiagram-KWPJA3E3-8GMQeB7t.js} +1 -1
  31. package/dist/assets/{ganttDiagram-FUAMR5RP-DPYfSO96.js → ganttDiagram-FUAMR5RP-ORE9jcsM.js} +1 -1
  32. package/dist/assets/{gitGraphDiagram-X574FWY7-DhkHeCle.js → gitGraphDiagram-X574FWY7-BmsedsWh.js} +1 -1
  33. package/dist/assets/index-BlnCEcU6.js +588 -0
  34. package/dist/assets/{index-G1PHKGyh.js → index-DKNEM8Q6.js} +1 -1
  35. package/dist/assets/index-DVxjOvID.css +1 -0
  36. package/dist/assets/{infoDiagram-VRGFBTTK-DstBLxME.js → infoDiagram-VRGFBTTK-E_p7AooJ.js} +1 -1
  37. package/dist/assets/{ishikawaDiagram-OU5B5YK6-CrIsGgch.js → ishikawaDiagram-OU5B5YK6-Y-B2mKda.js} +1 -1
  38. package/dist/assets/{journeyDiagram-ZHPQQLJL-CYypGDbB.js → journeyDiagram-ZHPQQLJL-eA8RELcK.js} +1 -1
  39. package/dist/assets/{kanban-definition-PNTS6WVX-DGjPt8E_.js → kanban-definition-PNTS6WVX-DqIL2e8e.js} +1 -1
  40. package/dist/assets/{linear-Dwc3Hrru.js → linear-yC_29R6e.js} +1 -1
  41. package/dist/assets/{mermaid.core-Dc4OePBL.js → mermaid.core-VhEMkSND.js} +5 -5
  42. package/dist/assets/{mindmap-definition-NLK3R4M7-DV-vepj-.js → mindmap-definition-NLK3R4M7-oJ7kyQZy.js} +1 -1
  43. package/dist/assets/{pegDiagram-GJSIUBJH-lx5Kj-n5.js → pegDiagram-GJSIUBJH-BmfYcY0O.js} +1 -1
  44. package/dist/assets/{pieDiagram-5QR66LMP-Bq7Vmm15.js → pieDiagram-5QR66LMP-DKvgP7w9.js} +1 -1
  45. package/dist/assets/{quadrantDiagram-O4NWA36T-DeqeqOBj.js → quadrantDiagram-O4NWA36T-BEKL3W0L.js} +1 -1
  46. package/dist/assets/{railroadDiagram-XR7U4H2S-CXwRQzSC.js → railroadDiagram-XR7U4H2S-BEsiqR5s.js} +1 -1
  47. package/dist/assets/{requirementDiagram-PLB6GJNP-8tAeoB88.js → requirementDiagram-PLB6GJNP-DWBcWvAP.js} +1 -1
  48. package/dist/assets/{sankeyDiagram-IPEJSGJF-BG5zjGWU.js → sankeyDiagram-IPEJSGJF-rpZ2_O4s.js} +1 -1
  49. package/dist/assets/{sequenceDiagram-PO4LG4MO-DKF3iLcw.js → sequenceDiagram-PO4LG4MO-B99HQdJR.js} +1 -1
  50. package/dist/assets/{sizeCapture-INFHLROL-B-y1qUgT.js → sizeCapture-INFHLROL-BjN0qT5T.js} +1 -1
  51. package/dist/assets/{stateDiagram-v2-GCMORJYK-MkzPgxAc.js → stateDiagram-v2-GCMORJYK-BbsVgGsC.js} +1 -1
  52. package/dist/assets/{swimlanes-2SLR337P-DnbaOEwH.js → swimlanes-2SLR337P-DG3gKkeR.js} +1 -1
  53. package/dist/assets/swimlanesDiagram-TC7HE7FX-BCZhxl7e.js +8 -0
  54. package/dist/assets/{timeline-definition-EJHVYXUP-Bb4xG_Bt.js → timeline-definition-EJHVYXUP-BTHOdtF_.js} +1 -1
  55. package/dist/assets/{usecaseDiagram-POWQR4AR-JgkR9pFf.js → usecaseDiagram-POWQR4AR-acLSLFwc.js} +1 -1
  56. package/dist/assets/{vennDiagram-UO4OBE2U-CIPIrAYe.js → vennDiagram-UO4OBE2U-C5JzNX9G.js} +1 -1
  57. package/dist/assets/{wardleyDiagram-VNRHLVJA-BjCLuUvJ.js → wardleyDiagram-VNRHLVJA-DL1-PrR_.js} +1 -1
  58. package/dist/assets/{xychartDiagram-PMCCYNJV-DKgiaYxT.js → xychartDiagram-PMCCYNJV-Bvr1477p.js} +1 -1
  59. package/dist/index.html +2 -2
  60. package/dist-server/cloud-home-start.js +18 -3
  61. package/dist-server/container-mcp.js +84 -32
  62. package/dist-server/drivers/agents-proxy.js +11 -0
  63. package/dist-server/index.js +25183 -23580
  64. package/dist-server/openmausbot.js +313 -159
  65. package/dist-server/pair-cli.js +313 -159
  66. package/dist-server/server/boat.js +66 -21
  67. package/dist-server/server/bot-overview.js +7 -4
  68. package/dist-server/server/cloud-home-start.js +23 -5
  69. package/dist-server/server/cloud-home.js +25 -2
  70. package/dist-server/server/cloud-lending.js +103 -0
  71. package/dist-server/server/cloud-move-http.js +268 -0
  72. package/dist-server/server/cloud-move.js +418 -0
  73. package/dist-server/server/config.js +42 -4
  74. package/dist-server/server/decider/index.js +238 -0
  75. package/dist-server/server/decider/jev.js +183 -0
  76. package/dist-server/server/decider/log.js +62 -0
  77. package/dist-server/server/decider/relay.js +52 -0
  78. package/dist-server/server/decider/room-routing.js +88 -0
  79. package/dist-server/server/decider/types.js +5 -0
  80. package/dist-server/server/drivers/agents-catalog.js +16 -0
  81. package/dist-server/server/drivers/boatagent.js +20 -12
  82. package/dist-server/server/drivers/claude.js +1 -0
  83. package/dist-server/server/group-goal-run.js +6 -4
  84. package/dist-server/server/harness-capabilities.js +2 -0
  85. package/dist-server/server/included-services.js +70 -0
  86. package/dist-server/server/index.js +438 -102
  87. package/dist-server/server/model-context-window.js +4 -4
  88. package/dist-server/server/package-export.js +17 -10
  89. package/dist-server/server/package-import.js +6 -3
  90. package/dist-server/server/package-parts.js +3 -1
  91. package/dist-server/server/request-auth.js +2 -0
  92. package/dist-server/server/routes/decider.js +19 -0
  93. package/dist-server/server/shared-computers.js +116 -30
  94. package/dist-server/server/store.js +17 -2
  95. package/dist-server/server/surface.js +13 -0
  96. package/dist-server/server/system-prompt.js +11 -0
  97. package/dist-server/server/team-backup.js +6 -2
  98. package/dist-server/server/team-manifest.js +11 -3
  99. package/dist-server/server/tts/elevenlabs.js +11 -6
  100. package/dist-server/server/tts/index.js +17 -10
  101. package/dist-server/server/workspace-backup-policy.js +22 -3
  102. package/dist-server/server/workspace-backup.js +25 -8
  103. package/dist-server/shared/cloud-home.js +4 -0
  104. package/dist-server/shared/package-format.js +30 -4
  105. package/dist-server/shared/team-backup.js +20 -3
  106. package/dist-server/vps-container-mcp.js +84 -32
  107. package/dist-server/workspace-backup.worker.js +113 -31
  108. package/package.json +1 -1
  109. package/dist/assets/channel-BCuyHjFV.js +0 -1
  110. package/dist/assets/index-CRvo-DS2.css +0 -1
  111. package/dist/assets/index-CWYGlA63.js +0 -588
  112. 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";
@@ -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 = {};
@@ -18706,6 +18706,72 @@ function schemaIssue(error51, fallback) {
18706
18706
  var CLOUD_SEAT_IDLE_STOP_MS = 5 * 6e4;
18707
18707
  var CLOUD_SEAT_SLEEP_RETRY_MAX_MS = 10 * 6e4;
18708
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
+
18709
18775
  // server/config.ts
18710
18776
  var optionalText = external_exports.string().optional();
18711
18777
  var SSH_ALIAS = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
@@ -19037,6 +19103,19 @@ var appConfigSchema = external_exports.object({
19037
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(),
19038
19104
  model: optionalText
19039
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(),
19040
19119
  /** Avatar provider credentials stay separate; choosing a router never reuses a cloud key. */
19041
19120
  imageGen: external_exports.object({
19042
19121
  provider: external_exports.enum(["openai", "xai", "custom"]).optional(),
@@ -19111,10 +19190,10 @@ function parseStoredConfig(value) {
19111
19190
  return parsed.data;
19112
19191
  }
19113
19192
  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");
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");
19118
19197
 
19119
19198
  // server/workspace-backup-policy.ts
19120
19199
  var PORTABLE_CONFIG_KEYS = [
@@ -19141,7 +19220,7 @@ function redownloadedOrgLibraryPath(path) {
19141
19220
  return /^org-library\/(?:catalog\.json(?:\.[0-9a-f-]{36}\.tmp)?$|blobs(?:\/|$))/.test(path);
19142
19221
  }
19143
19222
  function ephemeralWorkspaceTokenPath(path) {
19144
- return /^hook-tokens(?:\/|$)/.test(path);
19223
+ return /^(?:hook-tokens(?:\/|$)|sessions\.json\.open$)/.test(path);
19145
19224
  }
19146
19225
 
19147
19226
  // server/workspace-backup.ts
@@ -19169,7 +19248,10 @@ var EXCLUDED = /* @__PURE__ */ new Set([
19169
19248
  "openmausbot-server.lease",
19170
19249
  "box-create-requests.lock",
19171
19250
  "messages.db-wal",
19172
- "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"
19173
19255
  ]);
19174
19256
  var EXCLUSION_NOTES = [
19175
19257
  "Device pairing, server identity, live leases and runtime files (existing destination identities are preserved).",
@@ -19197,13 +19279,13 @@ function backupRoot(dataDir2) {
19197
19279
  if (root === parse3(root).root) throw new Error("A filesystem root cannot be a workspace backup target.");
19198
19280
  const stat = lstatSync(root);
19199
19281
  if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("The workspace data directory must not be a symbolic link.");
19200
- const path = join2(root, ".backups");
19282
+ const path = join3(root, ".backups");
19201
19283
  folder(path);
19202
19284
  return path;
19203
19285
  }
19204
19286
  function jobPath(dataDir2, id) {
19205
19287
  if (!ID.test(id)) throw new Error("Invalid workspace backup identifier.");
19206
- const path = join2(backupRoot(dataDir2), id);
19288
+ const path = join3(backupRoot(dataDir2), id);
19207
19289
  if (entryExists(path)) {
19208
19290
  const stat = lstatSync(path);
19209
19291
  if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("Unsafe workspace backup job directory.");
@@ -19246,14 +19328,14 @@ function writeJson(path, value) {
19246
19328
  writeFileAtomic(path, text, { mode: 384 });
19247
19329
  }
19248
19330
  function assertLocalAuthOutsideSnapshot(dataDir2) {
19249
- const configPath = join2(dataDir2, "config.json");
19250
- const config2 = existsSync(configPath) ? privateJson(configPath) : {};
19331
+ const configPath = join3(dataDir2, "config.json");
19332
+ const config2 = existsSync2(configPath) ? privateJson(configPath) : {};
19251
19333
  const instances = record2(config2) && record2(config2.instances) ? config2.instances : {};
19252
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"];
19253
19335
  const check2 = (value, field, home) => {
19254
19336
  if (typeof value !== "string" || !value.trim()) return;
19255
19337
  const text = value.trim();
19256
- 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;
19257
19339
  const resolved = resolve(expanded);
19258
19340
  const exists = entryExists(resolved);
19259
19341
  const path = relative(exists ? realpathSync(dataDir2) : resolve(dataDir2), exists ? realpathSync(resolved) : resolved).replaceAll("\\", "/");
@@ -19331,7 +19413,7 @@ function hashFile(path) {
19331
19413
  }
19332
19414
  }
19333
19415
  function countJsonArray(path) {
19334
- if (!existsSync(path)) return 0;
19416
+ if (!existsSync2(path)) return 0;
19335
19417
  const value = privateJson(path);
19336
19418
  if (!Array.isArray(value)) throw new Error("A workspace roster is not a valid JSON array.");
19337
19419
  const ids = /* @__PURE__ */ new Set();
@@ -19344,7 +19426,7 @@ function countJsonArray(path) {
19344
19426
  return value.length;
19345
19427
  }
19346
19428
  function databaseCounts(path) {
19347
- if (!existsSync(path)) return { threads: 0, messages: 0 };
19429
+ if (!existsSync2(path)) return { threads: 0, messages: 0 };
19348
19430
  const db = new DatabaseSync(path, { readOnly: true });
19349
19431
  try {
19350
19432
  const check2 = db.prepare("PRAGMA quick_check").all();
@@ -19363,27 +19445,27 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19363
19445
  const salt = randomBytes(16);
19364
19446
  const key = await passwordKey(options2.password, salt);
19365
19447
  const job = newJob(dataDir2, jobId2);
19366
- const snapshot = join2(job.directory, "snapshot");
19367
- folder(join2(snapshot, "data"));
19448
+ const snapshot = join3(job.directory, "snapshot");
19449
+ folder(join3(snapshot, "data"));
19368
19450
  const entries = [];
19369
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];
19370
19452
  let bytes = 0;
19371
19453
  let skippedLinks = 0;
19372
19454
  try {
19373
19455
  const root = realpathSync(dataDir2);
19374
- const sourceDb = join2(root, "messages.db");
19375
- if (existsSync(sourceDb)) {
19456
+ const sourceDb = join3(root, "messages.db");
19457
+ if (existsSync2(sourceDb)) {
19376
19458
  if (lstatSync(sourceDb).isSymbolicLink()) throw new Error("The message database must not be a symbolic link.");
19377
19459
  const db = new DatabaseSync(sourceDb, { readOnly: true });
19378
19460
  const completionPulse = setInterval(() => {
19379
19461
  }, 25);
19380
19462
  try {
19381
- await backup(db, join2(snapshot, "messages-snapshot.db"));
19463
+ await backup(db, join3(snapshot, "messages-snapshot.db"));
19382
19464
  } finally {
19383
19465
  clearInterval(completionPulse);
19384
19466
  db.close();
19385
19467
  }
19386
- const snapshotDb = new DatabaseSync(join2(snapshot, "messages-snapshot.db"));
19468
+ const snapshotDb = new DatabaseSync(join3(snapshot, "messages-snapshot.db"));
19387
19469
  try {
19388
19470
  snapshotDb.exec("PRAGMA journal_mode = DELETE");
19389
19471
  } finally {
@@ -19397,7 +19479,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19397
19479
  if (excludedWorkspaceAuthPath(path2) || ephemeralWorkspaceTokenPath(path2) || redownloadedOrgLibraryPath(path2)) continue;
19398
19480
  if (forbiddenArchivePath(path2)) throw new Error("A workspace filename conflicts with a protected authentication or runtime path.");
19399
19481
  if (!validRelative(path2)) throw new Error("A workspace filename cannot be safely restored on supported platforms.");
19400
- const source = join2(directory, name);
19482
+ const source = join3(directory, name);
19401
19483
  const stat = lstatSync(source);
19402
19484
  if (stat.isSymbolicLink()) {
19403
19485
  let target;
@@ -19417,7 +19499,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19417
19499
  continue;
19418
19500
  }
19419
19501
  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);
19502
+ const destination = join3(snapshot, "data", path2);
19421
19503
  if (stat.isDirectory()) {
19422
19504
  folder(destination);
19423
19505
  entries.push({ path: path2, type: "directory", size: 0, mode: 448 });
@@ -19435,7 +19517,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19435
19517
  writeJson(destination, value);
19436
19518
  }
19437
19519
  copied = { size: lstatSync(destination).size, mode: 384, sha256: hashFile(destination) };
19438
- } 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);
19439
19521
  bytes += copied.size;
19440
19522
  if (bytes > MAX_WORKSPACE_BACKUP_BYTES) throw new Error("The workspace exceeds the 10 GB backup limit.");
19441
19523
  entries.push({ path: path2, type: "file", ...copied });
@@ -19453,9 +19535,9 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19453
19535
  files: entries.filter((entry) => entry.type === "file").length,
19454
19536
  directories: entries.filter((entry) => entry.type === "directory").length,
19455
19537
  bytes,
19456
- bots: countJsonArray(join2(snapshot, "data", "bots.json")),
19457
- groups: countJsonArray(join2(snapshot, "data", "groups.json")),
19458
- ...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")),
19459
19541
  exclusions: EXCLUSION_NOTES,
19460
19542
  warnings
19461
19543
  };
@@ -19465,9 +19547,9 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
19465
19547
  clientState: options2.clientState ?? {},
19466
19548
  entries
19467
19549
  };
19468
- writeJson(join2(snapshot, "manifest.json"), manifest);
19469
- validateManifest(privateJson(join2(snapshot, "manifest.json")));
19470
- 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");
19471
19553
  const iv = randomBytes(12);
19472
19554
  const header = Buffer.concat([MAGIC, salt, iv]);
19473
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.90",
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-Dc4OePBL.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};