メインコンテンツへ移動

SandboxProcessManager

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

Sandbox のバックグラウンドプロセスを管理する抽象基底クラスです。プロセスの起動、一覧取得、PID によるハンドル取得、終了のためのメソッドを提供します。

BlaxelSandboxDaytonaSandboxE2BSandboxModalSandboxLocalSandbox には、いずれもプロセスマネージャーが組み込まれています。カスタム Sandbox Provider を構築する場合を除き、このクラスを直接インスタンス化する必要はありません。

使用例
使用例への直接リンク

Sandbox の processes プロパティからプロセスマネージャーにアクセスします。

src/mastra/index.ts
import { LocalSandbox } from '@mastra/core/workspace'

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

// Spawn a background process
const handle = await sandbox.processes.spawn('node server.js', {
env: { PORT: '3000' },
onStdout: data => console.log(data),
})

// List all tracked processes
const procs = await sandbox.processes.list()

// Get a handle by PID
const proc = await sandbox.processes.get(handle.pid)

// Kill a process
await sandbox.processes.kill(handle.pid)

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

spawn(command, options?)
spawncommand-optionsへの直接リンク

バックグラウンドプロセスを起動します。プロセスの終了を待たず、すぐに ProcessHandle を返します。

const handle = await sandbox.processes.spawn('npm run dev', {
cwd: '/app',
env: { NODE_ENV: 'development' },
onStdout: data => console.log(data),
})

パラメーター:

command:

string
実行するコマンド。シェルによって解釈されます。

options?:

SpawnProcessOptions
起動するプロセスの任意設定。
SpawnProcessOptions

timeout?:

number
タイムアウト(ミリ秒)。超過するとプロセスを終了します。

env?:

NodeJS.ProcessEnv
プロセスの環境変数。

cwd?:

string
プロセスの作業ディレクトリ。

onStdout?:

(data: string) => void
stdout チャンク用のコールバック。データの到着時に呼び出されます。

onStderr?:

(data: string) => void
stderr チャンク用のコールバック。データの到着時に呼び出されます。

abortSignal?:

AbortSignal
プロセスを中断するシグナル。中断時にプロセスを終了します。

戻り値: Promise<ProcessHandle>

list()
listへの直接リンク

追跡中のプロセスをすべて一覧表示します。PID、実行状態、終了コードを含む各プロセスの情報を返します。

const procs = await sandbox.processes.list()
for (const proc of procs) {
console.log(proc.pid, proc.running, proc.exitCode)
}

戻り値: Promise<ProcessInfo[]>

get(pid)
getpidへの直接リンク

PID を指定してプロセスのハンドルを取得します。プロセスが見つからないか、すでに破棄されている場合は undefined を返します。

const handle = await sandbox.processes.get(1234)
if (handle) {
console.log(handle.stdout)
await handle.kill()
}

戻り値: Promise<ProcessHandle | undefined>

kill(pid)
killpidへの直接リンク

PID を指定してプロセスを終了します。プロセスが終了するまで待機してから返ります。終了できた場合は true、見つからない場合は false を返します。

const killed = await sandbox.processes.kill(handle.pid)

戻り値: Promise<boolean>

ProcessInfo
processinfoへの直接リンク

list() が返す、追跡中のプロセスに関する情報です。

pid:

number
プロセス ID。

command?:

string
実行されたコマンド。

running:

boolean
プロセスがまだ実行中かどうか。

exitCode?:

number
プロセスが終了した場合の終了コード。

ProcessHandle
processhandleへの直接リンク

起動したバックグラウンドプロセスのハンドルです。出力の読み取り、stdin の送信、完了待機、プロセス終了のためのメソッドを提供します。

ProcessHandle インスタンスを直接作成する必要はありません。spawn()get() から返されます。

使用例
使用例への直接リンク

const handle = await sandbox.processes.spawn('npm run dev', {
onStdout: data => console.log(data),
})

// Read accumulated output
console.log(handle.pid)
console.log(handle.stdout)
console.log(handle.stderr)
console.log(handle.exitCode) // undefined while running

// Wait for completion
const result = await handle.wait()

// Send stdin
await handle.sendStdin('input data\n')

// Kill the process
await handle.kill()

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

pid:

number
プロセス ID。

stdout:

