openmausbot 0.1.89 → 0.1.91
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{abnfDiagram-O67JEVCF-BwaMaZEm.js → abnfDiagram-O67JEVCF-yP-w8pRq.js} +1 -1
- package/dist/assets/{arc-Be-8GKxd.js → arc-DsivfZEh.js} +1 -1
- package/dist/assets/{architectureDiagram-NJMV4G6O-Dp_U2Kv1.js → architectureDiagram-NJMV4G6O-CILw7lzT.js} +1 -1
- package/dist/assets/{blockDiagram-BEXU5L5S-DQjUjYUk.js → blockDiagram-BEXU5L5S-DEQUV3HF.js} +1 -1
- package/dist/assets/{c4Diagram-YGBWAQC7-Bd3aE4Kc.js → c4Diagram-YGBWAQC7-lSXCZoKA.js} +1 -1
- package/dist/assets/channel-DrfGMu7X.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-BijjTBeJ.js → chunk-2Q5K7J3B-QCD5bgWP.js} +1 -1
- package/dist/assets/{chunk-3FUC2YCW-CMGdwvzW.js → chunk-3FUC2YCW-C5-iZJuL.js} +2 -2
- package/dist/assets/{chunk-5VM5RSS4-0G09BfsZ.js → chunk-5VM5RSS4-cxsawMpY.js} +1 -1
- package/dist/assets/{chunk-GTNCS2PH-FOp3vSHe.js → chunk-GTNCS2PH-DV8tV8H7.js} +1 -1
- package/dist/assets/{chunk-GWA4HPMP-Dv-20VIn.js → chunk-GWA4HPMP-CJFZyfbW.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-CRgrdFcz.js → chunk-JWPE2WC7-BigbMXco.js} +1 -1
- package/dist/assets/{chunk-NETBCI7D-3hP4f7QB.js → chunk-NETBCI7D-oVxTfpDy.js} +1 -1
- package/dist/assets/{chunk-WEXAMYUT-CG98IjlG.js → chunk-WEXAMYUT-CH4BiroW.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-BrSTC9xG.js → chunk-XXDRQBXY-KEDa6gax.js} +1 -1
- package/dist/assets/{classDiagram-v2-NBCMYWYE-rpQQQDFX.js → classDiagram-v2-NBCMYWYE-BiPjfqVv.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-G6RSafHA.js → cose-bilkent-JH36ORCC-Caxew3OY.js} +1 -1
- package/dist/assets/{cynefin-OW5HDTMX-CXjv-IM2.js → cynefin-OW5HDTMX-B_Pui369.js} +1 -1
- package/dist/assets/{cynefinDiagram-VND7K2PF-Dw07MR9f.js → cynefinDiagram-VND7K2PF-X64ydIhP.js} +1 -1
- package/dist/assets/{dagre-6A5THRUB-BwPnlTg2.js → dagre-6A5THRUB-TqYCI1E1.js} +1 -1
- package/dist/assets/{diagram-22UHCM2B-Cm6xcMiz.js → diagram-22UHCM2B-TeOt3rAQ.js} +1 -1
- package/dist/assets/{diagram-3UASUU5V-CDpogPbE.js → diagram-3UASUU5V-D70BLhDA.js} +1 -1
- package/dist/assets/{diagram-ATOU4E4O-BV8z3Pnc.js → diagram-ATOU4E4O-BbQDLwUC.js} +1 -1
- package/dist/assets/{diagram-CDSNMT55-CKCQhOOC.js → diagram-CDSNMT55-ChNJZ1u-.js} +1 -1
- package/dist/assets/{diagram-MLGK6HIB-FGvJg69C.js → diagram-MLGK6HIB-DMBl2APa.js} +1 -1
- package/dist/assets/{diagram-MPIPVDR6-CwATvgnS.js → diagram-MPIPVDR6-CEqDchOp.js} +1 -1
- package/dist/assets/{ebnfDiagram-ZINNZB2B-CH_c3SSC.js → ebnfDiagram-ZINNZB2B-BVDKRp_-.js} +1 -1
- package/dist/assets/{elk-276RUBZZ-3guZi71R.js → elk-276RUBZZ-CRkofO9B.js} +1 -1
- package/dist/assets/{erDiagram-OPXOYQCR-BMHphR2n.js → erDiagram-OPXOYQCR-DruOMh5e.js} +1 -1
- package/dist/assets/{flowDiagram-KWPJA3E3-Vm5DkW5x.js → flowDiagram-KWPJA3E3-8GMQeB7t.js} +1 -1
- package/dist/assets/{ganttDiagram-FUAMR5RP-DO-1ct07.js → ganttDiagram-FUAMR5RP-ORE9jcsM.js} +1 -1
- package/dist/assets/{gitGraphDiagram-X574FWY7-nxeksEIN.js → gitGraphDiagram-X574FWY7-BmsedsWh.js} +1 -1
- package/dist/assets/index-BlnCEcU6.js +588 -0
- package/dist/assets/{index-Oxk9x45i.js → index-DKNEM8Q6.js} +1 -1
- package/dist/assets/index-DVxjOvID.css +1 -0
- package/dist/assets/{infoDiagram-VRGFBTTK-Dkcvr0p7.js → infoDiagram-VRGFBTTK-E_p7AooJ.js} +1 -1
- package/dist/assets/{ishikawaDiagram-OU5B5YK6-BwVibkoO.js → ishikawaDiagram-OU5B5YK6-Y-B2mKda.js} +1 -1
- package/dist/assets/{journeyDiagram-ZHPQQLJL-ByiBZqgG.js → journeyDiagram-ZHPQQLJL-eA8RELcK.js} +1 -1
- package/dist/assets/{kanban-definition-PNTS6WVX-qqjgXBF3.js → kanban-definition-PNTS6WVX-DqIL2e8e.js} +1 -1
- package/dist/assets/{linear-CtJnKe6A.js → linear-yC_29R6e.js} +1 -1
- package/dist/assets/{mermaid.core-BEiDklrY.js → mermaid.core-VhEMkSND.js} +5 -5
- package/dist/assets/{mindmap-definition-NLK3R4M7-DfIYHia9.js → mindmap-definition-NLK3R4M7-oJ7kyQZy.js} +1 -1
- package/dist/assets/{pegDiagram-GJSIUBJH-CYyRqa1a.js → pegDiagram-GJSIUBJH-BmfYcY0O.js} +1 -1
- package/dist/assets/{pieDiagram-5QR66LMP-hOToy_zH.js → pieDiagram-5QR66LMP-DKvgP7w9.js} +1 -1
- package/dist/assets/{quadrantDiagram-O4NWA36T-DKAsNN9I.js → quadrantDiagram-O4NWA36T-BEKL3W0L.js} +1 -1
- package/dist/assets/{railroadDiagram-XR7U4H2S-BSA-d8JU.js → railroadDiagram-XR7U4H2S-BEsiqR5s.js} +1 -1
- package/dist/assets/{requirementDiagram-PLB6GJNP-CSmlvb-p.js → requirementDiagram-PLB6GJNP-DWBcWvAP.js} +1 -1
- package/dist/assets/{sankeyDiagram-IPEJSGJF-CD5F6fnG.js → sankeyDiagram-IPEJSGJF-rpZ2_O4s.js} +1 -1
- package/dist/assets/{sequenceDiagram-PO4LG4MO-JUq5sx6d.js → sequenceDiagram-PO4LG4MO-B99HQdJR.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-BjIS-Stk.js → sizeCapture-INFHLROL-BjN0qT5T.js} +1 -1
- package/dist/assets/{stateDiagram-v2-GCMORJYK-DklkUxOg.js → stateDiagram-v2-GCMORJYK-BbsVgGsC.js} +1 -1
- package/dist/assets/{swimlanes-2SLR337P-CsjIU6be.js → swimlanes-2SLR337P-DG3gKkeR.js} +1 -1
- package/dist/assets/swimlanesDiagram-TC7HE7FX-BCZhxl7e.js +8 -0
- package/dist/assets/{timeline-definition-EJHVYXUP-BkFqK7AB.js → timeline-definition-EJHVYXUP-BTHOdtF_.js} +1 -1
- package/dist/assets/{usecaseDiagram-POWQR4AR-70gJB1EU.js → usecaseDiagram-POWQR4AR-acLSLFwc.js} +1 -1
- package/dist/assets/{vennDiagram-UO4OBE2U-83Tm62dN.js → vennDiagram-UO4OBE2U-C5JzNX9G.js} +1 -1
- package/dist/assets/{wardleyDiagram-VNRHLVJA-tTmseoX9.js → wardleyDiagram-VNRHLVJA-DL1-PrR_.js} +1 -1
- package/dist/assets/{xychartDiagram-PMCCYNJV-R1LBA55a.js → xychartDiagram-PMCCYNJV-Bvr1477p.js} +1 -1
- package/dist/index.html +2 -2
- package/dist-server/cloud-home-start.js +14810 -0
- package/dist-server/container-mcp.js +136 -36
- package/dist-server/drivers/agents-proxy.js +31 -10
- package/dist-server/index.js +48251 -44124
- package/dist-server/openmausbot.js +628 -292
- package/dist-server/pair-cli.js +628 -292
- package/dist-server/permission-proxy.js +1 -1
- package/dist-server/server/admission.js +46 -0
- package/dist-server/server/{box-create-idempotency.js → boat-create-idempotency.js} +32 -31
- package/dist-server/server/{box-delete-journal.js → boat-delete-journal.js} +26 -25
- package/dist-server/server/{box.js → boat.js} +381 -334
- package/dist-server/server/bot-overview.js +7 -4
- package/dist-server/server/bot-profile.js +7 -1
- package/dist-server/server/channel-queue.js +58 -18
- package/dist-server/server/checkpoints.js +98 -52
- package/dist-server/server/claim-idle.js +33 -0
- package/dist-server/server/cloud-backend.js +5 -5
- package/dist-server/server/cloud-home-start.js +121 -0
- package/dist-server/server/cloud-home.js +241 -0
- package/dist-server/server/cloud-lending.js +103 -0
- package/dist-server/server/cloud-move-http.js +268 -0
- package/dist-server/server/cloud-move.js +418 -0
- package/dist-server/server/cloud-overflow.js +167 -0
- package/dist-server/server/composio.js +5 -0
- package/dist-server/server/computer-observation.js +2 -2
- package/dist-server/server/config.js +156 -9
- package/dist-server/server/container-computer.js +13 -0
- package/dist-server/server/control-client.js +2 -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/delegations.js +11 -3
- package/dist-server/server/drivers/acp/core.js +5 -4
- package/dist-server/server/drivers/agents-call.js +5 -1
- package/dist-server/server/drivers/agents-catalog.js +25 -3
- package/dist-server/server/drivers/{boxagent.js → boatagent.js} +30 -21
- package/dist-server/server/drivers/builtIn.js +2 -2
- package/dist-server/server/drivers/{chat-box-tools.js → chat-boat-tools.js} +3 -3
- package/dist-server/server/drivers/chat-mcp-tools.js +2 -2
- package/dist-server/server/drivers/claude.js +178 -13
- package/dist-server/server/drivers/native.js +1 -1
- package/dist-server/server/drivers/openai-chat.js +15 -4
- package/dist-server/server/drivers/pi.js +3 -3
- package/dist-server/server/group-goal-run.js +6 -4
- package/dist-server/server/harness-capabilities.js +2 -0
- package/dist-server/server/hosted-models.js +6 -1
- package/dist-server/server/included-services.js +70 -0
- package/dist-server/server/index.js +1462 -576
- package/dist-server/server/local-vm-inventory.js +11 -1
- package/dist-server/server/local-vm-seat-pool.js +141 -0
- package/dist-server/server/managed-policy.js +4 -1
- package/dist-server/server/memory-capture.js +194 -0
- package/dist-server/server/memory-entries.js +76 -0
- package/dist-server/server/memory-organize.js +102 -0
- package/dist-server/server/memory-tidy.js +144 -0
- package/dist-server/server/memory-topics.js +169 -0
- package/dist-server/server/memory-upkeep.js +452 -0
- package/dist-server/server/message-db.js +49 -5
- 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/permission-proxy.js +3 -3
- package/dist-server/server/profile-learned.js +98 -0
- package/dist-server/server/profile-versions.js +45 -11
- package/dist-server/server/recall.js +172 -0
- package/dist-server/server/redact.js +1 -1
- package/dist-server/server/request-auth.js +2 -0
- package/dist-server/server/room-cwd.js +1 -1
- package/dist-server/server/room-handoffs.js +61 -6
- package/dist-server/server/routes/bot-memory.js +215 -0
- package/dist-server/server/routes/decider.js +19 -0
- package/dist-server/server/routine-requests.js +27 -16
- package/dist-server/server/routines.js +10 -6
- package/dist-server/server/shared-computers.js +116 -30
- package/dist-server/server/steer-queue.js +41 -10
- package/dist-server/server/store.js +42 -3
- package/dist-server/server/surface.js +14 -1
- package/dist-server/server/system-prompt.js +16 -5
- package/dist-server/server/team-backup.js +6 -2
- package/dist-server/server/team-computers.js +2 -2
- package/dist-server/server/team-manifest.js +11 -3
- package/dist-server/server/tightening-requests.js +34 -4
- package/dist-server/server/tool-summary.js +2 -2
- package/dist-server/server/tts/elevenlabs.js +12 -7
- package/dist-server/server/tts/index.js +17 -10
- package/dist-server/server/turn-resources.js +87 -11
- package/dist-server/server/vps-computer.js +1 -1
- package/dist-server/server/workspace-backup-policy.js +22 -3
- package/dist-server/server/workspace-backup.js +25 -8
- package/dist-server/server/workspace.js +57 -22
- package/dist-server/shared/ask-question.js +7 -5
- package/dist-server/shared/bot-avatar.js +19 -0
- package/dist-server/shared/cloud-home.js +4 -0
- package/dist-server/shared/credential-request.js +3 -3
- package/dist-server/shared/package-format.js +30 -4
- package/dist-server/shared/team-backup.js +20 -3
- package/dist-server/shared/tool-surface.js +1 -1
- package/dist-server/src/lib/composer-attachments.js +9 -0
- package/dist-server/vps-container-mcp.js +136 -36
- package/dist-server/workspace-backup.worker.js +165 -35
- package/package.json +1 -1
- package/dist/assets/channel-DqY_gMLg.js +0 -1
- package/dist/assets/index-BIMdIbaw.css +0 -1
- package/dist/assets/index-BVPdbq2r.js +0 -583
- package/dist/assets/swimlanesDiagram-TC7HE7FX-Bk14M0_B.js +0 -8
|
@@ -119,7 +119,7 @@ function probeLoginShellPath() {
|
|
|
119
119
|
|
|
120
120
|
// server/config.ts
|
|
121
121
|
import { homedir as homedir2 } from "node:os";
|
|
122
|
-
import { join as
|
|
122
|
+
import { join as join3 } from "node:path";
|
|
123
123
|
|
|
124
124
|
// node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
|
|
125
125
|
var external_exports = {};
|
|
@@ -14657,6 +14657,8 @@ function normalizeImageGenerationUrl(value) {
|
|
|
14657
14657
|
// shared/bot-avatar.ts
|
|
14658
14658
|
var BOT_AVATAR_CROPS = ["mascot", "circle", "rounded", "square"];
|
|
14659
14659
|
var botAvatarCropSchema = external_exports.enum(BOT_AVATAR_CROPS);
|
|
14660
|
+
var AVATAR_ZOOM_MIN = 1;
|
|
14661
|
+
var AVATAR_ZOOM_MAX = 3;
|
|
14660
14662
|
var botAvatarUrlSchema = external_exports.string().regex(
|
|
14661
14663
|
/^\/api\/attachments\/[A-Za-z0-9-]+\.(?:png|jpg|gif|webp)$/,
|
|
14662
14664
|
"must be a stored PNG, JPEG, GIF, or WebP attachment"
|
|
@@ -14695,6 +14697,9 @@ var profilePatchSchema = external_exports.object({
|
|
|
14695
14697
|
error: "avatarUrl must be a stored PNG, JPEG, GIF, or WebP attachment"
|
|
14696
14698
|
}).optional(),
|
|
14697
14699
|
avatarCrop: botAvatarCropSchema.optional(),
|
|
14700
|
+
avatarZoom: external_exports.number({ error: "avatarZoom must be a number from 1 to 3" }).finite().min(AVATAR_ZOOM_MIN).max(AVATAR_ZOOM_MAX).optional(),
|
|
14701
|
+
avatarFocusX: external_exports.number({ error: "avatarFocusX must be a number from 0 to 1" }).finite().min(0).max(1).optional(),
|
|
14702
|
+
avatarFocusY: external_exports.number({ error: "avatarFocusY must be a number from 0 to 1" }).finite().min(0).max(1).optional(),
|
|
14698
14703
|
mascotBody: mascotBodySchema.optional(),
|
|
14699
14704
|
voice: external_exports.string({ error: "voice must be a string" }).max(BOT_PROFILE_LIMITS.voice, { error: "voice must be at most 200 characters" }).optional(),
|
|
14700
14705
|
speakReplies: external_exports.boolean({ error: "speakReplies must be true or false" }).optional()
|
|
@@ -15630,6 +15635,76 @@ var remoteMutationSchema = remoteEntrySchema.extend({
|
|
|
15630
15635
|
headers: external_exports.record(external_exports.string(), external_exports.union([external_exports.string().max(16384), external_exports.literal(true)])).optional()
|
|
15631
15636
|
});
|
|
15632
15637
|
|
|
15638
|
+
// server/cloud-overflow.ts
|
|
15639
|
+
var CLOUD_SEAT_IDLE_STOP_MS = 5 * 6e4;
|
|
15640
|
+
var CLOUD_SEAT_SLEEP_RETRY_MAX_MS = 10 * 6e4;
|
|
15641
|
+
|
|
15642
|
+
// server/proxy-paths.ts
|
|
15643
|
+
import { existsSync as existsSync2 } from "node:fs";
|
|
15644
|
+
import { dirname as dirname2, join as join2 } from "node:path";
|
|
15645
|
+
import { fileURLToPath } from "node:url";
|
|
15646
|
+
var SERVER_ROOT = dirname2(fileURLToPath(import.meta.url));
|
|
15647
|
+
function resolveProxy(relative) {
|
|
15648
|
+
const source = join2(SERVER_ROOT, `${relative}.ts`);
|
|
15649
|
+
return existsSync2(source) ? source : join2(SERVER_ROOT, `${relative}.js`);
|
|
15650
|
+
}
|
|
15651
|
+
var SPAWNED_PROXIES = {
|
|
15652
|
+
browser: resolveProxy("browser-proxy"),
|
|
15653
|
+
localComputer: resolveProxy("local-computer-proxy"),
|
|
15654
|
+
permission: resolveProxy("permission-proxy"),
|
|
15655
|
+
containerMcp: resolveProxy("container-mcp"),
|
|
15656
|
+
vpsContainerMcp: resolveProxy("vps-container-mcp"),
|
|
15657
|
+
agents: resolveProxy("drivers/agents-proxy"),
|
|
15658
|
+
dweb: resolveProxy("drivers/dweb-proxy"),
|
|
15659
|
+
connectors: resolveProxy("connector-proxy"),
|
|
15660
|
+
mcpGate: resolveProxy("mcp-gate"),
|
|
15661
|
+
phone: resolveProxy("drivers/phone-proxy"),
|
|
15662
|
+
hook: resolveProxy("hooks/omb-hook"),
|
|
15663
|
+
// Loaded by the external `pi` process via `-e`, not by this server — but
|
|
15664
|
+
// resolved through the same single source of truth so the packaged layout
|
|
15665
|
+
// check can assert it ships.
|
|
15666
|
+
piMcpExtension: resolveProxy("drivers/pi-mcp-extension")
|
|
15667
|
+
};
|
|
15668
|
+
|
|
15669
|
+
// server/enterprise.ts
|
|
15670
|
+
var layerSchema = external_exports.object({
|
|
15671
|
+
customer: external_exports.string().min(1),
|
|
15672
|
+
features: external_exports.array(external_exports.string().min(1)),
|
|
15673
|
+
expiresAt: external_exports.string().nullable()
|
|
15674
|
+
});
|
|
15675
|
+
var DAY_MS = 24 * 60 * 6e4;
|
|
15676
|
+
|
|
15677
|
+
// server/sessions.ts
|
|
15678
|
+
var PAIRING_CODE_TTL_MS = 5 * 6e4;
|
|
15679
|
+
function daysMs(value, fallbackDays) {
|
|
15680
|
+
const days = Number(value);
|
|
15681
|
+
const ok = Number.isInteger(days) && days >= 1 && days <= 3650;
|
|
15682
|
+
return (ok ? days : fallbackDays) * 24 * 60 * 6e4;
|
|
15683
|
+
}
|
|
15684
|
+
var SESSION_TTL_MS = daysMs(process.env.OMB_SESSION_TTL_DAYS, 30);
|
|
15685
|
+
var SESSION_MAX_AGE_MS = daysMs(process.env.OMB_SESSION_MAX_DAYS, 180);
|
|
15686
|
+
var SESSION_RENEW_WHEN_LEFT_MS = SESSION_TTL_MS / 2;
|
|
15687
|
+
var STREAM_TICKET_TTL_MS = 5 * 6e4;
|
|
15688
|
+
var scopeSchema = external_exports.enum(["admin", "client"]);
|
|
15689
|
+
var sessionSchema = external_exports.object({
|
|
15690
|
+
id: external_exports.string().min(1),
|
|
15691
|
+
tokenHash: external_exports.string().length(64),
|
|
15692
|
+
label: external_exports.string().max(80),
|
|
15693
|
+
scopes: external_exports.array(scopeSchema).min(1),
|
|
15694
|
+
createdAt: external_exports.number(),
|
|
15695
|
+
lastSeenAt: external_exports.number(),
|
|
15696
|
+
expiresAt: external_exports.number(),
|
|
15697
|
+
/** Set when the session came from an account sign-in rather than a code. */
|
|
15698
|
+
userId: external_exports.string().max(256).optional(),
|
|
15699
|
+
email: external_exports.string().max(320).optional(),
|
|
15700
|
+
/** Set only by the internal verified-portal issuance path, never by email or pairing input. */
|
|
15701
|
+
membershipAuthority: external_exports.literal("portal").optional()
|
|
15702
|
+
});
|
|
15703
|
+
var fileSchema = external_exports.object({ version: external_exports.literal(1), sessions: external_exports.array(sessionSchema) });
|
|
15704
|
+
|
|
15705
|
+
// server/cloud-home.ts
|
|
15706
|
+
var CLOUD_PAIRING_NONCE_MS = 10 * 6e4;
|
|
15707
|
+
|
|
15633
15708
|
// server/config.ts
|
|
15634
15709
|
var optionalText = external_exports.string().optional();
|
|
15635
15710
|
var SSH_ALIAS = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
|
|
@@ -15671,7 +15746,8 @@ var browserEngineConfigSchema = external_exports.object({
|
|
|
15671
15746
|
var roomConfigSchema = external_exports.object({
|
|
15672
15747
|
turnTimeoutMinutes: external_exports.number().int().min(MIN_ROOM_TURN_TIMEOUT_MINUTES).max(MAX_ROOM_TURN_TIMEOUT_MINUTES),
|
|
15673
15748
|
/** Room handoff tree lifetime. Active execution pauses this clock; the
|
|
15674
|
-
* hard cap is
|
|
15749
|
+
* hard cap is the maximum stall window, measured wall-clock from the
|
|
15750
|
+
* tree's last durable progress. */
|
|
15675
15751
|
handoffLifetimeMinutes: external_exports.number().int().min(1).max(MAX_ROOM_TURN_TIMEOUT_MINUTES).optional(),
|
|
15676
15752
|
handoffMinRunwayMinutes: external_exports.number().int().min(1).max(MAX_ROOM_TURN_TIMEOUT_MINUTES).optional(),
|
|
15677
15753
|
handoffHardCapMinutes: external_exports.number().int().min(1).max(7 * MAX_ROOM_TURN_TIMEOUT_MINUTES).optional()
|
|
@@ -15680,7 +15756,7 @@ var roomConfigSchema = external_exports.object({
|
|
|
15680
15756
|
{ message: "rooms handoff bounds must satisfy handoffMinRunwayMinutes <= handoffLifetimeMinutes <= handoffHardCapMinutes" }
|
|
15681
15757
|
);
|
|
15682
15758
|
var localVmConfigSchema = external_exports.object({
|
|
15683
|
-
mode: external_exports.enum(["shared", "per-bot"]).optional(),
|
|
15759
|
+
mode: external_exports.enum(["shared", "per-bot", "pool"]).optional(),
|
|
15684
15760
|
maxInstances: external_exports.number().int().min(MIN_LOCAL_VM_MAX_INSTANCES).max(MAX_LOCAL_VM_MAX_INSTANCES).optional()
|
|
15685
15761
|
});
|
|
15686
15762
|
var browserProfileSchema = external_exports.object({
|
|
@@ -15799,6 +15875,10 @@ var featureConfigSchema = external_exports.object({
|
|
|
15799
15875
|
skillAuthoring: external_exports.boolean().optional(),
|
|
15800
15876
|
/** Show each tool run in the transcript. Off unless explicitly enabled. */
|
|
15801
15877
|
showToolCalls: external_exports.boolean().optional(),
|
|
15878
|
+
/** Run a routine inside the conversation it reports to, instead of a hidden
|
|
15879
|
+
* thread. Off unless explicitly enabled. The run still starts from its own
|
|
15880
|
+
* instructions, but the messages stay in that chat. */
|
|
15881
|
+
routinesInConversation: external_exports.boolean().optional(),
|
|
15802
15882
|
/** Experimental built-in browser. Off until explicitly enabled; each bot
|
|
15803
15883
|
* also has its own switch. */
|
|
15804
15884
|
browser: external_exports.boolean().optional(),
|
|
@@ -15812,8 +15892,23 @@ var featureConfigSchema = external_exports.object({
|
|
|
15812
15892
|
claudeUserMcp: external_exports.boolean().optional(),
|
|
15813
15893
|
/** LLM-generated titles for new bot threads. Off until explicitly
|
|
15814
15894
|
* enabled; a one-shot that fails or answers junk leaves the first-message
|
|
15815
|
-
|
|
15816
|
-
llmThreadTitles: external_exports.boolean().optional()
|
|
15895
|
+
* snippet in place — see llmThreadTitlesEnabled. */
|
|
15896
|
+
llmThreadTitles: external_exports.boolean().optional(),
|
|
15897
|
+
/** Before each turn, passages from the bot's own memory files and earlier
|
|
15898
|
+
* conversations that share words with the message ride into the turn.
|
|
15899
|
+
* Read-only; on unless explicitly switched off — see autoRecallEnabled. */
|
|
15900
|
+
autoRecall: external_exports.boolean().optional(),
|
|
15901
|
+
/** Idle release for computer claims (#1653): a desktop seat that stays
|
|
15902
|
+
* screen-quiet for 90 seconds is released to waiting turns while its
|
|
15903
|
+
* holder's turn still lives; the previous holder re-claims directly
|
|
15904
|
+
* for 10 minutes and yields to an occupied seat. Off until baked; see
|
|
15905
|
+
* computerClaimIdleReleaseEnabled for how to enable it by hand. */
|
|
15906
|
+
computerClaimIdleRelease: external_exports.boolean().optional(),
|
|
15907
|
+
/** Consented cloud overflow for local computer waits (#1655): a wait
|
|
15908
|
+
* may offer a per-second-billed cloud seat, but only through an explicit
|
|
15909
|
+
* consent card or a configured allowlist — never a silent Auto default.
|
|
15910
|
+
* Off until baked; see cloudOverflowEnabled for how to enable it by hand. */
|
|
15911
|
+
cloudOverflow: external_exports.boolean().optional()
|
|
15817
15912
|
});
|
|
15818
15913
|
var onboardingConfigSchema = external_exports.object({
|
|
15819
15914
|
/** ISO timestamp of finishing (or skipping to the end of) the welcome flow. */
|
|
@@ -15920,6 +16015,8 @@ var appConfigSchema = external_exports.object({
|
|
|
15920
16015
|
/** Project key used for Sessions, catalog and agent tools. userId/sessionId
|
|
15921
16016
|
* are non-secret local identifiers used to reuse one Composio Session. */
|
|
15922
16017
|
composio: external_exports.object({ apiKey: optionalText, userId: optionalText, sessionId: optionalText }).optional(),
|
|
16018
|
+
/** Historical config section name "box" (the persisted config.json key); the
|
|
16019
|
+
* provider is Boat now and the key is kept for compatibility. */
|
|
15923
16020
|
box: external_exports.object({ token: optionalText }).optional(),
|
|
15924
16021
|
vps: vpsConfigSchema.optional(),
|
|
15925
16022
|
/** Optional OpenCode key; persisted write-only and passed only to its child. */
|
|
@@ -15939,6 +16036,19 @@ var appConfigSchema = external_exports.object({
|
|
|
15939
16036
|
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(),
|
|
15940
16037
|
model: optionalText
|
|
15941
16038
|
}).optional(),
|
|
16039
|
+
/** The decision model (server/decider): a fast classifier that picks
|
|
16040
|
+
* things for bots, starting with who answers a room message. `key` is
|
|
16041
|
+
* write-only like every credential; `baseUrl` points at a Jev-compatible
|
|
16042
|
+
* server instead of TypeSafe's (an operator setting with no UI); `jobs`
|
|
16043
|
+
* switches each decision on or off. Not `decisions`: that section is the
|
|
16044
|
+
* authorization log's retention. */
|
|
16045
|
+
decider: external_exports.object({
|
|
16046
|
+
enabled: external_exports.boolean().optional(),
|
|
16047
|
+
provider: external_exports.enum(["jev", "off"]).optional(),
|
|
16048
|
+
key: optionalText,
|
|
16049
|
+
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(),
|
|
16050
|
+
jobs: external_exports.object({ roomRouting: external_exports.boolean().optional() }).optional()
|
|
16051
|
+
}).optional(),
|
|
15942
16052
|
/** Avatar provider credentials stay separate; choosing a router never reuses a cloud key. */
|
|
15943
16053
|
imageGen: external_exports.object({
|
|
15944
16054
|
provider: external_exports.enum(["openai", "xai", "custom"]).optional(),
|
|
@@ -15969,10 +16079,26 @@ var appConfigSchema = external_exports.object({
|
|
|
15969
16079
|
compactAt: external_exports.number().positive().max(1e7).optional(),
|
|
15970
16080
|
autoCompact: external_exports.boolean().optional()
|
|
15971
16081
|
}).optional(),
|
|
16082
|
+
/** Memory upkeep timing, for bots with Memory upkeep switched on. */
|
|
16083
|
+
memory: external_exports.object({
|
|
16084
|
+
/** Quiet time after a turn before its facts are captured (ms). */
|
|
16085
|
+
captureQuietMs: external_exports.number().int().min(1e3).max(24 * 60 * 6e4).optional(),
|
|
16086
|
+
/** Local hour (0-23) after which the nightly tidy-up runs. */
|
|
16087
|
+
tidyHour: external_exports.number().int().min(0).max(23).optional()
|
|
16088
|
+
}).strict().optional(),
|
|
15972
16089
|
threads: threadsConfigSchema.optional(),
|
|
15973
16090
|
/** The authorization decision log (server/decision-log.ts): days of month
|
|
15974
16091
|
* files kept, at least; OMB_DECISION_RETENTION_DAYS wins when set. */
|
|
15975
16092
|
decisions: external_exports.object({ retentionDays: external_exports.number().int().min(1).max(3650).optional() }).strict().optional(),
|
|
16093
|
+
/** #1655 cloud-overflow settings. perSecondCostUsd is the operator's own
|
|
16094
|
+
* verified rate: with no price configured the feature stays inert rather
|
|
16095
|
+
* than show an invented one. allowlistedThreads carries standing consent
|
|
16096
|
+
* for exact thread ids. */
|
|
16097
|
+
cloudOverflow: external_exports.object({
|
|
16098
|
+
perSecondCostUsd: external_exports.number().positive().max(10).optional(),
|
|
16099
|
+
idleStopMs: external_exports.number().int().positive().max(24 * 60 * 6e4).optional(),
|
|
16100
|
+
allowlistedThreads: external_exports.array(external_exports.string().min(1)).max(1e3).optional()
|
|
16101
|
+
}).strict().optional(),
|
|
15976
16102
|
localVm: localVmConfigSchema.optional(),
|
|
15977
16103
|
features: featureConfigSchema.optional(),
|
|
15978
16104
|
onboarding: onboardingConfigSchema.optional(),
|
|
@@ -15991,37 +16117,11 @@ var storedAppConfigSchema = appConfigSchema.extend({
|
|
|
15991
16117
|
});
|
|
15992
16118
|
var appConfigPatchSchema = appConfigSchema.omit({ instances: true, mcpServers: true, cliStartup: true, customDomain: true }).extend({ threads: threadsPatchSchema.optional(), newBots: newBotsPatchSchema.optional() });
|
|
15993
16119
|
var jsonObjectSchema = external_exports.record(external_exports.string(), external_exports.json());
|
|
15994
|
-
var
|
|
15995
|
-
var
|
|
15996
|
-
var
|
|
15997
|
-
var
|
|
15998
|
-
|
|
15999
|
-
// server/proxy-paths.ts
|
|
16000
|
-
import { existsSync as existsSync2 } from "node:fs";
|
|
16001
|
-
import { dirname as dirname2, join as join3 } from "node:path";
|
|
16002
|
-
import { fileURLToPath } from "node:url";
|
|
16003
|
-
var SERVER_ROOT = dirname2(fileURLToPath(import.meta.url));
|
|
16004
|
-
function resolveProxy(relative) {
|
|
16005
|
-
const source = join3(SERVER_ROOT, `${relative}.ts`);
|
|
16006
|
-
return existsSync2(source) ? source : join3(SERVER_ROOT, `${relative}.js`);
|
|
16007
|
-
}
|
|
16008
|
-
var SPAWNED_PROXIES = {
|
|
16009
|
-
browser: resolveProxy("browser-proxy"),
|
|
16010
|
-
localComputer: resolveProxy("local-computer-proxy"),
|
|
16011
|
-
permission: resolveProxy("permission-proxy"),
|
|
16012
|
-
containerMcp: resolveProxy("container-mcp"),
|
|
16013
|
-
vpsContainerMcp: resolveProxy("vps-container-mcp"),
|
|
16014
|
-
agents: resolveProxy("drivers/agents-proxy"),
|
|
16015
|
-
dweb: resolveProxy("drivers/dweb-proxy"),
|
|
16016
|
-
connectors: resolveProxy("connector-proxy"),
|
|
16017
|
-
mcpGate: resolveProxy("mcp-gate"),
|
|
16018
|
-
phone: resolveProxy("drivers/phone-proxy"),
|
|
16019
|
-
hook: resolveProxy("hooks/omb-hook"),
|
|
16020
|
-
// Loaded by the external `pi` process via `-e`, not by this server — but
|
|
16021
|
-
// resolved through the same single source of truth so the packaged layout
|
|
16022
|
-
// check can assert it ships.
|
|
16023
|
-
piMcpExtension: resolveProxy("drivers/pi-mcp-extension")
|
|
16024
|
-
};
|
|
16120
|
+
var DEFAULT_CAPTURE_QUIET_MS = 2 * 6e4;
|
|
16121
|
+
var DATA_DIR = process.env.OMB_DATA_DIR ?? join3(homedir2(), ".openmausbot");
|
|
16122
|
+
var LEGACY_DATA_DIR = join3(homedir2(), ".opengrokbot");
|
|
16123
|
+
var EVENTS_DIR = join3(DATA_DIR, "events");
|
|
16124
|
+
var NATIVE_DIR = join3(DATA_DIR, "native");
|
|
16025
16125
|
|
|
16026
16126
|
// server/container-computer.ts
|
|
16027
16127
|
var run = promisify(execFile2);
|
|
@@ -16,9 +16,9 @@ var CREDENTIAL_TARGETS = {
|
|
|
16
16
|
helpUrl: "https://console.x.ai/"
|
|
17
17
|
},
|
|
18
18
|
boxToken: {
|
|
19
|
-
label: "
|
|
20
|
-
description: "Gives bots an isolated cloud computer when
|
|
21
|
-
placeholder: "Paste your
|
|
19
|
+
label: "Boat API key",
|
|
20
|
+
description: "Gives bots an isolated cloud computer when Boat is selected.",
|
|
21
|
+
placeholder: "Paste your Boat API key",
|
|
22
22
|
helpUrl: "https://docs.boat.dev/api-keys"
|
|
23
23
|
},
|
|
24
24
|
opencodeGoApiKey: {
|
|
@@ -129,6 +129,7 @@ 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",
|
|
132
133
|
botId: env.OMB_BOT_ID ?? ""
|
|
133
134
|
};
|
|
134
135
|
}
|
|
@@ -222,8 +223,9 @@ var ROUTINE_FIELDS_SCHEMA = {
|
|
|
222
223
|
schedule: ROUTINE_SCHEDULE_SCHEMA,
|
|
223
224
|
run_on: {
|
|
224
225
|
type: "string",
|
|
226
|
+
// "box" is Boat's historical run_on destination id (agents wire contract).
|
|
225
227
|
enum: ["maus", "box"],
|
|
226
|
-
description: "Default maus keeps the bot's selected model and configured computer, INCLUDING a self-hosted VPS. Omit this field for normal schedules. box explicitly switches the agent to the
|
|
228
|
+
description: "Default maus keeps the bot's selected model and configured computer, INCLUDING a self-hosted VPS. Omit this field for normal schedules. box explicitly switches the agent to the Boat-hosted runner; it requires Boat setup and is not the generic cloud/VPS option. Legacy cloud values from list_routines mean box, not VPS."
|
|
227
229
|
},
|
|
228
230
|
timeout_minutes: {
|
|
229
231
|
type: "integer",
|
|
@@ -383,7 +385,7 @@ var toolDefinitions = (externalRuntime) => [
|
|
|
383
385
|
surface: {
|
|
384
386
|
type: "string",
|
|
385
387
|
enum: ["auto", "cloud", "vm", "local", "browser"],
|
|
386
|
-
description: "auto = suitable configured computer, cloud = remote
|
|
388
|
+
description: "auto = suitable configured computer, cloud = remote Boat/VPS, vm = isolated Local VM, local = user's own desktop, browser = built-in browser. Omit to list."
|
|
387
389
|
}
|
|
388
390
|
} }
|
|
389
391
|
},
|
|
@@ -625,7 +627,8 @@ var toolDefinitions = (externalRuntime) => [
|
|
|
625
627
|
properties: {
|
|
626
628
|
action: { type: "string", enum: ["append", "replace", "remove", "supersede"] },
|
|
627
629
|
text: { type: "string", minLength: 1, description: "Non-blank new text for append, replace, or supersede: the fact itself, without a date or bullet. Omit for remove; use remove to delete a passage." },
|
|
628
|
-
old_text: { type: "string", minLength: 1, description: "Exact unique existing passage for replace, supersede, or remove. Omit for append." }
|
|
630
|
+
old_text: { type: "string", minLength: 1, description: "Exact unique existing passage for replace, supersede, or remove. Omit for append." },
|
|
631
|
+
until: { type: "string", pattern: "^\\d{4}-\\d{2}-\\d{2}$", description: "Optional, for append or supersede: YYYY-MM-DD, the last day a temporary fact holds (an exam this weekend, a trip next week). After that day the entry is hidden from your memory." }
|
|
629
632
|
},
|
|
630
633
|
required: ["action"]
|
|
631
634
|
}
|
|
@@ -717,12 +720,16 @@ var toolDefinitions = (externalRuntime) => [
|
|
|
717
720
|
},
|
|
718
721
|
{
|
|
719
722
|
name: "propose_routine_action",
|
|
720
|
-
description: "Prepare a user-requested change to one of this bot's existing routines. Use list_routines first to get the routine id." + PROPOSAL_OUTCOME,
|
|
723
|
+
description: "Prepare a user-requested change to one of this bot's existing routines. Use list_routines first to get the routine id. If the user asks to change ANOTHER bot's routine and that bot is in your section, call list_bots and pass that bot's id as for_bot_id; the routine keeps its owner and every run keeps that bot's engine and permissions." + PROPOSAL_OUTCOME,
|
|
721
724
|
inputSchema: {
|
|
722
725
|
type: "object",
|
|
723
726
|
additionalProperties: false,
|
|
724
727
|
properties: {
|
|
725
728
|
routine_id: { type: "string", minLength: 1, description: "Routine id from list_routines." },
|
|
729
|
+
for_bot_id: {
|
|
730
|
+
type: "string",
|
|
731
|
+
description: "Only when the requested change targets ANOTHER bot's routine and that bot is in your section: that bot's id from list_bots. Learn the routine id from that bot's own routines (it can run list_routines). Omit to change one of your own routines."
|
|
732
|
+
},
|
|
726
733
|
action: {
|
|
727
734
|
type: "string",
|
|
728
735
|
enum: ["update", "pause", "resume", "run_now", "delete"],
|
|
@@ -847,7 +854,17 @@ var ROOM_ONLY_TOOLS = /* @__PURE__ */ new Set(["list_room_targets", "coordinate_
|
|
|
847
854
|
var ROOM_REPLACED_TOOLS = /* @__PURE__ */ new Set(["ask_bot", "delegate_bot", "check_delegation", "wait_delegation", "start_thread", "send_to_thread", "wait_thread"]);
|
|
848
855
|
var EXTERNAL_TOOL_NAMES = /* @__PURE__ */ new Set(["list_bots", "ask_bot", "delegate_bot", "check_delegation", "wait_delegation"]);
|
|
849
856
|
var WATCHER_TOOL_NAMES = /* @__PURE__ */ new Set(["create_options_card"]);
|
|
857
|
+
var LOCAL_VM_TOOL_NAMES = /* @__PURE__ */ new Set(["vm_exec"]);
|
|
858
|
+
var CLOUD_HOME_SURFACE = {
|
|
859
|
+
type: "string",
|
|
860
|
+
enum: ["auto", "cloud", "browser"],
|
|
861
|
+
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."
|
|
862
|
+
};
|
|
850
863
|
function availableTools(profile) {
|
|
864
|
+
const tools = catalogTools(profile);
|
|
865
|
+
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;
|
|
866
|
+
}
|
|
867
|
+
function catalogTools(profile) {
|
|
851
868
|
const TOOLS = toolDefinitions(profile.externalRuntime);
|
|
852
869
|
const BOT_SCOPED_TOOLS = profile.botId === WATCHER_OPTIONS_CARD_BOT_ID ? TOOLS : TOOLS.filter((tool) => !WATCHER_TOOL_NAMES.has(tool.name));
|
|
853
870
|
const AUTHORING_TOOLS = profile.skillAuthoring ? BOT_SCOPED_TOOLS : BOT_SCOPED_TOOLS.filter((tool) => !SKILL_TOOL_NAMES.has(tool.name));
|
|
@@ -16419,7 +16436,7 @@ function routineFields(args) {
|
|
|
16419
16436
|
const runOn = destination(args.run_on ?? args.runOn);
|
|
16420
16437
|
const timeoutMinutes = args.timeout_minutes ?? args.timeoutMinutes;
|
|
16421
16438
|
if (runOn != null && runOn !== "maus" && runOn !== "cloud") {
|
|
16422
|
-
return { fields, error: 'Use run_on="maus" for the bot\u2019s current model and configured computer (including VPS), or run_on="box" only for the
|
|
16439
|
+
return { fields, error: 'Use run_on="maus" for the bot\u2019s current model and configured computer (including VPS), or run_on="box" only for the Boat-hosted agent. Legacy "cloud" also means Boat.' };
|
|
16423
16440
|
}
|
|
16424
16441
|
if (timeoutMinutes != null && (typeof timeoutMinutes !== "number" || !Number.isInteger(timeoutMinutes) || timeoutMinutes < 5 || timeoutMinutes > 240)) {
|
|
16425
16442
|
return { fields, error: "timeout_minutes must be a whole number from 5 to 240. Use clear_timeout to remove a limit." };
|
|
@@ -17044,11 +17061,14 @@ ${JSON.stringify(routines, null, 2)}`
|
|
|
17044
17061
|
if (!routineId || !action) {
|
|
17045
17062
|
return { text: "propose_routine_action needs a routine_id and supported action.", isError: true };
|
|
17046
17063
|
}
|
|
17064
|
+
const forBotId = String(args.for_bot_id ?? "").trim();
|
|
17047
17065
|
const body = {
|
|
17048
17066
|
fromBotId: BOT_ID,
|
|
17049
17067
|
fromThreadId: THREAD_ID,
|
|
17050
17068
|
action,
|
|
17051
|
-
routineId
|
|
17069
|
+
routineId,
|
|
17070
|
+
// JSON.stringify drops the key entirely when no target was named
|
|
17071
|
+
...forBotId ? { forBotId } : {}
|
|
17052
17072
|
};
|
|
17053
17073
|
if (action === "update") {
|
|
17054
17074
|
if (!jsonRecord(args.changes)) {
|
|
@@ -17141,7 +17161,8 @@ ${JSON.stringify(routines, null, 2)}`
|
|
|
17141
17161
|
fromThreadId: THREAD_ID,
|
|
17142
17162
|
action: args.action,
|
|
17143
17163
|
text: args.text,
|
|
17144
|
-
oldText: args.old_text
|
|
17164
|
+
oldText: args.old_text,
|
|
17165
|
+
...typeof args.until === "string" && args.until.trim() ? { until: args.until.trim() } : {}
|
|
17145
17166
|
})
|
|
17146
17167
|
});
|
|
17147
17168
|
if (r.error || r.ok !== true) {
|