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.
Files changed (188) hide show
  1. package/dist/assets/{DesktopViewer-bxM7NV3N.js → DesktopViewer-DsnA23KM.js} +1 -1
  2. package/dist/assets/{abnfDiagram-O67JEVCF-BhMdJhRJ.js → abnfDiagram-O67JEVCF-Dkbd2hcj.js} +1 -1
  3. package/dist/assets/{arc-B5itKDcx.js → arc-Duj5Coy2.js} +1 -1
  4. package/dist/assets/{architectureDiagram-NJMV4G6O-C5d7UY6U.js → architectureDiagram-NJMV4G6O-uYUsDawP.js} +1 -1
  5. package/dist/assets/{blockDiagram-BEXU5L5S-BrZIhMmu.js → blockDiagram-BEXU5L5S-CWDlTpXe.js} +1 -1
  6. package/dist/assets/{c4Diagram-YGBWAQC7-7I0ArfbD.js → c4Diagram-YGBWAQC7-B0t15PDc.js} +1 -1
  7. package/dist/assets/channel-BZxwC-Gw.js +1 -0
  8. package/dist/assets/{chunk-2Q5K7J3B-BnEsyN36.js → chunk-2Q5K7J3B-BJSCL-HV.js} +1 -1
  9. package/dist/assets/{chunk-3FUC2YCW-BXATQ52s.js → chunk-3FUC2YCW-D3_ILccd.js} +2 -2
  10. package/dist/assets/{chunk-5VM5RSS4-B0BpTkEx.js → chunk-5VM5RSS4-D3dmwT_S.js} +1 -1
  11. package/dist/assets/{chunk-GTNCS2PH-BtLTz6FR.js → chunk-GTNCS2PH-Br73HFPD.js} +1 -1
  12. package/dist/assets/{chunk-GWA4HPMP-D6gcZOYt.js → chunk-GWA4HPMP-uSsjxubC.js} +1 -1
  13. package/dist/assets/{chunk-JWPE2WC7-DCLrosvf.js → chunk-JWPE2WC7-C40VWFyr.js} +1 -1
  14. package/dist/assets/{chunk-NETBCI7D-B9JsknV9.js → chunk-NETBCI7D-D6WNNYwU.js} +1 -1
  15. package/dist/assets/{chunk-WEXAMYUT-CsoTxw7z.js → chunk-WEXAMYUT-DOEhq64P.js} +1 -1
  16. package/dist/assets/{chunk-XXDRQBXY-0F_frB0c.js → chunk-XXDRQBXY-BqJEi6Pi.js} +1 -1
  17. package/dist/assets/{classDiagram-v2-NBCMYWYE-DkrpnflX.js → classDiagram-v2-NBCMYWYE-ByU_GnxT.js} +1 -1
  18. package/dist/assets/{cose-bilkent-JH36ORCC-BNDwYBt9.js → cose-bilkent-JH36ORCC-D-Uglxqq.js} +1 -1
  19. package/dist/assets/{cynefin-OW5HDTMX-JUkNr1Mk.js → cynefin-OW5HDTMX-CZWO7aYj.js} +1 -1
  20. package/dist/assets/{cynefinDiagram-VND7K2PF-DKeh9N4M.js → cynefinDiagram-VND7K2PF-C70-w0la.js} +1 -1
  21. package/dist/assets/{dagre-6A5THRUB-ve-6T_wX.js → dagre-6A5THRUB-CnhjhExB.js} +1 -1
  22. package/dist/assets/{diagram-22UHCM2B-BuJ2d8rT.js → diagram-22UHCM2B-bnjWCNb4.js} +1 -1
  23. package/dist/assets/{diagram-3UASUU5V-BgOs_Ni-.js → diagram-3UASUU5V-A4uTWoFV.js} +1 -1
  24. package/dist/assets/{diagram-ATOU4E4O-DMK6VmcP.js → diagram-ATOU4E4O-Zi6m3NUl.js} +1 -1
  25. package/dist/assets/{diagram-CDSNMT55-DksASlcY.js → diagram-CDSNMT55-DtCcmd5k.js} +1 -1
  26. package/dist/assets/{diagram-MLGK6HIB-Bgn8I5k6.js → diagram-MLGK6HIB-DofuETS3.js} +1 -1
  27. package/dist/assets/{diagram-MPIPVDR6-zK0jqO8N.js → diagram-MPIPVDR6-Dw2T9PuU.js} +1 -1
  28. package/dist/assets/{ebnfDiagram-ZINNZB2B-vKrbzTwr.js → ebnfDiagram-ZINNZB2B-DbrwPiem.js} +1 -1
  29. package/dist/assets/{elk-276RUBZZ-Bzv2mPNf.js → elk-276RUBZZ-BvCt1dCb.js} +1 -1
  30. package/dist/assets/{erDiagram-OPXOYQCR-CvOyYuxu.js → erDiagram-OPXOYQCR-Y-QKqPnU.js} +1 -1
  31. package/dist/assets/{flowDiagram-KWPJA3E3-CtbnDbc0.js → flowDiagram-KWPJA3E3-CDkL1B5w.js} +1 -1
  32. package/dist/assets/{ganttDiagram-FUAMR5RP-c4dMRYyG.js → ganttDiagram-FUAMR5RP-CKV5D2F6.js} +1 -1
  33. package/dist/assets/{gitGraphDiagram-X574FWY7-B34uaQho.js → gitGraphDiagram-X574FWY7-nL9iFTCv.js} +1 -1
  34. package/dist/assets/{index-CPiqc_DN.js → index-DreDnjOu.js} +1 -1
  35. package/dist/assets/index-Du7o6Dsf.js +610 -0
  36. package/dist/assets/index-KxG4bWSr.css +1 -0
  37. package/dist/assets/{infoDiagram-VRGFBTTK-o64ma4CI.js → infoDiagram-VRGFBTTK-C7aHjzsf.js} +1 -1
  38. package/dist/assets/{ishikawaDiagram-OU5B5YK6-DV4C9BAm.js → ishikawaDiagram-OU5B5YK6-KUZsNBTh.js} +1 -1
  39. package/dist/assets/{journeyDiagram-ZHPQQLJL-Bf0AHk1H.js → journeyDiagram-ZHPQQLJL-CGUuodFl.js} +1 -1
  40. package/dist/assets/{kanban-definition-PNTS6WVX-B1UMSKmE.js → kanban-definition-PNTS6WVX-Cy6r868Z.js} +1 -1
  41. package/dist/assets/{linear-BpKhuyLm.js → linear-Bl669148.js} +1 -1
  42. package/dist/assets/{mermaid.core-B_BKNCw5.js → mermaid.core-86Xqz5Mr.js} +5 -5
  43. package/dist/assets/{mindmap-definition-NLK3R4M7-DeARruT1.js → mindmap-definition-NLK3R4M7-G4DzHLrd.js} +1 -1
  44. package/dist/assets/{pegDiagram-GJSIUBJH-BOQEk_1D.js → pegDiagram-GJSIUBJH-K4eruzY0.js} +1 -1
  45. package/dist/assets/{pieDiagram-5QR66LMP-EIfoiTZo.js → pieDiagram-5QR66LMP-DYdR9PPq.js} +1 -1
  46. package/dist/assets/{quadrantDiagram-O4NWA36T-GgZwT-fi.js → quadrantDiagram-O4NWA36T-BCAh0nEy.js} +1 -1
  47. package/dist/assets/{railroadDiagram-XR7U4H2S-D9rDQomj.js → railroadDiagram-XR7U4H2S-p0dGRc4g.js} +1 -1
  48. package/dist/assets/{requirementDiagram-PLB6GJNP-DAh1MIeo.js → requirementDiagram-PLB6GJNP-tLeBG0aL.js} +1 -1
  49. package/dist/assets/{sankeyDiagram-IPEJSGJF-CPr6Uz64.js → sankeyDiagram-IPEJSGJF-QRuN16rV.js} +1 -1
  50. package/dist/assets/{sequenceDiagram-PO4LG4MO-BU6VIdcm.js → sequenceDiagram-PO4LG4MO-ueT1nVoa.js} +1 -1
  51. package/dist/assets/{sizeCapture-INFHLROL-qF2HO41r.js → sizeCapture-INFHLROL-wRS2zWg2.js} +1 -1
  52. package/dist/assets/{stateDiagram-v2-GCMORJYK-DlJ8G4MD.js → stateDiagram-v2-GCMORJYK-CYzA_hE1.js} +1 -1
  53. package/dist/assets/{swimlanes-2SLR337P-DzYE8I54.js → swimlanes-2SLR337P-kDnv6LMc.js} +1 -1
  54. package/dist/assets/swimlanesDiagram-TC7HE7FX-C7voMDle.js +8 -0
  55. package/dist/assets/{timeline-definition-EJHVYXUP-B7wzEQ0A.js → timeline-definition-EJHVYXUP-D1y2UbbH.js} +1 -1
  56. package/dist/assets/{usecaseDiagram-POWQR4AR-BvGgrxIP.js → usecaseDiagram-POWQR4AR-IqB4v9HX.js} +1 -1
  57. package/dist/assets/{vennDiagram-UO4OBE2U-CEECdgQg.js → vennDiagram-UO4OBE2U-BEi7KYVF.js} +1 -1
  58. package/dist/assets/{wardleyDiagram-VNRHLVJA-XQHA0P_P.js → wardleyDiagram-VNRHLVJA-Dkybo-Yf.js} +1 -1
  59. package/dist/assets/{xychartDiagram-PMCCYNJV-B5mLcZI2.js → xychartDiagram-PMCCYNJV-BAPFJLpg.js} +1 -1
  60. package/dist/index.html +2 -2
  61. package/dist-server/cloud-home-start.js +27 -13
  62. package/dist-server/companion/src/listener.js +39 -18
  63. package/dist-server/companion/src/routes.js +39 -0
  64. package/dist-server/container-mcp.js +16 -29
  65. package/dist-server/drivers/agents-proxy.js +161 -82
  66. package/dist-server/enterprise/server/index.js +2 -1
  67. package/dist-server/{browser-proxy.js → harness-mcp-proxy.js} +34 -19
  68. package/dist-server/index.js +4991 -4908
  69. package/dist-server/local-computer.js +2 -1
  70. package/dist-server/openmausbot.js +906 -1785
  71. package/dist-server/pair-cli.js +906 -1785
  72. package/dist-server/proxy-paths.js +2 -1
  73. package/dist-server/server/account-signin.js +0 -2
  74. package/dist-server/server/activity.js +201 -0
  75. package/dist-server/server/admin-activity.js +1 -4
  76. package/dist-server/server/auto-approve.js +25 -4
  77. package/dist-server/server/automatic-recovery.js +1 -1
  78. package/dist-server/server/boat-create-idempotency.js +0 -7
  79. package/dist-server/server/boat-delete-journal.js +0 -4
  80. package/dist-server/server/boat.js +4 -4
  81. package/dist-server/server/bot-package.js +1 -19
  82. package/dist-server/server/browser-runtime.js +1 -2
  83. package/dist-server/server/checkpoints.js +90 -148
  84. package/dist-server/server/chief-of-staff.js +9 -9
  85. package/dist-server/server/cli.js +33 -26
  86. package/dist-server/server/cloud-backend.js +0 -4
  87. package/dist-server/server/cloud-computer-tools.js +110 -0
  88. package/dist-server/server/cloud-home-start.js +12 -15
  89. package/dist-server/server/cloud-home.js +0 -5
  90. package/dist-server/server/cloud-lending.js +0 -3
  91. package/dist-server/server/cloud-move-http.js +44 -30
  92. package/dist-server/server/cloud-move.js +20 -18
  93. package/dist-server/server/composio.js +41 -5
  94. package/dist-server/server/computer-control.js +0 -15
  95. package/dist-server/server/computer-observation.js +0 -74
  96. package/dist-server/server/config.js +121 -65
  97. package/dist-server/server/container-computer.js +23 -24
  98. package/dist-server/server/control-client.js +4 -10
  99. package/dist-server/server/decider/jev.js +1 -4
  100. package/dist-server/server/decider/log.js +1 -3
  101. package/dist-server/server/decision-log.js +1 -4
  102. package/dist-server/server/delegations.js +3 -2
  103. package/dist-server/server/drivers/acp/core.js +11 -8
  104. package/dist-server/server/drivers/acp/opencode-go.js +17 -16
  105. package/dist-server/server/drivers/agents-call.js +88 -92
  106. package/dist-server/server/drivers/agents-catalog.js +90 -11
  107. package/dist-server/server/drivers/agents-proxy.js +10 -31
  108. package/dist-server/server/drivers/antigravity.js +1 -4
  109. package/dist-server/server/drivers/boatagent.js +23 -4
  110. package/dist-server/server/drivers/cerebras.js +3 -3
  111. package/dist-server/server/drivers/chat-mcp-tools.js +4 -7
  112. package/dist-server/server/drivers/claude-login-auth.js +2 -11
  113. package/dist-server/server/drivers/claude.js +16 -14
  114. package/dist-server/server/drivers/codex-device-auth.js +3 -1
  115. package/dist-server/server/drivers/codex.js +5 -4
  116. package/dist-server/server/drivers/grok.js +1 -1
  117. package/dist-server/server/drivers/openai-chat-protocol.js +4 -2
  118. package/dist-server/server/drivers/openai-chat.js +18 -11
  119. package/dist-server/server/drivers/prompt-split.js +4 -4
  120. package/dist-server/server/drivers/retry.js +8 -4
  121. package/dist-server/server/engine-install.js +1 -5
  122. package/dist-server/server/harness/bus.js +49 -0
  123. package/dist-server/server/harness/registry.js +0 -1
  124. package/dist-server/server/{browser-proxy.js → harness-mcp-proxy.js} +40 -20
  125. package/dist-server/server/index.js +1190 -971
  126. package/dist-server/server/lending-memory.js +12 -8
  127. package/dist-server/server/mcp-registry.js +35 -0
  128. package/dist-server/server/memory-entries.js +38 -8
  129. package/dist-server/server/memory-organize.js +1 -8
  130. package/dist-server/server/memory-topics.js +4 -4
  131. package/dist-server/server/memory-upkeep.js +13 -15
  132. package/dist-server/server/message-file.js +9 -13
  133. package/dist-server/server/outbound-counts.js +79 -0
  134. package/dist-server/server/outbound-requests.js +60 -0
  135. package/dist-server/server/package-import.js +1 -1
  136. package/dist-server/server/peer-delivery.js +5 -19
  137. package/dist-server/server/peer-roster.js +30 -4
  138. package/dist-server/server/profile-versions.js +0 -31
  139. package/dist-server/server/provider-key-check.js +2 -1
  140. package/dist-server/server/proxy-paths.js +2 -1
  141. package/dist-server/server/restart.js +40 -0
  142. package/dist-server/server/room-handoffs.js +17 -13
  143. package/dist-server/server/routes/bot-memory.js +0 -24
  144. package/dist-server/server/routine-requests.js +2 -5
  145. package/dist-server/server/routines.js +10 -5
  146. package/dist-server/server/server-launcher.js +53 -0
  147. package/dist-server/server/setup-mode.js +0 -2
  148. package/dist-server/server/skill-learn.js +0 -1
  149. package/dist-server/server/skill-library.js +0 -15
  150. package/dist-server/server/store.js +10 -2
  151. package/dist-server/server/surface.js +69 -28
  152. package/dist-server/server/system-prompt.js +17 -7
  153. package/dist-server/server/team-manifest.js +1 -6
  154. package/dist-server/server/team-memory.js +209 -0
  155. package/dist-server/server/thread-events.js +2 -2
  156. package/dist-server/server/tunnel.js +4 -1
  157. package/dist-server/server/turn-images.js +1 -21
  158. package/dist-server/server/turn-resources.js +19 -150
  159. package/dist-server/server/usage-ledger.js +3 -1
  160. package/dist-server/server/vps-computer.js +4 -14
  161. package/dist-server/server/workspace.js +87 -50
  162. package/dist-server/server-launcher.js +72 -0
  163. package/dist-server/shared/activity.js +3 -0
  164. package/dist-server/shared/ask-question.js +1 -1
  165. package/dist-server/shared/bot-avatar.js +8 -0
  166. package/dist-server/shared/cloud-computer.js +12 -0
  167. package/dist-server/shared/connector-scopes.js +78 -0
  168. package/dist-server/shared/failed-turn.js +25 -0
  169. package/dist-server/shared/live-approval.js +2 -2
  170. package/dist-server/shared/outbound.js +128 -0
  171. package/dist-server/shared/package-format.js +3 -3
  172. package/dist-server/shared/pairing-link.js +144 -0
  173. package/dist-server/shared/tool-surface.js +3 -2
  174. package/dist-server/vps-container-mcp.js +16 -29
  175. package/dist-server/workspace-backup.worker.js +14 -27
  176. package/enterprise/server/index.js +2 -1
  177. package/package.json +1 -1
  178. package/dist/assets/channel-CdJX6i8k.js +0 -1
  179. package/dist/assets/index-CPYrGsv1.js +0 -610
  180. package/dist/assets/index-CzT42GR8.css +0 -1
  181. package/dist/assets/swimlanesDiagram-TC7HE7FX-D-U4GtLQ.js +0 -8
  182. package/dist-server/server/claim-idle.js +0 -33
  183. package/dist-server/server/cloud-overflow.js +0 -167
  184. package/dist-server/server/drivers/chat-boat-tools.js +0 -90
  185. package/dist-server/server/drivers/grokagent.js +0 -4
  186. package/dist-server/server/openmaus-status-capsule.js +0 -329
  187. package/dist-server/server/tightening-requests.js +0 -435
  188. 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
- "screenshot", "click", "type_text", "press_key", "scroll", "computer_batch", "open_url", "browser_click", "browser_fill",
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
- opencodeGo: external_exports.object({ apiKey: optionalText }).optional(),
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: resolveProxy("browser-proxy"),
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
- opencodeGo: external_exports.object({ apiKey: optionalText }).optional(),
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: resolveProxy("browser-proxy"),
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,6 +1,6 @@
1
1
  {
2
2
  "name": "openmausbot",
3
- "version": "0.1.94",
3
+ "version": "0.1.96",
4
4
  "description": "Run the OpenMausBot server anywhere and pair your devices to it",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -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};