openmausbot 0.1.92 → 0.1.94
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 → DesktopViewer-bxM7NV3N.js} +1 -1
- package/dist/assets/{abnfDiagram-O67JEVCF-Cd3X7Hxc.js → abnfDiagram-O67JEVCF-BhMdJhRJ.js} +1 -1
- package/dist/assets/{arc-DIYc7Ymx.js → arc-B5itKDcx.js} +1 -1
- package/dist/assets/{architectureDiagram-NJMV4G6O-DBmRGVyP.js → architectureDiagram-NJMV4G6O-C5d7UY6U.js} +1 -1
- package/dist/assets/{blockDiagram-BEXU5L5S-CPFePSEE.js → blockDiagram-BEXU5L5S-BrZIhMmu.js} +1 -1
- package/dist/assets/{c4Diagram-YGBWAQC7-DD_DO1qy.js → c4Diagram-YGBWAQC7-7I0ArfbD.js} +1 -1
- package/dist/assets/channel-CdJX6i8k.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-BNEeNSjX.js → chunk-2Q5K7J3B-BnEsyN36.js} +1 -1
- package/dist/assets/{chunk-3FUC2YCW-BbinLaqH.js → chunk-3FUC2YCW-BXATQ52s.js} +2 -2
- package/dist/assets/{chunk-5VM5RSS4-BBgYrgDR.js → chunk-5VM5RSS4-B0BpTkEx.js} +1 -1
- package/dist/assets/{chunk-GTNCS2PH-ezXj-kA-.js → chunk-GTNCS2PH-BtLTz6FR.js} +1 -1
- package/dist/assets/{chunk-GWA4HPMP-9FxZ3diV.js → chunk-GWA4HPMP-D6gcZOYt.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-CO-40JpI.js → chunk-JWPE2WC7-DCLrosvf.js} +1 -1
- package/dist/assets/{chunk-NETBCI7D-BEhjslYE.js → chunk-NETBCI7D-B9JsknV9.js} +1 -1
- package/dist/assets/{chunk-WEXAMYUT-CNeq4n7_.js → chunk-WEXAMYUT-CsoTxw7z.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-OsCY7KSi.js → chunk-XXDRQBXY-0F_frB0c.js} +1 -1
- package/dist/assets/{classDiagram-v2-NBCMYWYE-CloRUEtk.js → classDiagram-v2-NBCMYWYE-DkrpnflX.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-D1BGZhp4.js → cose-bilkent-JH36ORCC-BNDwYBt9.js} +1 -1
- package/dist/assets/{cynefin-OW5HDTMX-CUf4T2CN.js → cynefin-OW5HDTMX-JUkNr1Mk.js} +1 -1
- package/dist/assets/{cynefinDiagram-VND7K2PF-DPEZrFGA.js → cynefinDiagram-VND7K2PF-DKeh9N4M.js} +1 -1
- package/dist/assets/{dagre-6A5THRUB-bDe6GIv5.js → dagre-6A5THRUB-ve-6T_wX.js} +1 -1
- package/dist/assets/{diagram-22UHCM2B-CdcUQz55.js → diagram-22UHCM2B-BuJ2d8rT.js} +1 -1
- package/dist/assets/{diagram-3UASUU5V-BZpqGg7c.js → diagram-3UASUU5V-BgOs_Ni-.js} +1 -1
- package/dist/assets/{diagram-ATOU4E4O-DvGM6ugp.js → diagram-ATOU4E4O-DMK6VmcP.js} +1 -1
- package/dist/assets/{diagram-CDSNMT55-DSTmMm0s.js → diagram-CDSNMT55-DksASlcY.js} +1 -1
- package/dist/assets/{diagram-MLGK6HIB-15cucnMn.js → diagram-MLGK6HIB-Bgn8I5k6.js} +1 -1
- package/dist/assets/{diagram-MPIPVDR6-tMbuaE6n.js → diagram-MPIPVDR6-zK0jqO8N.js} +1 -1
- package/dist/assets/{ebnfDiagram-ZINNZB2B-BYxYzjHI.js → ebnfDiagram-ZINNZB2B-vKrbzTwr.js} +1 -1
- package/dist/assets/{elk-276RUBZZ-v6bj852W.js → elk-276RUBZZ-Bzv2mPNf.js} +1 -1
- package/dist/assets/{erDiagram-OPXOYQCR-5lBBlnd2.js → erDiagram-OPXOYQCR-CvOyYuxu.js} +1 -1
- package/dist/assets/{flowDiagram-KWPJA3E3-CZyl1zIj.js → flowDiagram-KWPJA3E3-CtbnDbc0.js} +1 -1
- package/dist/assets/{ganttDiagram-FUAMR5RP-BiAI-ltZ.js → ganttDiagram-FUAMR5RP-c4dMRYyG.js} +1 -1
- package/dist/assets/{gitGraphDiagram-X574FWY7-BAZISkj3.js → gitGraphDiagram-X574FWY7-B34uaQho.js} +1 -1
- package/dist/assets/index-CPYrGsv1.js +610 -0
- package/dist/assets/{index-DGBaEXrM.js → index-CPiqc_DN.js} +1 -1
- package/dist/assets/index-CzT42GR8.css +1 -0
- package/dist/assets/{infoDiagram-VRGFBTTK-B6ooOy-Z.js → infoDiagram-VRGFBTTK-o64ma4CI.js} +1 -1
- package/dist/assets/{ishikawaDiagram-OU5B5YK6-BZ9ksi-B.js → ishikawaDiagram-OU5B5YK6-DV4C9BAm.js} +1 -1
- package/dist/assets/{journeyDiagram-ZHPQQLJL-DWqlzIEe.js → journeyDiagram-ZHPQQLJL-Bf0AHk1H.js} +1 -1
- package/dist/assets/{kanban-definition-PNTS6WVX-JX6piDwL.js → kanban-definition-PNTS6WVX-B1UMSKmE.js} +1 -1
- package/dist/assets/{linear-CmOWzX0P.js → linear-BpKhuyLm.js} +1 -1
- package/dist/assets/{mermaid.core-CF1zwoQ-.js → mermaid.core-B_BKNCw5.js} +5 -5
- package/dist/assets/{mindmap-definition-NLK3R4M7-CGh2K4fW.js → mindmap-definition-NLK3R4M7-DeARruT1.js} +1 -1
- package/dist/assets/{pegDiagram-GJSIUBJH-CDwYN0s7.js → pegDiagram-GJSIUBJH-BOQEk_1D.js} +1 -1
- package/dist/assets/{pieDiagram-5QR66LMP-1rfjJocB.js → pieDiagram-5QR66LMP-EIfoiTZo.js} +1 -1
- package/dist/assets/{quadrantDiagram-O4NWA36T-tKPvPiok.js → quadrantDiagram-O4NWA36T-GgZwT-fi.js} +1 -1
- package/dist/assets/{railroadDiagram-XR7U4H2S-BHLm5vXR.js → railroadDiagram-XR7U4H2S-D9rDQomj.js} +1 -1
- package/dist/assets/{requirementDiagram-PLB6GJNP-CB45STp7.js → requirementDiagram-PLB6GJNP-DAh1MIeo.js} +1 -1
- package/dist/assets/{sankeyDiagram-IPEJSGJF-55QA_huC.js → sankeyDiagram-IPEJSGJF-CPr6Uz64.js} +1 -1
- package/dist/assets/{sequenceDiagram-PO4LG4MO-BckFmQHn.js → sequenceDiagram-PO4LG4MO-BU6VIdcm.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-BFCOJF11.js → sizeCapture-INFHLROL-qF2HO41r.js} +1 -1
- package/dist/assets/{stateDiagram-v2-GCMORJYK-CZvmiVVN.js → stateDiagram-v2-GCMORJYK-DlJ8G4MD.js} +1 -1
- package/dist/assets/{swimlanes-2SLR337P-BpDUCEKy.js → swimlanes-2SLR337P-DzYE8I54.js} +1 -1
- package/dist/assets/swimlanesDiagram-TC7HE7FX-D-U4GtLQ.js +8 -0
- package/dist/assets/{timeline-definition-EJHVYXUP-BpxHq6IK.js → timeline-definition-EJHVYXUP-B7wzEQ0A.js} +1 -1
- package/dist/assets/{usecaseDiagram-POWQR4AR-Cj66vm02.js → usecaseDiagram-POWQR4AR-BvGgrxIP.js} +1 -1
- package/dist/assets/{vennDiagram-UO4OBE2U-C9nRkWE_.js → vennDiagram-UO4OBE2U-CEECdgQg.js} +1 -1
- package/dist/assets/{wardleyDiagram-VNRHLVJA-D-me_nWj.js → wardleyDiagram-VNRHLVJA-XQHA0P_P.js} +1 -1
- package/dist/assets/{xychartDiagram-PMCCYNJV-Dc_fL4mk.js → xychartDiagram-PMCCYNJV-B5mLcZI2.js} +1 -1
- package/dist/index.html +2 -2
- package/dist-server/cloud-home-start.js +1 -0
- package/dist-server/companion/src/routes.js +45 -1
- package/dist-server/container-mcp.js +99 -77
- package/dist-server/drivers/agents-proxy.js +40 -1
- package/dist-server/drivers/pi-mcp-extension.ts +245 -299
- package/dist-server/enterprise/server/index.js +1 -0
- package/dist-server/index.js +18361 -13794
- package/dist-server/local-computer-proxy.js +5 -1
- package/dist-server/local-computer.js +1 -0
- package/dist-server/mcp-gate.js +152 -20
- package/dist-server/mcp-remote-proxy.js +437 -0
- package/dist-server/openmausbot.js +8872 -7620
- package/dist-server/pair-cli.js +8872 -7620
- package/dist-server/permission-proxy.js +65 -1
- package/dist-server/proxy-paths.js +1 -0
- package/dist-server/server/auto-approve.js +33 -11
- package/dist-server/server/boat.js +3 -3
- package/dist-server/server/browser-live.js +14 -5
- package/dist-server/server/browser-runtime.js +6 -0
- package/dist-server/server/channel-queue.js +4 -1
- package/dist-server/server/cli.js +32 -12
- package/dist-server/server/cloud-move-http.js +9 -3
- package/dist-server/server/cloud-move.js +18 -0
- package/dist-server/server/cloud-owner.js +1 -1
- package/dist-server/server/computer-control.js +6 -0
- package/dist-server/server/computer-wait.js +33 -13
- package/dist-server/server/config.js +57 -10
- package/dist-server/server/container-computer.js +43 -32
- package/dist-server/server/decision-log.js +9 -6
- package/dist-server/server/delegations.js +47 -22
- package/dist-server/server/digest.js +12 -2
- package/dist-server/server/drivers/acp/core.js +229 -20
- package/dist-server/server/drivers/acp/cursor.js +13 -1
- package/dist-server/server/drivers/acp/grok.js +208 -3
- package/dist-server/server/drivers/acp/quiet-status.js +257 -0
- package/dist-server/server/drivers/acp/qwen.js +18 -0
- package/dist-server/server/drivers/agents-call.js +28 -0
- package/dist-server/server/drivers/agents-catalog.js +10 -1
- package/dist-server/server/drivers/boatagent.js +2 -0
- package/dist-server/server/drivers/builtIn.js +2 -0
- package/dist-server/server/drivers/cerebras.js +108 -0
- package/dist-server/server/drivers/chat-mcp-tools.js +45 -15
- package/dist-server/server/drivers/claude.js +35 -9
- package/dist-server/server/drivers/codex.js +84 -10
- package/dist-server/server/drivers/openai-chat.js +37 -5
- package/dist-server/server/drivers/pi.js +48 -4
- package/dist-server/server/drivers/prompt-split.js +2 -0
- package/dist-server/server/env-path.js +6 -2
- package/dist-server/server/environment.js +3 -0
- package/dist-server/server/guarded-requests.js +2 -1
- package/dist-server/server/index.js +1353 -311
- package/dist-server/server/live-call-controller.js +868 -0
- package/dist-server/server/live-call.js +216 -0
- package/dist-server/server/local-vm-stop-reason.js +26 -0
- package/dist-server/server/mcp-gate-config.js +43 -12
- package/dist-server/server/mcp-gate.js +127 -25
- package/dist-server/server/mcp-http.js +46 -8
- package/dist-server/server/mcp-remote-proxy.js +108 -0
- package/dist-server/server/new-bot-defaults.js +3 -0
- package/dist-server/server/peer-provenance.js +4 -2
- package/dist-server/server/permission-proxy.js +15 -1
- package/dist-server/server/plan-usage.js +797 -0
- package/dist-server/server/provider-key-check.js +2 -1
- package/dist-server/server/proxy-paths.js +1 -0
- package/dist-server/server/redact.js +2 -0
- package/dist-server/server/request-auth.js +3 -2
- package/dist-server/server/routes/desktop-viewer.js +50 -6
- package/dist-server/server/routes/live.js +98 -0
- package/dist-server/server/routines.js +6 -3
- package/dist-server/server/skill-library.js +207 -0
- package/dist-server/server/skills-library-migration.js +235 -0
- package/dist-server/server/skills.js +66 -3
- package/dist-server/server/steer-queue.js +13 -1
- package/dist-server/server/store.js +86 -4
- package/dist-server/server/surface.js +9 -3
- package/dist-server/server/team-backup.js +2 -1
- package/dist-server/server/thread-events.js +1 -1
- package/dist-server/server/tunnel.js +20 -1
- package/dist-server/server/turn-log.js +10 -0
- package/dist-server/server/turn-resources.js +124 -0
- package/dist-server/server/vps-computer.js +1 -1
- package/dist-server/server/workspace-backup.js +22 -0
- package/dist-server/server/workspace.js +1 -1
- package/dist-server/shared/approval-mode.js +1 -1
- package/dist-server/shared/ask-question.js +13 -0
- package/dist-server/shared/call-consent.js +28 -0
- package/dist-server/shared/live-approval.js +124 -0
- package/dist-server/shared/live-call.js +176 -0
- package/dist-server/shared/redact.js +1 -0
- package/dist-server/shared/skill-md.js +10 -0
- package/dist-server/shared/team-backup.js +3 -0
- package/dist-server/shared/tool-name.js +22 -0
- package/dist-server/shared/tool-scope-support.js +25 -0
- package/dist-server/shared/tool-scope.js +136 -0
- package/dist-server/src/lib/thread-refs.js +406 -0
- package/dist-server/vps-container-mcp.js +99 -77
- package/dist-server/workspace-backup.worker.js +103 -100
- package/enterprise/server/index.js +1 -0
- package/package.json +1 -1
- package/dist/assets/channel-Dtk5Mtic.js +0 -1
- package/dist/assets/index-Cdmjrl28.css +0 -1
- package/dist/assets/index-DR7YPMkW.js +0 -597
- package/dist/assets/swimlanesDiagram-TC7HE7FX-M0GYW9Y3.js +0 -8
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
cpSync,
|
|
17
17
|
createReadStream,
|
|
18
18
|
createWriteStream,
|
|
19
|
-
existsSync
|
|
19
|
+
existsSync,
|
|
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 join2, 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";
|
|
@@ -3179,7 +3179,7 @@ var WORKSPACE_BACKUP_CLIENT_KEYS = [
|
|
|
3179
3179
|
|
|
3180
3180
|
// server/config.ts
|
|
3181
3181
|
import { homedir } from "node:os";
|
|
3182
|
-
import { join
|
|
3182
|
+
import { join } from "node:path";
|
|
3183
3183
|
|
|
3184
3184
|
// node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
|
|
3185
3185
|
var external_exports = {};
|
|
@@ -18481,6 +18481,48 @@ function normalizeCronSchedule(value, after = Date.now()) {
|
|
|
18481
18481
|
return schedule;
|
|
18482
18482
|
}
|
|
18483
18483
|
|
|
18484
|
+
// shared/tool-scope.ts
|
|
18485
|
+
var SERVER_NAME = /^[a-z][a-z0-9_-]{0,31}$/;
|
|
18486
|
+
var CONTROL_CHARACTER = /[\x00-\x1f\x7f]/;
|
|
18487
|
+
var MAX_SELECTORS = 256;
|
|
18488
|
+
var MAX_SELECTOR_LENGTH = 1024;
|
|
18489
|
+
function validName(name) {
|
|
18490
|
+
return typeof name === "string" && name.trim().length > 0 && name.length <= MAX_SELECTOR_LENGTH && !CONTROL_CHARACTER.test(name) && !name.includes("*");
|
|
18491
|
+
}
|
|
18492
|
+
function selectorIdentity(selector) {
|
|
18493
|
+
if (selector.length > MAX_SELECTOR_LENGTH || CONTROL_CHARACTER.test(selector)) return;
|
|
18494
|
+
if (selector.startsWith("native:")) {
|
|
18495
|
+
const name = selector.slice(7);
|
|
18496
|
+
if (name === "*" || validName(name)) return { kind: "native", name };
|
|
18497
|
+
} else if (selector.startsWith("mcp:")) {
|
|
18498
|
+
const separator = selector.indexOf(":", 4);
|
|
18499
|
+
if (separator < 0) return;
|
|
18500
|
+
const server = selector.slice(4, separator);
|
|
18501
|
+
const name = selector.slice(separator + 1);
|
|
18502
|
+
if (SERVER_NAME.test(server) && (name === "*" || validName(name))) {
|
|
18503
|
+
return { kind: "mcp", server, name };
|
|
18504
|
+
}
|
|
18505
|
+
}
|
|
18506
|
+
}
|
|
18507
|
+
function parseToolScope(value) {
|
|
18508
|
+
if (value === void 0) return { ok: true, scope: void 0 };
|
|
18509
|
+
const invalid = { ok: false, error: "Tool selection must contain only valid allow and deny lists." };
|
|
18510
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return invalid;
|
|
18511
|
+
const prototype = Object.getPrototypeOf(value);
|
|
18512
|
+
if (prototype !== Object.prototype && prototype !== null) return invalid;
|
|
18513
|
+
const scope = {};
|
|
18514
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
18515
|
+
if (key !== "allow" && key !== "deny") return invalid;
|
|
18516
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
18517
|
+
if (!descriptor || !("value" in descriptor)) return invalid;
|
|
18518
|
+
const list = descriptor.value;
|
|
18519
|
+
if (!Array.isArray(list) || list.length > MAX_SELECTORS) return invalid;
|
|
18520
|
+
if (!Array.from(list).every((entry) => typeof entry === "string" && selectorIdentity(entry))) return invalid;
|
|
18521
|
+
scope[key] = [...new Set(list)];
|
|
18522
|
+
}
|
|
18523
|
+
return { ok: true, scope };
|
|
18524
|
+
}
|
|
18525
|
+
|
|
18484
18526
|
// server/new-bot-defaults.ts
|
|
18485
18527
|
var strings = (max, length) => external_exports.array(external_exports.string().max(length)).max(max);
|
|
18486
18528
|
var clock = external_exports.string().regex(/^(?:[01]\d|2[0-3]):[0-5]\d$/);
|
|
@@ -18515,6 +18557,10 @@ var botDefaultsProfileSchema = profilePatchSchema.extend({
|
|
|
18515
18557
|
browser: external_exports.boolean().optional(),
|
|
18516
18558
|
browserProfile: external_exports.string().max(100).nullable().optional(),
|
|
18517
18559
|
mcpServers: strings(100, 100).nullable().optional(),
|
|
18560
|
+
toolScope: external_exports.custom((value) => value !== void 0 && parseToolScope(value).ok, "Invalid tool selection").transform((value) => {
|
|
18561
|
+
const parsed = parseToolScope(value);
|
|
18562
|
+
return parsed.ok ? parsed.scope : value;
|
|
18563
|
+
}).nullable().optional(),
|
|
18518
18564
|
parkDirectMessages: external_exports.boolean().optional()
|
|
18519
18565
|
}).strict();
|
|
18520
18566
|
var scheduleSchema = external_exports.discriminatedUnion("type", [
|
|
@@ -18719,76 +18765,6 @@ function schemaIssue(error51, fallback) {
|
|
|
18719
18765
|
var CLOUD_SEAT_IDLE_STOP_MS = 5 * 6e4;
|
|
18720
18766
|
var CLOUD_SEAT_SLEEP_RETRY_MAX_MS = 10 * 6e4;
|
|
18721
18767
|
|
|
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
|
-
|
|
18792
18768
|
// server/config.ts
|
|
18793
18769
|
var optionalText = external_exports.string().optional();
|
|
18794
18770
|
var SSH_ALIAS = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
|
|
@@ -18996,7 +18972,11 @@ var featureConfigSchema = external_exports.object({
|
|
|
18996
18972
|
* may offer a per-second-billed cloud seat, but only through an explicit
|
|
18997
18973
|
* consent card or a configured allowlist — never a silent Auto default.
|
|
18998
18974
|
* Off until baked; see cloudOverflowEnabled for how to enable it by hand. */
|
|
18999
|
-
cloudOverflow: external_exports.boolean().optional()
|
|
18975
|
+
cloudOverflow: external_exports.boolean().optional(),
|
|
18976
|
+
/** Opt-in shared skills library: one store at the data dir that bots
|
|
18977
|
+
* read by assignment instead of per-workspace copies. Off until
|
|
18978
|
+
* explicitly enabled — see skillsLibraryEnabled. */
|
|
18979
|
+
skillsLibrary: external_exports.boolean().optional()
|
|
19000
18980
|
});
|
|
19001
18981
|
var onboardingConfigSchema = external_exports.object({
|
|
19002
18982
|
/** ISO timestamp of finishing (or skipping to the end of) the welcome flow. */
|
|
@@ -19078,6 +19058,7 @@ var appConfigSchema = external_exports.object({
|
|
|
19078
19058
|
phone: external_exports.enum(["ios", "android"]).optional()
|
|
19079
19059
|
}).optional(),
|
|
19080
19060
|
mistral: external_exports.object({ key: optionalText }).optional(),
|
|
19061
|
+
cerebras: external_exports.object({ key: optionalText }).optional(),
|
|
19081
19062
|
xai: external_exports.object({ key: optionalText, url: optionalText }).optional(),
|
|
19082
19063
|
/** Anthropic API key for Claude Code billed per token, handed only to
|
|
19083
19064
|
* Claude instances; `url` only for a proxy or a test double. Never a
|
|
@@ -19148,6 +19129,15 @@ var appConfigSchema = external_exports.object({
|
|
|
19148
19129
|
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
19130
|
jobs: external_exports.object({ roomRouting: external_exports.boolean().optional() }).optional()
|
|
19150
19131
|
}).optional(),
|
|
19132
|
+
/** Live calls: an OpenAI project key for GPT-Live, kept apart from every
|
|
19133
|
+
* other OpenAI credential so a Live call never bills an image or engine key
|
|
19134
|
+
* the user did not hand to it. `voice` is a GPT-Live built-in voice name. */
|
|
19135
|
+
live: external_exports.object({
|
|
19136
|
+
key: optionalText,
|
|
19137
|
+
voice: external_exports.string().trim().max(40).regex(/^[a-z]*$/, "a Live voice is a lowercase built-in voice name").optional(),
|
|
19138
|
+
readTypedReplies: external_exports.boolean().optional(),
|
|
19139
|
+
idleMinutes: external_exports.number().int().min(1).max(60).optional()
|
|
19140
|
+
}).optional(),
|
|
19151
19141
|
/** Avatar provider credentials stay separate; choosing a router never reuses a cloud key. */
|
|
19152
19142
|
imageGen: external_exports.object({
|
|
19153
19143
|
provider: external_exports.enum(["openai", "xai", "custom"]).optional(),
|
|
@@ -19222,10 +19212,10 @@ function parseStoredConfig(value) {
|
|
|
19222
19212
|
return parsed.data;
|
|
19223
19213
|
}
|
|
19224
19214
|
var DEFAULT_CAPTURE_QUIET_MS = 2 * 6e4;
|
|
19225
|
-
var DATA_DIR = process.env.OMB_DATA_DIR ??
|
|
19226
|
-
var LEGACY_DATA_DIR =
|
|
19227
|
-
var EVENTS_DIR =
|
|
19228
|
-
var NATIVE_DIR =
|
|
19215
|
+
var DATA_DIR = process.env.OMB_DATA_DIR ?? join(homedir(), ".openmausbot");
|
|
19216
|
+
var LEGACY_DATA_DIR = join(homedir(), ".opengrokbot");
|
|
19217
|
+
var EVENTS_DIR = join(DATA_DIR, "events");
|
|
19218
|
+
var NATIVE_DIR = join(DATA_DIR, "native");
|
|
19229
19219
|
var OPENAI_API_INSTANCE = "openai";
|
|
19230
19220
|
var OPENROUTER_API_INSTANCE = "openrouter";
|
|
19231
19221
|
var XAI_API_INSTANCE = "xaiApi";
|
|
@@ -19321,6 +19311,7 @@ var EXCLUSION_NOTES = [
|
|
|
19321
19311
|
"Device pairing, server identity, live leases and runtime files (existing destination identities are preserved).",
|
|
19322
19312
|
"Saved credentials, provider and MCP connections, managed provider login homes and browser login profiles are not transferred. Destination connections are preserved; reconnect on a new device.",
|
|
19323
19313
|
"Downloaded tools and caches; these can be installed again.",
|
|
19314
|
+
"Installed dependency folders (node_modules) and symbolic links inside conversation work folders; reinstall or recreate them in the project.",
|
|
19324
19315
|
"External project folders, CLI login homes, browser session homes, OS keychains, companion devices and other servers.",
|
|
19325
19316
|
"VM/container disk layers and remote cloud data; durable files inside this workspace are included."
|
|
19326
19317
|
];
|
|
@@ -19343,13 +19334,13 @@ function backupRoot(dataDir2) {
|
|
|
19343
19334
|
if (root === parse3(root).root) throw new Error("A filesystem root cannot be a workspace backup target.");
|
|
19344
19335
|
const stat = lstatSync(root);
|
|
19345
19336
|
if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("The workspace data directory must not be a symbolic link.");
|
|
19346
|
-
const path =
|
|
19337
|
+
const path = join2(root, ".backups");
|
|
19347
19338
|
folder(path);
|
|
19348
19339
|
return path;
|
|
19349
19340
|
}
|
|
19350
19341
|
function jobPath(dataDir2, id) {
|
|
19351
19342
|
if (!ID.test(id)) throw new Error("Invalid workspace backup identifier.");
|
|
19352
|
-
const path =
|
|
19343
|
+
const path = join2(backupRoot(dataDir2), id);
|
|
19353
19344
|
if (entryExists(path)) {
|
|
19354
19345
|
const stat = lstatSync(path);
|
|
19355
19346
|
if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("Unsafe workspace backup job directory.");
|
|
@@ -19392,14 +19383,14 @@ function writeJson(path, value) {
|
|
|
19392
19383
|
writeFileAtomic(path, text, { mode: 384 });
|
|
19393
19384
|
}
|
|
19394
19385
|
function assertLocalAuthOutsideSnapshot(dataDir2) {
|
|
19395
|
-
const configPath =
|
|
19396
|
-
const config2 =
|
|
19386
|
+
const configPath = join2(dataDir2, "config.json");
|
|
19387
|
+
const config2 = existsSync(configPath) ? privateJson(configPath) : {};
|
|
19397
19388
|
const instances = record2(config2) && record2(config2.instances) ? config2.instances : {};
|
|
19398
19389
|
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"];
|
|
19399
19390
|
const check2 = (value, field, home) => {
|
|
19400
19391
|
if (typeof value !== "string" || !value.trim()) return;
|
|
19401
19392
|
const text = value.trim();
|
|
19402
|
-
const expanded = text.startsWith("~/") || text.startsWith("~\\") ?
|
|
19393
|
+
const expanded = text.startsWith("~/") || text.startsWith("~\\") ? join2(home, text.slice(2)) : text;
|
|
19403
19394
|
const resolved = resolve(expanded);
|
|
19404
19395
|
const exists = entryExists(resolved);
|
|
19405
19396
|
const path = relative(exists ? realpathSync(dataDir2) : resolve(dataDir2), exists ? realpathSync(resolved) : resolved).replaceAll("\\", "/");
|
|
@@ -19477,7 +19468,7 @@ function hashFile(path) {
|
|
|
19477
19468
|
}
|
|
19478
19469
|
}
|
|
19479
19470
|
function countJsonArray(path) {
|
|
19480
|
-
if (!
|
|
19471
|
+
if (!existsSync(path)) return 0;
|
|
19481
19472
|
const value = privateJson(path);
|
|
19482
19473
|
if (!Array.isArray(value)) throw new Error("A workspace roster is not a valid JSON array.");
|
|
19483
19474
|
const ids = /* @__PURE__ */ new Set();
|
|
@@ -19490,7 +19481,7 @@ function countJsonArray(path) {
|
|
|
19490
19481
|
return value.length;
|
|
19491
19482
|
}
|
|
19492
19483
|
function databaseCounts(path) {
|
|
19493
|
-
if (!
|
|
19484
|
+
if (!existsSync(path)) return { threads: 0, messages: 0 };
|
|
19494
19485
|
const db = new DatabaseSync(path, { readOnly: true });
|
|
19495
19486
|
try {
|
|
19496
19487
|
const check2 = db.prepare("PRAGMA quick_check").all();
|
|
@@ -19509,27 +19500,29 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
|
|
|
19509
19500
|
const salt = randomBytes(16);
|
|
19510
19501
|
const key = await passwordKey(options2.password, salt);
|
|
19511
19502
|
const job = newJob(dataDir2, jobId2);
|
|
19512
|
-
const snapshot =
|
|
19513
|
-
folder(
|
|
19503
|
+
const snapshot = join2(job.directory, "snapshot");
|
|
19504
|
+
folder(join2(snapshot, "data"));
|
|
19514
19505
|
const entries = [];
|
|
19515
19506
|
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];
|
|
19516
19507
|
let bytes = 0;
|
|
19517
19508
|
let skippedLinks = 0;
|
|
19509
|
+
let skippedDependencies = 0;
|
|
19510
|
+
let skippedWorkLinks = 0;
|
|
19518
19511
|
try {
|
|
19519
19512
|
const root = realpathSync(dataDir2);
|
|
19520
|
-
const sourceDb =
|
|
19521
|
-
if (
|
|
19513
|
+
const sourceDb = join2(root, "messages.db");
|
|
19514
|
+
if (existsSync(sourceDb)) {
|
|
19522
19515
|
if (lstatSync(sourceDb).isSymbolicLink()) throw new Error("The message database must not be a symbolic link.");
|
|
19523
19516
|
const db = new DatabaseSync(sourceDb, { readOnly: true });
|
|
19524
19517
|
const completionPulse = setInterval(() => {
|
|
19525
19518
|
}, 25);
|
|
19526
19519
|
try {
|
|
19527
|
-
await backup(db,
|
|
19520
|
+
await backup(db, join2(snapshot, "messages-snapshot.db"));
|
|
19528
19521
|
} finally {
|
|
19529
19522
|
clearInterval(completionPulse);
|
|
19530
19523
|
db.close();
|
|
19531
19524
|
}
|
|
19532
|
-
const snapshotDb = new DatabaseSync(
|
|
19525
|
+
const snapshotDb = new DatabaseSync(join2(snapshot, "messages-snapshot.db"));
|
|
19533
19526
|
try {
|
|
19534
19527
|
snapshotDb.exec("PRAGMA journal_mode = DELETE");
|
|
19535
19528
|
} finally {
|
|
@@ -19543,8 +19536,16 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
|
|
|
19543
19536
|
if (excludedWorkspaceAuthPath(path2) || ephemeralWorkspaceTokenPath(path2) || redownloadedOrgLibraryPath(path2)) continue;
|
|
19544
19537
|
if (forbiddenArchivePath(path2)) throw new Error("A workspace filename conflicts with a protected authentication or runtime path.");
|
|
19545
19538
|
if (!validRelative(path2)) throw new Error("A workspace filename cannot be safely restored on supported platforms.");
|
|
19546
|
-
const source =
|
|
19539
|
+
const source = join2(directory, name);
|
|
19547
19540
|
const stat = lstatSync(source);
|
|
19541
|
+
if (name === "node_modules" && (stat.isDirectory() || stat.isSymbolicLink())) {
|
|
19542
|
+
skippedDependencies++;
|
|
19543
|
+
continue;
|
|
19544
|
+
}
|
|
19545
|
+
if (stat.isSymbolicLink() && path2.startsWith("task-workspaces/")) {
|
|
19546
|
+
skippedWorkLinks++;
|
|
19547
|
+
continue;
|
|
19548
|
+
}
|
|
19548
19549
|
if (stat.isSymbolicLink()) {
|
|
19549
19550
|
let target;
|
|
19550
19551
|
try {
|
|
@@ -19563,7 +19564,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
|
|
|
19563
19564
|
continue;
|
|
19564
19565
|
}
|
|
19565
19566
|
if (entries.length >= MAX_WORKSPACE_BACKUP_FILES) throw new Error("The workspace exceeds the 100,000-entry backup limit.");
|
|
19566
|
-
const destination =
|
|
19567
|
+
const destination = join2(snapshot, "data", path2);
|
|
19567
19568
|
if (stat.isDirectory()) {
|
|
19568
19569
|
folder(destination);
|
|
19569
19570
|
entries.push({ path: path2, type: "directory", size: 0, mode: 448 });
|
|
@@ -19581,7 +19582,7 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
|
|
|
19581
19582
|
writeJson(destination, value);
|
|
19582
19583
|
}
|
|
19583
19584
|
copied = { size: lstatSync(destination).size, mode: 384, sha256: hashFile(destination) };
|
|
19584
|
-
} else copied = copyRegular(path2 === "messages.db" ?
|
|
19585
|
+
} else copied = copyRegular(path2 === "messages.db" ? join2(snapshot, "messages-snapshot.db") : source, destination);
|
|
19585
19586
|
bytes += copied.size;
|
|
19586
19587
|
if (bytes > MAX_WORKSPACE_BACKUP_BYTES) throw new Error("The workspace exceeds the 10 GB backup limit.");
|
|
19587
19588
|
entries.push({ path: path2, type: "file", ...copied });
|
|
@@ -19590,6 +19591,8 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
|
|
|
19590
19591
|
};
|
|
19591
19592
|
walk(root);
|
|
19592
19593
|
if (skippedLinks) warnings.push(`${skippedLinks} managed skill discovery link(s) were omitted and are recreated by the app.`);
|
|
19594
|
+
if (skippedDependencies) warnings.push(`${skippedDependencies} installed dependency folder(s) (node_modules) were omitted; reinstall them in the project after restoring.`);
|
|
19595
|
+
if (skippedWorkLinks) warnings.push(`${skippedWorkLinks} symbolic link(s) in conversation work folders were omitted; what they point to is outside this backup.`);
|
|
19593
19596
|
const summary = {
|
|
19594
19597
|
format: "openmaus.workspace-backup",
|
|
19595
19598
|
version: 1,
|
|
@@ -19599,9 +19602,9 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
|
|
|
19599
19602
|
files: entries.filter((entry) => entry.type === "file").length,
|
|
19600
19603
|
directories: entries.filter((entry) => entry.type === "directory").length,
|
|
19601
19604
|
bytes,
|
|
19602
|
-
bots: countJsonArray(
|
|
19603
|
-
groups: countJsonArray(
|
|
19604
|
-
...databaseCounts(
|
|
19605
|
+
bots: countJsonArray(join2(snapshot, "data", "bots.json")),
|
|
19606
|
+
groups: countJsonArray(join2(snapshot, "data", "groups.json")),
|
|
19607
|
+
...databaseCounts(join2(snapshot, "data", "messages.db")),
|
|
19605
19608
|
exclusions: EXCLUSION_NOTES,
|
|
19606
19609
|
warnings
|
|
19607
19610
|
};
|
|
@@ -19611,9 +19614,9 @@ async function createWorkspaceBackupSnapshot(dataDir2, options2, jobId2) {
|
|
|
19611
19614
|
clientState: options2.clientState ?? {},
|
|
19612
19615
|
entries
|
|
19613
19616
|
};
|
|
19614
|
-
writeJson(
|
|
19615
|
-
validateManifest(privateJson(
|
|
19616
|
-
const path =
|
|
19617
|
+
writeJson(join2(snapshot, "manifest.json"), manifest);
|
|
19618
|
+
validateManifest(privateJson(join2(snapshot, "manifest.json")));
|
|
19619
|
+
const path = join2(job.directory, "workspace.ombbackup");
|
|
19617
19620
|
const iv = randomBytes(12);
|
|
19618
19621
|
const header = Buffer.concat([MAGIC, salt, iv]);
|
|
19619
19622
|
const cipher = createCipheriv("aes-256-gcm", key, iv);
|
|
@@ -14598,6 +14598,7 @@ var SPAWNED_PROXIES = {
|
|
|
14598
14598
|
dweb: resolveProxy("drivers/dweb-proxy"),
|
|
14599
14599
|
connectors: resolveProxy("connector-proxy"),
|
|
14600
14600
|
mcpGate: resolveProxy("mcp-gate"),
|
|
14601
|
+
mcpRemote: resolveProxy("mcp-remote-proxy"),
|
|
14601
14602
|
phone: resolveProxy("drivers/phone-proxy"),
|
|
14602
14603
|
hook: resolveProxy("hooks/omb-hook"),
|
|
14603
14604
|
// Loaded by the external `pi` process via `-e`, not by this server — but
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{U as a,C as n}from"./mermaid.core-CF1zwoQ-.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
|