This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## deepagents@1.12.0 ### Minor Changes - [#703](https://github.com/langchain-ai/deepagentsjs/pull/703) [`d25097f`](https://github.com/langchain-ai/deepagentsjs/commit/d25097f78d0e66741da34e1d74551f3c19991126) Thanks [@hntrl](https://github.com/hntrl)! - feat(deepagents): adopt more minimal prompting We've observed that current models don't need as verbose of prompting guidance, so we're reducing the amount of perscriptive guidance that deepagents has. This is reflected in the generic system prompt (which is now blank), and in the tool descriptions (which have been simplified). - [#708](https://github.com/langchain-ai/deepagentsjs/pull/708) [`1225a7f`](https://github.com/langchain-ai/deepagentsjs/commit/1225a7ff8673686c2a3c0411636a9511b7d8d0d0) Thanks [@hntrl](https://github.com/hntrl)! - feat(deepagents): make todo middleware opt-in - [#674](https://github.com/langchain-ai/deepagentsjs/pull/674) [`dd142fe`](https://github.com/langchain-ai/deepagentsjs/commit/dd142fe4fc54c986d5bcf51211d9a839a427e931) Thanks [@hntrl](https://github.com/hntrl)! - feat(filesystem): allow `write_file` to create missing files or completely replace existing files ## deepagents-acp@0.1.21 ### Patch Changes - Updated dependencies [[`d25097f`](https://github.com/langchain-ai/deepagentsjs/commit/d25097f78d0e66741da34e1d74551f3c19991126), [`1225a7f`](https://github.com/langchain-ai/deepagentsjs/commit/1225a7ff8673686c2a3c0411636a9511b7d8d0d0), [`dd142fe`](https://github.com/langchain-ai/deepagentsjs/commit/dd142fe4fc54c986d5bcf51211d9a839a427e931)]: - deepagents@1.12.0 ## @langchain/node-vfs@1.0.0 ### Patch Changes - [#674](https://github.com/langchain-ai/deepagentsjs/pull/674) [`dd142fe`](https://github.com/langchain-ai/deepagentsjs/commit/dd142fe4fc54c986d5bcf51211d9a839a427e931) Thanks [@hntrl](https://github.com/hntrl)! - fix: allow `VfsBackend.write` to overwrite existing files while continuing to reject symlinks ## @langchain/daytona@1.0.0 ## @langchain/deno@1.0.0 ## @langchain/modal@1.0.0 ## @langchain/quickjs@1.0.0 ## @langchain/sandbox-standard-tests@2.0.0 ## @deepagents/evals@0.0.20 ### Patch Changes - Updated dependencies [[`d25097f`](https://github.com/langchain-ai/deepagentsjs/commit/d25097f78d0e66741da34e1d74551f3c19991126), [`1225a7f`](https://github.com/langchain-ai/deepagentsjs/commit/1225a7ff8673686c2a3c0411636a9511b7d8d0d0), [`dd142fe`](https://github.com/langchain-ai/deepagentsjs/commit/dd142fe4fc54c986d5bcf51211d9a839a427e931)]: - deepagents@1.12.0 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@langchain/node-vfs
Node.js Virtual File System backend for DeepAgents.
This package provides an in-memory VFS implementation that enables agents to work with files in an isolated environment without touching the real filesystem. It uses node-vfs-polyfill which implements the upcoming Node.js VFS feature (nodejs/node#61478).
Installation
npm install @langchain/node-vfs deepagents
# or
pnpm add @langchain/node-vfs deepagents
Quick Start
import { VfsBackend } from "@langchain/node-vfs";
import { createDeepAgent } from "deepagents";
import { ChatAnthropic } from "@langchain/anthropic";
// Create and initialize a VFS backend
const backend = await VfsBackend.create({
initialFiles: {
"/src/index.js": "console.log('Hello from VFS!')",
},
});
try {
const agent = createDeepAgent({
model: new ChatAnthropic({ model: "claude-sonnet-4-20250514" }),
systemPrompt: "You are a coding assistant with VFS access.",
backend,
});
const result = await agent.invoke({
messages: [{ role: "user", content: "Run the index.js file" }],
});
} finally {
await backend.stop();
}
Features
- In-Memory File Storage - Files are stored in a virtual file system using node-vfs-polyfill
- Zero Setup - No Docker, cloud services, or external dependencies required
- Native File Tools -
read,ls,grep, andglobrun directly against VFS data - Automatic Cleanup - All resources are cleaned up when the backend stops
- Initial Files - Pre-populate the backend with files at creation time
- Path Confinement - File operations are constrained to the virtual workspace root
API Reference
VfsBackend (BackendProtocolV2)
The main class for creating and managing the in-memory VFS backend.
Static Methods
VfsBackend.create(options?)
Create and initialize a new VFS backend in one step.
const backend = await VfsBackend.create({
mountPath: "/vfs", // Mount path for the VFS (default: "/vfs")
initialFiles: {
// Initial files to populate
"/README.md": "# Hello",
"/src/index.js": "console.log('Hello')",
},
});
Instance Methods
backend.uploadFiles(files)
Upload files to the backend.
const encoder = new TextEncoder();
await backend.uploadFiles([
["src/app.js", encoder.encode("console.log('Hi')")],
["package.json", encoder.encode('{"name": "test"}')],
]);
backend.downloadFiles(paths)
Download files from the backend.
const results = await backend.downloadFiles(["src/app.js"]);
for (const result of results) {
if (result.content) {
console.log(new TextDecoder().decode(result.content));
}
}
backend.stop()
Stop the backend and clean up resources.
await backend.stop();
Factory Functions
createVfsBackendFactory(options?)
Create an async factory that creates new backend instances per invocation.
const factory = createVfsBackendFactory({
initialFiles: { "/README.md": "# Hello" },
});
const backend = await factory();
createVfsBackendFactoryFromBackend(backend)
Create a factory that reuses an existing backend.
const backend = await VfsBackend.create();
const factory = createVfsBackendFactoryFromBackend(backend);
Configuration Options
| Option | Type | Default | Description |
|---|---|---|---|
mountPath |
string |
"/vfs" |
Mount path for the virtual file system |
initialFiles |
Record<string, string | Uint8Array> |
undefined |
Initial files to populate the VFS |
Error Handling
The package exports a VfsSandboxError class for typed error handling:
import { VfsSandboxError } from "@langchain/node-vfs";
try {
const result = await backend.read("/src/index.js");
if (result.error) {
throw new Error(result.error);
}
} catch (error) {
if (error instanceof VfsSandboxError) {
switch (error.code) {
case "NOT_INITIALIZED":
// Handle uninitialized backend
break;
case "FILE_OPERATION_FAILED":
// Handle file operation failures
break;
}
}
}
Error Codes
NOT_INITIALIZED- Backend not initializedALREADY_INITIALIZED- Backend already initializedINITIALIZATION_FAILED- Failed to initialize VFSFILE_OPERATION_FAILED- File operation failedNOT_SUPPORTED- VFS not supported in environment
How It Works
The VFS backend is fully in-memory:
- File Storage - Files are stored in-memory using the
VirtualFileSystemfrom node-vfs-polyfill - File Operations -
read,ls,grep, andgloboperate directly on VFS paths - Isolation - Paths are confined under the virtual workspace root
This approach keeps filesystem operations isolated and avoids host shell execution from this provider.
Future: Native Node.js VFS
This package uses node-vfs-polyfill which implements the upcoming Node.js VFS feature being developed in nodejs/node#61478.
When the official node:vfs module lands in Node.js, this package will be updated to use the native implementation for better performance and compatibility.
License
MIT