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.
- package/dist/assets/DesktopViewer-Do6lBa4C.js +5 -0
- package/dist/assets/{abnfDiagram-O67JEVCF-DUyXd0kL.js → abnfDiagram-O67JEVCF-Cd3X7Hxc.js} +1 -1
- package/dist/assets/{arc-q73qM-At.js → arc-DIYc7Ymx.js} +1 -1
- package/dist/assets/{architectureDiagram-NJMV4G6O-D33O3Wur.js → architectureDiagram-NJMV4G6O-DBmRGVyP.js} +1 -1
- package/dist/assets/{blockDiagram-BEXU5L5S-DLsJeoXC.js → blockDiagram-BEXU5L5S-CPFePSEE.js} +1 -1
- package/dist/assets/{c4Diagram-YGBWAQC7-DnaljZnu.js → c4Diagram-YGBWAQC7-DD_DO1qy.js} +1 -1
- package/dist/assets/channel-Dtk5Mtic.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-Da0h2i79.js → chunk-2Q5K7J3B-BNEeNSjX.js} +1 -1
- package/dist/assets/{chunk-3FUC2YCW-CfzHi54f.js → chunk-3FUC2YCW-BbinLaqH.js} +2 -2
- package/dist/assets/{chunk-5VM5RSS4-LjE4d9Jf.js → chunk-5VM5RSS4-BBgYrgDR.js} +1 -1
- package/dist/assets/{chunk-GTNCS2PH-DY-UGmvc.js → chunk-GTNCS2PH-ezXj-kA-.js} +1 -1
- package/dist/assets/{chunk-GWA4HPMP-BqeGhyhP.js → chunk-GWA4HPMP-9FxZ3diV.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-BYa9EBAg.js → chunk-JWPE2WC7-CO-40JpI.js} +1 -1
- package/dist/assets/{chunk-NETBCI7D-vTrDtWyb.js → chunk-NETBCI7D-BEhjslYE.js} +1 -1
- package/dist/assets/{chunk-WEXAMYUT-ic5tXadM.js → chunk-WEXAMYUT-CNeq4n7_.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-DvRCY-c6.js → chunk-XXDRQBXY-OsCY7KSi.js} +1 -1
- package/dist/assets/{classDiagram-v2-NBCMYWYE-DVbmgz_L.js → classDiagram-v2-NBCMYWYE-CloRUEtk.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-vdUs2n57.js → cose-bilkent-JH36ORCC-D1BGZhp4.js} +1 -1
- package/dist/assets/{cynefin-OW5HDTMX-BvLGlV3U.js → cynefin-OW5HDTMX-CUf4T2CN.js} +1 -1
- package/dist/assets/{cynefinDiagram-VND7K2PF-C4GcJQDt.js → cynefinDiagram-VND7K2PF-DPEZrFGA.js} +1 -1
- package/dist/assets/{dagre-6A5THRUB-BMSaHpt_.js → dagre-6A5THRUB-bDe6GIv5.js} +1 -1
- package/dist/assets/{diagram-22UHCM2B-D5b9UBhC.js → diagram-22UHCM2B-CdcUQz55.js} +1 -1
- package/dist/assets/{diagram-3UASUU5V-CIKLlB7Y.js → diagram-3UASUU5V-BZpqGg7c.js} +1 -1
- package/dist/assets/{diagram-ATOU4E4O-BzXb-7k7.js → diagram-ATOU4E4O-DvGM6ugp.js} +1 -1
- package/dist/assets/{diagram-CDSNMT55-HsTvJ7uT.js → diagram-CDSNMT55-DSTmMm0s.js} +1 -1
- package/dist/assets/{diagram-MLGK6HIB-Db9ySNbQ.js → diagram-MLGK6HIB-15cucnMn.js} +1 -1
- package/dist/assets/{diagram-MPIPVDR6-D6BKbpqY.js → diagram-MPIPVDR6-tMbuaE6n.js} +1 -1
- package/dist/assets/{ebnfDiagram-ZINNZB2B-Bq067L0t.js → ebnfDiagram-ZINNZB2B-BYxYzjHI.js} +1 -1
- package/dist/assets/{elk-276RUBZZ-DhaD7fNJ.js → elk-276RUBZZ-v6bj852W.js} +1 -1
- package/dist/assets/{erDiagram-OPXOYQCR-fwIhfz36.js → erDiagram-OPXOYQCR-5lBBlnd2.js} +1 -1
- package/dist/assets/{flowDiagram-KWPJA3E3-DygIyu0V.js → flowDiagram-KWPJA3E3-CZyl1zIj.js} +1 -1
- package/dist/assets/{ganttDiagram-FUAMR5RP-DPYfSO96.js → ganttDiagram-FUAMR5RP-BiAI-ltZ.js} +1 -1
- package/dist/assets/{gitGraphDiagram-X574FWY7-DhkHeCle.js → gitGraphDiagram-X574FWY7-BAZISkj3.js} +1 -1
- package/dist/assets/index-Cdmjrl28.css +1 -0
- package/dist/assets/{index-G1PHKGyh.js → index-DGBaEXrM.js} +1 -1
- package/dist/assets/index-DR7YPMkW.js +597 -0
- package/dist/assets/{infoDiagram-VRGFBTTK-DstBLxME.js → infoDiagram-VRGFBTTK-B6ooOy-Z.js} +1 -1
- package/dist/assets/{ishikawaDiagram-OU5B5YK6-CrIsGgch.js → ishikawaDiagram-OU5B5YK6-BZ9ksi-B.js} +1 -1
- package/dist/assets/{journeyDiagram-ZHPQQLJL-CYypGDbB.js → journeyDiagram-ZHPQQLJL-DWqlzIEe.js} +1 -1
- package/dist/assets/{kanban-definition-PNTS6WVX-DGjPt8E_.js → kanban-definition-PNTS6WVX-JX6piDwL.js} +1 -1
- package/dist/assets/{linear-Dwc3Hrru.js → linear-CmOWzX0P.js} +1 -1
- package/dist/assets/{mermaid.core-Dc4OePBL.js → mermaid.core-CF1zwoQ-.js} +5 -5
- package/dist/assets/{mindmap-definition-NLK3R4M7-DV-vepj-.js → mindmap-definition-NLK3R4M7-CGh2K4fW.js} +1 -1
- package/dist/assets/{pegDiagram-GJSIUBJH-lx5Kj-n5.js → pegDiagram-GJSIUBJH-CDwYN0s7.js} +1 -1
- package/dist/assets/{pieDiagram-5QR66LMP-Bq7Vmm15.js → pieDiagram-5QR66LMP-1rfjJocB.js} +1 -1
- package/dist/assets/{quadrantDiagram-O4NWA36T-DeqeqOBj.js → quadrantDiagram-O4NWA36T-tKPvPiok.js} +1 -1
- package/dist/assets/{railroadDiagram-XR7U4H2S-CXwRQzSC.js → railroadDiagram-XR7U4H2S-BHLm5vXR.js} +1 -1
- package/dist/assets/{requirementDiagram-PLB6GJNP-8tAeoB88.js → requirementDiagram-PLB6GJNP-CB45STp7.js} +1 -1
- package/dist/assets/{sankeyDiagram-IPEJSGJF-BG5zjGWU.js → sankeyDiagram-IPEJSGJF-55QA_huC.js} +1 -1
- package/dist/assets/{sequenceDiagram-PO4LG4MO-DKF3iLcw.js → sequenceDiagram-PO4LG4MO-BckFmQHn.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-B-y1qUgT.js → sizeCapture-INFHLROL-BFCOJF11.js} +1 -1
- package/dist/assets/{stateDiagram-v2-GCMORJYK-MkzPgxAc.js → stateDiagram-v2-GCMORJYK-CZvmiVVN.js} +1 -1
- package/dist/assets/{swimlanes-2SLR337P-DnbaOEwH.js → swimlanes-2SLR337P-BpDUCEKy.js} +1 -1
- package/dist/assets/swimlanesDiagram-TC7HE7FX-M0GYW9Y3.js +8 -0
- package/dist/assets/{timeline-definition-EJHVYXUP-Bb4xG_Bt.js → timeline-definition-EJHVYXUP-BpxHq6IK.js} +1 -1
- package/dist/assets/{usecaseDiagram-POWQR4AR-JgkR9pFf.js → usecaseDiagram-POWQR4AR-Cj66vm02.js} +1 -1
- package/dist/assets/{vennDiagram-UO4OBE2U-CIPIrAYe.js → vennDiagram-UO4OBE2U-C9nRkWE_.js} +1 -1
- package/dist/assets/{wardleyDiagram-VNRHLVJA-BjCLuUvJ.js → wardleyDiagram-VNRHLVJA-D-me_nWj.js} +1 -1
- package/dist/assets/{xychartDiagram-PMCCYNJV-DKgiaYxT.js → xychartDiagram-PMCCYNJV-Dc_fL4mk.js} +1 -1
- package/dist/index.html +2 -2
- package/dist/novnc-NOTICE.txt +118 -0
- package/dist-server/cloud-home-start.js +128 -15
- package/dist-server/container-mcp.js +277 -45
- package/dist-server/drivers/agents-proxy.js +16 -4
- package/dist-server/enterprise/server/index.js +5 -1
- package/dist-server/index.js +46703 -39955
- package/dist-server/local-computer-proxy.js +128 -7
- package/dist-server/mcp-gate.js +11 -5
- package/dist-server/model-catalog/models-dev.snapshot.json +7299 -0
- package/dist-server/openmausbot.js +4099 -1217
- package/dist-server/pair-cli.js +4099 -1217
- package/dist-server/server/boat.js +67 -22
- package/dist-server/server/bot-overview.js +7 -4
- package/dist-server/server/browser-engine.js +10 -1
- package/dist-server/server/browser-live.js +46 -2
- package/dist-server/server/browser-runtime.js +74 -8
- package/dist-server/server/browser-tool-shape.js +6 -4
- package/dist-server/server/chief-of-staff.js +1 -1
- package/dist-server/server/cloud-home-start.js +136 -26
- package/dist-server/server/cloud-home.js +64 -5
- package/dist-server/server/cloud-lending.js +167 -0
- package/dist-server/server/cloud-move-http.js +268 -0
- package/dist-server/server/cloud-move.js +418 -0
- package/dist-server/server/cloud-owner.js +196 -0
- package/dist-server/server/cloud-secrets-boot.js +6 -0
- package/dist-server/server/cloud-secrets.js +65 -0
- package/dist-server/server/config.js +215 -17
- package/dist-server/server/container-computer.js +3 -2
- package/dist-server/server/decider/index.js +238 -0
- package/dist-server/server/decider/jev.js +183 -0
- package/dist-server/server/decider/log.js +62 -0
- package/dist-server/server/decider/relay.js +52 -0
- package/dist-server/server/decider/room-routing.js +88 -0
- package/dist-server/server/decider/types.js +5 -0
- package/dist-server/server/desktop-viewer-targets.js +26 -0
- package/dist-server/server/drivers/acp/core.js +167 -21
- package/dist-server/server/drivers/acp/opencode-go.js +614 -85
- package/dist-server/server/drivers/agents-catalog.js +22 -6
- package/dist-server/server/drivers/antigravity-acp.js +69 -11
- package/dist-server/server/drivers/antigravity-temp.js +360 -0
- package/dist-server/server/drivers/antigravity.js +21 -0
- package/dist-server/server/drivers/boatagent.js +20 -12
- package/dist-server/server/drivers/chatgpt-plan-auth.js +481 -0
- package/dist-server/server/drivers/claude.js +313 -34
- package/dist-server/server/drivers/codex.js +228 -18
- package/dist-server/server/drivers/grok.js +2 -2
- package/dist-server/server/drivers/mistral.js +4 -3
- package/dist-server/server/drivers/openai-chat-protocol.js +4 -3
- package/dist-server/server/drivers/openai-chat.js +41 -3
- package/dist-server/server/drivers/openai-compat.js +73 -23
- package/dist-server/server/engine-install.js +46 -12
- package/dist-server/server/env-path.js +15 -3
- package/dist-server/server/group-goal-run.js +6 -4
- package/dist-server/server/harness/registry.js +2 -2
- package/dist-server/server/harness-capabilities.js +2 -0
- package/dist-server/server/included-services.js +70 -0
- package/dist-server/server/index.js +1753 -263
- package/dist-server/server/lending-memory.js +479 -0
- package/dist-server/server/local-vm-idle.js +24 -6
- package/dist-server/server/managed-desktop.js +3 -0
- package/dist-server/server/mcp-bridge.js +5 -3
- package/dist-server/server/mcp-http.js +6 -3
- package/dist-server/server/mcp-oauth-discovery.js +133 -0
- package/dist-server/server/mcp-oauth-store.js +70 -0
- package/dist-server/server/mcp-oauth.js +550 -0
- package/dist-server/server/mcp-probe.js +14 -1
- package/dist-server/server/mcp-registry.js +43 -0
- package/dist-server/server/memory-upkeep.js +94 -84
- package/dist-server/server/model-catalog/catalog.js +374 -0
- package/dist-server/server/model-catalog/presets.js +176 -0
- package/dist-server/server/model-catalog/trim.js +219 -0
- package/dist-server/server/model-context-window.js +4 -4
- package/dist-server/server/package-export.js +17 -10
- package/dist-server/server/package-import.js +6 -3
- package/dist-server/server/package-parts.js +3 -1
- package/dist-server/server/provider-key-check.js +4 -2
- package/dist-server/server/recent-work.js +1 -1
- package/dist-server/server/request-auth.js +25 -0
- package/dist-server/server/routes/antigravity-leftovers.js +45 -0
- package/dist-server/server/routes/bot-memory.js +31 -6
- package/dist-server/server/routes/decider.js +19 -0
- package/dist-server/server/routes/desktop-viewer.js +194 -0
- package/dist-server/server/routine-requests.js +1 -1
- package/dist-server/server/routines.js +1 -1
- package/dist-server/server/sessions.js +56 -9
- package/dist-server/server/shared-computers.js +116 -30
- package/dist-server/server/skills.js +25 -10
- package/dist-server/server/store.js +79 -124
- package/dist-server/server/surface.js +13 -0
- package/dist-server/server/system-prompt.js +11 -0
- package/dist-server/server/team-backup.js +6 -2
- package/dist-server/server/team-manifest.js +11 -3
- package/dist-server/server/thread-events.js +2 -0
- package/dist-server/server/thread-starters.js +33 -0
- package/dist-server/server/thread-title.js +46 -0
- package/dist-server/server/tts/elevenlabs.js +11 -6
- package/dist-server/server/tts/fish.js +4 -5
- package/dist-server/server/tts/index.js +20 -11
- package/dist-server/server/vps-computer.js +79 -12
- package/dist-server/server/webhooks.js +18 -1
- package/dist-server/server/workspace-backup-policy.js +25 -3
- package/dist-server/server/workspace-backup.js +28 -8
- package/dist-server/server/workspace.js +65 -15
- package/dist-server/shared/cloud-home.js +4 -0
- package/dist-server/shared/package-format.js +30 -4
- package/dist-server/shared/team-backup.js +20 -3
- package/dist-server/shared/workspace-backup-client.js +1 -0
- package/dist-server/src/lib/citations.js +177 -0
- package/dist-server/src/lib/composer-attachments.js +7 -1
- package/dist-server/vps-container-mcp.js +278 -45
- package/dist-server/workspace-backup.worker.js +184 -38
- package/enterprise/server/index.js +5 -1
- package/package.json +1 -1
- package/dist/assets/channel-BCuyHjFV.js +0 -1
- package/dist/assets/index-CRvo-DS2.css +0 -1
- package/dist/assets/index-CWYGlA63.js +0 -588
- 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
|
|
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
|
|
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 ??
|
|
19115
|
-
var LEGACY_DATA_DIR =
|
|
19116
|
-
var EVENTS_DIR =
|
|
19117
|
-
var NATIVE_DIR =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
19250
|
-
const config2 =
|
|
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("~\\") ?
|
|
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 (!
|
|
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 (!
|
|
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 =
|
|
19367
|
-
folder(
|
|
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 =
|
|
19375
|
-
if (
|
|
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,
|
|
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(
|
|
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 =
|
|
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 =
|
|
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" ?
|
|
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(
|
|
19457
|
-
groups: countJsonArray(
|
|
19458
|
-
...databaseCounts(
|
|
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(
|
|
19469
|
-
validateManifest(privateJson(
|
|
19470
|
-
const path =
|
|
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 +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};
|