openmausbot 0.1.94 → 0.1.96
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-bxM7NV3N.js → DesktopViewer-DsnA23KM.js} +1 -1
- package/dist/assets/{abnfDiagram-O67JEVCF-BhMdJhRJ.js → abnfDiagram-O67JEVCF-Dkbd2hcj.js} +1 -1
- package/dist/assets/{arc-B5itKDcx.js → arc-Duj5Coy2.js} +1 -1
- package/dist/assets/{architectureDiagram-NJMV4G6O-C5d7UY6U.js → architectureDiagram-NJMV4G6O-uYUsDawP.js} +1 -1
- package/dist/assets/{blockDiagram-BEXU5L5S-BrZIhMmu.js → blockDiagram-BEXU5L5S-CWDlTpXe.js} +1 -1
- package/dist/assets/{c4Diagram-YGBWAQC7-7I0ArfbD.js → c4Diagram-YGBWAQC7-B0t15PDc.js} +1 -1
- package/dist/assets/channel-BZxwC-Gw.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-BnEsyN36.js → chunk-2Q5K7J3B-BJSCL-HV.js} +1 -1
- package/dist/assets/{chunk-3FUC2YCW-BXATQ52s.js → chunk-3FUC2YCW-D3_ILccd.js} +2 -2
- package/dist/assets/{chunk-5VM5RSS4-B0BpTkEx.js → chunk-5VM5RSS4-D3dmwT_S.js} +1 -1
- package/dist/assets/{chunk-GTNCS2PH-BtLTz6FR.js → chunk-GTNCS2PH-Br73HFPD.js} +1 -1
- package/dist/assets/{chunk-GWA4HPMP-D6gcZOYt.js → chunk-GWA4HPMP-uSsjxubC.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-DCLrosvf.js → chunk-JWPE2WC7-C40VWFyr.js} +1 -1
- package/dist/assets/{chunk-NETBCI7D-B9JsknV9.js → chunk-NETBCI7D-D6WNNYwU.js} +1 -1
- package/dist/assets/{chunk-WEXAMYUT-CsoTxw7z.js → chunk-WEXAMYUT-DOEhq64P.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-0F_frB0c.js → chunk-XXDRQBXY-BqJEi6Pi.js} +1 -1
- package/dist/assets/{classDiagram-v2-NBCMYWYE-DkrpnflX.js → classDiagram-v2-NBCMYWYE-ByU_GnxT.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-BNDwYBt9.js → cose-bilkent-JH36ORCC-D-Uglxqq.js} +1 -1
- package/dist/assets/{cynefin-OW5HDTMX-JUkNr1Mk.js → cynefin-OW5HDTMX-CZWO7aYj.js} +1 -1
- package/dist/assets/{cynefinDiagram-VND7K2PF-DKeh9N4M.js → cynefinDiagram-VND7K2PF-C70-w0la.js} +1 -1
- package/dist/assets/{dagre-6A5THRUB-ve-6T_wX.js → dagre-6A5THRUB-CnhjhExB.js} +1 -1
- package/dist/assets/{diagram-22UHCM2B-BuJ2d8rT.js → diagram-22UHCM2B-bnjWCNb4.js} +1 -1
- package/dist/assets/{diagram-3UASUU5V-BgOs_Ni-.js → diagram-3UASUU5V-A4uTWoFV.js} +1 -1
- package/dist/assets/{diagram-ATOU4E4O-DMK6VmcP.js → diagram-ATOU4E4O-Zi6m3NUl.js} +1 -1
- package/dist/assets/{diagram-CDSNMT55-DksASlcY.js → diagram-CDSNMT55-DtCcmd5k.js} +1 -1
- package/dist/assets/{diagram-MLGK6HIB-Bgn8I5k6.js → diagram-MLGK6HIB-DofuETS3.js} +1 -1
- package/dist/assets/{diagram-MPIPVDR6-zK0jqO8N.js → diagram-MPIPVDR6-Dw2T9PuU.js} +1 -1
- package/dist/assets/{ebnfDiagram-ZINNZB2B-vKrbzTwr.js → ebnfDiagram-ZINNZB2B-DbrwPiem.js} +1 -1
- package/dist/assets/{elk-276RUBZZ-Bzv2mPNf.js → elk-276RUBZZ-BvCt1dCb.js} +1 -1
- package/dist/assets/{erDiagram-OPXOYQCR-CvOyYuxu.js → erDiagram-OPXOYQCR-Y-QKqPnU.js} +1 -1
- package/dist/assets/{flowDiagram-KWPJA3E3-CtbnDbc0.js → flowDiagram-KWPJA3E3-CDkL1B5w.js} +1 -1
- package/dist/assets/{ganttDiagram-FUAMR5RP-c4dMRYyG.js → ganttDiagram-FUAMR5RP-CKV5D2F6.js} +1 -1
- package/dist/assets/{gitGraphDiagram-X574FWY7-B34uaQho.js → gitGraphDiagram-X574FWY7-nL9iFTCv.js} +1 -1
- package/dist/assets/{index-CPiqc_DN.js → index-DreDnjOu.js} +1 -1
- package/dist/assets/index-Du7o6Dsf.js +610 -0
- package/dist/assets/index-KxG4bWSr.css +1 -0
- package/dist/assets/{infoDiagram-VRGFBTTK-o64ma4CI.js → infoDiagram-VRGFBTTK-C7aHjzsf.js} +1 -1
- package/dist/assets/{ishikawaDiagram-OU5B5YK6-DV4C9BAm.js → ishikawaDiagram-OU5B5YK6-KUZsNBTh.js} +1 -1
- package/dist/assets/{journeyDiagram-ZHPQQLJL-Bf0AHk1H.js → journeyDiagram-ZHPQQLJL-CGUuodFl.js} +1 -1
- package/dist/assets/{kanban-definition-PNTS6WVX-B1UMSKmE.js → kanban-definition-PNTS6WVX-Cy6r868Z.js} +1 -1
- package/dist/assets/{linear-BpKhuyLm.js → linear-Bl669148.js} +1 -1
- package/dist/assets/{mermaid.core-B_BKNCw5.js → mermaid.core-86Xqz5Mr.js} +5 -5
- package/dist/assets/{mindmap-definition-NLK3R4M7-DeARruT1.js → mindmap-definition-NLK3R4M7-G4DzHLrd.js} +1 -1
- package/dist/assets/{pegDiagram-GJSIUBJH-BOQEk_1D.js → pegDiagram-GJSIUBJH-K4eruzY0.js} +1 -1
- package/dist/assets/{pieDiagram-5QR66LMP-EIfoiTZo.js → pieDiagram-5QR66LMP-DYdR9PPq.js} +1 -1
- package/dist/assets/{quadrantDiagram-O4NWA36T-GgZwT-fi.js → quadrantDiagram-O4NWA36T-BCAh0nEy.js} +1 -1
- package/dist/assets/{railroadDiagram-XR7U4H2S-D9rDQomj.js → railroadDiagram-XR7U4H2S-p0dGRc4g.js} +1 -1
- package/dist/assets/{requirementDiagram-PLB6GJNP-DAh1MIeo.js → requirementDiagram-PLB6GJNP-tLeBG0aL.js} +1 -1
- package/dist/assets/{sankeyDiagram-IPEJSGJF-CPr6Uz64.js → sankeyDiagram-IPEJSGJF-QRuN16rV.js} +1 -1
- package/dist/assets/{sequenceDiagram-PO4LG4MO-BU6VIdcm.js → sequenceDiagram-PO4LG4MO-ueT1nVoa.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-qF2HO41r.js → sizeCapture-INFHLROL-wRS2zWg2.js} +1 -1
- package/dist/assets/{stateDiagram-v2-GCMORJYK-DlJ8G4MD.js → stateDiagram-v2-GCMORJYK-CYzA_hE1.js} +1 -1
- package/dist/assets/{swimlanes-2SLR337P-DzYE8I54.js → swimlanes-2SLR337P-kDnv6LMc.js} +1 -1
- package/dist/assets/swimlanesDiagram-TC7HE7FX-C7voMDle.js +8 -0
- package/dist/assets/{timeline-definition-EJHVYXUP-B7wzEQ0A.js → timeline-definition-EJHVYXUP-D1y2UbbH.js} +1 -1
- package/dist/assets/{usecaseDiagram-POWQR4AR-BvGgrxIP.js → usecaseDiagram-POWQR4AR-IqB4v9HX.js} +1 -1
- package/dist/assets/{vennDiagram-UO4OBE2U-CEECdgQg.js → vennDiagram-UO4OBE2U-BEi7KYVF.js} +1 -1
- package/dist/assets/{wardleyDiagram-VNRHLVJA-XQHA0P_P.js → wardleyDiagram-VNRHLVJA-Dkybo-Yf.js} +1 -1
- package/dist/assets/{xychartDiagram-PMCCYNJV-B5mLcZI2.js → xychartDiagram-PMCCYNJV-BAPFJLpg.js} +1 -1
- package/dist/index.html +2 -2
- package/dist-server/cloud-home-start.js +27 -13
- package/dist-server/companion/src/listener.js +39 -18
- package/dist-server/companion/src/routes.js +39 -0
- package/dist-server/container-mcp.js +16 -29
- package/dist-server/drivers/agents-proxy.js +161 -82
- package/dist-server/enterprise/server/index.js +2 -1
- package/dist-server/{browser-proxy.js → harness-mcp-proxy.js} +34 -19
- package/dist-server/index.js +4991 -4908
- package/dist-server/local-computer.js +2 -1
- package/dist-server/openmausbot.js +906 -1785
- package/dist-server/pair-cli.js +906 -1785
- package/dist-server/proxy-paths.js +2 -1
- package/dist-server/server/account-signin.js +0 -2
- package/dist-server/server/activity.js +201 -0
- package/dist-server/server/admin-activity.js +1 -4
- package/dist-server/server/auto-approve.js +25 -4
- package/dist-server/server/automatic-recovery.js +1 -1
- package/dist-server/server/boat-create-idempotency.js +0 -7
- package/dist-server/server/boat-delete-journal.js +0 -4
- package/dist-server/server/boat.js +4 -4
- package/dist-server/server/bot-package.js +1 -19
- package/dist-server/server/browser-runtime.js +1 -2
- package/dist-server/server/checkpoints.js +90 -148
- package/dist-server/server/chief-of-staff.js +9 -9
- package/dist-server/server/cli.js +33 -26
- package/dist-server/server/cloud-backend.js +0 -4
- package/dist-server/server/cloud-computer-tools.js +110 -0
- package/dist-server/server/cloud-home-start.js +12 -15
- package/dist-server/server/cloud-home.js +0 -5
- package/dist-server/server/cloud-lending.js +0 -3
- package/dist-server/server/cloud-move-http.js +44 -30
- package/dist-server/server/cloud-move.js +20 -18
- package/dist-server/server/composio.js +41 -5
- package/dist-server/server/computer-control.js +0 -15
- package/dist-server/server/computer-observation.js +0 -74
- package/dist-server/server/config.js +121 -65
- package/dist-server/server/container-computer.js +23 -24
- package/dist-server/server/control-client.js +4 -10
- package/dist-server/server/decider/jev.js +1 -4
- package/dist-server/server/decider/log.js +1 -3
- package/dist-server/server/decision-log.js +1 -4
- package/dist-server/server/delegations.js +3 -2
- package/dist-server/server/drivers/acp/core.js +11 -8
- package/dist-server/server/drivers/acp/opencode-go.js +17 -16
- package/dist-server/server/drivers/agents-call.js +88 -92
- package/dist-server/server/drivers/agents-catalog.js +90 -11
- package/dist-server/server/drivers/agents-proxy.js +10 -31
- package/dist-server/server/drivers/antigravity.js +1 -4
- package/dist-server/server/drivers/boatagent.js +23 -4
- package/dist-server/server/drivers/cerebras.js +3 -3
- package/dist-server/server/drivers/chat-mcp-tools.js +4 -7
- package/dist-server/server/drivers/claude-login-auth.js +2 -11
- package/dist-server/server/drivers/claude.js +16 -14
- package/dist-server/server/drivers/codex-device-auth.js +3 -1
- package/dist-server/server/drivers/codex.js +5 -4
- package/dist-server/server/drivers/grok.js +1 -1
- package/dist-server/server/drivers/openai-chat-protocol.js +4 -2
- package/dist-server/server/drivers/openai-chat.js +18 -11
- package/dist-server/server/drivers/prompt-split.js +4 -4
- package/dist-server/server/drivers/retry.js +8 -4
- package/dist-server/server/engine-install.js +1 -5
- package/dist-server/server/harness/bus.js +49 -0
- package/dist-server/server/harness/registry.js +0 -1
- package/dist-server/server/{browser-proxy.js → harness-mcp-proxy.js} +40 -20
- package/dist-server/server/index.js +1190 -971
- package/dist-server/server/lending-memory.js +12 -8
- package/dist-server/server/mcp-registry.js +35 -0
- package/dist-server/server/memory-entries.js +38 -8
- package/dist-server/server/memory-organize.js +1 -8
- package/dist-server/server/memory-topics.js +4 -4
- package/dist-server/server/memory-upkeep.js +13 -15
- package/dist-server/server/message-file.js +9 -13
- package/dist-server/server/outbound-counts.js +79 -0
- package/dist-server/server/outbound-requests.js +60 -0
- package/dist-server/server/package-import.js +1 -1
- package/dist-server/server/peer-delivery.js +5 -19
- package/dist-server/server/peer-roster.js +30 -4
- package/dist-server/server/profile-versions.js +0 -31
- package/dist-server/server/provider-key-check.js +2 -1
- package/dist-server/server/proxy-paths.js +2 -1
- package/dist-server/server/restart.js +40 -0
- package/dist-server/server/room-handoffs.js +17 -13
- package/dist-server/server/routes/bot-memory.js +0 -24
- package/dist-server/server/routine-requests.js +2 -5
- package/dist-server/server/routines.js +10 -5
- package/dist-server/server/server-launcher.js +53 -0
- package/dist-server/server/setup-mode.js +0 -2
- package/dist-server/server/skill-learn.js +0 -1
- package/dist-server/server/skill-library.js +0 -15
- package/dist-server/server/store.js +10 -2
- package/dist-server/server/surface.js +69 -28
- package/dist-server/server/system-prompt.js +17 -7
- package/dist-server/server/team-manifest.js +1 -6
- package/dist-server/server/team-memory.js +209 -0
- package/dist-server/server/thread-events.js +2 -2
- package/dist-server/server/tunnel.js +4 -1
- package/dist-server/server/turn-images.js +1 -21
- package/dist-server/server/turn-resources.js +19 -150
- package/dist-server/server/usage-ledger.js +3 -1
- package/dist-server/server/vps-computer.js +4 -14
- package/dist-server/server/workspace.js +87 -50
- package/dist-server/server-launcher.js +72 -0
- package/dist-server/shared/activity.js +3 -0
- package/dist-server/shared/ask-question.js +1 -1
- package/dist-server/shared/bot-avatar.js +8 -0
- package/dist-server/shared/cloud-computer.js +12 -0
- package/dist-server/shared/connector-scopes.js +78 -0
- package/dist-server/shared/failed-turn.js +25 -0
- package/dist-server/shared/live-approval.js +2 -2
- package/dist-server/shared/outbound.js +128 -0
- package/dist-server/shared/package-format.js +3 -3
- package/dist-server/shared/pairing-link.js +144 -0
- package/dist-server/shared/tool-surface.js +3 -2
- package/dist-server/vps-container-mcp.js +16 -29
- package/dist-server/workspace-backup.worker.js +14 -27
- package/enterprise/server/index.js +2 -1
- package/package.json +1 -1
- package/dist/assets/channel-CdJX6i8k.js +0 -1
- package/dist/assets/index-CPYrGsv1.js +0 -610
- package/dist/assets/index-CzT42GR8.css +0 -1
- package/dist/assets/swimlanesDiagram-TC7HE7FX-D-U4GtLQ.js +0 -8
- package/dist-server/server/claim-idle.js +0 -33
- package/dist-server/server/cloud-overflow.js +0 -167
- package/dist-server/server/drivers/chat-boat-tools.js +0 -90
- package/dist-server/server/drivers/grokagent.js +0 -4
- package/dist-server/server/openmaus-status-capsule.js +0 -329
- package/dist-server/server/tightening-requests.js +0 -435
- package/dist-server/shared/tightening-request.js +0 -87
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// The one `openmausbot://pair` link builder. The desktop's phone setup, the
|
|
2
|
+
// headless server's pairing endpoint and `openmausbot pair` all print this
|
|
3
|
+
// link; the Android and iOS scanners read it (android/core Connection.kt
|
|
4
|
+
// `PairingInvite.parse`, ios CompanionCore Client.swift `PairingInvite.parse`).
|
|
5
|
+
//
|
|
6
|
+
// Every value is written with encodeURIComponent, so a space is `%20`. The
|
|
7
|
+
// desktop used URLSearchParams until Oct 2026, which writes a space as `+`;
|
|
8
|
+
// neither phone read that back as a space, and "Miguel's computer" showed up
|
|
9
|
+
// as "Miguel's+computer". The phones now also read `+` as a space, for links
|
|
10
|
+
// from desktops still running the old builder.
|
|
11
|
+
/** How many fallback routes a link will carry. The list is tiny in practice;
|
|
12
|
+
* the cap only keeps a pathological interface table from bloating the QR. */
|
|
13
|
+
export const MAX_PAIRING_HOSTS = 8;
|
|
14
|
+
const ENDPOINT_KINDS = new Set(["hosted", "tailnet", "lan", "bonjour"]);
|
|
15
|
+
/** Keep the QR contract strict even though its input came from our own
|
|
16
|
+
* sidecar. A public URL with credentials or a path is not a companion base
|
|
17
|
+
* URL, and filtering it is safer than teaching the phone to reinterpret it.
|
|
18
|
+
* Sorted by priority, deduplicated by origin, capped. */
|
|
19
|
+
export function qrEndpoints(endpoints) {
|
|
20
|
+
const seen = new Set();
|
|
21
|
+
const valid = [];
|
|
22
|
+
for (const endpoint of endpoints ?? []) {
|
|
23
|
+
if (!endpoint ||
|
|
24
|
+
!ENDPOINT_KINDS.has(endpoint.kind) ||
|
|
25
|
+
!Number.isInteger(endpoint.priority) ||
|
|
26
|
+
endpoint.priority < 0 ||
|
|
27
|
+
endpoint.priority > 1_000_000) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const parsed = new URL(endpoint.url);
|
|
32
|
+
const expectedProtocol = endpoint.kind === "hosted" ? "https:" : "http:";
|
|
33
|
+
const explicitPort = parsed.port ? Number(parsed.port) : null;
|
|
34
|
+
const hostname = parsed.hostname.toLowerCase().replace(/\.$/, "");
|
|
35
|
+
if (parsed.protocol !== expectedProtocol ||
|
|
36
|
+
// No empty DNS label (".ts.net", "mac..local"): the phones refuse
|
|
37
|
+
// one, and one endpoint they refuse makes them refuse the whole QR.
|
|
38
|
+
hostname.split(".").includes("") ||
|
|
39
|
+
(endpoint.kind === "tailnet" && !hostname.endsWith(".ts.net")) ||
|
|
40
|
+
(explicitPort !== null && (!Number.isInteger(explicitPort) || explicitPort < 1 || explicitPort > 65_535)) ||
|
|
41
|
+
parsed.username ||
|
|
42
|
+
parsed.password ||
|
|
43
|
+
parsed.pathname !== "/" ||
|
|
44
|
+
parsed.search ||
|
|
45
|
+
parsed.hash ||
|
|
46
|
+
seen.has(parsed.origin)) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
seen.add(parsed.origin);
|
|
50
|
+
valid.push({ url: parsed.origin, kind: endpoint.kind, priority: endpoint.priority });
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// One malformed advisory route must not invalidate an otherwise usable
|
|
54
|
+
// pairing QR. It is simply omitted from the route walk.
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return valid.sort((left, right) => left.priority - right.priority).slice(0, MAX_PAIRING_HOSTS);
|
|
58
|
+
}
|
|
59
|
+
/** URL-safe, unpadded base64 keeps the structured JSON smaller than query
|
|
60
|
+
* escaping every quote and slash while remaining straightforward to decode
|
|
61
|
+
* with Foundation on iOS. */
|
|
62
|
+
function encodeEndpoints(endpoints) {
|
|
63
|
+
const bytes = new TextEncoder().encode(JSON.stringify(endpoints));
|
|
64
|
+
let binary = "";
|
|
65
|
+
for (const byte of bytes)
|
|
66
|
+
binary += String.fromCharCode(byte);
|
|
67
|
+
return btoa(binary).replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/, "");
|
|
68
|
+
}
|
|
69
|
+
function validSecretPublicKey(value) {
|
|
70
|
+
if (!value || !/^[A-Za-z0-9_-]{87}$/.test(value))
|
|
71
|
+
return null;
|
|
72
|
+
try {
|
|
73
|
+
const base64 = value.replaceAll("-", "+").replaceAll("_", "/") + "=";
|
|
74
|
+
const decoded = atob(base64);
|
|
75
|
+
if (decoded.length !== 65 || decoded.charCodeAt(0) !== 4)
|
|
76
|
+
return null;
|
|
77
|
+
let binary = "";
|
|
78
|
+
for (let index = 0; index < decoded.length; index += 1)
|
|
79
|
+
binary += decoded[index];
|
|
80
|
+
return btoa(binary).replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/, "") === value
|
|
81
|
+
? value
|
|
82
|
+
: null;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** The `address` value: `host:port` (IPv6 bracketed) or a bare http(s)
|
|
89
|
+
* origin, or null when it is neither. Both phones refuse an address with
|
|
90
|
+
* credentials, a path, a query or a fragment, as `qrEndpoints` does. */
|
|
91
|
+
function linkAddress(address, port) {
|
|
92
|
+
const value = address.trim();
|
|
93
|
+
if (!value)
|
|
94
|
+
return null;
|
|
95
|
+
if (/^https?:\/\//i.test(value)) {
|
|
96
|
+
try {
|
|
97
|
+
const parsed = new URL(value);
|
|
98
|
+
if (parsed.username || parsed.password || parsed.pathname !== "/" || parsed.search || parsed.hash)
|
|
99
|
+
return null;
|
|
100
|
+
return parsed.origin;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (port === undefined || !Number.isInteger(port) || port < 1 || port > 65_535)
|
|
107
|
+
return null;
|
|
108
|
+
const authority = value.includes(":") && !value.startsWith("[") ? `[${value}]` : value;
|
|
109
|
+
return `${authority}:${port}`;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* A short-lived handoff from a trusted pairing screen to the mobile app. The
|
|
113
|
+
* credential still has to be redeemed; putting it in the link does not
|
|
114
|
+
* create or expose the long-lived device token. Null when any required part
|
|
115
|
+
* is malformed, so a caller never prints a link a phone would refuse.
|
|
116
|
+
*/
|
|
117
|
+
export function phonePairingLink({ address, port, token, code, name, hosts, endpoints, secretPublicKey, }) {
|
|
118
|
+
const dial = linkAddress(address, port);
|
|
119
|
+
if (!dial || !/^omb_pair_[A-Za-z0-9_-]{43}$/.test(token))
|
|
120
|
+
return null;
|
|
121
|
+
if (code !== undefined && !/^\d{6}$/.test(code))
|
|
122
|
+
return null;
|
|
123
|
+
const fields = [["address", dial], ["token", token]];
|
|
124
|
+
if (code !== undefined)
|
|
125
|
+
fields.push(["code", code]);
|
|
126
|
+
if (name?.trim())
|
|
127
|
+
fields.push(["name", name.trim()]);
|
|
128
|
+
// Comma-joined, which no hostname or IP literal can contain. Filtered
|
|
129
|
+
// rather than refused: a bad candidate costs the phone one failed dial,
|
|
130
|
+
// and dropping the whole link over it would break pairing entirely.
|
|
131
|
+
const candidates = (hosts ?? [])
|
|
132
|
+
.map((candidate) => candidate.trim())
|
|
133
|
+
.filter((candidate) => candidate && !/[\s/?#,[\]]/.test(candidate))
|
|
134
|
+
.slice(0, MAX_PAIRING_HOSTS);
|
|
135
|
+
if (candidates.length)
|
|
136
|
+
fields.push(["hosts", candidates.join(",")]);
|
|
137
|
+
const routes = qrEndpoints(endpoints);
|
|
138
|
+
if (routes.length)
|
|
139
|
+
fields.push(["endpoints", encodeEndpoints(routes)]);
|
|
140
|
+
const secretKey = validSecretPublicKey(secretPublicKey);
|
|
141
|
+
if (secretKey)
|
|
142
|
+
fields.push(["secretKey", secretKey]);
|
|
143
|
+
return `openmausbot://pair?${fields.map(([key, value]) => `${key}=${encodeURIComponent(value)}`).join("&")}`;
|
|
144
|
+
}
|
|
@@ -7,8 +7,9 @@
|
|
|
7
7
|
* computer is illustrated only after one of these; the built-in browser's
|
|
8
8
|
* read-only calls (snapshot, read, get_text, waits) stay out by the same rule. */
|
|
9
9
|
export const SCREEN_TOUCHING_TOOLS = new Set([
|
|
10
|
-
// cloud boat / remote computer
|
|
11
|
-
|
|
10
|
+
// cloud boat / remote computer (server/cloud-computer-tools.ts names its
|
|
11
|
+
// key tool key_press)
|
|
12
|
+
"screenshot", "click", "type_text", "press_key", "key_press", "scroll", "computer_batch", "open_url", "browser_click", "browser_fill",
|
|
12
13
|
// built-in browser: the Electron surface's names, kept because a bot on an
|
|
13
14
|
// older remote harness can still call them
|
|
14
15
|
"browser_navigate", "browser_type", "browser_press", "browser_scroll", "browser_hover", "browser_drag",
|
|
@@ -16202,10 +16202,6 @@ var remoteMutationSchema = remoteEntrySchema.extend({
|
|
|
16202
16202
|
}).optional()
|
|
16203
16203
|
});
|
|
16204
16204
|
|
|
16205
|
-
// server/cloud-overflow.ts
|
|
16206
|
-
var CLOUD_SEAT_IDLE_STOP_MS = 5 * 6e4;
|
|
16207
|
-
var CLOUD_SEAT_SLEEP_RETRY_MAX_MS = 10 * 6e4;
|
|
16208
|
-
|
|
16209
16205
|
// server/config.ts
|
|
16210
16206
|
var optionalText = external_exports.string().optional();
|
|
16211
16207
|
var SSH_ALIAS = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
|
|
@@ -16403,17 +16399,6 @@ var featureConfigSchema = external_exports.object({
|
|
|
16403
16399
|
* conversations that share words with the message ride into the turn.
|
|
16404
16400
|
* Read-only; on unless explicitly switched off — see autoRecallEnabled. */
|
|
16405
16401
|
autoRecall: external_exports.boolean().optional(),
|
|
16406
|
-
/** Idle release for computer claims (#1653): a desktop seat that stays
|
|
16407
|
-
* screen-quiet for 90 seconds is released to waiting turns while its
|
|
16408
|
-
* holder's turn still lives; the previous holder re-claims directly
|
|
16409
|
-
* for 10 minutes and yields to an occupied seat. Off until baked; see
|
|
16410
|
-
* computerClaimIdleReleaseEnabled for how to enable it by hand. */
|
|
16411
|
-
computerClaimIdleRelease: external_exports.boolean().optional(),
|
|
16412
|
-
/** Consented cloud overflow for local computer waits (#1655): a wait
|
|
16413
|
-
* may offer a per-second-billed cloud seat, but only through an explicit
|
|
16414
|
-
* consent card or a configured allowlist — never a silent Auto default.
|
|
16415
|
-
* Off until baked; see cloudOverflowEnabled for how to enable it by hand. */
|
|
16416
|
-
cloudOverflow: external_exports.boolean().optional(),
|
|
16417
16402
|
/** Opt-in shared skills library: one store at the data dir that bots
|
|
16418
16403
|
* read by assignment instead of per-workspace copies. Off until
|
|
16419
16404
|
* explicitly enabled — see skillsLibraryEnabled. */
|
|
@@ -16539,8 +16524,12 @@ var appConfigSchema = external_exports.object({
|
|
|
16539
16524
|
* provider is Boat now and the key is kept for compatibility. */
|
|
16540
16525
|
box: external_exports.object({ token: optionalText }).optional(),
|
|
16541
16526
|
vps: vpsConfigSchema.optional(),
|
|
16542
|
-
/** Optional OpenCode key; persisted write-only and passed only to its child.
|
|
16543
|
-
|
|
16527
|
+
/** Optional OpenCode key; persisted write-only and passed only to its child.
|
|
16528
|
+
* `providerKeys`: keys for OpenCode's other providers (Venice, Groq…) by the
|
|
16529
|
+
* environment name OpenCode reads, also write-only and only for its child.
|
|
16530
|
+
* Settings changes go through mergeOpenCodeProviderKeys; the stored copy
|
|
16531
|
+
* is read loosely (storedAppConfigSchema). */
|
|
16532
|
+
opencodeGo: external_exports.object({ apiKey: optionalText, providerKeys: external_exports.record(external_exports.string(), external_exports.string()).optional() }).optional(),
|
|
16544
16533
|
/** Voice settings and the selected voice id. `provider` picks the
|
|
16545
16534
|
* engine: "elevenlabs" (default; needs `key`), "fish" (needs its own
|
|
16546
16535
|
* `fishKey`; `fishModel` picks its speech model), "system" (the Mac's
|
|
@@ -16620,15 +16609,6 @@ var appConfigSchema = external_exports.object({
|
|
|
16620
16609
|
/** The authorization decision log (server/decision-log.ts): days of month
|
|
16621
16610
|
* files kept, at least; OMB_DECISION_RETENTION_DAYS wins when set. */
|
|
16622
16611
|
decisions: external_exports.object({ retentionDays: external_exports.number().int().min(1).max(3650).optional() }).strict().optional(),
|
|
16623
|
-
/** #1655 cloud-overflow settings. perSecondCostUsd is the operator's own
|
|
16624
|
-
* verified rate: with no price configured the feature stays inert rather
|
|
16625
|
-
* than show an invented one. allowlistedThreads carries standing consent
|
|
16626
|
-
* for exact thread ids. */
|
|
16627
|
-
cloudOverflow: external_exports.object({
|
|
16628
|
-
perSecondCostUsd: external_exports.number().positive().max(10).optional(),
|
|
16629
|
-
idleStopMs: external_exports.number().int().positive().max(24 * 60 * 6e4).optional(),
|
|
16630
|
-
allowlistedThreads: external_exports.array(external_exports.string().min(1)).max(1e3).optional()
|
|
16631
|
-
}).strict().optional(),
|
|
16632
16612
|
localVm: localVmConfigSchema.optional(),
|
|
16633
16613
|
features: featureConfigSchema.optional(),
|
|
16634
16614
|
onboarding: onboardingConfigSchema.optional(),
|
|
@@ -16643,7 +16623,14 @@ var appConfigSchema = external_exports.object({
|
|
|
16643
16623
|
mcpServers: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
|
|
16644
16624
|
});
|
|
16645
16625
|
var storedAppConfigSchema = appConfigSchema.extend({
|
|
16646
|
-
browserProfiles: storedBrowserProfilesSchema.optional()
|
|
16626
|
+
browserProfiles: storedBrowserProfilesSchema.optional(),
|
|
16627
|
+
/** Read loosely, like mcpServers: a hand-edited provider key that isn't
|
|
16628
|
+
* text is dropped here, and a bad name or key later
|
|
16629
|
+
* (openCodeProviderKeys), never the whole file. */
|
|
16630
|
+
opencodeGo: external_exports.object({
|
|
16631
|
+
apiKey: optionalText,
|
|
16632
|
+
providerKeys: external_exports.record(external_exports.string(), external_exports.unknown()).catch({}).transform((keys) => Object.fromEntries(Object.entries(keys).filter((entry) => typeof entry[1] === "string"))).optional()
|
|
16633
|
+
}).optional()
|
|
16647
16634
|
});
|
|
16648
16635
|
var appConfigPatchSchema = appConfigSchema.omit({ instances: true, mcpServers: true, cliStartup: true, customDomain: true }).extend({ threads: threadsPatchSchema.optional(), newBots: newBotsPatchSchema.optional() });
|
|
16649
16636
|
var jsonObjectSchema = external_exports.record(external_exports.string(), external_exports.json());
|
|
@@ -16691,7 +16678,8 @@ function resolveProxy(relative) {
|
|
|
16691
16678
|
return existsSync2(source) ? source : join3(SERVER_ROOT, `${relative}.js`);
|
|
16692
16679
|
}
|
|
16693
16680
|
var SPAWNED_PROXIES = {
|
|
16694
|
-
browser:
|
|
16681
|
+
// The built-in browser and the cloud computer: argv[2] picks which.
|
|
16682
|
+
harnessMcp: resolveProxy("harness-mcp-proxy"),
|
|
16695
16683
|
localComputer: resolveProxy("local-computer-proxy"),
|
|
16696
16684
|
permission: resolveProxy("permission-proxy"),
|
|
16697
16685
|
containerMcp: resolveProxy("container-mcp"),
|
|
@@ -16724,7 +16712,6 @@ var DISPLAY = ":1";
|
|
|
16724
16712
|
var CUA_SOCKET = "/run/user/1000/openmausbot-cua.sock";
|
|
16725
16713
|
var CUA_EXECUTABLE = "/usr/local/libexec/openmausbot/cua-driver";
|
|
16726
16714
|
var MEMORY_BYTES = 4 * 1024 * 1024 * 1024;
|
|
16727
|
-
var SHM_BYTES = 512 * 1024 * 1024;
|
|
16728
16715
|
function cuaExecArgs(args2, options = {}) {
|
|
16729
16716
|
return [
|
|
16730
16717
|
"exec",
|
|
@@ -18761,10 +18761,6 @@ function schemaIssue(error51, fallback) {
|
|
|
18761
18761
|
return path ? `${path} ${issue2.message}` : issue2.message;
|
|
18762
18762
|
}
|
|
18763
18763
|
|
|
18764
|
-
// server/cloud-overflow.ts
|
|
18765
|
-
var CLOUD_SEAT_IDLE_STOP_MS = 5 * 6e4;
|
|
18766
|
-
var CLOUD_SEAT_SLEEP_RETRY_MAX_MS = 10 * 6e4;
|
|
18767
|
-
|
|
18768
18764
|
// server/config.ts
|
|
18769
18765
|
var optionalText = external_exports.string().optional();
|
|
18770
18766
|
var SSH_ALIAS = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
|
|
@@ -18962,17 +18958,6 @@ var featureConfigSchema = external_exports.object({
|
|
|
18962
18958
|
* conversations that share words with the message ride into the turn.
|
|
18963
18959
|
* Read-only; on unless explicitly switched off — see autoRecallEnabled. */
|
|
18964
18960
|
autoRecall: external_exports.boolean().optional(),
|
|
18965
|
-
/** Idle release for computer claims (#1653): a desktop seat that stays
|
|
18966
|
-
* screen-quiet for 90 seconds is released to waiting turns while its
|
|
18967
|
-
* holder's turn still lives; the previous holder re-claims directly
|
|
18968
|
-
* for 10 minutes and yields to an occupied seat. Off until baked; see
|
|
18969
|
-
* computerClaimIdleReleaseEnabled for how to enable it by hand. */
|
|
18970
|
-
computerClaimIdleRelease: external_exports.boolean().optional(),
|
|
18971
|
-
/** Consented cloud overflow for local computer waits (#1655): a wait
|
|
18972
|
-
* may offer a per-second-billed cloud seat, but only through an explicit
|
|
18973
|
-
* consent card or a configured allowlist — never a silent Auto default.
|
|
18974
|
-
* Off until baked; see cloudOverflowEnabled for how to enable it by hand. */
|
|
18975
|
-
cloudOverflow: external_exports.boolean().optional(),
|
|
18976
18961
|
/** Opt-in shared skills library: one store at the data dir that bots
|
|
18977
18962
|
* read by assignment instead of per-workspace copies. Off until
|
|
18978
18963
|
* explicitly enabled — see skillsLibraryEnabled. */
|
|
@@ -19098,8 +19083,12 @@ var appConfigSchema = external_exports.object({
|
|
|
19098
19083
|
* provider is Boat now and the key is kept for compatibility. */
|
|
19099
19084
|
box: external_exports.object({ token: optionalText }).optional(),
|
|
19100
19085
|
vps: vpsConfigSchema.optional(),
|
|
19101
|
-
/** Optional OpenCode key; persisted write-only and passed only to its child.
|
|
19102
|
-
|
|
19086
|
+
/** Optional OpenCode key; persisted write-only and passed only to its child.
|
|
19087
|
+
* `providerKeys`: keys for OpenCode's other providers (Venice, Groq…) by the
|
|
19088
|
+
* environment name OpenCode reads, also write-only and only for its child.
|
|
19089
|
+
* Settings changes go through mergeOpenCodeProviderKeys; the stored copy
|
|
19090
|
+
* is read loosely (storedAppConfigSchema). */
|
|
19091
|
+
opencodeGo: external_exports.object({ apiKey: optionalText, providerKeys: external_exports.record(external_exports.string(), external_exports.string()).optional() }).optional(),
|
|
19103
19092
|
/** Voice settings and the selected voice id. `provider` picks the
|
|
19104
19093
|
* engine: "elevenlabs" (default; needs `key`), "fish" (needs its own
|
|
19105
19094
|
* `fishKey`; `fishModel` picks its speech model), "system" (the Mac's
|
|
@@ -19179,15 +19168,6 @@ var appConfigSchema = external_exports.object({
|
|
|
19179
19168
|
/** The authorization decision log (server/decision-log.ts): days of month
|
|
19180
19169
|
* files kept, at least; OMB_DECISION_RETENTION_DAYS wins when set. */
|
|
19181
19170
|
decisions: external_exports.object({ retentionDays: external_exports.number().int().min(1).max(3650).optional() }).strict().optional(),
|
|
19182
|
-
/** #1655 cloud-overflow settings. perSecondCostUsd is the operator's own
|
|
19183
|
-
* verified rate: with no price configured the feature stays inert rather
|
|
19184
|
-
* than show an invented one. allowlistedThreads carries standing consent
|
|
19185
|
-
* for exact thread ids. */
|
|
19186
|
-
cloudOverflow: external_exports.object({
|
|
19187
|
-
perSecondCostUsd: external_exports.number().positive().max(10).optional(),
|
|
19188
|
-
idleStopMs: external_exports.number().int().positive().max(24 * 60 * 6e4).optional(),
|
|
19189
|
-
allowlistedThreads: external_exports.array(external_exports.string().min(1)).max(1e3).optional()
|
|
19190
|
-
}).strict().optional(),
|
|
19191
19171
|
localVm: localVmConfigSchema.optional(),
|
|
19192
19172
|
features: featureConfigSchema.optional(),
|
|
19193
19173
|
onboarding: onboardingConfigSchema.optional(),
|
|
@@ -19202,7 +19182,14 @@ var appConfigSchema = external_exports.object({
|
|
|
19202
19182
|
mcpServers: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
|
|
19203
19183
|
});
|
|
19204
19184
|
var storedAppConfigSchema = appConfigSchema.extend({
|
|
19205
|
-
browserProfiles: storedBrowserProfilesSchema.optional()
|
|
19185
|
+
browserProfiles: storedBrowserProfilesSchema.optional(),
|
|
19186
|
+
/** Read loosely, like mcpServers: a hand-edited provider key that isn't
|
|
19187
|
+
* text is dropped here, and a bad name or key later
|
|
19188
|
+
* (openCodeProviderKeys), never the whole file. */
|
|
19189
|
+
opencodeGo: external_exports.object({
|
|
19190
|
+
apiKey: optionalText,
|
|
19191
|
+
providerKeys: external_exports.record(external_exports.string(), external_exports.unknown()).catch({}).transform((keys) => Object.fromEntries(Object.entries(keys).filter((entry) => typeof entry[1] === "string"))).optional()
|
|
19192
|
+
}).optional()
|
|
19206
19193
|
});
|
|
19207
19194
|
var appConfigPatchSchema = appConfigSchema.omit({ instances: true, mcpServers: true, cliStartup: true, customDomain: true }).extend({ threads: threadsPatchSchema.optional(), newBots: newBotsPatchSchema.optional() });
|
|
19208
19195
|
var jsonObjectSchema = external_exports.record(external_exports.string(), external_exports.json());
|
|
@@ -14589,7 +14589,8 @@ function resolveProxy(relative) {
|
|
|
14589
14589
|
return existsSync(source) ? source : join(SERVER_ROOT, `${relative}.js`);
|
|
14590
14590
|
}
|
|
14591
14591
|
var SPAWNED_PROXIES = {
|
|
14592
|
-
browser:
|
|
14592
|
+
// The built-in browser and the cloud computer: argv[2] picks which.
|
|
14593
|
+
harnessMcp: resolveProxy("harness-mcp-proxy"),
|
|
14593
14594
|
localComputer: resolveProxy("local-computer-proxy"),
|
|
14594
14595
|
permission: resolveProxy("permission-proxy"),
|
|
14595
14596
|
containerMcp: resolveProxy("container-mcp"),
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{U as a,C as n}from"./mermaid.core-B_BKNCw5.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
|