@agent-beam/beam 0.2.5 → 0.2.7
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/cli.js +9 -2
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.js +124 -2
- package/dist/client.js.map +1 -1
- package/dist/color.d.ts +1 -0
- package/dist/color.js +3 -0
- package/dist/color.js.map +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/core.d.ts +6 -0
- package/dist/core.js +9 -0
- package/dist/core.js.map +1 -1
- package/dist/enroll.js +1 -1
- package/dist/enroll.js.map +1 -1
- package/dist/forward.d.ts +2 -0
- package/dist/forward.js +14 -0
- package/dist/forward.js.map +1 -1
- package/dist/mcp-config.d.ts +16 -0
- package/dist/mcp-config.js +72 -0
- package/dist/mcp-config.js.map +1 -0
- package/dist/mcp-proxy.d.ts +2 -0
- package/dist/mcp-proxy.js +75 -0
- package/dist/mcp-proxy.js.map +1 -0
- package/dist/policy.js +6 -1
- package/dist/policy.js.map +1 -1
- package/dist/prompts.d.ts +1 -0
- package/dist/prompts.js +92 -17
- package/dist/prompts.js.map +1 -1
- package/dist/setup.d.ts +2 -1
- package/dist/setup.js +74 -55
- package/dist/setup.js.map +1 -1
- package/dist/studio.js +4 -2
- package/dist/studio.js.map +1 -1
- package/package.json +2 -1
package/dist/setup.js
CHANGED
|
@@ -1,35 +1,40 @@
|
|
|
1
|
-
import { createInterface } from "node:readline/promises";
|
|
2
1
|
import { detectAgents, installHook } from "./install.js";
|
|
3
2
|
import { readIdentity } from "./enroll.js";
|
|
4
3
|
import { startConnect } from "./connect.js";
|
|
5
4
|
import { installEnterprisePackage } from "./enterprise-install.js";
|
|
6
5
|
import { installService } from "./service.js";
|
|
7
6
|
import { openBrowser } from "./open-browser.js";
|
|
8
|
-
import {
|
|
9
|
-
import { checkbox, renderTable, withSpinner } from "./prompts.js";
|
|
7
|
+
import { checkbox, confirm, renderTable, withSpinner } from "./prompts.js";
|
|
10
8
|
import { showFirstRunWelcome } from "./owl.js";
|
|
9
|
+
import { cyan, dim, green, indigoOut, red } from "./color.js";
|
|
11
10
|
import { syncPolicy } from "./forward.js";
|
|
12
11
|
import { AGENT_BINARIES } from "./shims.js";
|
|
12
|
+
import { installMcpProxies } from "./mcp-config.js";
|
|
13
|
+
import { forwardMcpInventory } from "./forward.js";
|
|
13
14
|
const TOTAL_STEPS = 5;
|
|
14
15
|
function step(n, title) {
|
|
15
|
-
console.log(`\
|
|
16
|
+
console.log(`\n${indigoOut(`Step ${n}/${TOTAL_STEPS}`)} ${title}`);
|
|
16
17
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
18
|
+
function ok(message) {
|
|
19
|
+
console.log(` ${green("✔")} ${message}`);
|
|
20
|
+
}
|
|
21
|
+
function skip(message) {
|
|
22
|
+
console.log(` ${dim(`— ${message}`)}`);
|
|
23
|
+
}
|
|
24
|
+
function fail(message) {
|
|
25
|
+
console.log(` ${red("✖")} ${message}`);
|
|
26
|
+
}
|
|
27
|
+
// Kept as promptYesNo (rather than renaming every call site to `confirm`) since `beam uninstall`
|
|
28
|
+
// also imports it by this name for its own "Proceed?" prompt.
|
|
29
|
+
export const promptYesNo = confirm;
|
|
30
|
+
// Colors a summary-table status value by what it means, so the table communicates state at a
|
|
31
|
+
// glance instead of reading as one flat block of text.
|
|
32
|
+
function statusValue(value) {
|
|
33
|
+
if (value.startsWith("failed"))
|
|
34
|
+
return red(value);
|
|
35
|
+
if (value === "none" || value === "not connected" || value === "not started" || value === "skipped")
|
|
36
|
+
return dim(value);
|
|
37
|
+
return green(value);
|
|
33
38
|
}
|
|
34
39
|
// One-shot onboarding for a machine that already has `beam` installed: wires beam's hook into
|
|
35
40
|
// whichever detected agents the user picks, connects the device if it isn't already, and
|
|
@@ -40,7 +45,7 @@ export async function promptYesNo(question, defaultYes = true) {
|
|
|
40
45
|
export async function runSetup() {
|
|
41
46
|
// Owl says hello, but only the first time this machine is ever set up.
|
|
42
47
|
await showFirstRunWelcome();
|
|
43
|
-
console.log("Setting up Beam — 4 quick steps
|
|
48
|
+
console.log(indigoOut("Setting up Beam") + dim(" — 4 quick steps"));
|
|
44
49
|
const agentRows = [];
|
|
45
50
|
let dashboardStatus = "not connected";
|
|
46
51
|
let serviceStatus = "not started";
|
|
@@ -51,11 +56,11 @@ export async function runSetup() {
|
|
|
51
56
|
const installable = detected.filter(a => a.hookConfigPath && a.mergeHookConfig);
|
|
52
57
|
const unsupported = detected.filter(a => !a.hookConfigPath || !a.mergeHookConfig);
|
|
53
58
|
if (!detected.length) {
|
|
54
|
-
|
|
59
|
+
skip("No supported agents detected on this machine.");
|
|
55
60
|
}
|
|
56
61
|
else {
|
|
57
62
|
for (const a of unsupported)
|
|
58
|
-
|
|
63
|
+
skip(`${a.name}: hook install isn't built for it yet`);
|
|
59
64
|
}
|
|
60
65
|
if (installable.length) {
|
|
61
66
|
const picked = await checkbox(` Found ${installable.length} agent${installable.length === 1 ? "" : "s"} — pick which get beam's hook:`, installable.map(a => ({ label: a.name, checked: true })));
|
|
@@ -71,7 +76,7 @@ export async function runSetup() {
|
|
|
71
76
|
}
|
|
72
77
|
const skipped = installable.filter(a => !toInstall.includes(a));
|
|
73
78
|
for (const a of skipped)
|
|
74
|
-
|
|
79
|
+
skip(`Skipped ${a.name} (run 'beam agent install ${a.id}' later if you change your mind)`);
|
|
75
80
|
}
|
|
76
81
|
// Shims are never installed automatically -- writing into PATH resolution is a bigger footprint
|
|
77
82
|
// than a hook install, and this session has no way to also edit the user's shell rc for them.
|
|
@@ -81,34 +86,44 @@ export async function runSetup() {
|
|
|
81
86
|
console.log(`\n Tip: to sandbox ${shimmable.map(a => a.name).join(", ")} automatically (no need to type 'beam run'), run:`);
|
|
82
87
|
console.log(` beam shims install ${shimmable.map(a => a.id).join(" ")}`);
|
|
83
88
|
}
|
|
89
|
+
const mcpResults = await installMcpProxies();
|
|
90
|
+
void forwardMcpInventory(mcpResults.flatMap(result => result.servers));
|
|
91
|
+
const mcpWrapped = mcpResults.reduce((total, result) => total + result.wrapped, 0);
|
|
92
|
+
const mcpErrors = mcpResults.filter(result => result.error);
|
|
93
|
+
if (mcpWrapped)
|
|
94
|
+
ok(`Protected ${mcpWrapped} MCP server${mcpWrapped === 1 ? "" : "s"} with the local response proxy.`);
|
|
95
|
+
for (const result of mcpErrors)
|
|
96
|
+
fail(`Could not update MCP config ${result.path}: ${result.error}`);
|
|
84
97
|
// --- Step 2: connect this device to the dashboard (dashboard-v1, or BEAM_DASHBOARD_URL) ---
|
|
85
98
|
step(2, "Connecting to your Beam dashboard");
|
|
86
99
|
let identity = await readIdentity();
|
|
100
|
+
let shouldConnect = !identity;
|
|
87
101
|
if (identity) {
|
|
88
|
-
|
|
102
|
+
ok(`Already connected as device ${identity.deviceId}.`);
|
|
89
103
|
dashboardStatus = `connected (${identity.deviceId})`;
|
|
104
|
+
shouldConnect = await promptYesNo(" Reconnect or link to a different workspace?", false);
|
|
90
105
|
}
|
|
91
106
|
else {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
107
|
+
shouldConnect = await promptYesNo(" Connect this device to your Beam dashboard now?");
|
|
108
|
+
}
|
|
109
|
+
if (shouldConnect) {
|
|
110
|
+
// Mirrors 'beam connect': always opens the browser and overwrites any existing identity,
|
|
111
|
+
// so re-running setup can also be used to re-pair or switch workspaces.
|
|
112
|
+
const session = await startConnect();
|
|
113
|
+
openBrowser(session.url);
|
|
114
|
+
console.log(` ${dim("Didn't open? Visit:")} ${cyan(session.url)}`);
|
|
115
|
+
identity = await withSpinner("Waiting for you to finish in the browser", () => session.poll());
|
|
116
|
+
ok(`Connected device ${identity.deviceId} (org ${identity.orgId})`);
|
|
117
|
+
dashboardStatus = `connected (${identity.deviceId})`;
|
|
118
|
+
const enterprise = await withSpinner("Checking for beam-enterprise", () => installEnterprisePackage(identity));
|
|
119
|
+
if (enterprise.status === "installed")
|
|
120
|
+
ok("beam-enterprise installed (OS-level monitoring enabled).");
|
|
121
|
+
else if (enterprise.status === "error")
|
|
122
|
+
fail(`Could not install beam-enterprise: ${enterprise.message}`);
|
|
123
|
+
// "not-entitled": org isn't on the enterprise plan -- nothing to print, this is the normal case.
|
|
124
|
+
}
|
|
125
|
+
else if (!identity) {
|
|
126
|
+
skip("Skipped. Run 'beam connect' whenever you're ready.");
|
|
112
127
|
}
|
|
113
128
|
// --- Step 3: fetch this device's effective policy (org + any user-level override), if enrolled ---
|
|
114
129
|
// A device can be enrolled from a previous `beam setup`/`beam enroll` run without this run ever
|
|
@@ -146,23 +161,27 @@ export async function runSetup() {
|
|
|
146
161
|
}
|
|
147
162
|
}
|
|
148
163
|
else {
|
|
149
|
-
|
|
164
|
+
skip("Skipped. Run 'beam service install' (background) or 'beam start' (foreground) whenever you want it running.");
|
|
150
165
|
serviceStatus = "skipped";
|
|
151
166
|
}
|
|
152
167
|
// --- Step 5: summary ---
|
|
153
168
|
step(5, "Done");
|
|
154
169
|
console.log();
|
|
170
|
+
const agentSummary = agentRows.length
|
|
171
|
+
? `${agentRows.length} installed (${agentRows.join(", ")})`
|
|
172
|
+
: "none";
|
|
173
|
+
const agentSummaryColor = agentRows.some(r => r.includes("failed")) ? red : statusValue;
|
|
155
174
|
console.log(renderTable([
|
|
156
|
-
{ label: "Agent hooks", value:
|
|
157
|
-
{ label: "Dashboard", value: dashboardStatus },
|
|
158
|
-
{ label: "Policy", value: policyStatus },
|
|
159
|
-
{ label: "Service", value: serviceStatus },
|
|
175
|
+
{ label: "Agent hooks", value: agentSummaryColor(agentSummary) },
|
|
176
|
+
{ label: "Dashboard", value: statusValue(dashboardStatus) },
|
|
177
|
+
{ label: "Policy", value: statusValue(policyStatus) },
|
|
178
|
+
{ label: "Service", value: statusValue(serviceStatus) },
|
|
160
179
|
]));
|
|
161
|
-
console.log("
|
|
162
|
-
console.log("
|
|
163
|
-
console.log("
|
|
164
|
-
console.log("
|
|
180
|
+
console.log(`\n${dim("Useful next commands:")}`);
|
|
181
|
+
console.log(` ${cyan("beam studio")} open the activity dashboard`);
|
|
182
|
+
console.log(` ${cyan("beam service status")} check whether the collector is running`);
|
|
183
|
+
console.log(` ${cyan("beam agent list")} check hook status per agent`);
|
|
165
184
|
if (shimmable.length)
|
|
166
|
-
console.log(` beam shims install ${shimmable.map(a => a.id).join(" ")} sandbox ${shimmable.map(a => a.name).join(", ")} automatically`);
|
|
185
|
+
console.log(` ${cyan(`beam shims install ${shimmable.map(a => a.id).join(" ")}`)} sandbox ${shimmable.map(a => a.name).join(", ")} automatically`);
|
|
167
186
|
}
|
|
168
187
|
//# sourceMappingURL=setup.js.map
|
package/dist/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/studio.js
CHANGED
|
@@ -272,7 +272,8 @@ tr.row:hover { background:#0e1013; cursor:pointer; }
|
|
|
272
272
|
var reviewCell = (e.findings && e.findings.length)
|
|
273
273
|
? '<button class="btn secondary" data-review="' + e.id + '" style="padding:4px 10px;font-size:12px">' + (state.reviews[e.id] ? "✓ Reviewed" : "Mark reviewed") + "</button>"
|
|
274
274
|
: '<span class="muted">—</span>';
|
|
275
|
-
|
|
275
|
+
var context = e.mcp ? "MCP: " + e.mcp.server + (e.mcp.tool ? " · " + e.mcp.tool : e.mcp.resource ? " · " + e.mcp.resource : "") : escapeHtml(e.type) + " · " + escapeHtml(e.session);
|
|
276
|
+
return '<tr class="row" data-id="' + e.id + '"><td class="mono">' + timeOf(e.timestamp) + "</td><td><strong>" + escapeHtml(e.summary).slice(0, 140) + '</strong><br><small class="muted">' + escapeHtml(context) + "</small></td><td>" + escapeHtml(e.agent) + '</td><td><span class="badge ' + r + '">' + (r === "info" ? "no flags" : r) + "</span></td><td>" + reviewCell + "</td></tr>";
|
|
276
277
|
}).join("");
|
|
277
278
|
var bodyId = activeTab === "findings" ? "findingRows" : "eventRows";
|
|
278
279
|
var emptyId = activeTab === "findings" ? "findingsEmpty" : "eventsEmpty";
|
|
@@ -302,7 +303,8 @@ tr.row:hover { background:#0e1013; cursor:pointer; }
|
|
|
302
303
|
return '<div class="finding"><span class="badge ' + f.severity + '">' + f.severity + "</span><h3>" + escapeHtml(f.title) + '</h3><p class="muted">' + escapeHtml(f.explanation) + "</p><pre>" + escapeHtml(f.evidence) + "</pre></div>";
|
|
303
304
|
}).join("") || '<p class="muted">No configured rule matched. This does not establish that an action is safe.</p>';
|
|
304
305
|
root.innerHTML = '<div class="drawer-backdrop"><section class="drawer"><button class="close">×</button><h2>Action detail</h2><span class="badge ' + risk(event) + '">' + risk(event) + '</span><pre style="white-space:pre-wrap;background:#0e1013;padding:10px;border-radius:6px;margin-top:10px">' + escapeHtml(event.summary) + '</pre><dl>' +
|
|
305
|
-
[["Agent", event.agent], ["Session", event.session], ["Time", new Date(event.timestamp).toLocaleString()], ["Source", event.source], ["Status", event.phase], ["Project", event.project || "Not supplied"], ["Endpoint", event.endpoint], ["Model", event.model || "Not supplied"]]
|
|
306
|
+
[["Agent", event.agent], ["MCP server", event.mcp && event.mcp.server], ["MCP tool", event.mcp && event.mcp.tool], ["MCP resource", event.mcp && event.mcp.resource], ["Session", event.session], ["Time", new Date(event.timestamp).toLocaleString()], ["Source", event.source], ["Status", event.phase], ["Project", event.project || "Not supplied"], ["Endpoint", event.endpoint], ["Model", event.model || "Not supplied"]]
|
|
307
|
+
.filter(function (kv) { return kv[1]; })
|
|
306
308
|
.map(function (kv) { return "<dt>" + kv[0] + "</dt><dd>" + escapeHtml(kv[1]) + "</dd>"; }).join("") +
|
|
307
309
|
"</dl>" + findings + "</section></div>";
|
|
308
310
|
root.querySelector(".close").addEventListener("click", function () { root.innerHTML = ""; });
|
package/dist/studio.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"studio.js","sourceRoot":"","sources":["../src/studio.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,6FAA6F;AAC7F,+FAA+F;AAC/F,MAAM,UAAU,UAAU;IACxB,OAAO
|
|
1
|
+
{"version":3,"file":"studio.js","sourceRoot":"","sources":["../src/studio.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,6FAA6F;AAC7F,+FAA+F;AAC/F,MAAM,UAAU,UAAU;IACxB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4UR,CAAC;AACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-beam/beam",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"description": "Local-first observation and heuristic risk scanning for AI coding agents (Claude Code, Codex, Cursor, Copilot CLI, Gemini). Redacts secrets, flags risky tool calls, scans skills and MCP configs offline.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai agent security",
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"test:watch": "node --no-warnings --experimental-vm-modules node_modules/jest/bin/jest.js --watch",
|
|
47
47
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
48
48
|
"prepublishOnly": "npm run validate:skills && npm run typecheck && npm test && npm run build",
|
|
49
|
+
"setup": "npm run build && node dist/cli.js setup",
|
|
49
50
|
"setup:global": "bash scripts/setup-global.sh",
|
|
50
51
|
"validate:skills": "node Skills/scripts/validate-skills.mjs"
|
|
51
52
|
},
|