RepoPilotOpen in app →

rivet-dev/agent-os

A portable open-source operating system for agents. ~6 ms coldstarts, 32x cheaper than sandboxes. Powered by WebAssembly and V8 isolates.

Healthy

Healthy across all four use cases

weakest axis
Use as dependencyHealthy

Permissive license, no critical CVEs, actively maintained — safe to depend on.

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • Last commit 1w ago
  • Apache-2.0 licensed
  • CI configured
Show all 5 evidence items →
  • Tests present
  • Solo or near-solo (1 contributor active in recent commits)

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Healthy" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Healthy
[![RepoPilot: Healthy](https://repopilot.app/api/badge/rivet-dev/agent-os)](https://repopilot.app/r/rivet-dev/agent-os)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/rivet-dev/agent-os on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: rivet-dev/agent-os

Generated by RepoPilot · 2026-05-09 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/rivet-dev/agent-os shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

GO — Healthy across all four use cases

  • Last commit 1w ago
  • Apache-2.0 licensed
  • CI configured
  • Tests present
  • ⚠ Solo or near-solo (1 contributor active in recent commits)

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live rivet-dev/agent-os repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/rivet-dev/agent-os.

What it runs against: a local clone of rivet-dev/agent-os — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in rivet-dev/agent-os | Confirms the artifact applies here, not a fork | | 2 | License is still Apache-2.0 | Catches relicense before you depend on it | | 3 | Default branch main exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 39 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>rivet-dev/agent-os</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of rivet-dev/agent-os. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/rivet-dev/agent-os.git
#   cd agent-os
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of rivet-dev/agent-os and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "rivet-dev/agent-os(\\.git)?\\b" \\
  && ok "origin remote is rivet-dev/agent-os" \\
  || miss "origin remote is not rivet-dev/agent-os (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
  && ok "license is Apache-2.0" \\
  || miss "license drift — was Apache-2.0 at generation time"

# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
  && ok "default branch main exists" \\
  || miss "default branch main no longer exists"

# 4. Critical files exist
test -f ".agent/recovery/secure-exec/nodejs/src/index.ts" \\
  && ok ".agent/recovery/secure-exec/nodejs/src/index.ts" \\
  || miss "missing critical file: .agent/recovery/secure-exec/nodejs/src/index.ts"
test -f ".agent/recovery/secure-exec/kernel/kernel.ts" \\
  && ok ".agent/recovery/secure-exec/kernel/kernel.ts" \\
  || miss "missing critical file: .agent/recovery/secure-exec/kernel/kernel.ts"
test -f ".agent/recovery/secure-exec/nodejs/src/bridge-setup.ts" \\
  && ok ".agent/recovery/secure-exec/nodejs/src/bridge-setup.ts" \\
  || miss "missing critical file: .agent/recovery/secure-exec/nodejs/src/bridge-setup.ts"
test -f ".agent/recovery/secure-exec/nodejs/src/isolate-bootstrap.ts" \\
  && ok ".agent/recovery/secure-exec/nodejs/src/isolate-bootstrap.ts" \\
  || miss "missing critical file: .agent/recovery/secure-exec/nodejs/src/isolate-bootstrap.ts"
test -f ".agent/recovery/secure-exec/kernel/vfs.ts" \\
  && ok ".agent/recovery/secure-exec/kernel/vfs.ts" \\
  || miss "missing critical file: .agent/recovery/secure-exec/kernel/vfs.ts"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 39 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~9d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/rivet-dev/agent-os"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

agentOS is a lightweight, in-process virtual machine powered by WebAssembly and V8 isolates that runs AI agents with ~6ms cold starts and 32x lower cost than traditional sandboxes. It provides granular permission-based security (filesystem, network, process) while embedding agents directly into backend services via host tools, eliminating network hops and complex authentication. Monorepo with core Rust runtime (src/ likely contains kernel), TypeScript SDK layers in .agent/recovery/secure-exec/nodejs/src/ (bridge handlers, isolate bootstrap, module resolver), and build system using TypeScript + Node.js scripts. Package exports define internal boundaries: bridge-loader (V8 bridge), polyfills (Node.js compatibility), execution-driver (process control), module-resolver (import handling).

👥Who it's for

Backend engineers and AI product teams deploying Claude Code, Anthropic, and other agent frameworks who need fast, cheap, secure agent execution without spinning up VMs or containers. Developers using Rivet Cloud or self-hosting agent infrastructure.

🌱Maturity & risk

Actively developed with strong architectural foundation (7.3MB Rust core, 3.6MB TypeScript runtime). Has comprehensive kernel layer in .agent/recovery/secure-exec/kernel/ with device backends, VFS, process tables, and permission systems. Multiple supporting packages (@rivet-dev/agent-os, agent-os-common, agent-os-pi) indicate maturity, but language mix (mostly Rust + TypeScript) and 'coming soon' features suggest feature-complete but expanding product.

High complexity in V8 isolate bridging and WebAssembly integration (7.3MB Rust codebase) with non-trivial security surface (file permissions, socket isolation, process limits). .agent/notes/kernel-security-audit-2026-04-05.md and .agent/notes/release-readiness-2026-04-12.md suggest ongoing security hardening. No visible GitHub stars/age from provided data, but recovery branch and audit artifacts indicate recent active development with potential stability concerns.

Active areas of work

Active development on kernel security audit (April 2026 audit notes), release readiness assessment, and Node.js integration gaps. Recent probe scripts in .agent/notes/ (npm_unreachable_probe.ts, npx_fs_probe.ts, resolve_agent_probe.ts, http_direct_probe.ts) indicate debugging package resolution and network access inside isolates. PI SDK and bootstrap improvements visible in todo.md and test artifacts.

🚀Get running

git clone https://github.com/rivet-dev/agent-os.git
cd agent-os
npm install
npm run build

Then see README.md quickstart: install @rivet-dev/agent-os, create an AgentOs instance with software packages (common, pi), and call vm.prompt() or vm.exec().

Daily commands: Development: npm install && npm run build (see Makefile for build targets). Runtime: instantiate AgentOs.create({ software: [...] }), then call vm.prompt(sessionId, prompt) or vm.exec(cmd). Test: specific test files like .agent/notes/us076-debug.test.ts suggest Jest/mocha in use.

🗺️Map of the codebase

  • .agent/recovery/secure-exec/nodejs/src/index.ts — Primary entry point and public API surface for the secure-exec runtime; all agent execution flows through this module.
  • .agent/recovery/secure-exec/kernel/kernel.ts — Core kernel abstraction managing process tables, VFS, permissions, and resource isolation; the security foundation of agentOS.
  • .agent/recovery/secure-exec/nodejs/src/bridge-setup.ts — Configures the bridge between Node.js runtime and kernel; critical for agent-to-host function calls and permission enforcement.
  • .agent/recovery/secure-exec/nodejs/src/isolate-bootstrap.ts — Bootstraps V8 isolates with kernel runtime and polyfills; establishes the isolated execution environment for each agent.
  • .agent/recovery/secure-exec/kernel/vfs.ts — Virtual filesystem implementation enforcing filesystem isolation and mount-based access control for agents.
  • .agent/recovery/secure-exec/nodejs/src/module-resolver.ts — Resolves and loads modules within isolated contexts; prevents escape attacks and enforces module-level access policies.
  • .agent/recovery/secure-exec/shared/api-types.ts — Shared type definitions and contracts between kernel and Node.js bridge; maintains API consistency across isolation boundaries.

🛠️How to make changes

Add a new host tool function

  1. Define the tool signature in the bridge contract (.agent/recovery/secure-exec/shared/bridge-contract.ts)
  2. Implement the handler in the bridge handlers (.agent/recovery/secure-exec/nodejs/src/bridge-handlers.ts)
  3. Register the command in the kernel command registry (.agent/recovery/secure-exec/kernel/command-registry.ts)
  4. Bind the function in bridge setup to make it available to agents (.agent/recovery/secure-exec/nodejs/src/bridge-setup.ts)

Add filesystem access permissions for a new path

  1. Define permission policy in permissions module (.agent/recovery/secure-exec/kernel/permissions.ts)
  2. Update VFS mount table to register the path (.agent/recovery/secure-exec/kernel/vfs.ts)
  3. Add validation in filesystem bridge to check permissions on operations (.agent/recovery/secure-exec/nodejs/src/bridge/fs.ts)

Add a new polyfill for an unavailable API

  1. Create polyfill implementation in polyfills directory (.agent/recovery/secure-exec/nodejs/src/polyfills)
  2. Register polyfill in the polyfills loader (.agent/recovery/secure-exec/nodejs/src/polyfills.ts)
  3. Expose the API in isolate bootstrap global context (.agent/recovery/secure-exec/nodejs/src/isolate-bootstrap.ts)

Support a new network protocol or endpoint type

  1. Add socket type support to socket table (.agent/recovery/secure-exec/kernel/socket-table.ts)
  2. Implement network adapter for the protocol (.agent/recovery/secure-exec/nodejs/src/host-network-adapter.ts)
  3. Update network bridge to handle new protocol in agent code (.agent/recovery/secure-exec/nodejs/src/bridge/network.ts)
  4. Add permission checks for the new protocol type (.agent/recovery/secure-exec/kernel/permissions.ts)

🔧Why these technologies

  • V8 Isolates — Provides true process-level isolation within a single Node.js process with ~6ms cold-start overhead, enabling many concurrent agents with low memory footprint
  • WebAssembly (via V8) — Enables safer execution boundaries and potential future compilation targets for agent code with predictable resource limits
  • Virtual Filesystem (VFS) — Implements deny-by-default mount-based filesystem access control without requiring OS-level containers or VMs
  • Deny-by-Default Permissions — Mirrors browser security model where agents must explicitly request filesystem, network, and process access rather than defaulting to allow
  • Direct Host Function Binding — Eliminates network overhead by allowing agents to call host functions directly via bridge; no RPC or service-to-service auth needed

⚖️Trade-offs already made

  • Single-process isolation via V8 isolates instead of containers/VMs

    • Why: Achieves dramatic performance (6ms cold-start, 32x cost reduction) and deployment simplicity
    • Consequence: Host process compromise could affect all agents; less suitable for untrusted/adversarial code than VM isolation
  • Synchronous bridge calls between isolate and kernel

    • Why: Simplifies agent code patterns and avoids callback/promise complexity
    • Consequence: Long-running host operations block the isolate thread; requires careful timeout and cancellation handling
  • Module resolution happens at runtime within isolate

    • Why: Allows agents to load packages dynamically and apply isolation-aware resolution
    • Consequence: Higher per-execution overhead than bundling; potential module cache misses
  • Embedding in user process vs. standalone daemon

    • Why: Avoids separate service deployment and network hops for tool calls
    • Consequence: Tight coupling to host application lifecycle; harder to scale independently

🚫Non-goals (don't propose these)

  • Does not provide protection against agent code designed

🪤Traps & gotchas

  1. V8 Isolate memory isolation is strict: Node.js modules expecting direct syscalls (e.g., native C++ addons) will fail; requires bridge stubs in bridge-handlers.ts. 2) Module resolution happens twice: once by Node.js at build time, once by module-resolver at isolate runtime; mismatches cause 'module not found' in sandboxed code. 3) No real async I/O yet: VFS operations block the V8 thread; heavy I/O will hang the isolate. 4) Filesystem permissions are path-based, not fd-based: closing an fd doesn't revoke access if the path permission remains. 5) Network isolation blocks ALL sockets by default: even localhost requires explicit socket-table permission entry. 6) Build requires Rust toolchain: Wasm compilation step not visible in package.json but implied by Rust file counts; missing rust/wasm-pack will silently fail.

