メインコンテンツへ移動

LocalSandbox

追加バージョン: @mastra/core@1.1.0

ローカルシステムでコマンドを実行します。インターフェースの詳細は、WorkspaceSandbox インターフェースを参照してください。

使用方法
使用方法への直接リンク

Workspace に LocalSandbox を追加して Agent に割り当てます。これにより Agent はタスクの一環としてシェルコマンドを実行できます。

import { Agent } from '@mastra/core/agent'
import { Workspace, LocalFilesystem, LocalSandbox } from '@mastra/core/workspace'

const workspace = new Workspace({
filesystem: new LocalFilesystem({ basePath: './workspace' }),
sandbox: new LocalSandbox({
workingDirectory: './workspace',
env: {
NODE_ENV: 'development',
},
}),
})

const agent = new Agent({
id: 'dev-agent',
model: 'openai/gpt-5.6-sol',
workspace,
})

// The agent now has the execute_command tool available
const response = await agent.generate('Run npm install')

自動起動の動作
自動起動の動作への直接リンク

LocalSandbox がまだ動作していない場合は、最初のコマンド実行時に自動起動します。最初のコマンドの遅延を避けるには、アプリケーションの起動時に workspace.init() を呼び出して Sandbox を明示的に起動することもできます。

コンストラクターパラメーター
コンストラクターパラメーターへの直接リンク

id?:

string
= Auto-generated
この Sandbox インスタンスの一意な識別子。

workingDirectory?:

string
= process.cwd()/.sandbox/
コマンドを実行するディレクトリ。seatbelt プロファイルから分離するため、デフォルトは process.cwd() 内の .sandbox/ です。

env?:

NodeJS.ProcessEnv
設定する環境変数。上書きしない限り、デフォルトで PATH が含まれます。

timeout?:

number
= 30000
操作のデフォルトタイムアウト(ミリ秒)。

isolation?:

'none' | 'seatbelt' | 'bwrap'
= 'none'
OS ネイティブの Sandbox バックエンド。macOS では 'seatbelt'、Linux では 'bwrap' を使用します。

instructions?:

string | ((opts: { defaultInstructions: string; requestContext?: RequestContext }) => string)
getInstructions() が返すデフォルトの指示を上書きするカスタム指示。完全に置き換えるには文字列を、現在の requestContext を参照してリクエストごとにカスタマイズするには拡張関数を渡します。

nativeSandbox?:

NativeSandboxConfig
ネイティブ Sandbox の設定(後述の NativeSandboxConfig を参照)。

NativeSandboxConfig
nativesandboxconfigへの直接リンク

OS ネイティブの Sandbox 用設定オプション(isolation: 'seatbelt' または 'bwrap' とともに使用)。

allowNetwork?:

boolean
= false
Sandbox 化されたコマンドからのネットワークアクセスを許可するかどうか。

readOnlyPaths?:

string[]
読み取り専用アクセスを許可する追加パス(システムパスは常に読み取り可能)。

readWritePaths?:

string[]
Workspace ディレクトリの外部で読み書きを許可する追加パス。

seatbeltProfilePath?:

string
カスタム seatbelt プロファイルファイルへのパス(macOS のみ)。ユーザーが作成したファイルはそのまま使用されます。Mastra はマウントパスを追加しないため、マウントするすべてのパスをプロファイルで事前に許可する必要があります。ファイルが存在しない場合は、マウントパスを許可するデフォルトプロファイルが生成され、このパスへ書き込まれます。Mastra は生成したプロファイルに印を付けるため、以後の実行ではユーザー作成ファイルとして読み込まずに再生成します。生成済みプロファイルを編集して変更を維持するには、印となるコメントを削除してください。その後はユーザー作成ファイルとして扱われ、マウントパスは追加されません。

bwrapArgs?:

string[]
bwrap に渡す追加引数(Linux のみ)。

allowSystemBinaries?:

boolean
= true
標準のシステムバイナリパス(/bin、/usr/bin など)への読み取りアクセスを許可するかどうか。

プロパティ
プロパティへの直接リンク

id:

string
Sandbox インスタンスの識別子。

name:

string
Provider 名('LocalSandbox')。

provider:

string
Provider 識別子('local')。

status:

ProviderStatus
'starting' | 'running' | 'stopped' | 'error'

workingDirectory:

string
設定済みの作業ディレクトリ。

processes:

LocalProcessManager
バックグラウンドプロセスマネージャー。SandboxProcessManager リファレンスを参照してください。

パスの解決
パスの解決への直接リンク

相対パスと実行コンテキスト
相対パスと実行コンテキストへの直接リンク

workingDirectory に相対パスを使用すると、process.cwd() を基準に解決されます。Mastra プロジェクトでは、コードの実行方法によって cwd が変わります。

