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.
- package/dist/assets/{abnfDiagram-O67JEVCF-DUyXd0kL.js → abnfDiagram-O67JEVCF-yP-w8pRq.js} +1 -1
- package/dist/assets/{arc-q73qM-At.js → arc-DsivfZEh.js} +1 -1
- package/dist/assets/{architectureDiagram-NJMV4G6O-D33O3Wur.js → architectureDiagram-NJMV4G6O-CILw7lzT.js} +1 -1
- package/dist/assets/{blockDiagram-BEXU5L5S-DLsJeoXC.js → blockDiagram-BEXU5L5S-DEQUV3HF.js} +1 -1
- package/dist/assets/{c4Diagram-YGBWAQC7-DnaljZnu.js → c4Diagram-YGBWAQC7-lSXCZoKA.js} +1 -1
- package/dist/assets/channel-DrfGMu7X.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-Da0h2i79.js → chunk-2Q5K7J3B-QCD5bgWP.js} +1 -1
- package/dist/assets/{chunk-3FUC2YCW-CfzHi54f.js → chunk-3FUC2YCW-C5-iZJuL.js} +2 -2
- package/dist/assets/{chunk-5VM5RSS4-LjE4d9Jf.js → chunk-5VM5RSS4-cxsawMpY.js} +1 -1
- package/dist/assets/{chunk-GTNCS2PH-DY-UGmvc.js → chunk-GTNCS2PH-DV8tV8H7.js} +1 -1
- package/dist/assets/{chunk-GWA4HPMP-BqeGhyhP.js → chunk-GWA4HPMP-CJFZyfbW.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-BYa9EBAg.js → chunk-JWPE2WC7-BigbMXco.js} +1 -1
- package/dist/assets/{chunk-NETBCI7D-vTrDtWyb.js → chunk-NETBCI7D-oVxTfpDy.js} +1 -1
- package/dist/assets/{chunk-WEXAMYUT-ic5tXadM.js → chunk-WEXAMYUT-CH4BiroW.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-DvRCY-c6.js → chunk-XXDRQBXY-KEDa6gax.js} +1 -1
- package/dist/assets/{classDiagram-v2-NBCMYWYE-DVbmgz_L.js → classDiagram-v2-NBCMYWYE-BiPjfqVv.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-vdUs2n57.js → cose-bilkent-JH36ORCC-Caxew3OY.js} +1 -1
- package/dist/assets/{cynefin-OW5HDTMX-BvLGlV3U.js → cynefin-OW5HDTMX-B_Pui369.js} +1 -1
- package/dist/assets/{cynefinDiagram-VND7K2PF-C4GcJQDt.js → cynefinDiagram-VND7K2PF-X64ydIhP.js} +1 -1
- package/dist/assets/{dagre-6A5THRUB-BMSaHpt_.js → dagre-6A5THRUB-TqYCI1E1.js} +1 -1
- package/dist/assets/{diagram-22UHCM2B-D5b9UBhC.js → diagram-22UHCM2B-TeOt3rAQ.js} +1 -1
- package/dist/assets/{diagram-3UASUU5V-CIKLlB7Y.js → diagram-3UASUU5V-D70BLhDA.js} +1 -1
- package/dist/assets/{diagram-ATOU4E4O-BzXb-7k7.js → diagram-ATOU4E4O-BbQDLwUC.js} +1 -1
- package/dist/assets/{diagram-CDSNMT55-HsTvJ7uT.js → diagram-CDSNMT55-ChNJZ1u-.js} +1 -1
- package/dist/assets/{diagram-MLGK6HIB-Db9ySNbQ.js → diagram-MLGK6HIB-DMBl2APa.js} +1 -1
- package/dist/assets/{diagram-MPIPVDR6-D6BKbpqY.js → diagram-MPIPVDR6-CEqDchOp.js} +1 -1
- package/dist/assets/{ebnfDiagram-ZINNZB2B-Bq067L0t.js → ebnfDiagram-ZINNZB2B-BVDKRp_-.js} +1 -1
- package/dist/assets/{elk-276RUBZZ-DhaD7fNJ.js → elk-276RUBZZ-CRkofO9B.js} +1 -1
- package/dist/assets/{erDiagram-OPXOYQCR-fwIhfz36.js → erDiagram-OPXOYQCR-DruOMh5e.js} +1 -1
- package/dist/assets/{flowDiagram-KWPJA3E3-DygIyu0V.js → flowDiagram-KWPJA3E3-8GMQeB7t.js} +1 -1
- package/dist/assets/{ganttDiagram-FUAMR5RP-DPYfSO96.js → ganttDiagram-FUAMR5RP-ORE9jcsM.js} +1 -1
- package/dist/assets/{gitGraphDiagram-X574FWY7-DhkHeCle.js → gitGraphDiagram-X574FWY7-BmsedsWh.js} +1 -1
- package/dist/assets/index-BlnCEcU6.js +588 -0
- package/dist/assets/{index-G1PHKGyh.js → index-DKNEM8Q6.js} +1 -1
- package/dist/assets/index-DVxjOvID.css +1 -0
- package/dist/assets/{infoDiagram-VRGFBTTK-DstBLxME.js → infoDiagram-VRGFBTTK-E_p7AooJ.js} +1 -1
- package/dist/assets/{ishikawaDiagram-OU5B5YK6-CrIsGgch.js → ishikawaDiagram-OU5B5YK6-Y-B2mKda.js} +1 -1
- package/dist/assets/{journeyDiagram-ZHPQQLJL-CYypGDbB.js → journeyDiagram-ZHPQQLJL-eA8RELcK.js} +1 -1
- package/dist/assets/{kanban-definition-PNTS6WVX-DGjPt8E_.js → kanban-definition-PNTS6WVX-DqIL2e8e.js} +1 -1
- package/dist/assets/{linear-Dwc3Hrru.js → linear-yC_29R6e.js} +1 -1
- package/dist/assets/{mermaid.core-Dc4OePBL.js → mermaid.core-VhEMkSND.js} +5 -5
- package/dist/assets/{mindmap-definition-NLK3R4M7-DV-vepj-.js → mindmap-definition-NLK3R4M7-oJ7kyQZy.js} +1 -1
- package/dist/assets/{pegDiagram-GJSIUBJH-lx5Kj-n5.js → pegDiagram-GJSIUBJH-BmfYcY0O.js} +1 -1
- package/dist/assets/{pieDiagram-5QR66LMP-Bq7Vmm15.js → pieDiagram-5QR66LMP-DKvgP7w9.js} +1 -1
- package/dist/assets/{quadrantDiagram-O4NWA36T-DeqeqOBj.js → quadrantDiagram-O4NWA36T-BEKL3W0L.js} +1 -1
- package/dist/assets/{railroadDiagram-XR7U4H2S-CXwRQzSC.js → railroadDiagram-XR7U4H2S-BEsiqR5s.js} +1 -1
- package/dist/assets/{requirementDiagram-PLB6GJNP-8tAeoB88.js → requirementDiagram-PLB6GJNP-DWBcWvAP.js} +1 -1
- package/dist/assets/{sankeyDiagram-IPEJSGJF-BG5zjGWU.js → sankeyDiagram-IPEJSGJF-rpZ2_O4s.js} +1 -1
- package/dist/assets/{sequenceDiagram-PO4LG4MO-DKF3iLcw.js → sequenceDiagram-PO4LG4MO-B99HQdJR.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-B-y1qUgT.js → sizeCapture-INFHLROL-BjN0qT5T.js} +1 -1
- package/dist/assets/{stateDiagram-v2-GCMORJYK-MkzPgxAc.js → stateDiagram-v2-GCMORJYK-BbsVgGsC.js} +1 -1
- package/dist/assets/{swimlanes-2SLR337P-DnbaOEwH.js → swimlanes-2SLR337P-DG3gKkeR.js} +1 -1
- package/dist/assets/swimlanesDiagram-TC7HE7FX-BCZhxl7e.js +8 -0
- package/dist/assets/{timeline-definition-EJHVYXUP-Bb4xG_Bt.js → timeline-definition-EJHVYXUP-BTHOdtF_.js} +1 -1
- package/dist/assets/{usecaseDiagram-POWQR4AR-JgkR9pFf.js → usecaseDiagram-POWQR4AR-acLSLFwc.js} +1 -1
- package/dist/assets/{vennDiagram-UO4OBE2U-CIPIrAYe.js → vennDiagram-UO4OBE2U-C5JzNX9G.js} +1 -1
- package/dist/assets/{wardleyDiagram-VNRHLVJA-BjCLuUvJ.js → wardleyDiagram-VNRHLVJA-DL1-PrR_.js} +1 -1
- package/dist/assets/{xychartDiagram-PMCCYNJV-DKgiaYxT.js → xychartDiagram-PMCCYNJV-Bvr1477p.js} +1 -1
- package/dist/index.html +2 -2
- package/dist-server/cloud-home-start.js +18 -3
- package/dist-server/container-mcp.js +84 -32
- package/dist-server/drivers/agents-proxy.js +11 -0
- package/dist-server/index.js +25183 -23580
- package/dist-server/openmausbot.js +313 -159
- package/dist-server/pair-cli.js +313 -159
- package/dist-server/server/boat.js +66 -21
- package/dist-server/server/bot-overview.js +7 -4
- package/dist-server/server/cloud-home-start.js +23 -5
- package/dist-server/server/cloud-home.js +25 -2
- package/dist-server/server/cloud-lending.js +103 -0
- package/dist-server/server/cloud-move-http.js +268 -0
- package/dist-server/server/cloud-move.js +418 -0
- package/dist-server/server/config.js +42 -4
- 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/drivers/agents-catalog.js +16 -0
- package/dist-server/server/drivers/boatagent.js +20 -12
- package/dist-server/server/drivers/claude.js +1 -0
- package/dist-server/server/group-goal-run.js +6 -4
- package/dist-server/server/harness-capabilities.js +2 -0
- package/dist-server/server/included-services.js +70 -0
- package/dist-server/server/index.js +438 -102
- 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/request-auth.js +2 -0
- package/dist-server/server/routes/decider.js +19 -0
- package/dist-server/server/shared-computers.js +116 -30
- package/dist-server/server/store.js +17 -2
- 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/tts/elevenlabs.js +11 -6
- package/dist-server/server/tts/index.js +17 -10
- package/dist-server/server/workspace-backup-policy.js +22 -3
- package/dist-server/server/workspace-backup.js +25 -8
- 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/vps-container-mcp.js +84 -32
- package/dist-server/workspace-backup.worker.js +113 -31
- 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";
|
|
@@ -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 ??
|
|
19115
|
-
var LEGACY_DATA_DIR =
|
|
19116
|
-
var EVENTS_DIR =
|
|
19117
|
-
var NATIVE_DIR =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
19250
|
-
const config2 =
|
|
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("~\\") ?
|
|
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 (!
|
|
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 (!
|
|
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 =
|
|
19367
|
-
folder(
|
|
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 =
|
|
19375
|
-
if (
|
|
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,
|
|
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(
|
|
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 =
|
|
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 =
|
|
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" ?
|
|
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(
|
|
19457
|
-
groups: countJsonArray(
|
|
19458
|
-
...databaseCounts(
|
|
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(
|
|
19469
|
-
validateManifest(privateJson(
|
|
19470
|
-
const path =
|
|
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 +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};
|