🏗️Architecture

💡Concepts to learn

  • V8 Isolate — Core execution model for agentOS; each agent runs in a separate V8 isolate with independent heap, providing memory isolation without process overhead
  • WebAssembly (WASM) — Kernel and system-level code (filesystem, process management, permissions) compiled to WASM to run portably inside V8 and Node.js without native binary dependencies
  • Capability-based Security (Deny-by-Default) — agentOS's security model requires explicit permission grants for filesystem, network, and process APIs; agents cannot escape the sandbox without explicit capability tokens
  • Virtual File System (VFS) — Abstracts host filesystem from agent code; enables mount-based isolation, permission-enforced path access, and sandboxed /home and /tmp per session
  • Bridge Contract RPC — Typed message passing between V8 isolate and host kernel (bridge-contract.ts); eliminates unsafe serialization and enables strict API boundaries for syscalls
  • ESM Module Resolution — agentOS must resolve imports inside the isolate without access to the host's node_modules; module-resolver.ts implements custom resolution logic matching npm semantics but restricted to allowed paths
  • File Descriptor Table (fd-table) — Maps integer file descriptors to VFS inodes per process; security boundary preventing fd-spoofing attacks; classic Unix pattern adapted for isolate sandboxing
  • denoland/deno — Pioneered V8 isolate + permission model approach for sandboxed JavaScript; agentOS applies similar deny-by-default design to in-process agents
  • cloudflare/workerd — Uses WebAssembly + V8 isolates for edge compute with zero cold starts; inspired agentOS's architecture for millisecond-scale startup
  • microsoft/playwright — Alternative agent execution framework for browser automation; agentOS offers faster startup and lower cost through in-process design vs. Playwright's process-per-context model
  • rivet-dev/rivet — Parent framework integrating agentOS as the core agent runtime; users building with Rivet rely on this for execution and embedding
  • anthropics/anthropic-sdk-python — Companion SDK; agentOS hosts Claude Code and other Anthropic agents; agentOS examples show ANTHROPIC_API_KEY integration

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add comprehensive unit tests for kernel subsystems

