openmausbot 0.1.84 → 0.1.85
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/index-Ba9G44HI.js +310 -0
- package/dist/assets/{index-DNa2umw-.js → index-CTNNoqSJ.js} +1 -1
- package/dist/assets/index-CkRNp7wX.css +1 -0
- package/dist/index.html +2 -2
- package/dist-server/companion/src/routes.js +1 -0
- package/dist-server/container-mcp.js +212 -7
- package/dist-server/drivers/agents-proxy.js +135 -12
- package/dist-server/enterprise/server/index.js +1 -0
- package/dist-server/hooks/omb-hook.js +74 -0
- package/dist-server/index.js +8051 -6252
- package/dist-server/local-computer-proxy.js +83 -1
- package/dist-server/local-computer.js +14 -2
- package/dist-server/openmausbot.js +759 -301
- package/dist-server/pair-cli.js +759 -301
- package/dist-server/proxy-paths.js +1 -0
- package/dist-server/server/agent-tool-policy.js +1 -0
- package/dist-server/server/bot-package.js +2 -0
- package/dist-server/server/box.js +23 -4
- package/dist-server/server/browser-engine.js +87 -10
- package/dist-server/server/browser-live.js +7 -5
- package/dist-server/server/browser-runtime.js +65 -10
- package/dist-server/server/checkpoints.js +62 -18
- package/dist-server/server/cli-prompts.js +3 -1
- package/dist-server/server/commands.js +27 -0
- package/dist-server/server/compaction-summary.js +78 -0
- package/dist-server/server/config.js +59 -2
- package/dist-server/server/context-budget.js +29 -0
- package/dist-server/server/context-rebuild.js +72 -0
- package/dist-server/server/digest.js +130 -0
- package/dist-server/server/drivers/acp/core.js +540 -229
- package/dist-server/server/drivers/agents-proxy.js +51 -12
- package/dist-server/server/drivers/agents-result.js +23 -0
- package/dist-server/server/drivers/claude.js +62 -10
- package/dist-server/server/drivers/codex.js +6 -0
- package/dist-server/server/drivers/openai-chat.js +66 -45
- package/dist-server/server/drivers/openai-compat.js +1 -0
- package/dist-server/server/hooks/omb-hook.js +103 -0
- package/dist-server/server/index.js +1127 -365
- package/dist-server/server/local-computer.js +21 -2
- package/dist-server/server/mcp-bridge.js +10 -2
- package/dist-server/server/mcp-tool-images.js +37 -0
- package/dist-server/server/mcp-tool-schema.js +108 -0
- package/dist-server/server/message-db.js +80 -21
- package/dist-server/server/message-file.js +3 -2
- package/dist-server/server/package-export.js +1 -0
- package/dist-server/server/peer-roster.js +4 -2
- package/dist-server/server/provider-icon.js +20 -0
- package/dist-server/server/proxy-paths.js +1 -0
- package/dist-server/server/request-auth.js +1 -0
- package/dist-server/server/room-handoffs.js +16 -2
- package/dist-server/server/routine-requests.js +39 -1
- package/dist-server/server/routines.js +43 -9
- package/dist-server/server/shared-computer-control.js +31 -4
- package/dist-server/server/steer-queue.js +6 -0
- package/dist-server/server/store.js +94 -14
- package/dist-server/server/system-prompt.js +4 -4
- package/dist-server/server/team-backup.js +9 -1
- package/dist-server/server/tool-results.js +72 -0
- package/dist-server/server/tts/grok.js +74 -0
- package/dist-server/server/tts/index.js +19 -1
- package/dist-server/server/webhooks.js +28 -0
- package/dist-server/shared/approval-mode.js +7 -1
- package/dist-server/shared/digest.js +1 -0
- package/dist-server/shared/markdown-windows-paths.js +36 -0
- package/dist-server/shared/provider-icon.js +110 -0
- package/dist-server/shared/team-backup.js +3 -0
- package/dist-server/vps-container-mcp.js +217 -12
- package/enterprise/server/index.js +1 -0
- package/package.json +1 -1
- package/dist/assets/index-BbU5REzd.js +0 -310
- package/dist/assets/index-CLGfYlx_.css +0 -1
|
@@ -183,6 +183,86 @@ function probeLoginShellPath() {
|
|
|
183
183
|
);
|
|
184
184
|
}
|
|
185
185
|
|
|
186
|
+
// server/mcp-tool-schema.ts
|
|
187
|
+
var ROOT_COMBINATORS = ["anyOf", "oneOf", "allOf", "not"];
|
|
188
|
+
function isObject(value) {
|
|
189
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
190
|
+
}
|
|
191
|
+
function branches(value) {
|
|
192
|
+
return Array.isArray(value) ? value.filter(isObject) : [];
|
|
193
|
+
}
|
|
194
|
+
function objectShape(schema) {
|
|
195
|
+
const properties = isObject(schema.properties) ? { ...schema.properties } : {};
|
|
196
|
+
const required2 = new Set(Array.isArray(schema.required) ? schema.required.filter((key) => typeof key === "string") : []);
|
|
197
|
+
const adopt = (shape) => {
|
|
198
|
+
for (const [key, value] of Object.entries(shape.properties)) if (!(key in properties)) properties[key] = value;
|
|
199
|
+
};
|
|
200
|
+
for (const branch of branches(schema.allOf)) {
|
|
201
|
+
const shape = objectShape(branch);
|
|
202
|
+
adopt(shape);
|
|
203
|
+
for (const key of shape.required) required2.add(key);
|
|
204
|
+
}
|
|
205
|
+
for (const keyword of ["anyOf", "oneOf"]) {
|
|
206
|
+
const choices = branches(schema[keyword]).map(objectShape);
|
|
207
|
+
if (choices.length === 0) continue;
|
|
208
|
+
for (const choice of choices) adopt(choice);
|
|
209
|
+
for (const key of choices[0].required) {
|
|
210
|
+
if (choices.every((choice) => choice.required.includes(key))) required2.add(key);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return { properties, required: [...required2] };
|
|
214
|
+
}
|
|
215
|
+
function describesObject(type) {
|
|
216
|
+
return type === void 0 || type === "object" || Array.isArray(type) && type.includes("object");
|
|
217
|
+
}
|
|
218
|
+
function providerSafeInputSchema(schema) {
|
|
219
|
+
if (!isObject(schema) || !describesObject(schema.type)) return { type: "object", properties: {} };
|
|
220
|
+
if (schema.type === "object" && ROOT_COMBINATORS.every((keyword) => !(keyword in schema))) return schema;
|
|
221
|
+
const { properties, required: required2 } = objectShape(schema);
|
|
222
|
+
const safe = { ...schema, type: "object", properties };
|
|
223
|
+
for (const keyword of ROOT_COMBINATORS) delete safe[keyword];
|
|
224
|
+
if (required2.length > 0) safe.required = required2;
|
|
225
|
+
else delete safe.required;
|
|
226
|
+
return safe;
|
|
227
|
+
}
|
|
228
|
+
function createToolListNormalizer() {
|
|
229
|
+
const pending = /* @__PURE__ */ new Set();
|
|
230
|
+
const idKey = (id) => `${typeof id}:${String(id)}`;
|
|
231
|
+
return {
|
|
232
|
+
observeRequest(line) {
|
|
233
|
+
let frame;
|
|
234
|
+
try {
|
|
235
|
+
frame = JSON.parse(line);
|
|
236
|
+
} catch {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
if (isObject(frame) && frame.method === "tools/list" && (typeof frame.id === "number" || typeof frame.id === "string")) {
|
|
240
|
+
pending.add(idKey(frame.id));
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
rewriteResponse(line) {
|
|
244
|
+
if (pending.size === 0) return line;
|
|
245
|
+
let frame;
|
|
246
|
+
try {
|
|
247
|
+
frame = JSON.parse(line);
|
|
248
|
+
} catch {
|
|
249
|
+
return line;
|
|
250
|
+
}
|
|
251
|
+
if (!isObject(frame) || "method" in frame || !pending.delete(idKey(frame.id))) return line;
|
|
252
|
+
if (!isObject(frame.result) || !Array.isArray(frame.result.tools)) return line;
|
|
253
|
+
let changed = false;
|
|
254
|
+
const tools = frame.result.tools.map((tool) => {
|
|
255
|
+
if (!isObject(tool)) return tool;
|
|
256
|
+
const inputSchema = providerSafeInputSchema(tool.inputSchema);
|
|
257
|
+
if (inputSchema === tool.inputSchema) return tool;
|
|
258
|
+
changed = true;
|
|
259
|
+
return { ...tool, inputSchema };
|
|
260
|
+
});
|
|
261
|
+
return changed ? JSON.stringify({ ...frame, result: { ...frame.result, tools } }) : line;
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
|
|
186
266
|
// server/mcp-bridge.ts
|
|
187
267
|
var BRIDGE_INACTIVITY_MS = 45e3;
|
|
188
268
|
var PROBE_TIMEOUT_MS = 1e4;
|
|
@@ -352,8 +432,10 @@ function runMcpBridge(options) {
|
|
|
352
432
|
}
|
|
353
433
|
} : {}
|
|
354
434
|
});
|
|
435
|
+
const toolLists = createToolListNormalizer();
|
|
355
436
|
let pendingInput = Promise.resolve();
|
|
356
437
|
const inbound = createLineSplitter((line) => {
|
|
438
|
+
toolLists.observeRequest(line);
|
|
357
439
|
const completion = intercept(line);
|
|
358
440
|
if (completion) pendingInput = completion;
|
|
359
441
|
});
|
|
@@ -363,7 +445,7 @@ function runMcpBridge(options) {
|
|
|
363
445
|
inbound.flush();
|
|
364
446
|
void pendingInput.finally(() => child.stdin.end());
|
|
365
447
|
});
|
|
366
|
-
const outbound = createLineSplitter((line) => process.stdout.write(line + "\n"));
|
|
448
|
+
const outbound = createLineSplitter((line) => process.stdout.write(toolLists.rewriteResponse(line) + "\n"));
|
|
367
449
|
child.stdout.on("data", (chunk) => outbound.push(chunk));
|
|
368
450
|
child.stdout.on("end", () => outbound.flush());
|
|
369
451
|
const detach = () => {
|
|
@@ -1056,7 +1138,7 @@ __export(util_exports, {
|
|
|
1056
1138
|
getParsedType: () => getParsedType,
|
|
1057
1139
|
getSizableOrigin: () => getSizableOrigin,
|
|
1058
1140
|
hexToUint8Array: () => hexToUint8Array,
|
|
1059
|
-
isObject: () =>
|
|
1141
|
+
isObject: () => isObject2,
|
|
1060
1142
|
isPlainObject: () => isPlainObject,
|
|
1061
1143
|
issue: () => issue,
|
|
1062
1144
|
joinValues: () => joinValues,
|
|
@@ -1219,7 +1301,7 @@ function slugify(input) {
|
|
|
1219
1301
|
}
|
|
1220
1302
|
var captureStackTrace = "captureStackTrace" in Error ? Error.captureStackTrace : (..._args) => {
|
|
1221
1303
|
};
|
|
1222
|
-
function
|
|
1304
|
+
function isObject2(data) {
|
|
1223
1305
|
return typeof data === "object" && data !== null && !Array.isArray(data);
|
|
1224
1306
|
}
|
|
1225
1307
|
var allowsEval = /* @__PURE__ */ cached2(() => {
|
|
@@ -1238,7 +1320,7 @@ var allowsEval = /* @__PURE__ */ cached2(() => {
|
|
|
1238
1320
|
}
|
|
1239
1321
|
});
|
|
1240
1322
|
function isPlainObject(o) {
|
|
1241
|
-
if (
|
|
1323
|
+
if (isObject2(o) === false)
|
|
1242
1324
|
return false;
|
|
1243
1325
|
const ctor = o.constructor;
|
|
1244
1326
|
if (ctor === void 0)
|
|
@@ -1246,7 +1328,7 @@ function isPlainObject(o) {
|
|
|
1246
1328
|
if (typeof ctor !== "function")
|
|
1247
1329
|
return true;
|
|
1248
1330
|
const prot = ctor.prototype;
|
|
1249
|
-
if (
|
|
1331
|
+
if (isObject2(prot) === false)
|
|
1250
1332
|
return false;
|
|
1251
1333
|
if (Object.prototype.hasOwnProperty.call(prot, "isPrototypeOf") === false) {
|
|
1252
1334
|
return false;
|
|
@@ -3459,13 +3541,13 @@ var $ZodObject = /* @__PURE__ */ $constructor("$ZodObject", (inst, def) => {
|
|
|
3459
3541
|
}
|
|
3460
3542
|
return propValues;
|
|
3461
3543
|
});
|
|
3462
|
-
const
|
|
3544
|
+
const isObject3 = isObject2;
|
|
3463
3545
|
const catchall = def.catchall;
|
|
3464
3546
|
let value;
|
|
3465
3547
|
inst._zod.parse = (payload, ctx) => {
|
|
3466
3548
|
value ?? (value = _normalized.value);
|
|
3467
3549
|
const input = payload.value;
|
|
3468
|
-
if (!
|
|
3550
|
+
if (!isObject3(input)) {
|
|
3469
3551
|
payload.issues.push({
|
|
3470
3552
|
expected: "object",
|
|
3471
3553
|
code: "invalid_type",
|
|
@@ -3592,7 +3674,7 @@ var $ZodObjectJIT = /* @__PURE__ */ $constructor("$ZodObjectJIT", (inst, def) =>
|
|
|
3592
3674
|
return (payload, ctx) => fn(shape, payload, ctx);
|
|
3593
3675
|
};
|
|
3594
3676
|
let fastpass;
|
|
3595
|
-
const
|
|
3677
|
+
const isObject3 = isObject2;
|
|
3596
3678
|
const jit = !globalConfig.jitless;
|
|
3597
3679
|
const allowsEval2 = allowsEval;
|
|
3598
3680
|
const fastEnabled = jit && allowsEval2.value;
|
|
@@ -3601,7 +3683,7 @@ var $ZodObjectJIT = /* @__PURE__ */ $constructor("$ZodObjectJIT", (inst, def) =>
|
|
|
3601
3683
|
inst._zod.parse = (payload, ctx) => {
|
|
3602
3684
|
value ?? (value = _normalized.value);
|
|
3603
3685
|
const input = payload.value;
|
|
3604
|
-
if (!
|
|
3686
|
+
if (!isObject3(input)) {
|
|
3605
3687
|
payload.issues.push({
|
|
3606
3688
|
expected: "object",
|
|
3607
3689
|
code: "invalid_type",
|
|
@@ -3777,7 +3859,7 @@ var $ZodDiscriminatedUnion = /* @__PURE__ */ $constructor("$ZodDiscriminatedUnio
|
|
|
3777
3859
|
});
|
|
3778
3860
|
inst._zod.parse = (payload, ctx) => {
|
|
3779
3861
|
const input = payload.value;
|
|
3780
|
-
if (!
|
|
3862
|
+
if (!isObject2(input)) {
|
|
3781
3863
|
payload.issues.push({
|
|
3782
3864
|
code: "invalid_type",
|
|
3783
3865
|
expected: "object",
|
|
@@ -14962,6 +15044,97 @@ function isModelVariant(value) {
|
|
|
14962
15044
|
return typeof value === "string" && value.length > 0 && value.length <= 256 && value.trim() === value && !new RegExp("\\p{Cc}", "u").test(value);
|
|
14963
15045
|
}
|
|
14964
15046
|
|
|
15047
|
+
// shared/provider-icon.ts
|
|
15048
|
+
var PROVIDER_ICON_PRESETS = [
|
|
15049
|
+
"openai",
|
|
15050
|
+
"anthropic",
|
|
15051
|
+
"google",
|
|
15052
|
+
"azure",
|
|
15053
|
+
"aws",
|
|
15054
|
+
"xai",
|
|
15055
|
+
"deepseek",
|
|
15056
|
+
"meta",
|
|
15057
|
+
"mistral",
|
|
15058
|
+
"qwen",
|
|
15059
|
+
"moonshot",
|
|
15060
|
+
"cohere",
|
|
15061
|
+
"openrouter"
|
|
15062
|
+
];
|
|
15063
|
+
var PROVIDER_ICON_MAX_BYTES = 128 * 1024;
|
|
15064
|
+
var PROVIDER_ICON_MAX_DIMENSION = 1024;
|
|
15065
|
+
function decodedBase64Bytes(value) {
|
|
15066
|
+
const padding = value.endsWith("==") ? 2 : value.endsWith("=") ? 1 : 0;
|
|
15067
|
+
return Math.floor(value.length * 3 / 4) - padding;
|
|
15068
|
+
}
|
|
15069
|
+
function imageDimensions(bytes, mime) {
|
|
15070
|
+
const u16be = (offset) => bytes[offset] * 256 + bytes[offset + 1];
|
|
15071
|
+
const u16le = (offset) => bytes[offset] + bytes[offset + 1] * 256;
|
|
15072
|
+
const u24le = (offset) => bytes[offset] + bytes[offset + 1] * 256 + bytes[offset + 2] * 65536;
|
|
15073
|
+
const u32le = (offset) => bytes[offset] + bytes[offset + 1] * 256 + bytes[offset + 2] * 65536 + bytes[offset + 3] * 16777216;
|
|
15074
|
+
const u32be = (offset) => bytes[offset] * 16777216 + bytes[offset + 1] * 65536 + bytes[offset + 2] * 256 + bytes[offset + 3];
|
|
15075
|
+
if (mime === "image/png") {
|
|
15076
|
+
if (bytes.length < 33 || bytes.slice(0, 8).join(",") !== "137,80,78,71,13,10,26,10" || String.fromCharCode(...bytes.slice(12, 16)) !== "IHDR" || bytes.slice(-8).join(",") !== "73,69,78,68,174,66,96,130") return null;
|
|
15077
|
+
return { width: u32be(16), height: u32be(20) };
|
|
15078
|
+
}
|
|
15079
|
+
if (mime === "image/jpeg") {
|
|
15080
|
+
if (bytes.length < 12 || bytes[0] !== 255 || bytes[1] !== 216 || bytes.at(-2) !== 255 || bytes.at(-1) !== 217) return null;
|
|
15081
|
+
for (let offset = 2; offset + 8 < bytes.length; ) {
|
|
15082
|
+
if (bytes[offset] !== 255) {
|
|
15083
|
+
offset += 1;
|
|
15084
|
+
continue;
|
|
15085
|
+
}
|
|
15086
|
+
const marker = bytes[offset + 1];
|
|
15087
|
+
if ([192, 193, 194, 195, 197, 198, 199, 201, 202, 203, 205, 206, 207].includes(marker)) {
|
|
15088
|
+
return { height: u16be(offset + 5), width: u16be(offset + 7) };
|
|
15089
|
+
}
|
|
15090
|
+
if (marker === 216 || marker === 217 || marker === 1 || marker >= 208 && marker <= 215) {
|
|
15091
|
+
offset += 2;
|
|
15092
|
+
continue;
|
|
15093
|
+
}
|
|
15094
|
+
const length = u16be(offset + 2);
|
|
15095
|
+
if (length < 2) return null;
|
|
15096
|
+
offset += length + 2;
|
|
15097
|
+
}
|
|
15098
|
+
return null;
|
|
15099
|
+
}
|
|
15100
|
+
if (bytes.length < 30 || String.fromCharCode(...bytes.slice(0, 4)) !== "RIFF" || String.fromCharCode(...bytes.slice(8, 12)) !== "WEBP" || u32le(4) + 8 !== bytes.length) return null;
|
|
15101
|
+
const format = String.fromCharCode(...bytes.slice(12, 16));
|
|
15102
|
+
if (format === "VP8X") return { width: u24le(24) + 1, height: u24le(27) + 1 };
|
|
15103
|
+
if (format === "VP8L" && bytes[20] === 47) {
|
|
15104
|
+
const bits = bytes[21] | bytes[22] << 8 | bytes[23] << 16 | bytes[24] << 24;
|
|
15105
|
+
return { width: (bits & 16383) + 1, height: (bits >>> 14 & 16383) + 1 };
|
|
15106
|
+
}
|
|
15107
|
+
if (format === "VP8 " && bytes[23] === 157 && bytes[24] === 1 && bytes[25] === 42) {
|
|
15108
|
+
return { width: u16le(26) & 16383, height: u16le(28) & 16383 };
|
|
15109
|
+
}
|
|
15110
|
+
return null;
|
|
15111
|
+
}
|
|
15112
|
+
function providerIconError(icon) {
|
|
15113
|
+
if (icon.kind === "preset") {
|
|
15114
|
+
return PROVIDER_ICON_PRESETS.includes(icon.preset) ? null : "Choose a supported provider icon.";
|
|
15115
|
+
}
|
|
15116
|
+
const match = /^data:(image\/(?:png|jpeg|webp));base64,([A-Za-z0-9+/]+={0,2})$/.exec(icon.dataUrl);
|
|
15117
|
+
if (!match) return "Upload a PNG, JPEG, or WebP image.";
|
|
15118
|
+
const byteLength = decodedBase64Bytes(match[2]);
|
|
15119
|
+
if (byteLength > PROVIDER_ICON_MAX_BYTES) {
|
|
15120
|
+
return "Provider icons must be 128 KB or smaller.";
|
|
15121
|
+
}
|
|
15122
|
+
let decoded;
|
|
15123
|
+
try {
|
|
15124
|
+
decoded = atob(match[2]);
|
|
15125
|
+
} catch {
|
|
15126
|
+
return "The uploaded image is not valid base64.";
|
|
15127
|
+
}
|
|
15128
|
+
if (decoded.length !== byteLength) return "The uploaded image is not valid base64.";
|
|
15129
|
+
const bytes = Uint8Array.from(decoded, (value) => value.charCodeAt(0));
|
|
15130
|
+
const dimensions = imageDimensions(bytes, match[1]);
|
|
15131
|
+
if (!dimensions) return "The uploaded image is incomplete or does not match its file type.";
|
|
15132
|
+
if (dimensions.width < 1 || dimensions.height < 1 || dimensions.width > PROVIDER_ICON_MAX_DIMENSION || dimensions.height > PROVIDER_ICON_MAX_DIMENSION || dimensions.width * dimensions.height > PROVIDER_ICON_MAX_DIMENSION ** 2) {
|
|
15133
|
+
return `Provider icons must be at most ${PROVIDER_ICON_MAX_DIMENSION} \xD7 ${PROVIDER_ICON_MAX_DIMENSION} pixels.`;
|
|
15134
|
+
}
|
|
15135
|
+
return null;
|
|
15136
|
+
}
|
|
15137
|
+
|
|
14965
15138
|
// server/mcp-registry.ts
|
|
14966
15139
|
var MAX_ARGS = 64;
|
|
14967
15140
|
var stdioEntrySchema = external_exports.object({
|
|
@@ -15002,11 +15175,26 @@ var MAX_LOCAL_VM_MAX_INSTANCES = 4;
|
|
|
15002
15175
|
function isValidSshAlias(value) {
|
|
15003
15176
|
return typeof value === "string" && SSH_ALIAS.test(value);
|
|
15004
15177
|
}
|
|
15178
|
+
var CDP_PORT = /^[0-9]{1,5}$/;
|
|
15179
|
+
var CDP_URL = /^(https?|wss?):\/\/\S+$/i;
|
|
15180
|
+
function isValidCdpTarget(value) {
|
|
15181
|
+
if (typeof value !== "string" || value === "") return false;
|
|
15182
|
+
if (CDP_PORT.test(value)) {
|
|
15183
|
+
const port = Number(value);
|
|
15184
|
+
return port >= 1 && port <= 65535;
|
|
15185
|
+
}
|
|
15186
|
+
return CDP_URL.test(value);
|
|
15187
|
+
}
|
|
15005
15188
|
var vpsConfigSchema = external_exports.object({
|
|
15006
15189
|
sshAlias: external_exports.string().refine((value) => value === "" || isValidSshAlias(value), {
|
|
15007
15190
|
message: "must be a simple SSH config alias"
|
|
15008
15191
|
}).optional()
|
|
15009
15192
|
});
|
|
15193
|
+
var browserEngineConfigSchema = external_exports.object({
|
|
15194
|
+
attachCdpUrl: external_exports.string().trim().max(2048).refine((value) => value === "" || isValidCdpTarget(value), {
|
|
15195
|
+
message: "browserEngine.attachCdpUrl must be a CDP port (1-65535) or an http(s)/ws(s) URL"
|
|
15196
|
+
}).optional()
|
|
15197
|
+
});
|
|
15010
15198
|
var roomConfigSchema = external_exports.object({
|
|
15011
15199
|
turnTimeoutMinutes: external_exports.number().int().min(MIN_ROOM_TURN_TIMEOUT_MINUTES).max(MAX_ROOM_TURN_TIMEOUT_MINUTES),
|
|
15012
15200
|
/** Room handoff tree lifetime. Active execution pauses this clock; the
|
|
@@ -15148,7 +15336,11 @@ var featureConfigSchema = external_exports.object({
|
|
|
15148
15336
|
/** Claude bots also load the MCP servers and connectors from this
|
|
15149
15337
|
* machine's own Claude Code setup (Plugins → MCP servers switch). Off by
|
|
15150
15338
|
* default: each extra tool costs tokens on every model call. */
|
|
15151
|
-
claudeUserMcp: external_exports.boolean().optional()
|
|
15339
|
+
claudeUserMcp: external_exports.boolean().optional(),
|
|
15340
|
+
/** LLM-generated titles for new bot threads. Off until explicitly
|
|
15341
|
+
* enabled; a one-shot that fails or answers junk leaves the first-message
|
|
15342
|
+
* snippet in place — see llmThreadTitlesEnabled. */
|
|
15343
|
+
llmThreadTitles: external_exports.boolean().optional()
|
|
15152
15344
|
});
|
|
15153
15345
|
var onboardingConfigSchema = external_exports.object({
|
|
15154
15346
|
/** ISO timestamp of finishing (or skipping to the end of) the welcome flow. */
|
|
@@ -15162,6 +15354,10 @@ var instanceConfigSchema = external_exports.object({
|
|
|
15162
15354
|
driver: external_exports.string().min(1),
|
|
15163
15355
|
displayName: optionalText,
|
|
15164
15356
|
accentColor: optionalText,
|
|
15357
|
+
icon: external_exports.discriminatedUnion("kind", [
|
|
15358
|
+
external_exports.object({ kind: external_exports.literal("preset"), preset: external_exports.enum(PROVIDER_ICON_PRESETS) }).strict(),
|
|
15359
|
+
external_exports.object({ kind: external_exports.literal("custom"), dataUrl: external_exports.string() }).strict().refine((icon) => providerIconError(icon) === null, { message: "Invalid provider icon" })
|
|
15360
|
+
]).optional(),
|
|
15165
15361
|
environment: external_exports.record(external_exports.string(), external_exports.string()).optional(),
|
|
15166
15362
|
enabled: external_exports.boolean().optional(),
|
|
15167
15363
|
config: external_exports.json().optional()
|
|
@@ -15226,6 +15422,7 @@ var appConfigSchema = external_exports.object({
|
|
|
15226
15422
|
/** Voice settings and the selected voice id. `provider` picks the
|
|
15227
15423
|
* engine: "elevenlabs" (default; needs `key`), "fish" (needs its own
|
|
15228
15424
|
* `fishKey`), "system" (the Mac's built-in voices, no key), or
|
|
15425
|
+
* "xai" (Grok TTS, reusing `xai.key`), or
|
|
15229
15426
|
* "chatterbox" (a local OpenAI-compatible Chatterbox server; `baseUrl`
|
|
15230
15427
|
* and `model` are settings, not secrets). Cloud keys stay separate so
|
|
15231
15428
|
* switching providers never overwrites or misuses the other key. */
|
|
@@ -15233,7 +15430,7 @@ var appConfigSchema = external_exports.object({
|
|
|
15233
15430
|
key: optionalText,
|
|
15234
15431
|
fishKey: optionalText,
|
|
15235
15432
|
voice: optionalText,
|
|
15236
|
-
provider: external_exports.enum(["elevenlabs", "fish", "system", "chatterbox"]).optional(),
|
|
15433
|
+
provider: external_exports.enum(["elevenlabs", "fish", "system", "chatterbox", "xai"]).optional(),
|
|
15237
15434
|
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(),
|
|
15238
15435
|
model: optionalText
|
|
15239
15436
|
}).optional(),
|
|
@@ -15262,6 +15459,11 @@ var appConfigSchema = external_exports.object({
|
|
|
15262
15459
|
* system language. Unknown tags degrade to English in the renderer. */
|
|
15263
15460
|
language: optionalText,
|
|
15264
15461
|
rooms: roomConfigSchema.optional(),
|
|
15462
|
+
context: external_exports.object({
|
|
15463
|
+
rebuildBytes: external_exports.number().int().min(1024).max(1e6).optional(),
|
|
15464
|
+
compactAt: external_exports.number().positive().max(1e7).optional(),
|
|
15465
|
+
autoCompact: external_exports.boolean().optional()
|
|
15466
|
+
}).optional(),
|
|
15265
15467
|
threads: external_exports.object({
|
|
15266
15468
|
maxConcurrentPerBot: external_exports.number().int().min(1).max(MAX_CONCURRENT_BOT_THREADS),
|
|
15267
15469
|
/** Cap each per-thread events/ and native/ NDJSON log at this many
|
|
@@ -15274,6 +15476,8 @@ var appConfigSchema = external_exports.object({
|
|
|
15274
15476
|
localVm: localVmConfigSchema.optional(),
|
|
15275
15477
|
features: featureConfigSchema.optional(),
|
|
15276
15478
|
onboarding: onboardingConfigSchema.optional(),
|
|
15479
|
+
/** CDP attach target for a bot's browser; see browserEngineConfigSchema. */
|
|
15480
|
+
browserEngine: browserEngineConfigSchema.optional(),
|
|
15277
15481
|
browserProfiles: browserProfilesSchema.optional(),
|
|
15278
15482
|
instances: instanceConfigMapSchema.optional(),
|
|
15279
15483
|
/** User-configured MCP servers, mounted into every capable engine. Kept
|
|
@@ -15312,6 +15516,7 @@ var SPAWNED_PROXIES = {
|
|
|
15312
15516
|
connectors: resolveProxy("connector-proxy"),
|
|
15313
15517
|
mcpGate: resolveProxy("mcp-gate"),
|
|
15314
15518
|
phone: resolveProxy("drivers/phone-proxy"),
|
|
15519
|
+
hook: resolveProxy("hooks/omb-hook"),
|
|
15315
15520
|
// Loaded by the external `pi` process via `-e`, not by this server — but
|
|
15316
15521
|
// resolved through the same single source of truth so the packaged layout
|
|
15317
15522
|
// check can assert it ships.
|
|
@@ -14602,6 +14602,7 @@ var SPAWNED_PROXIES = {
|
|
|
14602
14602
|
connectors: resolveProxy("connector-proxy"),
|
|
14603
14603
|
mcpGate: resolveProxy("mcp-gate"),
|
|
14604
14604
|
phone: resolveProxy("drivers/phone-proxy"),
|
|
14605
|
+
hook: resolveProxy("hooks/omb-hook"),
|
|
14605
14606
|
// Loaded by the external `pi` process via `-e`, not by this server — but
|
|
14606
14607
|
// resolved through the same single source of truth so the packaged layout
|
|
14607
14608
|
// check can assert it ships.
|