Skip to main content
Execution

Node.js Compatibility

Review the Node.js built-in modules and compatibility guarantees available to JavaScript and TypeScript code running inside agentOS VMs.

Guest JavaScript never touches the host Node.js runtime.

  • Every node: import/require resolves to a VM-backed bridge or an in-isolate implementation.
  • Unknown or denied modules fail explicitly with ERR_ACCESS_DENIED.
  • The guest reports Node.js v22.0.0 via process.version.

How builtins are backed:

  • VM-backed — routes through the VM filesystem, sockets, processes, DNS, or entropy.
  • In-isolate — pure JavaScript running inside V8; no host access.
  • Denied — importing throws ERR_ACCESS_DENIED.
A guest never falls through to a real host builtin. Anything not bridged or implemented in the isolate is denied.

VM-backed builtins

ModuleBacked by
fs, fs/promisesVM filesystem: fds, streams, metadata, symlinks, polling watchers.
child_processVM process table. spawn, exec, execFile, sync variants.
net, dgramVM TCP, Unix-socket, and UDP tables.
dns, dns/promisesVM DNS resolver.
http, https, http2, tlsVM socket/TLS paths: clients, servers, pooling.
osVM-scoped platform, arch, hostname, CPU, memory, user.
cryptoEntropy, hashes, HMAC, ciphers, scrypt, UUIDs, WebCrypto.
processVM env, cwd, signals, timers, stdio, umask.
modulecreateRequire, builtin resolution, basic Module compat.
consoleBounded formatting, guest stdout/stderr.
readline, sqlite, ttyVM-backed compatibility surfaces.
timers, timers/promisesTimeout, interval, immediate, promise variants.
stream/web, stream/consumers, stream/promisesWeb Streams + stream helpers.
  • Network builtins obey the VM permission policy.
  • Network access is denied until granted by the VM creator.

In-isolate builtins

  • Full: path, buffer, events, stream, util, assert, url, querystring, string_decoder, zlib, punycode, constants, sys. Default and named ESM imports supported.
  • Feature-detection shims: async_hooks, diagnostics_channel, perf_hooks, worker_threads, vm, v8. worker_threads does not create real worker threads.

Denied builtins

cluster, domain, inspector, repl, trace_events, wasi.

Global APIs

  • Modern web globals: fetch, Headers, Request, Response, TextEncoder/TextDecoder, Buffer, URL APIs, Blob, File, FormData, abort APIs, structuredClone, performance, WebAssembly.
  • fetch() uses VM sockets and follows the same policy as http/net.

Modules and output

  • ESM and CommonJS both use the VM filesystem and normal node_modules resolution.
  • Console/stream output flows through the bounded process-output path — see Processes & Shells.
import { AgentOs } from "@rivet-dev/agentos";

const runtime = await AgentOs.create();

try {
	const result = await runtime.javascript.evaluate<{
		filename: string;
		digest: string;
	}>(`(async () => {
		const { createHash } = await import("node:crypto");
		const { join } = await import("node:path");
		return {
			filename: join("/workspace", "report.json"),
			digest: createHash("sha256").update("agentos").digest("hex"),
		};
	})()`);

	if (result.outcome !== "succeeded") throw new Error(result.error.message);
	console.log(result.value);
} finally {
	await runtime.dispose();
}

Back to the JavaScript guide for TypeScript, packages, files, processes, networking, bindings, permissions, and limits.