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
|
@@ -90,6 +90,9 @@ function nvmBinDirs() {
|
|
|
90
90
|
return [];
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
|
+
function sealedFixture() {
|
|
94
|
+
return process.env.OMB_TEST_SEALED_PATH === "1";
|
|
95
|
+
}
|
|
93
96
|
function knownDirs() {
|
|
94
97
|
const home = homedir();
|
|
95
98
|
return [
|
|
@@ -105,10 +108,13 @@ function knownDirs() {
|
|
|
105
108
|
// opencode installer
|
|
106
109
|
join(home, ".claude", "local"),
|
|
107
110
|
// claude "local install"
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
111
|
+
// Machine-wide rather than under the (possibly temporary) home.
|
|
112
|
+
...sealedFixture() ? [] : [
|
|
113
|
+
"/opt/homebrew/bin",
|
|
114
|
+
// brew, Apple silicon
|
|
115
|
+
"/usr/local/bin"
|
|
116
|
+
// brew Intel / classic installs
|
|
117
|
+
],
|
|
112
118
|
join(home, ".volta", "bin"),
|
|
113
119
|
join(home, ".bun", "bin"),
|
|
114
120
|
join(home, ".asdf", "shims"),
|
|
@@ -160,7 +166,7 @@ function augmentedPath() {
|
|
|
160
166
|
...(process.platform === "win32" ? windowsKnownDirs() : knownDirs()).filter((d) => existsSync(d))
|
|
161
167
|
]);
|
|
162
168
|
}
|
|
163
|
-
if (!probed && !process.env.VITEST && process.platform !== "win32") {
|
|
169
|
+
if (!probed && !process.env.VITEST && !sealedFixture() && process.platform !== "win32") {
|
|
164
170
|
probed = true;
|
|
165
171
|
probeLoginShellPath();
|
|
166
172
|
}
|
|
@@ -184,6 +190,119 @@ function probeLoginShellPath() {
|
|
|
184
190
|
}
|
|
185
191
|
);
|
|
186
192
|
}
|
|
193
|
+
function splitCliString(cli) {
|
|
194
|
+
const out = [];
|
|
195
|
+
let cur = "";
|
|
196
|
+
let quote = null;
|
|
197
|
+
for (const ch of cli.trim()) {
|
|
198
|
+
if (quote) {
|
|
199
|
+
if (ch === quote) quote = null;
|
|
200
|
+
else cur += ch;
|
|
201
|
+
} else if (ch === '"' || ch === "'") {
|
|
202
|
+
quote = ch;
|
|
203
|
+
} else if (/\s/.test(ch)) {
|
|
204
|
+
if (cur) out.push(cur);
|
|
205
|
+
cur = "";
|
|
206
|
+
} else {
|
|
207
|
+
cur += ch;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (cur) out.push(cur);
|
|
211
|
+
return out;
|
|
212
|
+
}
|
|
213
|
+
function isFile(p2) {
|
|
214
|
+
try {
|
|
215
|
+
return statSync(p2, { throwIfNoEntry: false })?.isFile() ?? false;
|
|
216
|
+
} catch {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function whichWin(cli, env) {
|
|
221
|
+
const exts = ((env ?? process.env).PATHEXT ?? ".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean);
|
|
222
|
+
const probe = (base) => {
|
|
223
|
+
const order = extname(base) ? [base, ...exts.map((e) => base + e)] : [...exts.map((e) => base + e), base];
|
|
224
|
+
return order.find(isFile) ?? null;
|
|
225
|
+
};
|
|
226
|
+
if (/[\\/]/.test(cli) || /^[a-zA-Z]:/.test(cli)) return probe(cli);
|
|
227
|
+
const path = env ? env.PATH ?? env.Path ?? "" : augmentedPath();
|
|
228
|
+
for (const dir of path.split(delimiter)) {
|
|
229
|
+
if (!dir) continue;
|
|
230
|
+
const hit = probe(join(dir, cli));
|
|
231
|
+
if (hit) return hit;
|
|
232
|
+
}
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
function nodeExe(near, env) {
|
|
236
|
+
const local = join(near, "node.exe");
|
|
237
|
+
if (isFile(local)) return local;
|
|
238
|
+
const onPath = whichWin("node.exe", env);
|
|
239
|
+
if (onPath && extname(onPath).toLowerCase() === ".exe") return onPath;
|
|
240
|
+
return process.versions.electron ? null : process.execPath;
|
|
241
|
+
}
|
|
242
|
+
function parseCmdShim(shim, env) {
|
|
243
|
+
let text;
|
|
244
|
+
try {
|
|
245
|
+
text = readFileSync(shim, "utf8");
|
|
246
|
+
} catch {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
const dir = dirname(shim);
|
|
250
|
+
const npmEntry = /^SET "NP[MX]_CLI_JS=%~dp0\\([^"]+)"/im.exec(text);
|
|
251
|
+
const targets = [...npmEntry ? [npmEntry] : [], ...text.matchAll(/"%~?dp0%?\\?([^"]+)"/g)].map((m2) => join(dir, m2[1])).filter((p2) => isFile(p2) && basename(p2).toLowerCase() !== "node.exe");
|
|
252
|
+
const script = targets.find((p2) => /\.[cm]?js$/i.test(p2));
|
|
253
|
+
if (script) {
|
|
254
|
+
const node = nodeExe(dir, env);
|
|
255
|
+
if (node) return { command: node, args: [script] };
|
|
256
|
+
}
|
|
257
|
+
const exe = targets.find((p2) => extname(p2).toLowerCase() === ".exe");
|
|
258
|
+
return exe ? { command: exe, args: [] } : null;
|
|
259
|
+
}
|
|
260
|
+
function parseNodeShebang(file2, env) {
|
|
261
|
+
let head = "";
|
|
262
|
+
let fd = null;
|
|
263
|
+
try {
|
|
264
|
+
fd = openSync(file2, "r");
|
|
265
|
+
const buf = Buffer.alloc(128);
|
|
266
|
+
const n = readSync(fd, buf, 0, buf.length, 0);
|
|
267
|
+
head = buf.subarray(0, n).toString("utf8").split("\n", 1)[0];
|
|
268
|
+
} catch {
|
|
269
|
+
return null;
|
|
270
|
+
} finally {
|
|
271
|
+
if (fd !== null) {
|
|
272
|
+
try {
|
|
273
|
+
closeSync(fd);
|
|
274
|
+
} catch {
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
if (!/^#!.*\bnode(\.exe)?\b/.test(head)) return null;
|
|
279
|
+
const node = nodeExe(dirname(file2), env);
|
|
280
|
+
return node ? { command: node, args: [file2] } : null;
|
|
281
|
+
}
|
|
282
|
+
function resolveWord(cli, args2, env) {
|
|
283
|
+
if (process.platform !== "win32") return { command: cli, args: args2 };
|
|
284
|
+
const file2 = whichWin(cli, env);
|
|
285
|
+
if (!file2) return { command: cli, args: args2 };
|
|
286
|
+
const ext = extname(file2).toLowerCase();
|
|
287
|
+
if (ext === ".cmd" || ext === ".bat") {
|
|
288
|
+
const direct = parseCmdShim(file2, env);
|
|
289
|
+
return direct ? { command: direct.command, args: [...direct.args, ...args2] } : { command: file2, args: args2 };
|
|
290
|
+
}
|
|
291
|
+
if (ext === ".exe" || ext === ".com") return { command: file2, args: args2 };
|
|
292
|
+
const viaNode = parseNodeShebang(file2, env);
|
|
293
|
+
return viaNode ? { command: viaNode.command, args: [...viaNode.args, ...args2] } : { command: file2, args: args2 };
|
|
294
|
+
}
|
|
295
|
+
function resolveCliSpawn(cli, args2, env) {
|
|
296
|
+
const trimmed = cli.trim();
|
|
297
|
+
if (trimmed.includes(" ") && existsSync(trimmed)) return resolveWord(trimmed, args2, env);
|
|
298
|
+
const split = splitCliString(cli);
|
|
299
|
+
if (split.length > 1 || split[0] !== trimmed) {
|
|
300
|
+
const [head, ...fixed] = split;
|
|
301
|
+
if (!head) return { command: cli, args: args2 };
|
|
302
|
+
return resolveWord(head, [...fixed, ...args2], env);
|
|
303
|
+
}
|
|
304
|
+
return resolveWord(cli, args2, env);
|
|
305
|
+
}
|
|
187
306
|
|
|
188
307
|
// server/mcp-tool-schema.ts
|
|
189
308
|
var ROOT_COMBINATORS = ["anyOf", "oneOf", "allOf", "not"];
|
|
@@ -407,9 +526,11 @@ function createMcpBridgeInterceptor(options) {
|
|
|
407
526
|
};
|
|
408
527
|
}
|
|
409
528
|
function runMcpBridge(options) {
|
|
410
|
-
const
|
|
529
|
+
const env = options.env ?? { ...process.env, PATH: augmentedPath() };
|
|
530
|
+
const { command, args: args2 } = resolveCliSpawn(options.command, options.args, env);
|
|
531
|
+
const child = spawn(command, args2, {
|
|
411
532
|
shell: false,
|
|
412
|
-
env
|
|
533
|
+
env,
|
|
413
534
|
stdio: ["pipe", "pipe", "pipe"]
|
|
414
535
|
});
|
|
415
536
|
child.stdin.on("error", () => {
|
|
@@ -503,7 +624,7 @@ import { promisify } from "node:util";
|
|
|
503
624
|
|
|
504
625
|
// server/config.ts
|
|
505
626
|
import { homedir as homedir2 } from "node:os";
|
|
506
|
-
import { join as
|
|
627
|
+
import { join as join3 } from "node:path";
|
|
507
628
|
|
|
508
629
|
// node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
|
|
509
630
|
var external_exports = {};
|
|
@@ -16008,26 +16129,109 @@ var stdioEntrySchema = external_exports.object({
|
|
|
16008
16129
|
var stdioMutationSchema = stdioEntrySchema.extend({
|
|
16009
16130
|
env: external_exports.record(external_exports.string(), external_exports.union([external_exports.string().max(16384), external_exports.literal(true)])).optional()
|
|
16010
16131
|
});
|
|
16132
|
+
var CLIENT_ID = /^[\x20-\x7e]+$/;
|
|
16133
|
+
var SCOPE = /^[\x21\x23-\x5b\x5d-\x7e]+$/;
|
|
16134
|
+
var CLIENT_SECRET_MAX = 4096;
|
|
16135
|
+
var oauthClientSchema = external_exports.object({
|
|
16136
|
+
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."),
|
|
16137
|
+
clientSecret: external_exports.string().min(1).max(CLIENT_SECRET_MAX).regex(CLIENT_ID, "A client secret is printable text on one line.").optional(),
|
|
16138
|
+
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()
|
|
16139
|
+
}).strict();
|
|
16011
16140
|
var remoteEntrySchema = external_exports.object({
|
|
16012
16141
|
/** Streamable HTTP unless the entry says the older SSE transport. */
|
|
16013
16142
|
type: external_exports.enum(["http", "sse"]).optional(),
|
|
16014
16143
|
url: external_exports.string().trim().min(1).max(2048),
|
|
16015
16144
|
headers: external_exports.record(external_exports.string(), external_exports.string().max(16384)).optional(),
|
|
16145
|
+
oauth: oauthClientSchema.optional(),
|
|
16016
16146
|
enabled: external_exports.boolean().optional()
|
|
16017
16147
|
}).strict();
|
|
16018
16148
|
var remoteMutationSchema = remoteEntrySchema.extend({
|
|
16019
|
-
headers: external_exports.record(external_exports.string(), external_exports.union([external_exports.string().max(16384), external_exports.literal(true)])).optional()
|
|
16149
|
+
headers: external_exports.record(external_exports.string(), external_exports.union([external_exports.string().max(16384), external_exports.literal(true)])).optional(),
|
|
16150
|
+
oauth: oauthClientSchema.extend({
|
|
16151
|
+
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()
|
|
16152
|
+
}).optional()
|
|
16020
16153
|
});
|
|
16021
16154
|
|
|
16022
16155
|
// server/cloud-overflow.ts
|
|
16023
16156
|
var CLOUD_SEAT_IDLE_STOP_MS = 5 * 6e4;
|
|
16024
16157
|
var CLOUD_SEAT_SLEEP_RETRY_MAX_MS = 10 * 6e4;
|
|
16025
16158
|
|
|
16159
|
+
// server/proxy-paths.ts
|
|
16160
|
+
import { existsSync as existsSync2 } from "node:fs";
|
|
16161
|
+
import { dirname as dirname2, join as join2 } from "node:path";
|
|
16162
|
+
import { fileURLToPath } from "node:url";
|
|
16163
|
+
var SERVER_ROOT = dirname2(fileURLToPath(import.meta.url));
|
|
16164
|
+
function resolveProxy(relative) {
|
|
16165
|
+
const source = join2(SERVER_ROOT, `${relative}.ts`);
|
|
16166
|
+
return existsSync2(source) ? source : join2(SERVER_ROOT, `${relative}.js`);
|
|
16167
|
+
}
|
|
16168
|
+
var SPAWNED_PROXIES = {
|
|
16169
|
+
browser: resolveProxy("browser-proxy"),
|
|
16170
|
+
localComputer: resolveProxy("local-computer-proxy"),
|
|
16171
|
+
permission: resolveProxy("permission-proxy"),
|
|
16172
|
+
containerMcp: resolveProxy("container-mcp"),
|
|
16173
|
+
vpsContainerMcp: resolveProxy("vps-container-mcp"),
|
|
16174
|
+
agents: resolveProxy("drivers/agents-proxy"),
|
|
16175
|
+
dweb: resolveProxy("drivers/dweb-proxy"),
|
|
16176
|
+
connectors: resolveProxy("connector-proxy"),
|
|
16177
|
+
mcpGate: resolveProxy("mcp-gate"),
|
|
16178
|
+
phone: resolveProxy("drivers/phone-proxy"),
|
|
16179
|
+
hook: resolveProxy("hooks/omb-hook"),
|
|
16180
|
+
// Loaded by the external `pi` process via `-e`, not by this server — but
|
|
16181
|
+
// resolved through the same single source of truth so the packaged layout
|
|
16182
|
+
// check can assert it ships.
|
|
16183
|
+
piMcpExtension: resolveProxy("drivers/pi-mcp-extension")
|
|
16184
|
+
};
|
|
16185
|
+
|
|
16186
|
+
// server/enterprise.ts
|
|
16187
|
+
var layerSchema = external_exports.object({
|
|
16188
|
+
customer: external_exports.string().min(1),
|
|
16189
|
+
features: external_exports.array(external_exports.string().min(1)),
|
|
16190
|
+
expiresAt: external_exports.string().nullable()
|
|
16191
|
+
});
|
|
16192
|
+
var DAY_MS = 24 * 60 * 6e4;
|
|
16193
|
+
|
|
16194
|
+
// server/sessions.ts
|
|
16195
|
+
var PAIRING_CODE_TTL_MS = 5 * 6e4;
|
|
16196
|
+
function daysMs(value, fallbackDays) {
|
|
16197
|
+
const days = Number(value);
|
|
16198
|
+
const ok = Number.isInteger(days) && days >= 1 && days <= 3650;
|
|
16199
|
+
return (ok ? days : fallbackDays) * 24 * 60 * 6e4;
|
|
16200
|
+
}
|
|
16201
|
+
var SESSION_TTL_MS = daysMs(process.env.OMB_SESSION_TTL_DAYS, 30);
|
|
16202
|
+
var SESSION_MAX_AGE_MS = daysMs(process.env.OMB_SESSION_MAX_DAYS, 180);
|
|
16203
|
+
var SESSION_RENEW_WHEN_LEFT_MS = SESSION_TTL_MS / 2;
|
|
16204
|
+
var STREAM_TICKET_TTL_MS = 5 * 6e4;
|
|
16205
|
+
var scopeSchema = external_exports.enum(["admin", "client"]);
|
|
16206
|
+
var sessionSchema = external_exports.object({
|
|
16207
|
+
id: external_exports.string().min(1),
|
|
16208
|
+
tokenHash: external_exports.string().length(64),
|
|
16209
|
+
label: external_exports.string().max(80),
|
|
16210
|
+
scopes: external_exports.array(scopeSchema).min(1),
|
|
16211
|
+
createdAt: external_exports.number(),
|
|
16212
|
+
lastSeenAt: external_exports.number(),
|
|
16213
|
+
expiresAt: external_exports.number(),
|
|
16214
|
+
/** Set when the session came from an account sign-in rather than a code. */
|
|
16215
|
+
userId: external_exports.string().max(256).optional(),
|
|
16216
|
+
email: external_exports.string().max(320).optional(),
|
|
16217
|
+
/** Set only by the internal verified-portal issuance path, never by email or pairing input. */
|
|
16218
|
+
membershipAuthority: external_exports.literal("portal").optional(),
|
|
16219
|
+
/** A browser sign-in (PairingCode `browser`): accepted only as its browser's cookie, never as a bearer token. */
|
|
16220
|
+
cookieOnly: external_exports.literal(true).optional(),
|
|
16221
|
+
/** Whose OMB Cloud a browser sign-in signed in to (its PairingCode `owner`). */
|
|
16222
|
+
owner: external_exports.string().max(254).optional()
|
|
16223
|
+
});
|
|
16224
|
+
var fileSchema = external_exports.object({ version: external_exports.literal(1), sessions: external_exports.array(sessionSchema) });
|
|
16225
|
+
|
|
16226
|
+
// server/cloud-home.ts
|
|
16227
|
+
var CLOUD_PAIRING_NONCE_MS = 10 * 6e4;
|
|
16228
|
+
|
|
16026
16229
|
// server/config.ts
|
|
16027
16230
|
var optionalText = external_exports.string().optional();
|
|
16028
16231
|
var SSH_ALIAS = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
|
|
16029
16232
|
var LEGACY_BROWSER_PROFILE_ID = /^[A-Za-z0-9_-]{1,40}$/;
|
|
16030
16233
|
var BROWSER_PROFILE_ID = /^[a-z0-9_-]{1,40}$/;
|
|
16234
|
+
var FISH_TTS_MODELS = ["s2.1-pro", "s2.1-pro-free"];
|
|
16031
16235
|
var MIN_ROOM_TURN_TIMEOUT_MINUTES = 1;
|
|
16032
16236
|
var MAX_ROOM_TURN_TIMEOUT_MINUTES = 1440;
|
|
16033
16237
|
var DEFAULT_ROOM_HANDOFF_LIFETIME_MINUTES = 30;
|
|
@@ -16038,6 +16242,8 @@ var MIN_THREAD_EVENT_LOG_BYTES = 256 * 1024;
|
|
|
16038
16242
|
var MAX_THREAD_EVENT_LOG_BYTES = 4 * 1024 * 1024 * 1024;
|
|
16039
16243
|
var MIN_LOCAL_VM_MAX_INSTANCES = 1;
|
|
16040
16244
|
var MAX_LOCAL_VM_MAX_INSTANCES = 8;
|
|
16245
|
+
var MIN_LOCAL_VM_IDLE_TIMEOUT_MINUTES = 5;
|
|
16246
|
+
var MAX_LOCAL_VM_IDLE_TIMEOUT_MINUTES = 1440;
|
|
16041
16247
|
function isValidSshAlias(value) {
|
|
16042
16248
|
return typeof value === "string" && SSH_ALIAS.test(value);
|
|
16043
16249
|
}
|
|
@@ -16075,7 +16281,8 @@ var roomConfigSchema = external_exports.object({
|
|
|
16075
16281
|
);
|
|
16076
16282
|
var localVmConfigSchema = external_exports.object({
|
|
16077
16283
|
mode: external_exports.enum(["shared", "per-bot", "pool"]).optional(),
|
|
16078
|
-
maxInstances: external_exports.number().int().min(MIN_LOCAL_VM_MAX_INSTANCES).max(MAX_LOCAL_VM_MAX_INSTANCES).optional()
|
|
16284
|
+
maxInstances: external_exports.number().int().min(MIN_LOCAL_VM_MAX_INSTANCES).max(MAX_LOCAL_VM_MAX_INSTANCES).optional(),
|
|
16285
|
+
idleTimeoutMinutes: external_exports.number().int().min(MIN_LOCAL_VM_IDLE_TIMEOUT_MINUTES).max(MAX_LOCAL_VM_IDLE_TIMEOUT_MINUTES).optional()
|
|
16079
16286
|
});
|
|
16080
16287
|
var browserProfileSchema = external_exports.object({
|
|
16081
16288
|
// "guest" is the throwaway session's reserved id, never a saved profile
|
|
@@ -16234,7 +16441,11 @@ var onboardingConfigSchema = external_exports.object({
|
|
|
16234
16441
|
/** Which welcome flow was completed; a newer flow may re-show itself. */
|
|
16235
16442
|
version: external_exports.number().int().min(0).max(1e3).optional(),
|
|
16236
16443
|
reelSeen: external_exports.boolean().optional(),
|
|
16237
|
-
hintsSeen: external_exports.array(external_exports.string().trim().min(1).max(60)).max(100).optional()
|
|
16444
|
+
hintsSeen: external_exports.array(external_exports.string().trim().min(1).max(60)).max(100).optional(),
|
|
16445
|
+
/** OMB Cloud home only: when a bot's turn first finished on this machine
|
|
16446
|
+
* (cloud-home.ts firstCloudTurnPatch). Written by the server, read by the
|
|
16447
|
+
* Cloud's setup checklist. */
|
|
16448
|
+
firstTurnAt: external_exports.string().trim().max(40).optional()
|
|
16238
16449
|
}).strict();
|
|
16239
16450
|
var instanceConfigSchema = external_exports.object({
|
|
16240
16451
|
driver: external_exports.string().min(1),
|
|
@@ -16246,6 +16457,7 @@ var instanceConfigSchema = external_exports.object({
|
|
|
16246
16457
|
]).optional(),
|
|
16247
16458
|
environment: external_exports.record(external_exports.string(), external_exports.string()).optional(),
|
|
16248
16459
|
enabled: external_exports.boolean().optional(),
|
|
16460
|
+
access: external_exports.enum(["subscription", "custom", "api"]).optional(),
|
|
16249
16461
|
config: external_exports.json().optional()
|
|
16250
16462
|
});
|
|
16251
16463
|
var instanceConfigMapSchema = external_exports.record(external_exports.string(), instanceConfigSchema);
|
|
@@ -16307,7 +16519,12 @@ var appConfigSchema = external_exports.object({
|
|
|
16307
16519
|
/** Anthropic API key for Claude Code billed per token, handed only to
|
|
16308
16520
|
* Claude instances; `url` only for a proxy or a test double. Never a
|
|
16309
16521
|
* personal-login OAuth token. */
|
|
16310
|
-
anthropic: external_exports.object({ key: optionalText, url: optionalText }).optional(),
|
|
16522
|
+
anthropic: external_exports.object({ key: optionalText, url: optionalText, everyClaudeBot: external_exports.boolean().optional() }).optional(),
|
|
16523
|
+
/** OpenAI's own API key, for the `openai` instance only. Codex keeps its
|
|
16524
|
+
* own ChatGPT or API login and never reads this. */
|
|
16525
|
+
openai: external_exports.object({ key: optionalText }).optional(),
|
|
16526
|
+
/** OpenRouter key, for the `openrouter` instance only. */
|
|
16527
|
+
openrouter: external_exports.object({ key: optionalText }).optional(),
|
|
16311
16528
|
/** Monthly spend limit for the whole workspace, against the cost engines
|
|
16312
16529
|
* report to the usage ledger. Enforced only with the `budgets` entitlement. */
|
|
16313
16530
|
budgets: external_exports.object({
|
|
@@ -16341,8 +16558,8 @@ var appConfigSchema = external_exports.object({
|
|
|
16341
16558
|
opencodeGo: external_exports.object({ apiKey: optionalText }).optional(),
|
|
16342
16559
|
/** Voice settings and the selected voice id. `provider` picks the
|
|
16343
16560
|
* engine: "elevenlabs" (default; needs `key`), "fish" (needs its own
|
|
16344
|
-
* `fishKey`), "system" (the Mac's
|
|
16345
|
-
* "xai" (Grok TTS, reusing `xai.key`), or
|
|
16561
|
+
* `fishKey`; `fishModel` picks its speech model), "system" (the Mac's
|
|
16562
|
+
* built-in voices, no key), "xai" (Grok TTS, reusing `xai.key`), or
|
|
16346
16563
|
* "chatterbox" (a local OpenAI-compatible Chatterbox server; `baseUrl`
|
|
16347
16564
|
* and `model` are settings, not secrets). Cloud keys stay separate so
|
|
16348
16565
|
* switching providers never overwrites or misuses the other key. */
|
|
@@ -16352,7 +16569,21 @@ var appConfigSchema = external_exports.object({
|
|
|
16352
16569
|
voice: optionalText,
|
|
16353
16570
|
provider: external_exports.enum(["elevenlabs", "fish", "system", "chatterbox", "xai"]).optional(),
|
|
16354
16571
|
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(),
|
|
16355
|
-
model: optionalText
|
|
16572
|
+
model: optionalText,
|
|
16573
|
+
fishModel: external_exports.enum(FISH_TTS_MODELS).optional()
|
|
16574
|
+
}).optional(),
|
|
16575
|
+
/** The decision model (server/decider): a fast classifier that picks
|
|
16576
|
+
* things for bots, starting with who answers a room message. `key` is
|
|
16577
|
+
* write-only like every credential; `baseUrl` points at a Jev-compatible
|
|
16578
|
+
* server instead of TypeSafe's (an operator setting with no UI); `jobs`
|
|
16579
|
+
* switches each decision on or off. Not `decisions`: that section is the
|
|
16580
|
+
* authorization log's retention. */
|
|
16581
|
+
decider: external_exports.object({
|
|
16582
|
+
enabled: external_exports.boolean().optional(),
|
|
16583
|
+
provider: external_exports.enum(["jev", "off"]).optional(),
|
|
16584
|
+
key: optionalText,
|
|
16585
|
+
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(),
|
|
16586
|
+
jobs: external_exports.object({ roomRouting: external_exports.boolean().optional() }).optional()
|
|
16356
16587
|
}).optional(),
|
|
16357
16588
|
/** Avatar provider credentials stay separate; choosing a router never reuses a cloud key. */
|
|
16358
16589
|
imageGen: external_exports.object({
|
|
@@ -16423,36 +16654,37 @@ var storedAppConfigSchema = appConfigSchema.extend({
|
|
|
16423
16654
|
var appConfigPatchSchema = appConfigSchema.omit({ instances: true, mcpServers: true, cliStartup: true, customDomain: true }).extend({ threads: threadsPatchSchema.optional(), newBots: newBotsPatchSchema.optional() });
|
|
16424
16655
|
var jsonObjectSchema = external_exports.record(external_exports.string(), external_exports.json());
|
|
16425
16656
|
var DEFAULT_CAPTURE_QUIET_MS = 2 * 6e4;
|
|
16426
|
-
var DATA_DIR = process.env.OMB_DATA_DIR ??
|
|
16427
|
-
var LEGACY_DATA_DIR =
|
|
16428
|
-
var EVENTS_DIR =
|
|
16429
|
-
var NATIVE_DIR =
|
|
16430
|
-
|
|
16431
|
-
|
|
16432
|
-
|
|
16433
|
-
|
|
16434
|
-
|
|
16435
|
-
|
|
16436
|
-
|
|
16437
|
-
|
|
16438
|
-
|
|
16439
|
-
}
|
|
16440
|
-
|
|
16441
|
-
|
|
16442
|
-
|
|
16443
|
-
|
|
16444
|
-
|
|
16445
|
-
|
|
16446
|
-
|
|
16447
|
-
|
|
16448
|
-
|
|
16449
|
-
|
|
16450
|
-
|
|
16451
|
-
|
|
16452
|
-
|
|
16453
|
-
|
|
16454
|
-
|
|
16455
|
-
|
|
16657
|
+
var DATA_DIR = process.env.OMB_DATA_DIR ?? join3(homedir2(), ".openmausbot");
|
|
16658
|
+
var LEGACY_DATA_DIR = join3(homedir2(), ".opengrokbot");
|
|
16659
|
+
var EVENTS_DIR = join3(DATA_DIR, "events");
|
|
16660
|
+
var NATIVE_DIR = join3(DATA_DIR, "native");
|
|
16661
|
+
var OPENAI_API_INSTANCE = "openai";
|
|
16662
|
+
var OPENROUTER_API_INSTANCE = "openrouter";
|
|
16663
|
+
var XAI_API_INSTANCE = "xaiApi";
|
|
16664
|
+
var CLAUDE_API_INSTANCE = "claudeApi";
|
|
16665
|
+
var API_KEY_FLEET = {
|
|
16666
|
+
[OPENAI_API_INSTANCE]: {
|
|
16667
|
+
driver: "openai-compat",
|
|
16668
|
+
displayName: "OpenAI",
|
|
16669
|
+
access: "api",
|
|
16670
|
+
icon: { kind: "preset", preset: "openai" },
|
|
16671
|
+
config: { url: "https://api.openai.com/v1", apiKeyEnv: "OMB_OPENAI_API_KEY", catalog: "openai" }
|
|
16672
|
+
},
|
|
16673
|
+
[CLAUDE_API_INSTANCE]: {
|
|
16674
|
+
driver: "claudeAgent",
|
|
16675
|
+
displayName: "Claude (API key)",
|
|
16676
|
+
access: "api",
|
|
16677
|
+
icon: { kind: "preset", preset: "anthropic" },
|
|
16678
|
+
config: { requireApiKey: true }
|
|
16679
|
+
},
|
|
16680
|
+
[XAI_API_INSTANCE]: { driver: "grok", displayName: "xAI", access: "api", icon: { kind: "preset", preset: "xai" } },
|
|
16681
|
+
[OPENROUTER_API_INSTANCE]: {
|
|
16682
|
+
driver: "openai-compat",
|
|
16683
|
+
displayName: "OpenRouter",
|
|
16684
|
+
access: "api",
|
|
16685
|
+
icon: { kind: "preset", preset: "openrouter" },
|
|
16686
|
+
config: { url: "https://openrouter.ai/api/v1", apiKeyEnv: "OMB_OPENROUTER_API_KEY" }
|
|
16687
|
+
}
|
|
16456
16688
|
};
|
|
16457
16689
|
|
|
16458
16690
|
// server/container-computer.ts
|
|
@@ -16585,6 +16817,7 @@ var CONTAINER_ID = /^[a-f0-9]{12,64}$/i;
|
|
|
16585
16817
|
var LOCK_ACQUIRE_TIMEOUT_MS = 5e3;
|
|
16586
16818
|
var SCREENSHOT_BUDGET_MS = 45e3;
|
|
16587
16819
|
var PREPARATION_LOCK_TIMEOUT_MS = SCREENSHOT_BUDGET_MS + LOCK_ACQUIRE_TIMEOUT_MS;
|
|
16820
|
+
var NATIVE_VIEWER_LIFETIME_MS = 8 * 60 * 6e4;
|
|
16588
16821
|
function vpsDockerArgs(alias2, args2) {
|
|
16589
16822
|
if (!isValidSshAlias(alias2)) {
|
|
16590
16823
|
throw new Error("invalid VPS SSH config alias");
|