The kernel directory (.agent/recovery/secure-exec/kernel/) contains critical components like fd-table.ts, process-table.ts, socket-table.ts, and pty.ts with no visible test files. These are foundational to security and stability. Adding tests would catch regressions in file descriptor management, process isolation, and PTY handling—core to the ~6ms coldstart claim.

  • [ ] Create test file: .agent/recovery/secure-exec/kernel/tests/fd-table.test.ts covering descriptor allocation, cleanup, and edge cases
  • [ ] Create test file: .agent/recovery/secure-exec/kernel/tests/process-table.test.ts for process lifecycle, PID management, and parent-child relationships
  • [ ] Create test file: .agent/recovery/secure-exec/kernel/tests/socket-table.test.ts for socket creation, binding, and cleanup under resource constraints
  • [ ] Create test file: .agent/recovery/secure-exec/kernel/tests/vfs.test.ts for mount operations and permission checks
  • [ ] Add test coverage reporting to package.json scripts

Add integration tests for Node.js bridge-handlers to validate real command execution

The bridge-handlers.ts and individual bridge modules (fs.ts, child-process.ts, network.ts, os.ts) implement the critical API surface between the isolate and the kernel, but there's no visible integration test suite. Testing these handlers with real subprocess spawning, filesystem operations, and network calls would validate the security model works end-to-end and catch regressions in the bridge contract.

  • [ ] Create test file: .agent/recovery/secure-exec/nodejs/src/tests/bridge-integration.test.ts to test complete workflows (e.g., spawn process → read file → make HTTP call)
  • [ ] Add tests for child-process.ts bridge: verify subprocess isolation, signal handling, and exit code propagation
  • [ ] Add tests for fs.ts bridge: verify permission checks block unauthorized paths and allow permitted ones
  • [ ] Add tests for network.ts bridge: verify network adapter correctly gates requests based on kernel rules
  • [ ] Add test fixtures in .agent/recovery/secure-exec/nodejs/src/tests/fixtures/ for test scripts to execute

