openmausbot 0.1.94 → 0.1.95

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 (145) hide show
  1. package/dist/assets/{DesktopViewer-bxM7NV3N.js → DesktopViewer-BwWpc4RK.js} +1 -1
  2. package/dist/assets/{abnfDiagram-O67JEVCF-BhMdJhRJ.js → abnfDiagram-O67JEVCF-jsQkIqTn.js} +1 -1
  3. package/dist/assets/{arc-B5itKDcx.js → arc-7kei4Hsu.js} +1 -1
  4. package/dist/assets/{architectureDiagram-NJMV4G6O-C5d7UY6U.js → architectureDiagram-NJMV4G6O-CRWDFDMq.js} +1 -1
  5. package/dist/assets/{blockDiagram-BEXU5L5S-BrZIhMmu.js → blockDiagram-BEXU5L5S-CTKW_IKs.js} +1 -1
  6. package/dist/assets/{c4Diagram-YGBWAQC7-7I0ArfbD.js → c4Diagram-YGBWAQC7-BBTW7-6M.js} +1 -1
  7. package/dist/assets/channel-DS2NbT5x.js +1 -0
  8. package/dist/assets/{chunk-2Q5K7J3B-BnEsyN36.js → chunk-2Q5K7J3B-M_Ox-MkD.js} +1 -1
  9. package/dist/assets/{chunk-3FUC2YCW-BXATQ52s.js → chunk-3FUC2YCW-D2YiN-Ud.js} +2 -2
  10. package/dist/assets/{chunk-5VM5RSS4-B0BpTkEx.js → chunk-5VM5RSS4-BmVYJ0f8.js} +1 -1
  11. package/dist/assets/{chunk-GTNCS2PH-BtLTz6FR.js → chunk-GTNCS2PH-BtiLVVnZ.js} +1 -1
  12. package/dist/assets/{chunk-GWA4HPMP-D6gcZOYt.js → chunk-GWA4HPMP-DFYSb6J6.js} +1 -1
  13. package/dist/assets/{chunk-JWPE2WC7-DCLrosvf.js → chunk-JWPE2WC7-mknKBzgV.js} +1 -1
  14. package/dist/assets/{chunk-NETBCI7D-B9JsknV9.js → chunk-NETBCI7D-DgSYGiOu.js} +1 -1
  15. package/dist/assets/{chunk-WEXAMYUT-CsoTxw7z.js → chunk-WEXAMYUT-C7ZvuguH.js} +1 -1
  16. package/dist/assets/{chunk-XXDRQBXY-0F_frB0c.js → chunk-XXDRQBXY-CPqxINpA.js} +1 -1
  17. package/dist/assets/{classDiagram-v2-NBCMYWYE-DkrpnflX.js → classDiagram-v2-NBCMYWYE-Cd6xfJaC.js} +1 -1
  18. package/dist/assets/{cose-bilkent-JH36ORCC-BNDwYBt9.js → cose-bilkent-JH36ORCC-BSXY5qRh.js} +1 -1
  19. package/dist/assets/{cynefin-OW5HDTMX-JUkNr1Mk.js → cynefin-OW5HDTMX-D_lhEMj1.js} +1 -1
  20. package/dist/assets/{cynefinDiagram-VND7K2PF-DKeh9N4M.js → cynefinDiagram-VND7K2PF-Da9FrFwk.js} +1 -1
  21. package/dist/assets/{dagre-6A5THRUB-ve-6T_wX.js → dagre-6A5THRUB-T77jMOXe.js} +1 -1
  22. package/dist/assets/{diagram-22UHCM2B-BuJ2d8rT.js → diagram-22UHCM2B-Dkj96X5E.js} +1 -1
  23. package/dist/assets/{diagram-3UASUU5V-BgOs_Ni-.js → diagram-3UASUU5V-CMi9zlD_.js} +1 -1
  24. package/dist/assets/{diagram-ATOU4E4O-DMK6VmcP.js → diagram-ATOU4E4O-CXK6YUfS.js} +1 -1
  25. package/dist/assets/{diagram-CDSNMT55-DksASlcY.js → diagram-CDSNMT55-BE7B1u9Q.js} +1 -1
  26. package/dist/assets/{diagram-MLGK6HIB-Bgn8I5k6.js → diagram-MLGK6HIB-CCMQphKr.js} +1 -1
  27. package/dist/assets/{diagram-MPIPVDR6-zK0jqO8N.js → diagram-MPIPVDR6-iHJ_-tGH.js} +1 -1
  28. package/dist/assets/{ebnfDiagram-ZINNZB2B-vKrbzTwr.js → ebnfDiagram-ZINNZB2B-DONsCWQ7.js} +1 -1
  29. package/dist/assets/{elk-276RUBZZ-Bzv2mPNf.js → elk-276RUBZZ-CU_WOaXk.js} +1 -1
  30. package/dist/assets/{erDiagram-OPXOYQCR-CvOyYuxu.js → erDiagram-OPXOYQCR-BeYwM04G.js} +1 -1
  31. package/dist/assets/{flowDiagram-KWPJA3E3-CtbnDbc0.js → flowDiagram-KWPJA3E3-Bdw9DqEl.js} +1 -1
  32. package/dist/assets/{ganttDiagram-FUAMR5RP-c4dMRYyG.js → ganttDiagram-FUAMR5RP-C9iwq3qm.js} +1 -1
  33. package/dist/assets/{gitGraphDiagram-X574FWY7-B34uaQho.js → gitGraphDiagram-X574FWY7-Dx-VWzUg.js} +1 -1
  34. package/dist/assets/{index-CPiqc_DN.js → index-KygHRE3E.js} +1 -1
  35. package/dist/assets/index-NF7XCHAy.css +1 -0
  36. package/dist/assets/index-X_5ydXIE.js +610 -0
  37. package/dist/assets/{infoDiagram-VRGFBTTK-o64ma4CI.js → infoDiagram-VRGFBTTK-BG7uaEd4.js} +1 -1
  38. package/dist/assets/{ishikawaDiagram-OU5B5YK6-DV4C9BAm.js → ishikawaDiagram-OU5B5YK6-D72WAXnM.js} +1 -1
  39. package/dist/assets/{journeyDiagram-ZHPQQLJL-Bf0AHk1H.js → journeyDiagram-ZHPQQLJL-DKH1gjYT.js} +1 -1
  40. package/dist/assets/{kanban-definition-PNTS6WVX-B1UMSKmE.js → kanban-definition-PNTS6WVX-3upm9JUT.js} +1 -1
  41. package/dist/assets/{linear-BpKhuyLm.js → linear-CcR4pc0-.js} +1 -1
  42. package/dist/assets/{mermaid.core-B_BKNCw5.js → mermaid.core-C6yU5FSS.js} +5 -5
  43. package/dist/assets/{mindmap-definition-NLK3R4M7-DeARruT1.js → mindmap-definition-NLK3R4M7-DOI2xEuv.js} +1 -1
  44. package/dist/assets/{pegDiagram-GJSIUBJH-BOQEk_1D.js → pegDiagram-GJSIUBJH-BVWJSgLd.js} +1 -1
  45. package/dist/assets/{pieDiagram-5QR66LMP-EIfoiTZo.js → pieDiagram-5QR66LMP-jtbYezhq.js} +1 -1
  46. package/dist/assets/{quadrantDiagram-O4NWA36T-GgZwT-fi.js → quadrantDiagram-O4NWA36T-g0u8mtPX.js} +1 -1
  47. package/dist/assets/{railroadDiagram-XR7U4H2S-D9rDQomj.js → railroadDiagram-XR7U4H2S-k8689Wny.js} +1 -1
  48. package/dist/assets/{requirementDiagram-PLB6GJNP-DAh1MIeo.js → requirementDiagram-PLB6GJNP-DsJ22PDt.js} +1 -1
  49. package/dist/assets/{sankeyDiagram-IPEJSGJF-CPr6Uz64.js → sankeyDiagram-IPEJSGJF-CneWBRgG.js} +1 -1
  50. package/dist/assets/{sequenceDiagram-PO4LG4MO-BU6VIdcm.js → sequenceDiagram-PO4LG4MO-DWsFCWap.js} +1 -1
  51. package/dist/assets/{sizeCapture-INFHLROL-qF2HO41r.js → sizeCapture-INFHLROL-Bvf0YE3S.js} +1 -1
  52. package/dist/assets/{stateDiagram-v2-GCMORJYK-DlJ8G4MD.js → stateDiagram-v2-GCMORJYK-Bxb3Iei8.js} +1 -1
  53. package/dist/assets/{swimlanes-2SLR337P-DzYE8I54.js → swimlanes-2SLR337P-DLkk7W4A.js} +1 -1
  54. package/dist/assets/swimlanesDiagram-TC7HE7FX-C6bZtBXk.js +8 -0
  55. package/dist/assets/{timeline-definition-EJHVYXUP-B7wzEQ0A.js → timeline-definition-EJHVYXUP-KR9bIHYC.js} +1 -1
  56. package/dist/assets/{usecaseDiagram-POWQR4AR-BvGgrxIP.js → usecaseDiagram-POWQR4AR-DfsOrj8t.js} +1 -1
  57. package/dist/assets/{vennDiagram-UO4OBE2U-CEECdgQg.js → vennDiagram-UO4OBE2U-DRSTzG3h.js} +1 -1
  58. package/dist/assets/{wardleyDiagram-VNRHLVJA-XQHA0P_P.js → wardleyDiagram-VNRHLVJA-DtEdhPgT.js} +1 -1
  59. package/dist/assets/{xychartDiagram-PMCCYNJV-B5mLcZI2.js → xychartDiagram-PMCCYNJV-B-XhTxjG.js} +1 -1
  60. package/dist/index.html +2 -2
  61. package/dist-server/cloud-home-start.js +2 -1
  62. package/dist-server/companion/src/routes.js +39 -0
  63. package/dist-server/container-mcp.js +2 -2
  64. package/dist-server/drivers/agents-proxy.js +58 -38
  65. package/dist-server/enterprise/server/index.js +2 -1
  66. package/dist-server/{browser-proxy.js → harness-mcp-proxy.js} +35 -19
  67. package/dist-server/index.js +3159 -2313
  68. package/dist-server/local-computer.js +2 -1
  69. package/dist-server/openmausbot.js +314 -1336
  70. package/dist-server/pair-cli.js +314 -1336
  71. package/dist-server/proxy-paths.js +2 -1
  72. package/dist-server/server/account-signin.js +0 -2
  73. package/dist-server/server/activity.js +201 -0
  74. package/dist-server/server/auto-approve.js +6 -0
  75. package/dist-server/server/automatic-recovery.js +1 -1
  76. package/dist-server/server/boat-create-idempotency.js +0 -7
  77. package/dist-server/server/boat-delete-journal.js +0 -4
  78. package/dist-server/server/bot-package.js +1 -19
  79. package/dist-server/server/browser-runtime.js +1 -2
  80. package/dist-server/server/chief-of-staff.js +2 -3
  81. package/dist-server/server/cloud-backend.js +0 -4
  82. package/dist-server/server/cloud-computer-tools.js +110 -0
  83. package/dist-server/server/cloud-home.js +0 -1
  84. package/dist-server/server/cloud-lending.js +0 -3
  85. package/dist-server/server/composio.js +31 -2
  86. package/dist-server/server/computer-control.js +0 -15
  87. package/dist-server/server/computer-observation.js +0 -74
  88. package/dist-server/server/config.js +29 -1
  89. package/dist-server/server/container-computer.js +7 -19
  90. package/dist-server/server/contracts.js +9 -0
  91. package/dist-server/server/control-client.js +4 -10
  92. package/dist-server/server/drivers/acp/core.js +7 -5
  93. package/dist-server/server/drivers/agents-call.js +42 -29
  94. package/dist-server/server/drivers/agents-catalog.js +24 -11
  95. package/dist-server/server/drivers/agents-proxy.js +8 -30
  96. package/dist-server/server/drivers/antigravity.js +1 -4
  97. package/dist-server/server/drivers/boatagent.js +23 -4
  98. package/dist-server/server/drivers/cerebras.js +3 -3
  99. package/dist-server/server/drivers/chat-mcp-tools.js +4 -7
  100. package/dist-server/server/drivers/claude.js +16 -14
  101. package/dist-server/server/drivers/openai-chat.js +3 -6
  102. package/dist-server/server/drivers/retry.js +8 -4
  103. package/dist-server/server/engine-install.js +1 -5
  104. package/dist-server/server/harness/registry.js +0 -1
  105. package/dist-server/server/{browser-proxy.js → harness-mcp-proxy.js} +40 -20
  106. package/dist-server/server/index.js +789 -256
  107. package/dist-server/server/lending-memory.js +12 -8
  108. package/dist-server/server/memory-entries.js +38 -8
  109. package/dist-server/server/memory-organize.js +1 -8
  110. package/dist-server/server/memory-topics.js +4 -4
  111. package/dist-server/server/memory-upkeep.js +13 -15
  112. package/dist-server/server/message-file.js +5 -9
  113. package/dist-server/server/outbound-counts.js +79 -0
  114. package/dist-server/server/outbound-requests.js +60 -0
  115. package/dist-server/server/package-import.js +1 -1
  116. package/dist-server/server/peer-delivery.js +1 -0
  117. package/dist-server/server/proxy-paths.js +2 -1
  118. package/dist-server/server/room-handoffs.js +5 -13
  119. package/dist-server/server/routine-requests.js +1 -1
  120. package/dist-server/server/routines.js +5 -1
  121. package/dist-server/server/setup-mode.js +0 -2
  122. package/dist-server/server/skill-learn.js +0 -1
  123. package/dist-server/server/skill-library.js +0 -15
  124. package/dist-server/server/store.js +9 -1
  125. package/dist-server/server/surface.js +65 -20
  126. package/dist-server/server/system-prompt.js +4 -4
  127. package/dist-server/server/team-memory.js +209 -0
  128. package/dist-server/server/thread-events.js +2 -2
  129. package/dist-server/server/vps-computer.js +4 -14
  130. package/dist-server/server/workspace.js +85 -47
  131. package/dist-server/shared/activity.js +3 -0
  132. package/dist-server/shared/bot-avatar.js +8 -0
  133. package/dist-server/shared/connector-scopes.js +78 -0
  134. package/dist-server/shared/outbound.js +128 -0
  135. package/dist-server/shared/tool-surface.js +3 -2
  136. package/dist-server/vps-container-mcp.js +2 -2
  137. package/enterprise/server/index.js +2 -1
  138. package/package.json +1 -1
  139. package/dist/assets/channel-CdJX6i8k.js +0 -1
  140. package/dist/assets/index-CPYrGsv1.js +0 -610
  141. package/dist/assets/index-CzT42GR8.css +0 -1
  142. package/dist/assets/swimlanesDiagram-TC7HE7FX-D-U4GtLQ.js +0 -8
  143. package/dist-server/server/drivers/chat-boat-tools.js +0 -90
  144. package/dist-server/server/drivers/grokagent.js +0 -4
  145. package/dist-server/server/openmaus-status-capsule.js +0 -329
