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
|
@@ -22,6 +22,9 @@ function nvmBinDirs() {
|
|
|
22
22
|
return [];
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
+
function sealedFixture() {
|
|
26
|
+
return process.env.OMB_TEST_SEALED_PATH === "1";
|
|
27
|
+
}
|
|
25
28
|
function knownDirs() {
|
|
26
29
|
const home = homedir();
|
|
27
30
|
return [
|
|
@@ -37,10 +40,13 @@ function knownDirs() {
|
|
|
37
40
|
// opencode installer
|
|
38
41
|
join(home, ".claude", "local"),
|
|
39
42
|
// claude "local install"
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
// Machine-wide rather than under the (possibly temporary) home.
|
|
44
|
+
...sealedFixture() ? [] : [
|
|
45
|
+
"/opt/homebrew/bin",
|
|
46
|
+
// brew, Apple silicon
|
|
47
|
+
"/usr/local/bin"
|
|
48
|
+
// brew Intel / classic installs
|
|
49
|
+
],
|
|
44
50
|
join(home, ".volta", "bin"),
|
|
45
51
|
join(home, ".bun", "bin"),
|
|
46
52
|
join(home, ".asdf", "shims"),
|
|
@@ -92,7 +98,7 @@ function augmentedPath() {
|
|
|
92
98
|
...(process.platform === "win32" ? windowsKnownDirs() : knownDirs()).filter((d) => existsSync(d))
|
|
93
99
|
]);
|
|
94
100
|
}
|
|
95
|
-
if (!probed && !process.env.VITEST && process.platform !== "win32") {
|
|
101
|
+
if (!probed && !process.env.VITEST && !sealedFixture() && process.platform !== "win32") {
|
|
96
102
|
probed = true;
|
|
97
103
|
probeLoginShellPath();
|
|
98
104
|
}
|
|
@@ -116,10 +122,123 @@ function probeLoginShellPath() {
|
|
|
116
122
|
}
|
|
117
123
|
);
|
|
118
124
|
}
|
|
125
|
+
function splitCliString(cli) {
|
|
126
|
+
const out = [];
|
|
127
|
+
let cur = "";
|
|
128
|
+
let quote = null;
|
|
129
|
+
for (const ch of cli.trim()) {
|
|
130
|
+
if (quote) {
|
|
131
|
+
if (ch === quote) quote = null;
|
|
132
|
+
else cur += ch;
|
|
133
|
+
} else if (ch === '"' || ch === "'") {
|
|
134
|
+
quote = ch;
|
|
135
|
+
} else if (/\s/.test(ch)) {
|
|
136
|
+
if (cur) out.push(cur);
|
|
137
|
+
cur = "";
|
|
138
|
+
} else {
|
|
139
|
+
cur += ch;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (cur) out.push(cur);
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
function isFile(p2) {
|
|
146
|
+
try {
|
|
147
|
+
return statSync(p2, { throwIfNoEntry: false })?.isFile() ?? false;
|
|
148
|
+
} catch {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function whichWin(cli, env) {
|
|
153
|
+
const exts = ((env ?? process.env).PATHEXT ?? ".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean);
|
|
154
|
+
const probe = (base) => {
|
|
155
|
+
const order = extname(base) ? [base, ...exts.map((e) => base + e)] : [...exts.map((e) => base + e), base];
|
|
156
|
+
return order.find(isFile) ?? null;
|
|
157
|
+
};
|
|
158
|
+
if (/[\\/]/.test(cli) || /^[a-zA-Z]:/.test(cli)) return probe(cli);
|
|
159
|
+
const path = env ? env.PATH ?? env.Path ?? "" : augmentedPath();
|
|
160
|
+
for (const dir of path.split(delimiter)) {
|
|
161
|
+
if (!dir) continue;
|
|
162
|
+
const hit = probe(join(dir, cli));
|
|
163
|
+
if (hit) return hit;
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
function nodeExe(near, env) {
|
|
168
|
+
const local = join(near, "node.exe");
|
|
169
|
+
if (isFile(local)) return local;
|
|
170
|
+
const onPath = whichWin("node.exe", env);
|
|
171
|
+
if (onPath && extname(onPath).toLowerCase() === ".exe") return onPath;
|
|
172
|
+
return process.versions.electron ? null : process.execPath;
|
|
173
|
+
}
|
|
174
|
+
function parseCmdShim(shim, env) {
|
|
175
|
+
let text;
|
|
176
|
+
try {
|
|
177
|
+
text = readFileSync(shim, "utf8");
|
|
178
|
+
} catch {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
const dir = dirname(shim);
|
|
182
|
+
const npmEntry = /^SET "NP[MX]_CLI_JS=%~dp0\\([^"]+)"/im.exec(text);
|
|
183
|
+
const targets = [...npmEntry ? [npmEntry] : [], ...text.matchAll(/"%~?dp0%?\\?([^"]+)"/g)].map((m2) => join(dir, m2[1])).filter((p2) => isFile(p2) && basename(p2).toLowerCase() !== "node.exe");
|
|
184
|
+
const script = targets.find((p2) => /\.[cm]?js$/i.test(p2));
|
|
185
|
+
if (script) {
|
|
186
|
+
const node = nodeExe(dir, env);
|
|
187
|
+
if (node) return { command: node, args: [script] };
|
|
188
|
+
}
|
|
189
|
+
const exe = targets.find((p2) => extname(p2).toLowerCase() === ".exe");
|
|
190
|
+
return exe ? { command: exe, args: [] } : null;
|
|
191
|
+
}
|
|
192
|
+
function parseNodeShebang(file2, env) {
|
|
193
|
+
let head = "";
|
|
194
|
+
let fd = null;
|
|
195
|
+
try {
|
|
196
|
+
fd = openSync(file2, "r");
|
|
197
|
+
const buf = Buffer.alloc(128);
|
|
198
|
+
const n = readSync(fd, buf, 0, buf.length, 0);
|
|
199
|
+
head = buf.subarray(0, n).toString("utf8").split("\n", 1)[0];
|
|
200
|
+
} catch {
|
|
201
|
+
return null;
|
|
202
|
+
} finally {
|
|
203
|
+
if (fd !== null) {
|
|
204
|
+
try {
|
|
205
|
+
closeSync(fd);
|
|
206
|
+
} catch {
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (!/^#!.*\bnode(\.exe)?\b/.test(head)) return null;
|
|
211
|
+
const node = nodeExe(dirname(file2), env);
|
|
212
|
+
return node ? { command: node, args: [file2] } : null;
|
|
213
|
+
}
|
|
214
|
+
function resolveWord(cli, args, env) {
|
|
215
|
+
if (process.platform !== "win32") return { command: cli, args };
|
|
216
|
+
const file2 = whichWin(cli, env);
|
|
217
|
+
if (!file2) return { command: cli, args };
|
|
218
|
+
const ext = extname(file2).toLowerCase();
|
|
219
|
+
if (ext === ".cmd" || ext === ".bat") {
|
|
220
|
+
const direct = parseCmdShim(file2, env);
|
|
221
|
+
return direct ? { command: direct.command, args: [...direct.args, ...args] } : { command: file2, args };
|
|
222
|
+
}
|
|
223
|
+
if (ext === ".exe" || ext === ".com") return { command: file2, args };
|
|
224
|
+
const viaNode = parseNodeShebang(file2, env);
|
|
225
|
+
return viaNode ? { command: viaNode.command, args: [...viaNode.args, ...args] } : { command: file2, args };
|
|
226
|
+
}
|
|
227
|
+
function resolveCliSpawn(cli, args, env) {
|
|
228
|
+
const trimmed = cli.trim();
|
|
229
|
+
if (trimmed.includes(" ") && existsSync(trimmed)) return resolveWord(trimmed, args, env);
|
|
230
|
+
const split = splitCliString(cli);
|
|
231
|
+
if (split.length > 1 || split[0] !== trimmed) {
|
|
232
|
+
const [head, ...fixed] = split;
|
|
233
|
+
if (!head) return { command: cli, args };
|
|
234
|
+
return resolveWord(head, [...fixed, ...args], env);
|
|
235
|
+
}
|
|
236
|
+
return resolveWord(cli, args, env);
|
|
237
|
+
}
|
|
119
238
|
|
|
120
239
|
// server/config.ts
|
|
121
240
|
import { homedir as homedir2 } from "node:os";
|
|
122
|
-
import { join as
|
|
241
|
+
import { join as join3 } from "node:path";
|
|
123
242
|
|
|
124
243
|
// node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
|
|
125
244
|
var external_exports = {};
|
|
@@ -15624,26 +15743,109 @@ var stdioEntrySchema = external_exports.object({
|
|
|
15624
15743
|
var stdioMutationSchema = stdioEntrySchema.extend({
|
|
15625
15744
|
env: external_exports.record(external_exports.string(), external_exports.union([external_exports.string().max(16384), external_exports.literal(true)])).optional()
|
|
15626
15745
|
});
|
|
15746
|
+
var CLIENT_ID = /^[\x20-\x7e]+$/;
|
|
15747
|
+
var SCOPE = /^[\x21\x23-\x5b\x5d-\x7e]+$/;
|
|
15748
|
+
var CLIENT_SECRET_MAX = 4096;
|
|
15749
|
+
var oauthClientSchema = external_exports.object({
|
|
15750
|
+
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."),
|
|
15751
|
+
clientSecret: external_exports.string().min(1).max(CLIENT_SECRET_MAX).regex(CLIENT_ID, "A client secret is printable text on one line.").optional(),
|
|
15752
|
+
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()
|
|
15753
|
+
}).strict();
|
|
15627
15754
|
var remoteEntrySchema = external_exports.object({
|
|
15628
15755
|
/** Streamable HTTP unless the entry says the older SSE transport. */
|
|
15629
15756
|
type: external_exports.enum(["http", "sse"]).optional(),
|
|
15630
15757
|
url: external_exports.string().trim().min(1).max(2048),
|
|
15631
15758
|
headers: external_exports.record(external_exports.string(), external_exports.string().max(16384)).optional(),
|
|
15759
|
+
oauth: oauthClientSchema.optional(),
|
|
15632
15760
|
enabled: external_exports.boolean().optional()
|
|
15633
15761
|
}).strict();
|
|
15634
15762
|
var remoteMutationSchema = remoteEntrySchema.extend({
|
|
15635
|
-
headers: external_exports.record(external_exports.string(), external_exports.union([external_exports.string().max(16384), external_exports.literal(true)])).optional()
|
|
15763
|
+
headers: external_exports.record(external_exports.string(), external_exports.union([external_exports.string().max(16384), external_exports.literal(true)])).optional(),
|
|
15764
|
+
oauth: oauthClientSchema.extend({
|
|
15765
|
+
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()
|
|
15766
|
+
}).optional()
|
|
15636
15767
|
});
|
|
15637
15768
|
|
|
15638
15769
|
// server/cloud-overflow.ts
|
|
15639
15770
|
var CLOUD_SEAT_IDLE_STOP_MS = 5 * 6e4;
|
|
15640
15771
|
var CLOUD_SEAT_SLEEP_RETRY_MAX_MS = 10 * 6e4;
|
|
15641
15772
|
|
|
15773
|
+
// server/proxy-paths.ts
|
|
15774
|
+
import { existsSync as existsSync2 } from "node:fs";
|
|
15775
|
+
import { dirname as dirname2, join as join2 } from "node:path";
|
|
15776
|
+
import { fileURLToPath } from "node:url";
|
|
15777
|
+
var SERVER_ROOT = dirname2(fileURLToPath(import.meta.url));
|
|
15778
|
+
function resolveProxy(relative) {
|
|
15779
|
+
const source = join2(SERVER_ROOT, `${relative}.ts`);
|
|
15780
|
+
return existsSync2(source) ? source : join2(SERVER_ROOT, `${relative}.js`);
|
|
15781
|
+
}
|
|
15782
|
+
var SPAWNED_PROXIES = {
|
|
15783
|
+
browser: resolveProxy("browser-proxy"),
|
|
15784
|
+
localComputer: resolveProxy("local-computer-proxy"),
|
|
15785
|
+
permission: resolveProxy("permission-proxy"),
|
|
15786
|
+
containerMcp: resolveProxy("container-mcp"),
|
|
15787
|
+
vpsContainerMcp: resolveProxy("vps-container-mcp"),
|
|
15788
|
+
agents: resolveProxy("drivers/agents-proxy"),
|
|
15789
|
+
dweb: resolveProxy("drivers/dweb-proxy"),
|
|
15790
|
+
connectors: resolveProxy("connector-proxy"),
|
|
15791
|
+
mcpGate: resolveProxy("mcp-gate"),
|
|
15792
|
+
phone: resolveProxy("drivers/phone-proxy"),
|
|
15793
|
+
hook: resolveProxy("hooks/omb-hook"),
|
|
15794
|
+
// Loaded by the external `pi` process via `-e`, not by this server — but
|
|
15795
|
+
// resolved through the same single source of truth so the packaged layout
|
|
15796
|
+
// check can assert it ships.
|
|
15797
|
+
piMcpExtension: resolveProxy("drivers/pi-mcp-extension")
|
|
15798
|
+
};
|
|
15799
|
+
|
|
15800
|
+
// server/enterprise.ts
|
|
15801
|
+
var layerSchema = external_exports.object({
|
|
15802
|
+
customer: external_exports.string().min(1),
|
|
15803
|
+
features: external_exports.array(external_exports.string().min(1)),
|
|
15804
|
+
expiresAt: external_exports.string().nullable()
|
|
15805
|
+
});
|
|
15806
|
+
var DAY_MS = 24 * 60 * 6e4;
|
|
15807
|
+
|
|
15808
|
+
// server/sessions.ts
|
|
15809
|
+
var PAIRING_CODE_TTL_MS = 5 * 6e4;
|
|
15810
|
+
function daysMs(value, fallbackDays) {
|
|
15811
|
+
const days = Number(value);
|
|
15812
|
+
const ok = Number.isInteger(days) && days >= 1 && days <= 3650;
|
|
15813
|
+
return (ok ? days : fallbackDays) * 24 * 60 * 6e4;
|
|
15814
|
+
}
|
|
15815
|
+
var SESSION_TTL_MS = daysMs(process.env.OMB_SESSION_TTL_DAYS, 30);
|
|
15816
|
+
var SESSION_MAX_AGE_MS = daysMs(process.env.OMB_SESSION_MAX_DAYS, 180);
|
|
15817
|
+
var SESSION_RENEW_WHEN_LEFT_MS = SESSION_TTL_MS / 2;
|
|
15818
|
+
var STREAM_TICKET_TTL_MS = 5 * 6e4;
|
|
15819
|
+
var scopeSchema = external_exports.enum(["admin", "client"]);
|
|
15820
|
+
var sessionSchema = external_exports.object({
|
|
15821
|
+
id: external_exports.string().min(1),
|
|
15822
|
+
tokenHash: external_exports.string().length(64),
|
|
15823
|
+
label: external_exports.string().max(80),
|
|
15824
|
+
scopes: external_exports.array(scopeSchema).min(1),
|
|
15825
|
+
createdAt: external_exports.number(),
|
|
15826
|
+
lastSeenAt: external_exports.number(),
|
|
15827
|
+
expiresAt: external_exports.number(),
|
|
15828
|
+
/** Set when the session came from an account sign-in rather than a code. */
|
|
15829
|
+
userId: external_exports.string().max(256).optional(),
|
|
15830
|
+
email: external_exports.string().max(320).optional(),
|
|
15831
|
+
/** Set only by the internal verified-portal issuance path, never by email or pairing input. */
|
|
15832
|
+
membershipAuthority: external_exports.literal("portal").optional(),
|
|
15833
|
+
/** A browser sign-in (PairingCode `browser`): accepted only as its browser's cookie, never as a bearer token. */
|
|
15834
|
+
cookieOnly: external_exports.literal(true).optional(),
|
|
15835
|
+
/** Whose OMB Cloud a browser sign-in signed in to (its PairingCode `owner`). */
|
|
15836
|
+
owner: external_exports.string().max(254).optional()
|
|
15837
|
+
});
|
|
15838
|
+
var fileSchema = external_exports.object({ version: external_exports.literal(1), sessions: external_exports.array(sessionSchema) });
|
|
15839
|
+
|
|
15840
|
+
// server/cloud-home.ts
|
|
15841
|
+
var CLOUD_PAIRING_NONCE_MS = 10 * 6e4;
|
|
15842
|
+
|
|
15642
15843
|
// server/config.ts
|
|
15643
15844
|
var optionalText = external_exports.string().optional();
|
|
15644
15845
|
var SSH_ALIAS = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
|
|
15645
15846
|
var LEGACY_BROWSER_PROFILE_ID = /^[A-Za-z0-9_-]{1,40}$/;
|
|
15646
15847
|
var BROWSER_PROFILE_ID = /^[a-z0-9_-]{1,40}$/;
|
|
15848
|
+
var FISH_TTS_MODELS = ["s2.1-pro", "s2.1-pro-free"];
|
|
15647
15849
|
var MIN_ROOM_TURN_TIMEOUT_MINUTES = 1;
|
|
15648
15850
|
var MAX_ROOM_TURN_TIMEOUT_MINUTES = 1440;
|
|
15649
15851
|
var DEFAULT_ROOM_HANDOFF_LIFETIME_MINUTES = 30;
|
|
@@ -15654,6 +15856,8 @@ var MIN_THREAD_EVENT_LOG_BYTES = 256 * 1024;
|
|
|
15654
15856
|
var MAX_THREAD_EVENT_LOG_BYTES = 4 * 1024 * 1024 * 1024;
|
|
15655
15857
|
var MIN_LOCAL_VM_MAX_INSTANCES = 1;
|
|
15656
15858
|
var MAX_LOCAL_VM_MAX_INSTANCES = 8;
|
|
15859
|
+
var MIN_LOCAL_VM_IDLE_TIMEOUT_MINUTES = 5;
|
|
15860
|
+
var MAX_LOCAL_VM_IDLE_TIMEOUT_MINUTES = 1440;
|
|
15657
15861
|
function isValidSshAlias(value) {
|
|
15658
15862
|
return typeof value === "string" && SSH_ALIAS.test(value);
|
|
15659
15863
|
}
|
|
@@ -15691,7 +15895,8 @@ var roomConfigSchema = external_exports.object({
|
|
|
15691
15895
|
);
|
|
15692
15896
|
var localVmConfigSchema = external_exports.object({
|
|
15693
15897
|
mode: external_exports.enum(["shared", "per-bot", "pool"]).optional(),
|
|
15694
|
-
maxInstances: external_exports.number().int().min(MIN_LOCAL_VM_MAX_INSTANCES).max(MAX_LOCAL_VM_MAX_INSTANCES).optional()
|
|
15898
|
+
maxInstances: external_exports.number().int().min(MIN_LOCAL_VM_MAX_INSTANCES).max(MAX_LOCAL_VM_MAX_INSTANCES).optional(),
|
|
15899
|
+
idleTimeoutMinutes: external_exports.number().int().min(MIN_LOCAL_VM_IDLE_TIMEOUT_MINUTES).max(MAX_LOCAL_VM_IDLE_TIMEOUT_MINUTES).optional()
|
|
15695
15900
|
});
|
|
15696
15901
|
var browserProfileSchema = external_exports.object({
|
|
15697
15902
|
// "guest" is the throwaway session's reserved id, never a saved profile
|
|
@@ -15850,7 +16055,11 @@ var onboardingConfigSchema = external_exports.object({
|
|
|
15850
16055
|
/** Which welcome flow was completed; a newer flow may re-show itself. */
|
|
15851
16056
|
version: external_exports.number().int().min(0).max(1e3).optional(),
|
|
15852
16057
|
reelSeen: external_exports.boolean().optional(),
|
|
15853
|
-
hintsSeen: external_exports.array(external_exports.string().trim().min(1).max(60)).max(100).optional()
|
|
16058
|
+
hintsSeen: external_exports.array(external_exports.string().trim().min(1).max(60)).max(100).optional(),
|
|
16059
|
+
/** OMB Cloud home only: when a bot's turn first finished on this machine
|
|
16060
|
+
* (cloud-home.ts firstCloudTurnPatch). Written by the server, read by the
|
|
16061
|
+
* Cloud's setup checklist. */
|
|
16062
|
+
firstTurnAt: external_exports.string().trim().max(40).optional()
|
|
15854
16063
|
}).strict();
|
|
15855
16064
|
var instanceConfigSchema = external_exports.object({
|
|
15856
16065
|
driver: external_exports.string().min(1),
|
|
@@ -15862,6 +16071,7 @@ var instanceConfigSchema = external_exports.object({
|
|
|
15862
16071
|
]).optional(),
|
|
15863
16072
|
environment: external_exports.record(external_exports.string(), external_exports.string()).optional(),
|
|
15864
16073
|
enabled: external_exports.boolean().optional(),
|
|
16074
|
+
access: external_exports.enum(["subscription", "custom", "api"]).optional(),
|
|
15865
16075
|
config: external_exports.json().optional()
|
|
15866
16076
|
});
|
|
15867
16077
|
var instanceConfigMapSchema = external_exports.record(external_exports.string(), instanceConfigSchema);
|
|
@@ -15923,7 +16133,12 @@ var appConfigSchema = external_exports.object({
|
|
|
15923
16133
|
/** Anthropic API key for Claude Code billed per token, handed only to
|
|
15924
16134
|
* Claude instances; `url` only for a proxy or a test double. Never a
|
|
15925
16135
|
* personal-login OAuth token. */
|
|
15926
|
-
anthropic: external_exports.object({ key: optionalText, url: optionalText }).optional(),
|
|
16136
|
+
anthropic: external_exports.object({ key: optionalText, url: optionalText, everyClaudeBot: external_exports.boolean().optional() }).optional(),
|
|
16137
|
+
/** OpenAI's own API key, for the `openai` instance only. Codex keeps its
|
|
16138
|
+
* own ChatGPT or API login and never reads this. */
|
|
16139
|
+
openai: external_exports.object({ key: optionalText }).optional(),
|
|
16140
|
+
/** OpenRouter key, for the `openrouter` instance only. */
|
|
16141
|
+
openrouter: external_exports.object({ key: optionalText }).optional(),
|
|
15927
16142
|
/** Monthly spend limit for the whole workspace, against the cost engines
|
|
15928
16143
|
* report to the usage ledger. Enforced only with the `budgets` entitlement. */
|
|
15929
16144
|
budgets: external_exports.object({
|
|
@@ -15957,8 +16172,8 @@ var appConfigSchema = external_exports.object({
|
|
|
15957
16172
|
opencodeGo: external_exports.object({ apiKey: optionalText }).optional(),
|
|
15958
16173
|
/** Voice settings and the selected voice id. `provider` picks the
|
|
15959
16174
|
* engine: "elevenlabs" (default; needs `key`), "fish" (needs its own
|
|
15960
|
-
* `fishKey`), "system" (the Mac's
|
|
15961
|
-
* "xai" (Grok TTS, reusing `xai.key`), or
|
|
16175
|
+
* `fishKey`; `fishModel` picks its speech model), "system" (the Mac's
|
|
16176
|
+
* built-in voices, no key), "xai" (Grok TTS, reusing `xai.key`), or
|
|
15962
16177
|
* "chatterbox" (a local OpenAI-compatible Chatterbox server; `baseUrl`
|
|
15963
16178
|
* and `model` are settings, not secrets). Cloud keys stay separate so
|
|
15964
16179
|
* switching providers never overwrites or misuses the other key. */
|
|
@@ -15968,7 +16183,21 @@ var appConfigSchema = external_exports.object({
|
|
|
15968
16183
|
voice: optionalText,
|
|
15969
16184
|
provider: external_exports.enum(["elevenlabs", "fish", "system", "chatterbox", "xai"]).optional(),
|
|
15970
16185
|
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(),
|
|
15971
|
-
model: optionalText
|
|
16186
|
+
model: optionalText,
|
|
16187
|
+
fishModel: external_exports.enum(FISH_TTS_MODELS).optional()
|
|
16188
|
+
}).optional(),
|
|
16189
|
+
/** The decision model (server/decider): a fast classifier that picks
|
|
16190
|
+
* things for bots, starting with who answers a room message. `key` is
|
|
16191
|
+
* write-only like every credential; `baseUrl` points at a Jev-compatible
|
|
16192
|
+
* server instead of TypeSafe's (an operator setting with no UI); `jobs`
|
|
16193
|
+
* switches each decision on or off. Not `decisions`: that section is the
|
|
16194
|
+
* authorization log's retention. */
|
|
16195
|
+
decider: external_exports.object({
|
|
16196
|
+
enabled: external_exports.boolean().optional(),
|
|
16197
|
+
provider: external_exports.enum(["jev", "off"]).optional(),
|
|
16198
|
+
key: optionalText,
|
|
16199
|
+
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(),
|
|
16200
|
+
jobs: external_exports.object({ roomRouting: external_exports.boolean().optional() }).optional()
|
|
15972
16201
|
}).optional(),
|
|
15973
16202
|
/** Avatar provider credentials stay separate; choosing a router never reuses a cloud key. */
|
|
15974
16203
|
imageGen: external_exports.object({
|
|
@@ -16039,36 +16268,37 @@ var storedAppConfigSchema = appConfigSchema.extend({
|
|
|
16039
16268
|
var appConfigPatchSchema = appConfigSchema.omit({ instances: true, mcpServers: true, cliStartup: true, customDomain: true }).extend({ threads: threadsPatchSchema.optional(), newBots: newBotsPatchSchema.optional() });
|
|
16040
16269
|
var jsonObjectSchema = external_exports.record(external_exports.string(), external_exports.json());
|
|
16041
16270
|
var DEFAULT_CAPTURE_QUIET_MS = 2 * 6e4;
|
|
16042
|
-
var DATA_DIR = process.env.OMB_DATA_DIR ??
|
|
16043
|
-
var LEGACY_DATA_DIR =
|
|
16044
|
-
var EVENTS_DIR =
|
|
16045
|
-
var NATIVE_DIR =
|
|
16046
|
-
|
|
16047
|
-
|
|
16048
|
-
|
|
16049
|
-
|
|
16050
|
-
|
|
16051
|
-
|
|
16052
|
-
|
|
16053
|
-
|
|
16054
|
-
|
|
16055
|
-
}
|
|
16056
|
-
|
|
16057
|
-
|
|
16058
|
-
|
|
16059
|
-
|
|
16060
|
-
|
|
16061
|
-
|
|
16062
|
-
|
|
16063
|
-
|
|
16064
|
-
|
|
16065
|
-
|
|
16066
|
-
|
|
16067
|
-
|
|
16068
|
-
|
|
16069
|
-
|
|
16070
|
-
|
|
16071
|
-
|
|
16271
|
+
var DATA_DIR = process.env.OMB_DATA_DIR ?? join3(homedir2(), ".openmausbot");
|
|
16272
|
+
var LEGACY_DATA_DIR = join3(homedir2(), ".opengrokbot");
|
|
16273
|
+
var EVENTS_DIR = join3(DATA_DIR, "events");
|
|
16274
|
+
var NATIVE_DIR = join3(DATA_DIR, "native");
|
|
16275
|
+
var OPENAI_API_INSTANCE = "openai";
|
|
16276
|
+
var OPENROUTER_API_INSTANCE = "openrouter";
|
|
16277
|
+
var XAI_API_INSTANCE = "xaiApi";
|
|
16278
|
+
var CLAUDE_API_INSTANCE = "claudeApi";
|
|
16279
|
+
var API_KEY_FLEET = {
|
|
16280
|
+
[OPENAI_API_INSTANCE]: {
|
|
16281
|
+
driver: "openai-compat",
|
|
16282
|
+
displayName: "OpenAI",
|
|
16283
|
+
access: "api",
|
|
16284
|
+
icon: { kind: "preset", preset: "openai" },
|
|
16285
|
+
config: { url: "https://api.openai.com/v1", apiKeyEnv: "OMB_OPENAI_API_KEY", catalog: "openai" }
|
|
16286
|
+
},
|
|
16287
|
+
[CLAUDE_API_INSTANCE]: {
|
|
16288
|
+
driver: "claudeAgent",
|
|
16289
|
+
displayName: "Claude (API key)",
|
|
16290
|
+
access: "api",
|
|
16291
|
+
icon: { kind: "preset", preset: "anthropic" },
|
|
16292
|
+
config: { requireApiKey: true }
|
|
16293
|
+
},
|
|
16294
|
+
[XAI_API_INSTANCE]: { driver: "grok", displayName: "xAI", access: "api", icon: { kind: "preset", preset: "xai" } },
|
|
16295
|
+
[OPENROUTER_API_INSTANCE]: {
|
|
16296
|
+
driver: "openai-compat",
|
|
16297
|
+
displayName: "OpenRouter",
|
|
16298
|
+
access: "api",
|
|
16299
|
+
icon: { kind: "preset", preset: "openrouter" },
|
|
16300
|
+
config: { url: "https://openrouter.ai/api/v1", apiKeyEnv: "OMB_OPENROUTER_API_KEY" }
|
|
16301
|
+
}
|
|
16072
16302
|
};
|
|
16073
16303
|
|
|
16074
16304
|
// server/container-computer.ts
|
|
@@ -16402,9 +16632,11 @@ function createMcpBridgeInterceptor(options) {
|
|
|
16402
16632
|
};
|
|
16403
16633
|
}
|
|
16404
16634
|
function runMcpBridge(options) {
|
|
16405
|
-
const
|
|
16635
|
+
const env = options.env ?? { ...process.env, PATH: augmentedPath() };
|
|
16636
|
+
const { command, args } = resolveCliSpawn(options.command, options.args, env);
|
|
16637
|
+
const child = spawn(command, args, {
|
|
16406
16638
|
shell: false,
|
|
16407
|
-
env
|
|
16639
|
+
env,
|
|
16408
16640
|
stdio: ["pipe", "pipe", "pipe"]
|
|
16409
16641
|
});
|
|
16410
16642
|
child.stdin.on("error", () => {
|
|
@@ -129,6 +129,8 @@ function catalogProfileFromEnv(env) {
|
|
|
129
129
|
skillAuthoring: env.OMB_SKILL_AUTHORING_ENABLED === "1",
|
|
130
130
|
sharedComputers: env.OMB_SHARED_COMPUTERS_ENABLED === "1",
|
|
131
131
|
voiceNotes: env.OMB_VOICE_NOTES === "1",
|
|
132
|
+
cloudHome: env.OMB_CLOUD_HOME === "1",
|
|
133
|
+
memoryEnabled: env.OMB_MEMORY_ENABLED !== "0",
|
|
132
134
|
botId: env.OMB_BOT_ID ?? ""
|
|
133
135
|
};
|
|
134
136
|
}
|
|
@@ -309,14 +311,14 @@ var toolDefinitions = (externalRuntime) => [
|
|
|
309
311
|
},
|
|
310
312
|
{
|
|
311
313
|
name: "coordinate_bots",
|
|
312
|
-
description: "Ask existing OpenMausBot teammates for advice or assign concrete work. From normal chat
|
|
314
|
+
description: "Ask existing OpenMausBot teammates for advice or assign concrete work. From normal chat each distinct assignment starts a fresh thread for that teammate; from a room it defaults to this room. Give a self-contained brief. Use group_id from list_room_targets for a specific room. Give 1-4 bot_ids \u2014 teammate ids as list_bots or your roster prints them; a unique teammate name also resolves: they receive only your brief and use their own model, tools and permissions. Busy bots queue. They can consult their specialists; all results return here and resume you automatically. Include exact file paths, constraints and what must be verified. After sending all assignments, END your turn; do not poll or wait. On return, resolve tradeoffs, verify the requested outcome and request concrete corrections if necessary before giving one final answer. Do not send acknowledgements as new work.",
|
|
313
315
|
inputSchema: { type: "object", additionalProperties: false, properties: {
|
|
314
|
-
group_id: { type: "string", description: "Optional destination room. Omit for this room, or
|
|
316
|
+
group_id: { type: "string", description: "Optional destination room. Omit for this room, or a fresh thread for each teammate when chatting directly." },
|
|
315
317
|
bot_ids: { type: "array", items: { type: "string", description: "A teammate's id exactly as list_bots or your roster prints it ([id: \u2026]). A teammate's unique display name also resolves; a name shared by two reachable teammates is refused." }, minItems: 1, maxItems: 4, uniqueItems: true },
|
|
316
318
|
message: { type: "string", minLength: 1, maxLength: 4e3, description: "Self-contained question or task for these teammates. Send separate requests when responsibilities differ." },
|
|
317
319
|
request_key: { type: "string", description: "A short unique assignment key. Reuse for an identical retry." },
|
|
318
320
|
rework: { type: "boolean", description: "True only for concrete additional work from someone who already completed a request." },
|
|
319
|
-
label: { type: "string", description: "Optional short name (one line, at most 60 characters) for this job.
|
|
321
|
+
label: { type: "string", description: "Optional short name (one line, at most 60 characters) for this job. Names the new direct assignment thread." }
|
|
320
322
|
}, required: ["bot_ids", "message", "request_key"] }
|
|
321
323
|
},
|
|
322
324
|
{
|
|
@@ -853,9 +855,19 @@ var ROOM_ONLY_TOOLS = /* @__PURE__ */ new Set(["list_room_targets", "coordinate_
|
|
|
853
855
|
var ROOM_REPLACED_TOOLS = /* @__PURE__ */ new Set(["ask_bot", "delegate_bot", "check_delegation", "wait_delegation", "start_thread", "send_to_thread", "wait_thread"]);
|
|
854
856
|
var EXTERNAL_TOOL_NAMES = /* @__PURE__ */ new Set(["list_bots", "ask_bot", "delegate_bot", "check_delegation", "wait_delegation"]);
|
|
855
857
|
var WATCHER_TOOL_NAMES = /* @__PURE__ */ new Set(["create_options_card"]);
|
|
858
|
+
var LOCAL_VM_TOOL_NAMES = /* @__PURE__ */ new Set(["vm_exec"]);
|
|
859
|
+
var CLOUD_HOME_SURFACE = {
|
|
860
|
+
type: "string",
|
|
861
|
+
enum: ["auto", "cloud", "browser"],
|
|
862
|
+
description: "auto = suitable configured computer, cloud = remote Boat/VPS, browser = built-in browser. Omit to list. This server runs in the cloud: the user's own computer and a Local VM are not places here."
|
|
863
|
+
};
|
|
856
864
|
function availableTools(profile) {
|
|
865
|
+
const tools = catalogTools(profile);
|
|
866
|
+
return profile.cloudHome ? tools.filter((tool) => !LOCAL_VM_TOOL_NAMES.has(tool.name)).map((tool) => tool.name === "select_computer" ? { ...tool, inputSchema: { ...tool.inputSchema, properties: { surface: CLOUD_HOME_SURFACE } } } : tool) : tools;
|
|
867
|
+
}
|
|
868
|
+
function catalogTools(profile) {
|
|
857
869
|
const TOOLS = toolDefinitions(profile.externalRuntime);
|
|
858
|
-
const BOT_SCOPED_TOOLS = profile.botId === WATCHER_OPTIONS_CARD_BOT_ID
|
|
870
|
+
const BOT_SCOPED_TOOLS = TOOLS.filter((tool) => (profile.botId === WATCHER_OPTIONS_CARD_BOT_ID || !WATCHER_TOOL_NAMES.has(tool.name)) && (profile.memoryEnabled !== false || tool.name !== "memory_update" && tool.name !== "memory_log"));
|
|
859
871
|
const AUTHORING_TOOLS = profile.skillAuthoring ? BOT_SCOPED_TOOLS : BOT_SCOPED_TOOLS.filter((tool) => !SKILL_TOOL_NAMES.has(tool.name));
|
|
860
872
|
const SHAREABLE_TOOLS = profile.sharedComputers ? AUTHORING_TOOLS : AUTHORING_TOOLS.filter((tool) => !SHARED_COMPUTER_TOOL_NAMES.has(tool.name));
|
|
861
873
|
const VOICE_READY_TOOLS = profile.voiceNotes ? SHAREABLE_TOOLS : SHAREABLE_TOOLS.filter((tool) => !VOICE_TOOL_NAMES.has(tool.name));
|
|
@@ -14728,7 +14728,11 @@ var sessionSchema = external_exports.object({
|
|
|
14728
14728
|
userId: external_exports.string().max(256).optional(),
|
|
14729
14729
|
email: external_exports.string().max(320).optional(),
|
|
14730
14730
|
/** Set only by the internal verified-portal issuance path, never by email or pairing input. */
|
|
14731
|
-
membershipAuthority: external_exports.literal("portal").optional()
|
|
14731
|
+
membershipAuthority: external_exports.literal("portal").optional(),
|
|
14732
|
+
/** A browser sign-in (PairingCode `browser`): accepted only as its browser's cookie, never as a bearer token. */
|
|
14733
|
+
cookieOnly: external_exports.literal(true).optional(),
|
|
14734
|
+
/** Whose OMB Cloud a browser sign-in signed in to (its PairingCode `owner`). */
|
|
14735
|
+
owner: external_exports.string().max(254).optional()
|
|
14732
14736
|
});
|
|
14733
14737
|
var fileSchema = external_exports.object({ version: external_exports.literal(1), sessions: external_exports.array(sessionSchema) });
|
|
14734
14738
|
|