Document the kernel security model and bridge contract specification

The kernel implements a deny-by-default permission model and the bridge enforces a contract between isolate and kernel, but this is only mentioned in README snippets. Missing is detailed documentation of what the security guarantees are, how permissions work (kernel/permissions.ts), and what the bridge contract is (bridge-contract.ts). New contributors and security auditors need this to understand threat models.

  • [ ] Create .agent/recovery/secure-exec/SECURITY.md documenting deny-by-default policy, permission types (filesystem, network, process), and how they interact
  • [ ] Create .agent/recovery/secure-exec/kernel/ARCHITECTURE.md explaining fd-table, process-table, mount-table, vfs, and how they enforce isolation
  • [ ] Create .agent/recovery/secure-exec/nodejs/BRIDGE_CONTRACT.md documenting the host↔isolate message protocol, handler types, and validation rules from bridge-contract.ts
  • [ ] Add inline code comments to kernel/permissions.ts and nodejs/src/bridge-handlers.ts referencing the architecture docs
  • [ ] Add a threat model section to the main README linking to SECURITY.md

🌿Good first issues

  • Add unit tests for .agent/recovery/secure-exec/kernel/fd-table.ts file descriptor lifecycle (open/close/dup/seek); currently no test visible in file list despite complex state management
  • Implement DNS caching layer in .agent/recovery/secure-exec/kernel/dns-cache.ts with TTL eviction; skeleton exists but probe logs (dns-cache.md, npm_unreachable_probe.ts) suggest incomplete network isolation validation
  • Add ESM module loader tests for .agent/recovery/secure-exec/nodejs/src/module-resolver.ts covering node_modules resolution, package.json exports field, and conditional imports; recent probes (resolve_agent_probe.ts, npx_semver_probe.ts) indicate edge cases

Top contributors

Click to expand

📝Recent commits