@@ -0,0 +1,78 @@
1
+ // Per-bot connection scopes: which connected apps a bot may use, and
2
+ // whether it may only read them or also write. Absent means what it has
3
+ // always meant — every connected app, read and write — so nothing changes
4
+ // for a bot nobody has scoped. Present means a list: an app not on it is
5
+ // off for this bot, and "read" refuses anything that is not a read.
6
+ //
7
+ // Shared between the harness (which enforces it at the connector relay,
8
+ // seeing through Composio's meta tools) and the app (which shows the
9
+ // control), so both agree on what a scope means.
10
+ // No import from outbound.ts: shared/ is compiled by both the server (which
11
+ // needs .ts extensions) and the app (which forbids them), so shared modules
12
+ // stand alone. The read-verb rule is repeated here in its Composio-only form.
13
+ const READ_VERBS = new Set(["GET", "LIST", "FETCH", "SEARCH", "READ", "FIND", "RETRIEVE", "LOOKUP", "DOWNLOAD", "VIEW", "CHECK", "COUNT"]);
14
+ const TOOLKIT_SLUG = /^[a-z0-9][a-z0-9_-]{0,63}$/;
15
+ /** The toolkit a Composio slug belongs to: the part before the first
16
+ * underscore, lower-cased. A workbench API proxy belongs to no app. */
17
+ export function toolkitOf(slug) {
18
+ const cut = slug.indexOf("_");
19
+ return (cut > 0 ? slug.slice(0, cut) : slug).toLowerCase();
20
+ }
21
+ /** A read verb first means the tool reads. Creating a draft writes to the
22
+ * account even though it sends nothing, so it is a write here. */
23
+ export function isReadOnlyAction(slug, toolkit) {
24
+ if (slug === "COMPOSIO_PROXY_EXECUTE")
25
+ return false;
26
+ const cut = toolkit ? toolkit.length : slug.indexOf("_");
27
+ const action = cut > 0 ? slug.slice(cut + 1) : "";
28
+ const first = action.toUpperCase().split(/[^A-Z0-9]+/).find(Boolean);
29
+ return first !== undefined && READ_VERBS.has(first);
30
+ }
31
+ /** The stored shape, or null when the value is not one. */
32
+ export function normalizeConnectorScopes(value) {
33
+ if (!value || typeof value !== "object" || Array.isArray(value))
34
+ return null;
35
+ const raw = value.apps;
36
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
37
+ return null;
38
+ const apps = Object.create(null);
39
+ for (const [key, scope] of Object.entries(raw)) {
40
+ const slug = key.trim().toLowerCase();
41
+ if (!TOOLKIT_SLUG.test(slug))
42
+ return null;
43
+ if (scope !== "read" && scope !== "write")
44
+ return null;
45
+ apps[slug] = scope;
46
+ }
47
+ return { apps };
48
+ }
49
+ /** May this bot run these calls? The first refusal wins, so a batch that
50
+ * mixes an allowed read with a forbidden write is refused whole rather
51
+ * than half-run. */
52
+ export function connectorAccessDecision(scopes, calls, toolkits = []) {
53
+ if (!scopes)
54
+ return { ok: true };
55
+ for (const call of calls) {
56
+ const toolkit = toolkits.filter(candidate => call.slug.startsWith(candidate.toUpperCase() + "_"))
57
+ .sort((a, b) => b.length - a.length)[0] ?? toolkitOf(call.slug);
58
+ const scope = call.slug === "COMPOSIO_PROXY_EXECUTE" || !Object.hasOwn(scopes.apps, toolkit) ? undefined : scopes.apps[toolkit];
59
+ if (!scope)
60
+ return { ok: false, slug: call.slug, toolkit, reason: "app" };
61
+ if (scope === "read" && !isReadOnlyAction(call.slug, toolkit))
62
+ return { ok: false, slug: call.slug, toolkit, reason: "write" };
63
+ }
64
+ return { ok: true };
65
+ }
66
+ /** One sentence for the bot's prompt, so it does not spend a turn finding
67
+ * out. Empty when the bot is unscoped. */
68
+ export function describeConnectorScopes(scopes) {
69
+ if (!scopes)
70
+ return "";
71
+ const entries = Object.entries(scopes.apps);
72
+ if (entries.length === 0)
73
+ return " This bot has been given no connected apps; do not try to use any.";
74
+ const listed = entries
75
+ .map(([slug, scope]) => `${slug} (${scope === "read" ? "read only" : "read and write"})`)
76
+ .join(", ");
77
+ return ` This bot may use only these connected apps: ${listed}. Do not try others, and do not write to a read-only one.`;
78
+ }
@@ -0,0 +1,128 @@
1
+ // Outbound actions: the calls that reach a person outside the app, or move
2
+ // money. Sending an email, replying in a thread, posting to a channel,
3
+ // publishing, inviting, sharing, refunding, charging. These get their own
4
+ // confirmation regardless of approval level, and an optional daily
5
+ // allowance per bot, because the cost of one wrong send is paid by someone
6
+ // who never saw the bot.
7
+ //
8
+ // Shared between the harness (which enforces it) and the app (which shows
9
+ // the setting), so both agree on what "outbound" means.
10
+ export const OUTBOUND_DEFAULT_CAP = 25;
11
+ const OUTBOUND_MAX_CAP = 1_000;
12
+ /** Tools whose action is one of these words send something somewhere. */
13
+ const SEND_VERBS = new Set([
14
+ "SEND",
15
+ "SENDS",
16
+ "REPLY",
17
+ "RESPOND",
18
+ "FORWARD",
19
+ "POST",
20
+ "PUBLISH",
21
+ "TWEET",
22
+ "RETWEET",
23
+ "BROADCAST",
24
+ "INVITE",
25
+ "SHARE",
26
+ "REFUND",
27
+ "CHARGE",
28
+ "PAY",
29
+ "PAYOUT",
30
+ "TRANSFER",
31
+ ]);
32
+ /** Creating one of these is sending it: a created comment is a comment
33
+ * someone reads, a created invoice is one someone receives. */
34
+ const CREATE_VERBS = new Set(["CREATE", "CREATION", "ADD", "NEW"]);
35
+ const SENT_NOUNS = new Set(["MESSAGE", "COMMENT", "POST", "EMAIL", "MAIL", "INVOICE", "PAYMENT", "REFUND", "REPLY", "TWEET", "DM"]);
36
+ /** A read verb first means the rest of the name is what is being read:
37
+ * REDDIT_GET_POST fetches a post, it does not post. */
38
+ const READ_VERBS = new Set(["GET", "LIST", "FETCH", "SEARCH", "READ", "FIND", "RETRIEVE", "LOOKUP", "DOWNLOAD", "VIEW", "CHECK", "COUNT"]);
39
+ /** The action part of a tool name, as upper-case word tokens. Composio's
40
+ * TOOLKIT_ACTION drops its toolkit; an MCP server's mcp__server__action
41
+ * drops its server; a bare built-in like Bash stays as it is. */
42
+ function actionTokens(name) {
43
+ let action = name;
44
+ if (name.startsWith("mcp__")) {
45
+ const [, server = "", ...rest] = name.split("__");
46
+ action = rest.join("_");
47
+ if (server === "composio")
48
+ return actionTokens(action);
49
+ }
50
+ else if (/^[A-Z][A-Z0-9]*_[A-Z0-9_]+$/.test(name)) {
51
+ action = name.slice(name.indexOf("_") + 1);
52
+ }
53
+ return action
54
+ .replace(/([a-z0-9])([A-Z])/g, "$1_$2")
55
+ .toUpperCase()
56
+ .split(/[^A-Z0-9]+/)
57
+ .filter(Boolean);
58
+ }
59
+ /** Does this tool send something to someone, or move money? */
60
+ export function isOutboundTool(name) {
61
+ // A raw API call from the workbench can do anything an app tool can, and
62
+ // nothing here can read which; it is treated as a send.
63
+ if (name === "COMPOSIO_PROXY_EXECUTE")
64
+ return true;
65
+ const tokens = actionTokens(name);
66
+ if (tokens.length === 0)
67
+ return false;
68
+ if (READ_VERBS.has(tokens[0]))
69
+ return false;
70
+ if (tokens.some((token) => SEND_VERBS.has(token)))
71
+ return true;
72
+ if (tokens.includes("DRAFT"))
73
+ return false;
74
+ return tokens.some((token) => CREATE_VERBS.has(token)) && tokens.some((token) => SENT_NOUNS.has(token));
75
+ }
76
+ /** The stored shape, or null when the value is not one. */
77
+ export function normalizeOutboundPolicy(value) {
78
+ if (!value || typeof value !== "object" || Array.isArray(value))
79
+ return null;
80
+ const { policy, dailyCap } = value;
81
+ if (policy !== "ask" && policy !== "allow")
82
+ return null;
83
+ if (dailyCap === undefined)
84
+ return { policy, dailyCap: OUTBOUND_DEFAULT_CAP };
85
+ if (typeof dailyCap !== "number" || !Number.isInteger(dailyCap) || dailyCap < 1 || dailyCap > OUTBOUND_MAX_CAP)
86
+ return null;
87
+ return { policy, dailyCap };
88
+ }
89
+ /** What a bot without a stored policy does: ask, every time. */
90
+ export const DEFAULT_OUTBOUND_POLICY = { policy: "ask", dailyCap: OUTBOUND_DEFAULT_CAP };
91
+ const isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
92
+ /** Composio's session exposes a handful of meta tools and runs the app
93
+ * tools inside them: a multi-execute call carries a list of slugs with
94
+ * arguments. Arbitrary workbench/bash code is opaque: it requires an
95
+ * explicit unrestricted approval, never an inferred app or send count.
96
+ * Search, schema lookup, and connection management run no app tools. */
97
+ export function connectorCallsIn(name, args) {
98
+ if (name === "COMPOSIO_MULTI_EXECUTE_TOOL") {
99
+ const tools = isRecord(args) && Array.isArray(args.tools) ? args.tools
100
+ : isRecord(args) && typeof args.tool_slug === "string" ? [args] : [];
101
+ if (!tools.length)
102
+ return [{ slug: "COMPOSIO_PROXY_EXECUTE", arguments: args }];
103
+ const calls = [];
104
+ for (const item of tools) {
105
+ if (!isRecord(item))
106
+ return [{ slug: "COMPOSIO_PROXY_EXECUTE", arguments: args }];
107
+ const slug = [item.tool_slug, item.slug, item.name, item.tool].find((value) => typeof value === "string" && value);
108
+ if (typeof slug !== "string")
109
+ return [{ slug: "COMPOSIO_PROXY_EXECUTE", arguments: args }];
110
+ calls.push({ slug, ...(item.arguments !== undefined ? { arguments: item.arguments } : {}) });
111
+ }
112
+ return calls;
113
+ }
114
+ if (name === "COMPOSIO_REMOTE_WORKBENCH" || name === "COMPOSIO_REMOTE_BASH_TOOL") {
115
+ // Arbitrary code can compute tool names and repeat calls. Its app and
116
+ // outbound count cannot be inferred from literals in the source.
117
+ return [{ slug: "COMPOSIO_PROXY_EXECUTE", arguments: args }];
118
+ }
119
+ if (["COMPOSIO_SEARCH_TOOLS", "COMPOSIO_GET_TOOL_SCHEMAS", "COMPOSIO_MANAGE_CONNECTIONS", "COMPOSIO_WAIT_FOR_CONNECTIONS"].includes(name))
120
+ return [];
121
+ if (name.startsWith("COMPOSIO_"))
122
+ return [{ slug: "COMPOSIO_PROXY_EXECUTE", arguments: args }];
123
+ return [{ slug: name, ...(args !== undefined ? { arguments: args } : {}) }];
124
+ }
125
+ /** The subset of a request's app tools that would send something. */
126
+ export function outboundCallsIn(name, args) {
127
+ return connectorCallsIn(name, args).filter((call) => isOutboundTool(call.slug));
128
+ }
@@ -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",
@@ -16691,7 +16691,8 @@ function resolveProxy(relative) {
16691
16691
  return existsSync2(source) ? source : join3(SERVER_ROOT, `${relative}.js`);
16692
16692
  }
16693
16693
  var SPAWNED_PROXIES = {
16694
- browser: resolveProxy("browser-proxy"),
16694
+ // The built-in browser and the cloud computer: argv[2] picks which.
16695
+ harnessMcp: resolveProxy("harness-mcp-proxy"),
16695
16696
  localComputer: resolveProxy("local-computer-proxy"),
16696
16697
  permission: resolveProxy("permission-proxy"),
16697
16698
  containerMcp: resolveProxy("container-mcp"),
@@ -16724,7 +16725,6 @@ var DISPLAY = ":1";
16724
16725
  var CUA_SOCKET = "/run/user/1000/openmausbot-cua.sock";
16725
16726
  var CUA_EXECUTABLE = "/usr/local/libexec/openmausbot/cua-driver";
16726
16727
  var MEMORY_BYTES = 4 * 1024 * 1024 * 1024;
16727
- var SHM_BYTES = 512 * 1024 * 1024;
16728
16728
  function cuaExecArgs(args2, options = {}) {
16729
16729
  return [
16730
16730
  "exec",
@@ -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.95",
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};