コンテキスト作業ディレクトリ./workspace の解決先
mastra dev./src/mastra/public/./src/mastra/public/workspace
mastra start./.mastra/output/./.mastra/output/workspace
スクリプトを直接実行コマンドを実行した場所その場所からの相対パス

同じ相対パスが異なる場所へ解決されるため、混乱を招くことがあります。

すべての実行コンテキストでパスを統一するには、絶対パスを設定した環境変数を使用します。

import { LocalSandbox } from '@mastra/core/workspace'

const sandbox = new LocalSandbox({
workingDirectory: process.env.WORKSPACE_PATH!,
})

環境変数 WORKSPACE_PATH/home/user/my-project/workspace などの絶対パスを設定します。コードの実行方法にかかわらず、コマンドを同じディレクトリから実行できます。

バックグラウンドプロセス
バックグラウンドプロセスへの直接リンク

LocalSandbox には、バックグラウンドプロセスを起動・管理するプロセスマネージャーが組み込まれています。プロセスは child_process.spawn を使用し、ローカルマシン上の子プロセスとして動作します。

const sandbox = new LocalSandbox({ workingDirectory: './workspace' })
await sandbox.start()

// Spawn a background process
const handle = await sandbox.processes.spawn('node server.js')

// Read output, send stdin, kill
console.log(handle.stdout)
await handle.sendStdin('input\n')
await handle.kill()

ネイティブ分離(seatbelt または bwrap)を有効にすると、起動したプロセスも同じ分離バックエンドでラップされます。

完全な API は、SandboxProcessManager リファレンスを参照してください。

静的メソッド
静的メソッドへの直接リンク

detectIsolation()
detectisolationへの直接リンク

現在のプラットフォームで利用可能な最適の分離バックエンドを検出します。

const detection = LocalSandbox.detectIsolation()
// { backend: 'seatbelt', available: true, message: 'Seatbelt available on macOS' }

環境の分離
環境の分離への直接リンク

デフォルトでは、LocalSandbox の環境に含まれるのは PATH だけです。これにより、コマンドを実行可能にしつつ、API キーやシークレットの意図しない公開を防ぎます。

// Default: only PATH is available (commands work, secrets protected)
const secureSandbox = new LocalSandbox({
workingDirectory: './workspace',
})

// Explicit: pass specific variables
const sandbox = new LocalSandbox({
workingDirectory: './workspace',
env: {
NODE_ENV: 'development',
API_URL: 'https://api.example.com',
},
})

// Full access (use with caution)
const devSandbox = new LocalSandbox({
workingDirectory: './workspace',
env: process.env,
})

OS ネイティブの Sandbox
OS ネイティブの Sandboxへの直接リンク

LocalSandbox は、セキュリティを強化するため OS ネイティブの Sandbox に対応します。

  • macOS:Filesystem とネットワークの分離に Seatbelt(sandbox-exec)を使用
  • Linux:名前空間の分離に Bubblewrap(bwrap)を使用
// Detect the best available backend for this platform
const detection = LocalSandbox.detectIsolation()
console.log(detection)
// { backend: 'seatbelt', available: true, message: '...' }

// Enable native sandboxing
const sandbox = new LocalSandbox({
workingDirectory: './workspace',
isolation: 'seatbelt', // or 'bwrap' on Linux
nativeSandbox: {
allowNetwork: false, // Block network access (default)
readWritePaths: ['/tmp/extra'], // Additional writable paths
},
})

分離を有効にすると、次の制限が適用されます。

  • ファイルの書き込みは Workspace ディレクトリ(および設定済みパス)内に制限されます
  • ファイルの読み取りはすべての場所で許可されます(システムバイナリに必要)
  • ネットワークアクセスはデフォルトで遮断されます
  • プロセス分離により、ホストシステムへの影響を防ぎます

Sandbox プロファイルの場所
Sandbox プロファイルの場所への直接リンク

macOS で seatbelt 分離を使用すると、LocalSandbox は作業ディレクトリとは別に、process.cwd() 内の .sandbox-profiles/ フォルダーへプロファイルファイルを生成します。

project/
├── .sandbox/ # Default working directory (sandboxed)
│ └── ... files created by sandbox
├── .sandbox-profiles/ # Seatbelt profiles (outside sandbox)
│ └── seatbelt-a1b2c3d4.sb # Hash based on workspace + config
└── ... your project files

プロファイルのファイル名は Workspace のパスと設定から生成したハッシュです。同じ設定の Sandbox は同じプロファイルを共有し、設定が異なる場合は別のファイルを使用します。これにより、複数の Sandbox を同時実行する際の競合を防ぎます。

この分離により、Sandbox 化されたプロセスが自身のセキュリティプロファイルを読み取ったり変更したりするのを防ぎます。プロファイルは Sandbox の起動時に作成され、破棄時にクリーンアップされます。