Click to expand
  • ece7ce6 — chore: kernel hardening, Node.js compat, and test suite coverage (#1451) (NathanFlurry)
  • b1f023a — finish ts rust migration (#1442) (NathanFlurry)
  • 0063cdc — feat: runtime isolation hardening + test quality (#1437) (NathanFlurry)
  • 3bee7a4 — chore: rust kernel hardening & feature parity (#1435) (NathanFlurry)
  • fc1c5a4 — feat: US-001 - Add Python variant to GuestRuntimeKind protocol (#1434) (NathanFlurry)
  • ce0f560 — chore: module loading perf (#1433) (NathanFlurry)
  • 5a43882 — feat: rust kernel sidecar (#1430) (NathanFlurry)
  • 6694bf5 — release: bump all packages to v0.1.1 (NathanFlurry)
  • 7b48651 — fix: use workspace protocol for codex registry-types dep (NathanFlurry)
  • 6c0ca99 — fix: remove obsolete secure-exec patches and fix release build (NathanFlurry)

🔒Security observations

  • High · Incomplete Dependency Information — .agent/recovery/secure-exec/nodejs/package.json. The package.json file is truncated and does not show the complete dependencies list. This prevents full analysis of potential vulnerable transitive dependencies. The file cuts off mid-export definition, suggesting the actual dependency declarations are missing from the provided content. Fix: Provide the complete package.json file including all dependencies, devDependencies, and optionally a package-lock.json. Run 'npm audit' regularly to identify and patch vulnerable dependencies.
  • High · Potential Command Injection in Host Command Executor — .agent/recovery/secure-exec/nodejs/src/host-command-executor.ts. The file 'host-command-executor.ts' suggests execution of host commands. Without reviewing the actual code, command executors are high-risk for injection attacks if user input is not properly sanitized before being passed to child processes or shell commands. Fix: Ensure all command execution uses parameterized/array-based arguments (e.g., child_process.execFile with args array) rather than shell string concatenation. Never pass unsanitized user input to shell interpreters. Use allowlists for permitted commands.
  • High · Network Bridge Potential Bypass — .agent/recovery/secure-exec/nodejs/src/host-network-adapter.ts, .agent/recovery/secure-exec/nodejs/src/default-network-adapter.ts. The 'host-network-adapter.ts' and 'default-network-adapter.ts' files suggest network access management. If not properly configured, the deny-by-default security model could be bypassed through improper validation of network requests or DNS resolution. Fix: Implement strict validation of all network destinations against a whitelist. Validate DNS responses to prevent DNS rebinding attacks. Enforce TLS/HTTPS for sensitive connections. Log all network access attempts.
  • High · V8 Isolate Escape Risk — .agent/recovery/secure-exec/nodejs/src/bindings.ts, .agent/recovery/secure-exec/nodejs/src/bridge-handlers.ts. The codebase relies on V8 isolates for security boundaries. Isolate escapes have been discovered historically in V8. The code contains custom bridge handlers and bindings that expose host functionality to isolates, which increases the attack surface. Fix: Keep V8/Node.js updated to the latest stable version with security patches. Minimize the surface area of exposed host functions. Implement strict type validation for all cross-isolate boundaries. Consider using multiple layers of sandboxing (OS-level in addition to V8).
  • High · Filesystem Access Control Weaknesses — .agent/recovery/secure-exec/kernel/vfs.ts, .agent/recovery/secure-exec/kernel/fd-table.ts, .agent/recovery/secure-exec/kernel/file-lock.ts. The VFS (virtual filesystem) layer and fd-table suggest filesystem sandboxing. However, symlink attacks, TOCTOU races, and path traversal vulnerabilities are common in custom VFS implementations, especially around mount point resolution. Fix: Resolve all symlinks before access checks. Use realpath() to canonicalize paths. Implement atomic TOCTOU-safe operations. Validate all path components against allowlists. Consider using OS-level capabilities (seccomp, AppArmor, SELinux) for defense-in-depth.
  • Medium · Missing Authentication/Authorization in Bridge Layer — .agent/recovery/secure-exec/nodejs/src/bridge-contract.ts, .agent/recovery/secure-exec/nodejs/src/bridge-setup.ts. The bridge-contract.ts and bridge-setup.ts suggest IPC between host and isolates. If authentication tokens or authorization checks are missing, a compromised isolate could invoke unintended host functions. Fix: Implement capability-based security with per-isolate tokens. Validate all bridge messages include proper authorization credentials. Use cryptographic signatures for critical operations. Implement rate limiting on bridge calls.
  • Medium · Module Resolution Security — .agent/recovery/secure-exec/nodejs/src/module-resolver.ts, .agent/recovery/secure-exec/nodejs. The module-resolver.ts and esm-compiler.ts files handle module loading. Improper resolution could allow loading of unintended modules from the host filesystem, node_modules, or crafted package names with special characters. Fix: undefined

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Healthy signals · rivet-dev/agent-os — RepoPilot