dumbtv
dumbtv가 ADB로 Fire TV에서 광고·추적·업데이트 알림을 제거, 루트·앱 변경 없이, 무료 오픈소스
에이전트 활동을 관찰하고 위험 행동을 포착해 AI 접근과 실행을 제어합니다
Observe agent activity, catch risky actions, and stay in control of what your AI can access and execute. Local-first AI agent security: runtime monitoring, MCP config scanning, and audit-ready evidenc
보안TypeScript · PythonGitHub @whyashthakker온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
Monitoring & Safety layer for all your agents. Open Source CLI & Skills for Claude Code, Codex, Cursor and your preferred agents.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
AgentBeam is a local security layer for AI agents. beam is the AgentBeam CLI. It installs hooks for the agents detected on your machine, captures agent and MCP activity, applies your AgentBeam policy locally, and sends approved telemetry to the AgentBeam dashboard.
beam setup is the main command. It detects supported agents, installs their native AgentBeam hooks, inventories configured MCP servers, connects the device to the dashboard, downloads organization and user policy, and starts the persistent background service.README 전문 보기 ↗AgentBeam is a local security layer for AI agents. beam is the AgentBeam CLI. It installs hooks for the agents detected on your machine, captures agent and MCP activity, applies your AgentBeam policy locally, and sends approved telemetry to the AgentBeam dashboard.
Full documentation, guides and cookbooks: docs.agentbeam.com. This README is a quick reference; the docs explain each feature in depth, and every page there can be handed to your coding agent.
WipeBench gives coding agents an objective, captures the commands they choose, and evaluates task completion and harmful effects in Docker. A benchmark by AgentBeam, in collaboration with ExplainX.ai.
The local snapshot includes 112 scored scenarios across 12 categories and a no-key smoke test:
python3 safety-bench/bench.py selftest --scenarios smoke-hello
Requires Python 3.11+ and a running Docker daemon. Scripted self-tests validate the harness; they are not model rankings. The benchmark snapshot uses its own Apache-2.0 license. See the benchmark page for scope and usage.
npm i @agent-beam/beam -g
beam setup
beam setup is the main command. It detects supported agents, installs their native AgentBeam hooks, inventories configured MCP servers, connects the device to the dashboard, downloads organization and user policy, and starts the persistent background service.
After setup, selected agents are protected automatically. You do not need to run beam run or manually start a collector.
npx @agent-beam/beam add skill agentbeam-setup -g --all-agents
That installs the AgentBeam setup skill for Claude Code, Codex, Cursor, Gemini CLI, OpenCode and GitHub Copilot CLI. Then ask your agent to "set up AgentBeam". It installs the CLI, hands you beam setup for the parts that need a browser sign-in, and checks that everything is running.
beam setup # install or repair AgentBeam and agent protection
beam service status # check the background service
beam agent list # see supported agents and hook status
beam studio # open the local activity dashboard
beam sync # fetch the latest organization policy
beam monitor --file <log> # watch a running app's logs and traffic (see App monitoring)
beam monitor configure # save what to watch and which LLM key to use; shows where each setting comes from
beam monitor pause <ip> # pause an attacker for this app (the SDK answers it with a 429); also unpause, paused
beam cve check . # check an app's dependencies for known vulnerabilities
beam add package express # scan an npm package and its dependencies, then install it if it passes
beam packages scan . # scan everything already in node_modules and .venv for malware
beam share ./my-skill # share a skill, CLAUDE.md or slash command with your team (see Team library)
Run beam setup again when adding an agent or repairing an installation. It preserves existing agent configuration.
Updates. Like Claude Code, Beam keeps itself current. At most once a day, an interactive beam command checks for a new release and installs it in the background, so the command you ran never waits. The next command tells you it's done and what to restart.
beam run, beam monitor, CI or non-interactive shells, and never asks for sudo. If the install needs elevated rights, it tells you to run beam update.beam update --auto off, or fleet-wide with BEAM_DISABLE_AUTOUPDATE=1 (for example through MDM).Depending on organization policy, AgentBeam can ask for approval, block, redact, or log:
.env filesMCP responses can be filtered locally before sensitive content reaches an agent. MCP inventory and activity are reported to the dashboard so administrators can review or block a server for one user or the entire organization.
AgentBeam is not Claude-specific. Setup discovers the agents actually installed on the machine and installs the appropriate native hook for each selected agent.
| Agent | Hook support |
|---|---|
| Claude Code | Pre-tool protection and activity capture |
| Codex | Pre-tool protection and activity capture |
| Gemini CLI | Before-tool protection and activity capture |
| GitHub Copilot CLI | Pre-tool protection and activity capture |
| Cursor | Pre-tool protection and activity capture |
| Hermes Agent | Pre-tool shell hook in ~/.hermes/config.yaml; asks for approval on first use |
| OpenClaw | before_tool_call plugin, registered with openclaw plugins install --link |
| OpenCode | Shim-based protection where supported |
| Jev (TypeSafe AI) | Discovery only — config/artifact presence; ecosystem is too fragmented across third-party CLIs (jev-cli, jev-axi, jev-guard) for a single hook contract yet |
Agent configuration is updated non-destructively, without replacing existing hooks.
Use TypeSafe Jev to review proposed actions with Noul (two independent risk questions), Score (a damage rubric), or both. This is separate from discovery of third-party Jev CLIs in the agent table above. The integration is disabled by default; enabling it sends selected, redacted action data to TypeSafe's remote API and can incur charges.
Supply TYPESAFE_API_KEY through your shell or secret manager, then run:
beam jev configure --mode observe --primitive both
beam jev status
For persistent hooks that do not inherit your shell environment, pipe a key from your secret manager to beam jev configure --key-stdin. Keys are stored in ~/.beam/jev.json (or BEAM_HOME/jev.json) with mode 0600. Never pass a key as a command argument. The environment key takes precedence over a stored key. Run configuration directly as the operator; Beam's self-protection blocks agents from changing these settings.
For an explicit check, create action.json:
{
"action": { "tool": "Bash", "command": "git diff --stat" },
"context": "Inspect workspace changes without modifying files."
}
beam jev judge action.json --dry-run # inspect redacted request locally; no API call
beam jev judge action.json # JSON result; 0 allow, 2 review/deny, 1 error
beam jev configure --mode enforce --primitive both
beam jev disable # stop checks and remove stored key
configure enables checks in existing pre-tool hooks; it does not install them. Observation prints judgments to stderr and preserves local policy. Enforcement blocks an eligible action on review, deny, or an evaluation error. Local deny, approval and redaction decisions take precedence and skip Jev. Prompt/post-tool events and offline beam scan skip Jev. The explicit judge command reports its own verdict regardless of hook mode; it never executes the action.
| Check | Pass | Deny | Review |
|---|---|---|---|
| Noul: data exposure and irreversible destruction | Both ≤ 0.2 | Either ≥ 0.8 | Otherwise |
| Score: four damage levels (0–3) | Score ≤ 0.5 and confidence ≥ 0.7 | Score ≥ 2 | Otherwise |
| Both | All checks pass | Any check denies | Any remaining uncertainty |
These initial thresholds are conservative defaults, not measured safety guarantees. Noul has no separate confidence. Score includes its distribution and confidence. A malformed config reports an error and skips the optional check, preserving local policy; repair it to restore Jev coverage. Requests use a fixed HTTPS endpoint, a two-second timeout, no automatic retries, a 32 KB input limit and a 64 KB response limit.
Hook requests include only agent, tool, tool input and command, with known credential patterns, sensitive field names and policy custom detectors redacted first. Tool arguments can still contain private source or data; redaction cannot guarantee removal of every secret. Hooks do not load transcripts, referenced file contents, the user's task or environment into Jev state. An explicit file may include a short context string. Hook enforcement depends on the installed client's support and does not cover uninstrumented actions or every MCP transport. disable does not revoke the provider key or unset external environment variables.
Use the bundled Jev action judging skill, read the Beam walkthrough, or explore the Awesome Jev use-case collection. API semantics: Noul, Score, HTTP reference.
beam judge works like Jev but with a model you choose. It's disabled by default. Pick one provider:
llm: any model behind an OpenAI-compatible chat completions endpoint, such as OpenAI, OpenRouter, a LiteLLM gateway, or a local Ollama or vLLM server. Beam asks it for an allow, review or deny verdict on the action.http: your own decision service: an internal policy engine, a classifier, or a fine-tuned model behind an API.# General LLM. On OpenAI the default model is gpt-4.1-nano; key from your secret manager
op read op://vault/openai/key | beam judge configure --provider llm --key-stdin
# A local model: no key, nothing leaves the machine
beam judge configure --provider llm --url http://localhost:11434/v1 --model llama3.2
# Your own decision service, enforcing
beam judge configure --provider http --url https://decide.internal.example/v1/check --mode enforce
beam judge status
beam judge check action.json --dry-run # print the redacted request; nothing is sent
beam judge check action.json # 0 allow, 2 review/deny, 1 error
beam judge disable # stop checks and remove the stored key
A decision service receives POST {"version":1,"action":{"agent","tool","input","command"},"context"?} and must answer {"verdict":"allow"|"review"|"deny","reason":"..."}. A decision field is accepted in place of verdict. The key, if any, comes from BEAM_JUDGE_API_KEY or is stored in ~/.beam/judge.json (mode 0600), and is sent as Authorization: Bearer.
The safety rules match Jev's:
--mode enforce blocks an action, on review, deny or an error.review. Anything unreadable counts as an error, never as allow.--timeout-ms, from 500 to 15000).beam judge configure or beam judge disable.Jev and beam judge can run together. Each adds its own wait to every eligible tool call.
beam monitor watches a running application rather than an AI agent. It follows the app's log files and HTTP access logs around the clock and alerts on activity that looks like an attack or a compromise. beam cve check checks the app's dependencies for known vulnerabilities.
Both need a connected workspace, and both stay off until a workspace owner or admin turns on App monitoring in the dashboard. Until then, beam monitor waits and captures nothing.
export BEAM_APP_TOKEN=beam_app_... # the app's token, from the dashboard (App monitoring > Settings, apps and alerts)
beam monitor --file /var/log/nginx/access.log --file /var/log/app/app.log
beam monitor --llm openai --file /var/log/app/app.log # review flagged lines with your own OPENAI_API_KEY
beam monitor configure --file /var/log/app/app.log --llm openai # save it; then a plain 'beam monitor' runs it
beam monitor --file /var/log/app/app.log --app /srv/app # also check dependencies at start and daily
node server.js 2>&1 | beam monitor --stdin # or read piped output
beam monitor test # send one test finding to prove the setup
beam monitor status # app, on or off, level, LLM in use, usage, and where each setting came from
beam cve check . # one-off check; exits 2 when anything is found
beam cve check . --fail-on high --json # in CI: fail only on high and critical
Apps and tokens. Add each app (bgremover, explainx, ...) in the dashboard under App monitoring > Settings, apps and alerts to get its own token, shown once. With BEAM_APP_TOKEN set, beam monitor and beam cve check report as that app, and its findings, filters and webhook routing stay separate from your other apps. A laptop connected with beam connect works without a token. Tokens are least-privilege:
Run it under whatever keeps your app running: a systemd unit, a sidecar container that shares the log volume, or pm2.
Inside a Node.js or Next.js app (SDK). Where the app doesn't write request logs (for example next start behind a platform proxy), monitor in-process instead. Detection runs in your app with the same rules, and only redacted findings leave it, sent in the background with BEAM_APP_TOKEN.
// middleware.ts (Next.js); npm i @agent-beam/beam
import { NextResponse, type NextFetchEvent, type NextRequest } from "next/server";
import { createAppMonitor } from "@agent-beam/beam/monitor";
const beam = createAppMonitor(); // reads BEAM_APP_TOKEN
export function middleware(request: NextRequest, event: NextFetchEvent) {
const verdict = beam.request({
method: request.method,
url: request.nextUrl.pathname + request.nextUrl.search,
ip: request.headers.get("x-forwarded-for")?.split(",")[0]?.trim(),
userAgent: request.headers.get("user-agent"),
headers: request.headers, // host, country, Signature-Agent and browser-header presence (values never sent)
// cf: request.cf, // on Cloudflare Workers: verified bot, signed agent, bot score, JA4
});
event.waitUntil(beam.flush());
if (verdict.paused) return beam.pausedResponse(verdict); // a paused attacker: 429 + Retry-After
return NextResponse.next();
}
For Express, app.use(beam.middleware()) refuses paused senders and reports every other request after its response, with the status, so Beam knows what became of it. Or report yourself: app.use((req, res, next) => { res.on("finish", () => beam.request({ method: req.method, url: req.originalUrl, ip: req.ip, userAgent: req.get("user-agent"), status: res.statusCode })); next(); }). beam.log(line) checks application log lines too.
Only what might have worked is raised. With a response status (from the SDK's status, or the access logs beam monitor reads), an attack the app refused (3xx or 4xx) is folded into one low-severity roll-up per rule every few minutes: never alerted on, not counted against the monthly allowance, and shown in the dashboard's attack analytics. Middleware runs before the response, so there the SDK also rolls up attacks on software a JavaScript app can't run, like WordPress, PHP or Java paths; set proxiesOtherStacks: true if the app proxies such paths to another server.
Signs an attack is underway. (details) Besides single requests, Beam watches for patterns, with thresholds that follow the level:
| Signal | What it means | From |
|---|---|---|
| Scan found a live path | An address with a run of 4xx answers gets a 2xx on a real page | Access logs, request() with status |
| Server errors jumped | 5xx on one route far above its usual rate | Access logs, request() with status |
| Address walking the app | One address requests 100+ different paths in a minute | Access logs, request() |
| Sign-in after failures | A sign-in succeeds right after a run of failures (same address or user) | Access logs, log lines, event() |
| Admin granted, new API key | A role or admin grant, or a new key or token | Log lines, writes to role and key endpoints, event() |
| Unusual LLM spend | One user's tokens in an hour past a budget (tokensPerUserHour) | Logged usage fields, usage() |
| First call to a new host | The app calls a host it never has; the workspace learns the usual ones for a day first | watchOutbound: true, outbound() |
beam.event("login.failed", { user: user.id, ip }); // and "login.succeeded", "admin.granted", "apikey.created"
beam.usage({ user: user.id, tokens: res.usage.total_tokens, model });
const beam = createAppMonitor({ watchOutbound: true }); // notes the host of each fetch(); never the URL or body
Framework-aware. Tell Beam the app's framework (createAppMonitor({ stack: "nextjs" }), or beam monitor --stack django; --app detects it) and it adds that framework's rules, such as the Next.js middleware bypass, Laravel Ignition, Spring4Shell, exposed Spring actuators, Werkzeug consoles, Rails info pages, Go pprof and ASP.NET diagnostics. Attacks on frameworks the app doesn't run are rolled up instead of raised. Stacks: nextjs, express, nestjs, vite, node, django, flask, fastapi, rails, laravel, php, wordpress, spring, java, go, dotnet, static. Per-framework cookbooks: docs.agentbeam.com/cookbooks/overview.
LLM features (prompt injection and friends). If the app sends text to a model, check it on the way in and out with the same beam instance. Both calls run locally in microseconds and return what they found, so the app decides what to do. Beam itself still never blocks anything; prompt(text, { user }) also returns paused: true for a sender paused from LLM routes.
const beam = createAppMonitor({ canaries: [process.env.PROMPT_CANARY!] }); // a random string in your system prompt
const check = beam.prompt(message, { user: userId }); // also: retrieved docs, web pages, tool results
if (check.severity === "high" || check.severity === "critical") return refuse(check.matches);
const reply = await callModel(message);
if (beam.output(reply).flagged) { /* render as plain text, or don't hand it to tools */ }
prompt() flags requests for the app's API keys, tokens or environment, instruction overrides, instructions hidden in invisible Unicode tag characters or base64, forged chat-template and system markers (<|im_start|>, [INST], <system>), jailbreak personas, system prompt and data extraction, and one sender flooding the model ("denial of wallet"). Full-width letters and zero-width characters are folded first, and long retrieved documents are read in overlapping windows.output() flags zero-click exfiltration (a markdown or HTML image whose URL carries data), credentials, script, injected instructions on their way to the next agent, and a leaked canary (critical).prompt() too, with a label: that's where indirect prompt injection comes from.checkPrompt(text) and checkOutput(text, { canaries }) run the same checks without a token and report nothing.createAppMonitor({ excerpts: false }) sends the rule and sender without the text.When you can't change the app or its container, the Beam monitor service for Railway streams its logs from Railway instead. It needs a Railway project token, which is broader than an app token.
Let your coding agent do it: npx @agent-beam/beam add skill agentbeam-app-monitoring -g --all-agents, then ask it to add AgentBeam monitoring to your app. It finds where the app runs, keeps the token out of the repository, and finishes with beam monitor test.
What leaves the machine. Log lines are matched on the server where beam monitor runs, and raw lines are never sent. A finding carries the rule, severity, file, a repeat count and a redacted excerpt of up to 600 characters. Redaction removes credentials, bearer tokens, URL userinfo, email addresses and your policy's custom detector matches. Query strings are kept, because in an access log the query is usually the attack. beam cve check sends package names and versions only.
What it never does. It doesn't block requests, change the app or sit in the request path. With --file it reads logs the way tail -F does and follows rotation and truncation. With --stdin it echoes every line to stdout, so the app's output still reaches its usual destination; use --no-echo to turn that off. Prefer --file in production so the app doesn't depend on Beam's pipe.
Noise control. Repeats fold into one finding per time window. Traffic is grouped by client address, so a scan from one IP becomes one alert with a count. Above 200 new findings in 10 minutes, the rest are summarized in a single finding.
False positives and rules. On the dashboard, Create rule on any finding (owners and admins) either ignores findings like it (dropped before they're stored, metered or alerted on) or keeps them on the dashboard without alerting. A rule matches the detection rule and an exact request path, a path prefix such as /blog/, or the rule anywhere, in one app or all of them. AgentBeam applies rules when findings arrive, so every CLI and SDK version follows them, including ones already deployed.
| Level (set in the dashboard) | Alerts on | Repeats fold for | Optional LLM check |
|---|---|---|---|
| Light | Critical | 60 minutes | Never |
| Standard | High and critical | 15 minutes | High-severity findings |
| Strict | Medium and above | 5 minutes | Every alert |
What it looks for:
printenv, cat .env, echo $STRIPE_SECRET_KEY), and a .env, .git/config or credentials file actually served with a 2xx. A probe that got a 404 is medium, because bots ask every site for /.env all day; an app that answers 200 to every path can trip the served-file rule.KEY_NAME=value secrets..env, .git and credential files, and repeated failed sign-ins from one address.--app or beam cve check. Advisories listed in CISA's Known Exploited Vulnerabilities catalog are raised to critical.The LLM check is hardened against being talked out of an alert. The lines it judges are written by attackers, and a "benign" verdict keeps a finding out of the webhooks. These layers make that hard, though not impossible:
Detection is heuristic. It will miss attacks it has no rule for, and some legitimate traffic will match. Use it alongside a web application firewall and regular patching, not instead of them.
Pausing attackers. (details) Beam can stop an attacker for a while instead of only telling you. A paused sender gets a 429 with Retry-After, only from the part of the app it went after:
| Caught doing | Paused from | First pause |
|---|---|---|
| Repeated failed sign-ins | Sign-in routes | 15 minutes |
| Flooding LLM routes, or LLM spend past the budget | LLM routes (the user, when you pass user) | 15 minutes |
| Walking the app's paths, or a scan that found a live path | The whole app | 1 hour |
| A critical exploit that wasn't refused | The whole app | 1 hour |
A repeat within a day pauses four times as long, up to 24 hours.
beam monitor pause apply in every mode, and Lift ends one.beam.middleware(), or beam.check({ ip, user, url }). With beam monitor, --deny-file writes the paused addresses for nginx (or --deny-format plain for anything else) and --reload runs after each change.X-Forwarded-For list; on Cloudflare, Vercel and Fly.io the platform's own header is read instead), private and loopback addresses, and the allowlist.beam monitor --file /var/log/nginx/access.log --deny-file /etc/nginx/beam/deny.conf --reload "nginx -s reload"
beam monitor pause 203.0.113.9 --for 2h --reason "credential stuffing" # also: --scope auth|llm, user:<id>, ranges
beam monitor paused
beam monitor unpause 203.0.113.9
Alerts. Findings appear on the dashboard's App monitoring and Risks pages and go to the webhooks a workspace admin adds there. Each webhook can be limited to critical, high and critical, or everything. Slack and Discord URLs get their native message format; any other URL gets JSON with a findings array. Every request is signed. To verify one:
import { createHmac, timingSafeEqual } from "node:crypto";
const expected = `sha256=${createHmac("sha256", webhookSecret).update(`${req.headers["x-beam-timestamp"]}.${rawBody}`).digest("hex")}`;
const signature = String(req.headers["x-beam-signature"] ?? "");
const valid = signature.length === expected.length && timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
LLM second opinion (optional). A model can review flagged lines before they alert. It sees only the redacted excerpt, and lines go in chunks of up to 10 per request, to a small model by default, to keep cost down. A "benign" verdict keeps the finding in the dashboard but out of the webhooks. If the model refuses or fails, the alert still goes out. Which findings are reviewed depends on the level (see the table above), and dependency findings are never sent.
You choose whose model runs:
Your own key, from the CLI. Pick a provider and beam monitor uses the key you already have for it. The key goes only to that provider and is never sent to Beam; findings arrive with the verdict attached, and these checks don't count toward the workspace's LLM allowance. A key in the environment is never used until you pick a provider.
--llm | Key read from | Default model |
|---|---|---|
openai | OPENAI_API_KEY | gpt-4.1-nano |
anthropic | ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN or an ant auth login profile | claude-opus-5-5 |
gemini | GEMINI_API_KEY or GOOGLE_API_KEY | set BEAM_LLM_MODEL |
groq | GROQ_API_KEY | openai/gpt-oss-20b |
openrouter | OPENROUTER_API_KEY | openai/gpt-4.1-nano |
mistral | MISTRAL_API_KEY | mistral-small-latest |
deepseek | DEEPSEEK_API_KEY | deepseek-chat |
xai | XAI_API_KEY | set BEAM_LLM_MODEL |
ollama | none | set BEAM_LLM_MODEL |
custom | BEAM_LLM_API_KEY | any OpenAI-compatible endpoint at BEAM_LLM_BASE_URL (LiteLLM, vLLM) |
beam monitor --llm openai --file /var/log/nginx/access.log # uses your OPENAI_API_KEY
BEAM_LLM_MODEL=claude-haiku-5-5 beam monitor --llm anthropic --stdin
beam monitor test --llm openai # also makes one LLM check to prove the key works
BEAM_LLM_PROVIDER, BEAM_LLM_MODEL, BEAM_LLM_BASE_URL and BEAM_LLM_API_KEY set the same things from the environment (or ~/.beam/.env). Anthropic is called through Anthropic's SDK with structured output; the rest through OpenAI-compatible chat completions. A key is never sent over plain HTTP to a public host.
beam monitor status shows which model is in use and where its key comes from, never the key itself.
Settings files. beam monitor reads layered settings, like git or npm config, so a plain beam monitor in a systemd unit or a container needs no flags. Lowest to highest:
| Layer | Where | Set by | Can hold a key |
|---|---|---|---|
| Managed | /etc/beam/monitor.json (macOS /Library/Application Support/Beam/, Windows %ProgramData%\Beam\) | IT, through MDM or config management | No: name the variable with llm.apiKeyEnv |
| User | ~/.beam/monitor.json (mode 0600), written by beam monitor configure | the person or service account | Yes (from --key-stdin); a warning if others can read the file |
| Project | beam.monitor.json where beam monitor starts, or --config <file> | the app team, committed with the app | No |
| Environment | BEAM_LLM_* | the deploy platform or secret store | Yes |
| Flags | --llm, --max-cpu, --file, --app | whoever runs it | n/a |
Each setting (files, app, maxCpuPercent, llm) comes whole from the highest layer that sets it. The managed file can lock settings with "locked": ["llm", "maxCpuPercent"]. Nothing below it, flags and environment variables included, can change a locked setting. For example, {"version": 1, "llm": {"provider": "beam"}, "locked": ["llm"]} keeps every server on the workspace's model, with no personal keys.
beam monitor configure --llm openai --file /var/log/nginx/access.log --app /srv/app # save to the user layer
beam monitor configure --llm anthropic --key-env TEAM_ANTHROPIC_KEY # read the key from another variable
beam monitor configure # effective settings, and which layer each came from
beam monitor configure --check # validate every layer; exits 1 on a problem (for CI)
The first monitor command after upgrading creates the user file, carrying over older BEAM_LLM_* settings. It records which variable holds a key, never the key's value. In the SDK, settings come from code and the environment (edge runtimes have no files): createAppMonitor({ llm: "openai" }) or BEAM_LLM_PROVIDER=openai reviews findings with the app's own key during flush(), and only the verdict reaches AgentBeam.
Built to stay out of your app's way.
--max-cpu percent of one core (default 25 for beam monitor) and, in the SDK, maxCpuPercent (default 2, plus as much again for prompt() and output()). Past it, lines are skipped and counted until the next minute; prompt() and output() return skipped: true so your app decides.beam monitor after 3 million lines, and no growth in the SDK over a million requests with AgentBeam down.--stdin, your app's output passes straight through with normal backpressure. Detection works from a bounded backlog and skips lines rather than slowing the pipe.Each release runs a stress test of all of this (npm run stress) and publishes the report with the release, at agentbeam.com/releases. A release that breaks a limit isn't published.
Dependency checks read package-lock.json, npm-shrinkwrap.json, yarn.lock, pnpm-lock.yaml, bun.lock, requirements*.txt (pinned == lines), poetry.lock, uv.lock, Pipfile.lock, go.mod, Cargo.lock, composer.lock, Gemfile.lock, NuGet packages.lock.json, gradle.lockfile, mix.lock, Package.resolved and GitHub Actions workflow files. The search goes four directory levels deep and skips node_modules, vendor and virtual environments. Manifests without pinned versions, such as package.json ranges or pom.xml, are not checked.
Usage. Findings, dependency checks and LLM checks count toward the workspace's monthly App monitoring allowance, shown in beam monitor status and in the dashboard. When the allowance runs out, capture pauses until the reset date. The app itself is never affected.
beam add package scans npm and PyPI packages before they're installed, the way beam add skill does for skills. It's useful when an AI agent wants to install a package it named itself.
beam add package zod # scan zod and every dependency, then install the scanned version
beam add package requests==2.32.3 --pip # PyPI, installed with pip
beam add package some-cli -g --scan-only # report only, install nothing
beam packages scan . # scan node_modules (npm, yarn, pnpm, bun) and .venv/venv/env
--ignore-scripts. Python packages are fetched as wheels only, because building a source distribution would run its setup.py. When a package ships source only, its sdist comes straight from PyPI, its hash is checked, and it's unpacked without being built.eval(Buffer.from(...)), exec(base64.b64decode(...))), obfuscated code, credential and wallet file access, .pth startup hooks, dependencies from outside the registry, and names one typo away from a popular package. A typo name on a package first published in the last 30 days is blocked.beam connect (or with BEAM_APP_TOKEN set), every package in the tree is checked against the same database as beam cve check. Only names and versions are sent. Critical advisories and actively exploited ones (CISA KEV) count as critical.--force installs anyway). Other findings are shown as warnings. If the package passes, Beam installs the exact version it scanned with your project's own package manager (npm, pnpm, yarn or bun, detected from the lockfile).beam share shares a skill, a CLAUDE.md / AGENTS.md / GEMINI.md, a slash command, a subagent or a Cursor rule with everyone in your workspace. Teammates install it with one command. It needs a device connected with beam setup. The same library is in the dashboard under Team library, where you can also share from the browser.
beam share ./.claude/skills/release-checklist # share a skill folder (the kind is detected from the path)
beam share ./CLAUDE.md --name "Backend conventions" # share project instructions
beam share ./.claude/commands/review.md -m "Covers migrations" # publish a new version with a note
beam share list # what your team has shared
beam share install release-checklist # install the newest approved version
beam share install release-checklist@3 --all-agents # a specific version, for every supported agent
beam share update # bring installed shares up to date
beam share delete release-checklist # unshare something you shared
node_modules, symlinks and non-text files are left out, and each one left out is listed. Limits: 100 files, 128 KB per file, 512 KB per share.--force, which keeps a backup beside it.After enrollment, the AgentBeam dashboard shows agent activity, policy decisions, MCP inventory, users, installations, model usage, token counts, violations, blocked actions, and sensitive-data findings. Administrators can block MCP usage for an entire organization or an individual user.
AgentBeam's hook and policy decision run locally, so actions can be blocked even when the collector or dashboard is unavailable. Optional Jev judgments use the remote TypeSafe API, and optional beam judge checks use the model or service you configure; local policy remains independent. Telemetry is redacted before storage or forwarding. The local service binds to loopback, and AgentBeam files are protected from modification or removal by agent hooks.
npm test
npm run typecheck
npm run build
Bump version in package.json and push to main. The Release workflow then:
vX.Y.Z tag and a GitHub Release with generated notes.npm publish yourself.A version that's already tagged is skipped. agentbeam.com's changelog and install scripts read these GitHub Releases, so the site follows within the hour.
To turn on automatic npm publishing:
whyashthakker/beam-cli, workflow release.yml.NPM_TRUSTED_PUBLISHING to true.AGPL-3.0-only — see LICENSE.
Beam's model, from the dashboard. With no provider chosen (or --llm beam), a workspace admin can turn on LLM checks on the App monitoring page. Beam reviews the findings after they arrive, and those reviews count toward the workspace's monthly LLM allowance.