string
これまでに蓄積された stdout 出力。

stderr:

string
これまでに蓄積された stderr 出力。

exitCode:

number | undefined
終了コード。プロセスの実行中は undefined です。

command:

string | undefined
起動されたコマンド。プロセスマネージャーによって自動設定されます。

reader:

Readable
stdout の読み取り可能ストリーム。stdio で通信する LSP や JSON-RPC などのプロトコルに利用できます。

writer:

Writable
stdin への書き込み可能ストリーム。stdio で通信する LSP や JSON-RPC などのプロトコルに利用できます。

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

wait(options?)
waitoptionsへの直接リンク

プロセスが終了するまで待機し、結果を返します。待機中の出力をストリーミングするには、任意で onStdoutonStderr コールバックを渡します。wait() が解決するとコールバックは自動的に削除されます。

// Simple wait
const result = await handle.wait()
console.log(result.success, result.exitCode, result.stdout)

// Wait with streaming
const result = await handle.wait({
onStdout: data => process.stdout.write(data),
onStderr: data => process.stderr.write(data),
})

パラメーター:

options?:

WaitOptions
待機時の任意設定。
WaitOptions

onStdout?:

(data: string) => void
待機中の stdout チャンク用コールバック。

onStderr?:

(data: string) => void
待機中の stderr チャンク用コールバック。

戻り値: Promise<CommandResult>

CommandResult オブジェクトには次の値が含まれます。

success:

boolean
終了コードが0の場合は true。

exitCode:

number
数値の終了コード。

stdout:

string
stdout の完全な出力。

stderr:

string
stderr の完全な出力。

executionTimeMs:

number
実行時間(ミリ秒)。

timedOut?:

boolean
タイムアウトによってプロセスが終了された場合は true。

killed?:

boolean
シグナルによってプロセスが終了された場合は true。

kill()
killへの直接リンク

プロセスを終了します。終了できた場合は true、すでに終了していた場合は false を返します。

const killed = await handle.kill()

戻り値: Promise<boolean>

sendStdin(data)
sendstdindataへの直接リンク

プロセスの stdin にデータを送信します。プロセスがすでに終了しているか stdin を利用できない場合はスローします。

await handle.sendStdin('console.log("hello")\n')

戻り値: Promise<void>

ストリーム相互運用
ストリーム相互運用への直接リンク

ProcessHandle は、LSP や JSON-RPC など Node.js ストリームベースのプロトコルと統合するための readerwriter プロパティを公開します。

import {
createMessageConnection,
StreamMessageReader,
StreamMessageWriter,
} from 'vscode-jsonrpc/node'

const handle = await sandbox.processes.spawn('typescript-language-server --stdio')

const connection = createMessageConnection(
new StreamMessageReader(handle.reader),
new StreamMessageWriter(handle.writer),
)
connection.listen()

カスタムプロセスマネージャーの構築
カスタムプロセスマネージャーの構築への直接リンク

カスタム Sandbox Provider のプロセスマネージャーを構築するには、SandboxProcessManager を拡張して spawn()list() を実装します。基底クラスが各メソッドを ensureRunning() で自動的にラップするため、プロセス操作の前に Sandbox が起動します。

import { SandboxProcessManager, ProcessHandle } from '@mastra/core/workspace'
import type { ProcessInfo, SpawnProcessOptions } from '@mastra/core/workspace'

class MyProcessManager extends SandboxProcessManager<MySandbox> {
async spawn(command: string, options: SpawnProcessOptions = {}): Promise<ProcessHandle> {
// Your spawn implementation
const handle = new MyProcessHandle(/* ... */)
this._tracked.set(handle.pid, handle)
return handle
}

async list(): Promise<ProcessInfo[]> {
return Array.from(this._tracked.values()).map(handle => ({
pid: handle.pid,
running: handle.exitCode === undefined,
exitCode: handle.exitCode,
}))
}
}

MastraSandboxprocesses オプションを介して、プロセスマネージャーを Sandbox に渡します。

class MySandbox extends MastraSandbox {
constructor() {
super({
name: 'MySandbox',
processes: new MyProcessManager(),
})
}
}

プロセスマネージャーを指定すると、MastraSandboxspawn()wait() を使用するデフォルトの executeCommand 実装を自動作成するため、両方を実装する必要はありません。