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.
- package/dist/assets/{DesktopViewer-bxM7NV3N.js → DesktopViewer-BwWpc4RK.js} +1 -1
- package/dist/assets/{abnfDiagram-O67JEVCF-BhMdJhRJ.js → abnfDiagram-O67JEVCF-jsQkIqTn.js} +1 -1
- package/dist/assets/{arc-B5itKDcx.js → arc-7kei4Hsu.js} +1 -1
- package/dist/assets/{architectureDiagram-NJMV4G6O-C5d7UY6U.js → architectureDiagram-NJMV4G6O-CRWDFDMq.js} +1 -1
- package/dist/assets/{blockDiagram-BEXU5L5S-BrZIhMmu.js → blockDiagram-BEXU5L5S-CTKW_IKs.js} +1 -1
- package/dist/assets/{c4Diagram-YGBWAQC7-7I0ArfbD.js → c4Diagram-YGBWAQC7-BBTW7-6M.js} +1 -1
- package/dist/assets/channel-DS2NbT5x.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-BnEsyN36.js → chunk-2Q5K7J3B-M_Ox-MkD.js} +1 -1
- package/dist/assets/{chunk-3FUC2YCW-BXATQ52s.js → chunk-3FUC2YCW-D2YiN-Ud.js} +2 -2
- package/dist/assets/{chunk-5VM5RSS4-B0BpTkEx.js → chunk-5VM5RSS4-BmVYJ0f8.js} +1 -1
- package/dist/assets/{chunk-GTNCS2PH-BtLTz6FR.js → chunk-GTNCS2PH-BtiLVVnZ.js} +1 -1
- package/dist/assets/{chunk-GWA4HPMP-D6gcZOYt.js → chunk-GWA4HPMP-DFYSb6J6.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-DCLrosvf.js → chunk-JWPE2WC7-mknKBzgV.js} +1 -1
- package/dist/assets/{chunk-NETBCI7D-B9JsknV9.js → chunk-NETBCI7D-DgSYGiOu.js} +1 -1
- package/dist/assets/{chunk-WEXAMYUT-CsoTxw7z.js → chunk-WEXAMYUT-C7ZvuguH.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-0F_frB0c.js → chunk-XXDRQBXY-CPqxINpA.js} +1 -1
- package/dist/assets/{classDiagram-v2-NBCMYWYE-DkrpnflX.js → classDiagram-v2-NBCMYWYE-Cd6xfJaC.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-BNDwYBt9.js → cose-bilkent-JH36ORCC-BSXY5qRh.js} +1 -1
- package/dist/assets/{cynefin-OW5HDTMX-JUkNr1Mk.js → cynefin-OW5HDTMX-D_lhEMj1.js} +1 -1
- package/dist/assets/{cynefinDiagram-VND7K2PF-DKeh9N4M.js → cynefinDiagram-VND7K2PF-Da9FrFwk.js} +1 -1
- package/dist/assets/{dagre-6A5THRUB-ve-6T_wX.js → dagre-6A5THRUB-T77jMOXe.js} +1 -1
- package/dist/assets/{diagram-22UHCM2B-BuJ2d8rT.js → diagram-22UHCM2B-Dkj96X5E.js} +1 -1
- package/dist/assets/{diagram-3UASUU5V-BgOs_Ni-.js → diagram-3UASUU5V-CMi9zlD_.js} +1 -1
- package/dist/assets/{diagram-ATOU4E4O-DMK6VmcP.js → diagram-ATOU4E4O-CXK6YUfS.js} +1 -1
- package/dist/assets/{diagram-CDSNMT55-DksASlcY.js → diagram-CDSNMT55-BE7B1u9Q.js} +1 -1
- package/dist/assets/{diagram-MLGK6HIB-Bgn8I5k6.js → diagram-MLGK6HIB-CCMQphKr.js} +1 -1
- package/dist/assets/{diagram-MPIPVDR6-zK0jqO8N.js → diagram-MPIPVDR6-iHJ_-tGH.js} +1 -1
- package/dist/assets/{ebnfDiagram-ZINNZB2B-vKrbzTwr.js → ebnfDiagram-ZINNZB2B-DONsCWQ7.js} +1 -1
- package/dist/assets/{elk-276RUBZZ-Bzv2mPNf.js → elk-276RUBZZ-CU_WOaXk.js} +1 -1
- package/dist/assets/{erDiagram-OPXOYQCR-CvOyYuxu.js → erDiagram-OPXOYQCR-BeYwM04G.js} +1 -1
- package/dist/assets/{flowDiagram-KWPJA3E3-CtbnDbc0.js → flowDiagram-KWPJA3E3-Bdw9DqEl.js} +1 -1
- package/dist/assets/{ganttDiagram-FUAMR5RP-c4dMRYyG.js → ganttDiagram-FUAMR5RP-C9iwq3qm.js} +1 -1
- package/dist/assets/{gitGraphDiagram-X574FWY7-B34uaQho.js → gitGraphDiagram-X574FWY7-Dx-VWzUg.js} +1 -1
- package/dist/assets/{index-CPiqc_DN.js → index-KygHRE3E.js} +1 -1
- package/dist/assets/index-NF7XCHAy.css +1 -0
- package/dist/assets/index-X_5ydXIE.js +610 -0
- package/dist/assets/{infoDiagram-VRGFBTTK-o64ma4CI.js → infoDiagram-VRGFBTTK-BG7uaEd4.js} +1 -1
- package/dist/assets/{ishikawaDiagram-OU5B5YK6-DV4C9BAm.js → ishikawaDiagram-OU5B5YK6-D72WAXnM.js} +1 -1
- package/dist/assets/{journeyDiagram-ZHPQQLJL-Bf0AHk1H.js → journeyDiagram-ZHPQQLJL-DKH1gjYT.js} +1 -1
- package/dist/assets/{kanban-definition-PNTS6WVX-B1UMSKmE.js → kanban-definition-PNTS6WVX-3upm9JUT.js} +1 -1
- package/dist/assets/{linear-BpKhuyLm.js → linear-CcR4pc0-.js} +1 -1
- package/dist/assets/{mermaid.core-B_BKNCw5.js → mermaid.core-C6yU5FSS.js} +5 -5
- package/dist/assets/{mindmap-definition-NLK3R4M7-DeARruT1.js → mindmap-definition-NLK3R4M7-DOI2xEuv.js} +1 -1
- package/dist/assets/{pegDiagram-GJSIUBJH-BOQEk_1D.js → pegDiagram-GJSIUBJH-BVWJSgLd.js} +1 -1
- package/dist/assets/{pieDiagram-5QR66LMP-EIfoiTZo.js → pieDiagram-5QR66LMP-jtbYezhq.js} +1 -1
- package/dist/assets/{quadrantDiagram-O4NWA36T-GgZwT-fi.js → quadrantDiagram-O4NWA36T-g0u8mtPX.js} +1 -1
- package/dist/assets/{railroadDiagram-XR7U4H2S-D9rDQomj.js → railroadDiagram-XR7U4H2S-k8689Wny.js} +1 -1
- package/dist/assets/{requirementDiagram-PLB6GJNP-DAh1MIeo.js → requirementDiagram-PLB6GJNP-DsJ22PDt.js} +1 -1
- package/dist/assets/{sankeyDiagram-IPEJSGJF-CPr6Uz64.js → sankeyDiagram-IPEJSGJF-CneWBRgG.js} +1 -1
- package/dist/assets/{sequenceDiagram-PO4LG4MO-BU6VIdcm.js → sequenceDiagram-PO4LG4MO-DWsFCWap.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-qF2HO41r.js → sizeCapture-INFHLROL-Bvf0YE3S.js} +1 -1
- package/dist/assets/{stateDiagram-v2-GCMORJYK-DlJ8G4MD.js → stateDiagram-v2-GCMORJYK-Bxb3Iei8.js} +1 -1
- package/dist/assets/{swimlanes-2SLR337P-DzYE8I54.js → swimlanes-2SLR337P-DLkk7W4A.js} +1 -1
- package/dist/assets/swimlanesDiagram-TC7HE7FX-C6bZtBXk.js +8 -0
- package/dist/assets/{timeline-definition-EJHVYXUP-B7wzEQ0A.js → timeline-definition-EJHVYXUP-KR9bIHYC.js} +1 -1
- package/dist/assets/{usecaseDiagram-POWQR4AR-BvGgrxIP.js → usecaseDiagram-POWQR4AR-DfsOrj8t.js} +1 -1
- package/dist/assets/{vennDiagram-UO4OBE2U-CEECdgQg.js → vennDiagram-UO4OBE2U-DRSTzG3h.js} +1 -1
- package/dist/assets/{wardleyDiagram-VNRHLVJA-XQHA0P_P.js → wardleyDiagram-VNRHLVJA-DtEdhPgT.js} +1 -1
- package/dist/assets/{xychartDiagram-PMCCYNJV-B5mLcZI2.js → xychartDiagram-PMCCYNJV-B-XhTxjG.js} +1 -1
- package/dist/index.html +2 -2
- package/dist-server/cloud-home-start.js +2 -1
- package/dist-server/companion/src/routes.js +39 -0
- package/dist-server/container-mcp.js +2 -2
- package/dist-server/drivers/agents-proxy.js +58 -38
- package/dist-server/enterprise/server/index.js +2 -1
- package/dist-server/{browser-proxy.js → harness-mcp-proxy.js} +35 -19
- package/dist-server/index.js +3159 -2313
- package/dist-server/local-computer.js +2 -1
- package/dist-server/openmausbot.js +314 -1336
- package/dist-server/pair-cli.js +314 -1336
- 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/auto-approve.js +6 -0
- 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/bot-package.js +1 -19
- package/dist-server/server/browser-runtime.js +1 -2
- package/dist-server/server/chief-of-staff.js +2 -3
- 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.js +0 -1
- package/dist-server/server/cloud-lending.js +0 -3
- package/dist-server/server/composio.js +31 -2
- package/dist-server/server/computer-control.js +0 -15
- package/dist-server/server/computer-observation.js +0 -74
- package/dist-server/server/config.js +29 -1
- package/dist-server/server/container-computer.js +7 -19
- package/dist-server/server/contracts.js +9 -0
- package/dist-server/server/control-client.js +4 -10
- package/dist-server/server/drivers/acp/core.js +7 -5
- package/dist-server/server/drivers/agents-call.js +42 -29
- package/dist-server/server/drivers/agents-catalog.js +24 -11
- package/dist-server/server/drivers/agents-proxy.js +8 -30
- 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.js +16 -14
- package/dist-server/server/drivers/openai-chat.js +3 -6
- package/dist-server/server/drivers/retry.js +8 -4
- package/dist-server/server/engine-install.js +1 -5
- 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 +789 -256
- package/dist-server/server/lending-memory.js +12 -8
- 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 +5 -9
- 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 +1 -0
- package/dist-server/server/proxy-paths.js +2 -1
- package/dist-server/server/room-handoffs.js +5 -13
- package/dist-server/server/routine-requests.js +1 -1
- package/dist-server/server/routines.js +5 -1
- 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 +9 -1
- package/dist-server/server/surface.js +65 -20
- package/dist-server/server/system-prompt.js +4 -4
- package/dist-server/server/team-memory.js +209 -0
- package/dist-server/server/thread-events.js +2 -2
- package/dist-server/server/vps-computer.js +4 -14
- package/dist-server/server/workspace.js +85 -47
- package/dist-server/shared/activity.js +3 -0
- package/dist-server/shared/bot-avatar.js +8 -0
- package/dist-server/shared/connector-scopes.js +78 -0
- package/dist-server/shared/outbound.js +128 -0
- package/dist-server/shared/tool-surface.js +3 -2
- package/dist-server/vps-container-mcp.js +2 -2
- 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/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
|
@@ -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
|
-
|
|
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:
|
|
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:
|
|
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};
|