@mastra/railway 0.3.1 → 0.4.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # @mastra/railway
2
2
 
3
+ ## 0.4.0-alpha.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Allowed derived Railway sandboxes to override the checkpoint name used for checkpoint-backed creation and refresh. ([#19907](https://github.com/mastra-ai/mastra/pull/19907))
8
+
9
+ - Updated dependencies [[`c7d30cd`](https://github.com/mastra-ai/mastra/commit/c7d30cd86009c407df91105591f03cd6e3d2854d), [`ef03fbc`](https://github.com/mastra-ai/mastra/commit/ef03fbcc556bcbc04c9b3d06fab88771ecaa043c), [`a7bbe77`](https://github.com/mastra-ai/mastra/commit/a7bbe773577f60bc4761b534ef7ec6b476332dad), [`a7bbe77`](https://github.com/mastra-ai/mastra/commit/a7bbe773577f60bc4761b534ef7ec6b476332dad), [`4e68363`](https://github.com/mastra-ai/mastra/commit/4e683634f94ebd062d26a3bb6093a8dfc7263d37), [`9251370`](https://github.com/mastra-ai/mastra/commit/9251370ad413af464aa22d7566338bec5613e8de)]:
10
+ - @mastra/core@1.52.0-alpha.11
11
+
12
+ ## 0.4.0-alpha.0
13
+
14
+ ### Minor Changes
15
+
16
+ - Added `clone()` support to the sandbox providers. `clone()` constructs an unstarted sibling sandbox that inherits the template's configuration (credentials, image, resources) with per-instance overrides for `id` and `env`, so one configured sandbox can act as a template for a fleet of sandbox clones (for example, one per project). ([#19616](https://github.com/mastra-ai/mastra/pull/19616))
17
+
18
+ ```ts
19
+ const template = new E2BSandbox({ apiKey, template: 'base' });
20
+
21
+ const projectSandbox = template.clone({
22
+ id: 'mc-project-42',
23
+ env: { GITHUB_TOKEN: token },
24
+ idleTimeoutMinutes: 30,
25
+ });
26
+ await projectSandbox.start();
27
+ ```
28
+
29
+ `idleTimeoutMinutes` is a best-effort hint that maps to each provider's native lifetime knob (Railway `idleTimeoutMinutes`, E2B/Modal/Vercel timeout in milliseconds, Daytona `autoStopInterval`, Blaxel TTL duration). Docker and Apple Container ignore it since they have no provider-side idle teardown.
30
+
31
+ ### Patch Changes
32
+
33
+ - Updated dependencies [[`ec857fc`](https://github.com/mastra-ai/mastra/commit/ec857fc79c264b53b38e16478c789b7177f2ad59), [`e1f2fae`](https://github.com/mastra-ai/mastra/commit/e1f2faebaf048c3d4c2e2c01d293767c195d5794), [`63aa799`](https://github.com/mastra-ai/mastra/commit/63aa799c6b44eacc7806cda6846b7c5bbee06b37), [`73db8db`](https://github.com/mastra-ai/mastra/commit/73db8db90d69ab6153c7942749f624db0d96952d), [`73db8db`](https://github.com/mastra-ai/mastra/commit/73db8db90d69ab6153c7942749f624db0d96952d), [`76b7181`](https://github.com/mastra-ai/mastra/commit/76b71810366e6d90b9d3973149d1c7ba3659ffb9), [`0c0e8d7`](https://github.com/mastra-ai/mastra/commit/0c0e8d7becd4d1445c656b78d5d845f606c1ff9d), [`9f7c67a`](https://github.com/mastra-ai/mastra/commit/9f7c67abeeb52c41c51a9b5edee60b62afe7cd8d), [`3b65e68`](https://github.com/mastra-ai/mastra/commit/3b65e68d7f1c771c7a70eea42d83fefdd28cad88), [`e3868e2`](https://github.com/mastra-ai/mastra/commit/e3868e22babfffd0133771669ca724501c2dd58e)]:
34
+ - @mastra/core@1.52.0-alpha.5
35
+
3
36
  ## 0.3.1
4
37
 
5
38
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -487,6 +487,46 @@ var RailwaySandbox = class _RailwaySandbox extends workspace.MastraSandbox {
487
487
  await child._start();
488
488
  return child;
489
489
  }
490
+ /**
491
+ * Construct a sibling `RailwaySandbox` that inherits this sandbox's
492
+ * credentials and defaults (token, environment, checkpoint, network
493
+ * isolation, timeout, template, instructions) with per-instance overrides.
494
+ *
495
+ * Unlike {@link fork}, `clone` performs no I/O and does not require this
496
+ * sandbox to be started — the returned sandbox is not started and provisions
497
+ * (or reattaches, when `sandboxId` is set) on its own `start()`. Use it when
498
+ * one configured sandbox acts as the template for a fleet of independent
499
+ * sandboxes (e.g. one per project).
500
+ */
501
+ clone(options = {}) {
502
+ return new _RailwaySandbox({
503
+ ...options.id !== void 0 && { id: options.id },
504
+ ...this._token !== void 0 && { token: this._token },
505
+ ...this._environmentId !== void 0 && { environmentId: this._environmentId },
506
+ ...options.sandboxId !== void 0 && { sandboxId: options.sandboxId },
507
+ ...(options.checkpointName ?? this._checkpointName) !== void 0 && {
508
+ checkpointName: options.checkpointName ?? this._checkpointName
509
+ },
510
+ idleTimeoutMinutes: options.idleTimeoutMinutes ?? this._idleTimeoutMinutes,
511
+ ...this._networkIsolation !== void 0 && { networkIsolation: this._networkIsolation },
512
+ env: options.env ?? this._env,
513
+ ...this._templateOption !== void 0 && { template: this._templateOption },
514
+ ...this._timeout !== void 0 && { timeout: this._timeout },
515
+ ...this._instructionsOverride !== void 0 && { instructions: this._instructionsOverride }
516
+ });
517
+ }
518
+ /**
519
+ * Whether a Railway API token was resolved at construction (explicit option
520
+ * or the `RAILWAY_API_TOKEN` env fallback). Lets callers gate features on a
521
+ * usable configuration without provisioning a sandbox.
522
+ */
523
+ get hasCredentials() {
524
+ return this._token !== void 0 && this._token !== "";
525
+ }
526
+ /** The configured idle teardown window in minutes, if any. */
527
+ get idleTimeoutMinutes() {
528
+ return this._idleTimeoutMinutes;
529
+ }
490
530
  // ---------------------------------------------------------------------------
491
531
  // Info & Instructions
492
532
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/shell-quote.ts","../src/sandbox/process-manager.ts","../src/sandbox/index.ts","../src/provider.ts"],"names":["ProcessHandle","SandboxProcessManager","MastraSandbox","SandboxNotReadyError","Sandbox","sandbox","checkpoint","SandboxNotFoundError","SandboxFailedError","SandboxTimeoutError"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Shell-quote a single argument for safe use in a command string.\n *\n * Arguments containing only safe characters are returned as-is.\n * All others are wrapped in single quotes with embedded single quotes escaped.\n */\nexport function shellQuote(arg: string): string {\n // Safe characters that don't need quoting\n if (/^[a-zA-Z0-9._\\-/@:=]+$/.test(arg)) return arg;\n // Wrap in single quotes, escaping any embedded single quotes\n return \"'\" + arg.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n","/**\n * Railway Process Manager\n *\n * Implements SandboxProcessManager for Railway sandboxes.\n * Wraps the Railway SDK's `Sandbox.exec()` API.\n *\n * Railway's `exec(command, options)` accepts per-call `cwd` and `env` options\n * (since SDK v3.3.1) and returns an `ExecHandle` that runs the command\n * server-side, independently of the client. Each spawn() starts one exec.\n * The handle streams output via `onStdout`/`onStderr` callbacks wired to\n * `emitStdout`/`emitStderr`, exposes a durable `sessionName`, and can be\n * terminated with `kill(signal)`.\n */\n\nimport { ProcessHandle, SandboxProcessManager } from '@mastra/core/workspace';\nimport type { CommandResult, ProcessInfo, SpawnProcessOptions } from '@mastra/core/workspace';\nimport type { ExecHandle, ExecResult } from 'railway';\nimport type { RailwaySandbox } from './index';\n\nexport const LOG_PREFIX = '[RailwaySandbox]';\n\n// =============================================================================\n// Railway Process Handle\n// =============================================================================\n\n/**\n * Wraps a Railway ExecHandle to conform to Mastra's ProcessHandle.\n * Not exported — internal to this module.\n */\nclass RailwayProcessHandle extends ProcessHandle {\n readonly pid: string;\n\n private readonly _execHandle: ExecHandle;\n private readonly _startTime: number;\n private _exitCode: number | undefined;\n private _waitPromise: Promise<CommandResult> | null = null;\n private _killed = false;\n\n constructor(pid: string, execHandle: ExecHandle, startTime: number, options?: SpawnProcessOptions) {\n super(options);\n this.pid = pid;\n this._execHandle = execHandle;\n this._startTime = startTime;\n\n // Resolve exit code once the command completes so exitCode is available\n // without an explicit wait().\n void this._execHandle.then(\n (result: ExecResult) => {\n // -1 means terminated by a signal (e.g. after kill()).\n this._exitCode = result.exitCode ?? (this._killed ? 137 : -1);\n },\n () => {\n if (this._exitCode === undefined) {\n this._exitCode = 1;\n }\n },\n );\n }\n\n get exitCode(): number | undefined {\n return this._exitCode;\n }\n\n async wait(): Promise<CommandResult> {\n // Idempotent — cache the promise so repeated calls return the same result.\n if (!this._waitPromise) {\n this._waitPromise = this._doWait();\n }\n return this._waitPromise;\n }\n\n private async _doWait(): Promise<CommandResult> {\n try {\n const result = await this._execHandle;\n const exitCode = result.exitCode ?? (this._killed ? 137 : -1);\n this._exitCode = exitCode;\n\n // Railway captures output server-side; surface it through the base buffers\n // if streaming callbacks didn't already populate them.\n if (result.stdout && !this.stdout) this.emitStdout(result.stdout);\n if (result.stderr && !this.stderr) this.emitStderr(result.stderr);\n\n return {\n success: exitCode === 0,\n exitCode,\n stdout: this.stdout,\n stderr: this.stderr,\n executionTimeMs: Date.now() - this._startTime,\n killed: this._killed,\n timedOut: result.timedOut,\n };\n } catch (error) {\n const exitCode = this._exitCode ?? 1;\n this._exitCode = exitCode;\n return {\n success: false,\n exitCode,\n stdout: this.stdout,\n stderr: this.stderr || (error instanceof Error ? error.message : String(error)),\n executionTimeMs: Date.now() - this._startTime,\n killed: this._killed,\n };\n }\n }\n\n async kill(): Promise<boolean> {\n if (this._exitCode !== undefined) return false;\n this._killed = true;\n try {\n return await this._execHandle.kill('TERM');\n } catch {\n // Command may already be gone.\n return false;\n }\n }\n\n async sendStdin(_data: string): Promise<void> {\n // Railway's exec API does not expose stdin streaming.\n throw new Error(`${LOG_PREFIX} sending stdin is not supported by the Railway sandbox provider`);\n }\n}\n\n// =============================================================================\n// Railway Process Manager\n// =============================================================================\n\nexport interface RailwayProcessManagerOptions {\n env?: Record<string, string | undefined>;\n}\n\n/**\n * Railway implementation of SandboxProcessManager.\n * Uses the Railway SDK's `Sandbox.exec()` with one exec per spawned process.\n */\nexport class RailwayProcessManager extends SandboxProcessManager<RailwaySandbox> {\n private _spawnCounter = 0;\n\n constructor(opts: RailwayProcessManagerOptions = {}) {\n super({ env: opts.env });\n }\n\n async spawn(command: string, options: SpawnProcessOptions = {}): Promise<ProcessHandle> {\n const railway = this.sandbox.railway;\n\n // Merge default env with per-spawn env.\n const mergedEnv = { ...this.env, ...options.env };\n const env = Object.fromEntries(\n Object.entries(mergedEnv).filter((entry): entry is [string, string] => entry[1] !== undefined),\n );\n\n const pid = `railway-proc-${Date.now().toString(36)}-${(this._spawnCounter++).toString(36)}`;\n\n // Deferred reference — callbacks fire asynchronously after the handle is\n // assigned, so `handle` is always defined by the time they run.\n let handle: RailwayProcessHandle;\n\n const execHandle = railway.exec(command, {\n ...(options.timeout !== undefined && { timeoutSec: Math.ceil(options.timeout / 1000) }),\n ...(options.cwd !== undefined && { cwd: options.cwd }),\n ...(Object.keys(env).length > 0 && { env }),\n onStdout: (chunk: string) => handle.emitStdout(chunk),\n onStderr: (chunk: string) => handle.emitStderr(chunk),\n });\n\n handle = new RailwayProcessHandle(pid, execHandle, Date.now(), options);\n this._tracked.set(handle.pid, handle);\n return handle;\n }\n\n /**\n * List tracked processes.\n *\n * Railway has no API to enumerate running exec sessions by sandbox, so this\n * reports the processes this manager spawned.\n */\n async list(): Promise<ProcessInfo[]> {\n return Array.from(this._tracked.values()).map(handle => ({\n pid: handle.pid,\n command: handle.command,\n running: handle.exitCode === undefined,\n ...(handle.exitCode !== undefined && { exitCode: handle.exitCode }),\n }));\n }\n}\n","/**\n * Railway Sandbox Provider\n *\n * A Railway sandbox implementation for Mastra workspaces. Provisions an\n * ephemeral, isolated Linux VM on Railway, runs commands in it via the\n * Railway TypeScript SDK, and destroys it on teardown.\n *\n * @see https://docs.railway.com/sandboxes\n */\n\nimport type {\n CommandResult,\n ExecuteCommandOptions,\n InstructionsOption,\n MastraSandboxOptions,\n ProviderStatus,\n SandboxInfo,\n} from '@mastra/core/workspace';\nimport { MastraSandbox, SandboxNotReadyError } from '@mastra/core/workspace';\nimport { Sandbox, SandboxFailedError, SandboxNotFoundError, SandboxTimeoutError } from 'railway';\nimport type { SandboxNetworkIsolation, SandboxTemplate } from 'railway';\nimport { shellQuote } from '../utils/shell-quote';\nimport { LOG_PREFIX, RailwayProcessManager } from './process-manager';\n\n// =============================================================================\n// Railway Sandbox Options\n// =============================================================================\n\n/**\n * Railway sandbox provider configuration.\n */\nexport interface RailwaySandboxOptions extends Omit<MastraSandboxOptions, 'processes'> {\n /** Unique identifier for this sandbox instance. */\n id?: string;\n /** Railway API token. Falls back to the RAILWAY_API_TOKEN env var. */\n token?: string;\n /** Railway environment ID. Falls back to the RAILWAY_ENVIRONMENT_ID env var. */\n environmentId?: string;\n /**\n * Reattach to an existing Railway sandbox by its Railway ID instead of\n * creating a new one. When set, `start()` calls `Sandbox.connect()`.\n */\n sandboxId?: string;\n /**\n * Reuse a saved Railway sandbox checkpoint as the baseline filesystem for\n * new sandboxes. When the named checkpoint is missing, the sandbox is created\n * normally and a checkpoint is captured after setup succeeds.\n */\n checkpointName?: string;\n /**\n * How long the sandbox can sit idle (no `exec` interaction) before Railway\n * destroys it automatically. Range depends on plan (1–120 minutes on\n * Hobby/Pro, 1–5 on Trial/Free). Defaults to the plan default when omitted.\n */\n idleTimeoutMinutes?: number;\n /**\n * Network isolation mode.\n * - `ISOLATED` (default): outbound internet only, no private network access.\n * - `PRIVATE`: joins the environment's private network.\n */\n networkIsolation?: SandboxNetworkIsolation;\n /** Environment variables baked into the sandbox, available to every command. */\n env?: Record<string, string>;\n /**\n * Provision the sandbox from a custom base image built with the Railway\n * template builder. Use this to pre-install packages or run setup steps so\n * every sandbox created from it starts ready.\n *\n * - Builder callback — receives the base `Sandbox.template()` and returns the\n * configured template. Railway builds the template when `Sandbox.create()`\n * runs during `start()`.\n * ```ts\n * template: t => t.withPackages('git', 'curl').run('npm i -g pnpm')\n * ```\n * - Pre-built `SandboxTemplate` — pass a template to reuse it across\n * sandboxes. Railway still builds the image during sandbox creation.\n *\n * Ignored when `sandboxId` is set (reattach) or when forking.\n */\n template?: SandboxTemplate | ((base: SandboxTemplate) => SandboxTemplate);\n /**\n * Default execution timeout in milliseconds applied to commands that don't\n * specify their own timeout. When omitted, commands run until they exit.\n */\n timeout?: number;\n /**\n * Custom instructions that override the default instructions returned by\n * `getInstructions()`.\n *\n * - `string` — Fully replaces the default instructions. Pass an empty string\n * to suppress instructions entirely.\n * - `(opts) => string` — Receives the default instructions and optional\n * request context so you can extend or customise per-request.\n */\n instructions?: InstructionsOption;\n}\n\n// =============================================================================\n// Railway Sandbox Implementation\n// =============================================================================\n\n/**\n * Railway sandbox provider for Mastra workspaces.\n *\n * Features:\n * - Ephemeral, isolated Linux VM via the Railway TypeScript SDK\n * - Command execution with streaming output and timeouts\n * - Configurable idle timeout and network isolation\n * - Reattach to an existing sandbox by Railway ID\n *\n * @example Basic usage\n * ```typescript\n * import { Workspace } from '@mastra/core/workspace';\n * import { RailwaySandbox } from '@mastra/railway';\n *\n * const sandbox = new RailwaySandbox({\n * // token + environmentId read from RAILWAY_API_TOKEN / RAILWAY_ENVIRONMENT_ID\n * idleTimeoutMinutes: 30,\n * });\n *\n * const workspace = new Workspace({ sandbox });\n * const result = await workspace.executeCode('console.log(\"Hello!\")');\n * ```\n *\n * @example Private networking\n * ```typescript\n * const sandbox = new RailwaySandbox({\n * networkIsolation: 'PRIVATE',\n * env: { NODE_ENV: 'production' },\n * });\n * ```\n */\nexport class RailwaySandbox extends MastraSandbox {\n readonly id: string;\n readonly name = 'RailwaySandbox';\n readonly provider = 'railway';\n status: ProviderStatus = 'pending';\n\n declare readonly processes: RailwayProcessManager;\n\n private _sandbox: Sandbox | null = null;\n private _createdAt: Date | null = null;\n private _checkpointRefreshTimer: ReturnType<typeof setTimeout> | null = null;\n private _checkpointRefreshInFlight: Promise<void> | null = null;\n\n private readonly _token?: string;\n private readonly _environmentId?: string;\n private readonly _sandboxId?: string;\n private readonly _checkpointName?: string;\n private readonly _idleTimeoutMinutes?: number;\n private readonly _networkIsolation?: SandboxNetworkIsolation;\n private readonly _env: Record<string, string>;\n private readonly _timeout?: number;\n private readonly _instructionsOverride?: InstructionsOption;\n private readonly _templateOption?: RailwaySandboxOptions['template'];\n\n constructor(options: RailwaySandboxOptions = {}) {\n super({\n ...options,\n name: 'RailwaySandbox',\n processes: new RailwayProcessManager({ env: options.env }),\n });\n\n this.id = options.id ?? this.generateId();\n this._token = options.token ?? process.env.RAILWAY_API_TOKEN;\n this._environmentId = options.environmentId ?? process.env.RAILWAY_ENVIRONMENT_ID;\n this._sandboxId = options.sandboxId;\n this._checkpointName = options.checkpointName;\n this._idleTimeoutMinutes = options.idleTimeoutMinutes;\n this._networkIsolation = options.networkIsolation;\n this._env = options.env ?? {};\n this._timeout = options.timeout;\n this._instructionsOverride = options.instructions;\n this._templateOption = options.template;\n }\n\n private generateId(): string {\n return `railway-sandbox-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n /**\n * Get the underlying Railway Sandbox instance for direct SDK access.\n *\n * @throws {SandboxNotReadyError} If the sandbox has not been started.\n */\n get railway(): Sandbox {\n if (!this._sandbox) {\n throw new SandboxNotReadyError(this.id);\n }\n return this._sandbox;\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n /**\n * Start the Railway sandbox.\n *\n * Reattaches to an existing sandbox when `sandboxId` is configured,\n * otherwise provisions a new one. Resolves once the sandbox is RUNNING.\n */\n async start(): Promise<void> {\n if (this._sandbox) {\n return;\n }\n\n await this._startRailwaySandbox({ reconnectSandboxId: this._sandboxId, fallbackToCreate: false });\n }\n\n async restart(): Promise<void> {\n const reconnectSandboxId = this._sandbox?.id ?? this._sandboxId;\n this._cancelCheckpointRefresh();\n await this._checkpointRefreshInFlight?.catch(error => {\n this.logger.warn(`${LOG_PREFIX} Failed to flush in-flight checkpoint before restart:`, error);\n });\n this._sandbox = null;\n this._createdAt = null;\n this.status = 'starting';\n\n try {\n await this._startRailwaySandbox({ reconnectSandboxId, fallbackToCreate: true });\n this.status = 'running';\n } catch (error) {\n this.status = 'error';\n throw error;\n }\n }\n\n async withRestartRetry<T>(operation: () => Promise<T>): Promise<T> {\n await this.ensureRunning();\n try {\n return await operation();\n } catch (error) {\n if (!this.isSandboxUnavailableError(error)) {\n throw error;\n }\n\n await this.restart();\n return await operation();\n } finally {\n this._scheduleCheckpointRefresh();\n }\n }\n\n private async _startRailwaySandbox({\n reconnectSandboxId,\n fallbackToCreate,\n }: {\n reconnectSandboxId?: string;\n fallbackToCreate: boolean;\n }): Promise<void> {\n const clientConfig = this._clientConfig();\n const createOptions = this._createOptions(clientConfig);\n\n this._sandbox = reconnectSandboxId\n ? await this._reconnectSandbox(reconnectSandboxId, fallbackToCreate, clientConfig, createOptions)\n : await this._createNewSandbox(createOptions);\n\n this._createdAt = this._sandbox.createdAt ? new Date(this._sandbox.createdAt) : new Date();\n this.logger.debug(`${LOG_PREFIX} Railway sandbox ${this._sandbox.id} ready for logical ID: ${this.id}`);\n this._scheduleCheckpointRefresh();\n }\n\n /**\n * Reconnect to an existing Railway sandbox, creating a fresh one when\n * `fallbackToCreate` is set and the sandbox is unavailable or not running.\n */\n private async _reconnectSandbox(\n reconnectSandboxId: string,\n fallbackToCreate: boolean,\n clientConfig: { token?: string; environmentId?: string },\n createOptions: ReturnType<RailwaySandbox['_createOptions']>,\n ): Promise<Sandbox> {\n this.logger.debug(`${LOG_PREFIX} Reconnecting to Railway sandbox ${reconnectSandboxId}...`);\n\n let connectedSandbox: Sandbox;\n try {\n connectedSandbox = await Sandbox.connect(reconnectSandboxId, clientConfig);\n } catch (error) {\n if (!fallbackToCreate || !this.isSandboxUnavailableError(error)) {\n throw error;\n }\n return this._createNewSandbox(createOptions);\n }\n\n if (connectedSandbox.status === 'RUNNING') {\n return connectedSandbox;\n }\n\n if (!fallbackToCreate) {\n throw new Error(`Railway sandbox ${reconnectSandboxId} is not running (status: ${connectedSandbox.status})`);\n }\n\n return this._createNewSandbox(createOptions);\n }\n\n private _clientConfig(): { token?: string; environmentId?: string } {\n return {\n ...(this._token !== undefined && { token: this._token }),\n ...(this._environmentId !== undefined && { environmentId: this._environmentId }),\n };\n }\n\n private _createOptions(clientConfig: { token?: string; environmentId?: string }) {\n return {\n ...clientConfig,\n ...(this._idleTimeoutMinutes !== undefined && { idleTimeoutMinutes: this._idleTimeoutMinutes }),\n ...(this._networkIsolation !== undefined && { networkIsolation: this._networkIsolation }),\n ...(Object.keys(this._env).length > 0 && { env: this._env }),\n };\n }\n\n private async _createNewSandbox(createOptions: ReturnType<RailwaySandbox['_createOptions']>): Promise<Sandbox> {\n const checkpointSandbox = await this._tryCreateFromCheckpoint(createOptions);\n if (checkpointSandbox) {\n return checkpointSandbox;\n }\n\n if (this._templateOption) {\n const template = this._resolveTemplate();\n this.logger.debug(`${LOG_PREFIX} Creating Railway sandbox from template for: ${this.id}`);\n const sandbox = await Sandbox.create(template, createOptions);\n await this._checkpointSandbox(sandbox);\n return sandbox;\n }\n\n this.logger.debug(`${LOG_PREFIX} Creating Railway sandbox for: ${this.id}`);\n const sandbox = await Sandbox.create(createOptions);\n await this._checkpointSandbox(sandbox);\n return sandbox;\n }\n\n private async _tryCreateFromCheckpoint(\n createOptions: ReturnType<RailwaySandbox['_createOptions']>,\n ): Promise<Sandbox | undefined> {\n if (!this._checkpointName) {\n return undefined;\n }\n\n this.logger.debug(`${LOG_PREFIX} Creating Railway sandbox from checkpoint ${this._checkpointName} for: ${this.id}`);\n\n try {\n const sandbox = await Sandbox.create(this._checkpointName, createOptions);\n return sandbox;\n } catch (error) {\n if (!this.isCheckpointUnavailableError(error)) {\n throw error;\n }\n return undefined;\n }\n }\n\n private async _checkpointSandbox(sandbox: Sandbox): Promise<void> {\n if (!this._checkpointName) {\n return;\n }\n\n try {\n this.logger.debug(`${LOG_PREFIX} Capturing Railway sandbox checkpoint ${this._checkpointName} for: ${this.id}`);\n await sandbox.checkpoint(this._checkpointName);\n } catch (error) {\n if (!this.isCheckpointAlreadyExistsError(error)) {\n throw error;\n }\n\n await this._deleteCheckpointByName(this._checkpointName);\n await sandbox.checkpoint(this._checkpointName);\n }\n }\n\n private async _deleteCheckpointByName(name: string): Promise<void> {\n try {\n const checkpoint = (await Sandbox.checkpoints(this._clientConfig())).find(checkpoint => checkpoint.key === name);\n if (!checkpoint) {\n return;\n }\n\n await Sandbox.deleteCheckpoint(checkpoint.id, this._clientConfig());\n } catch (error) {\n if (!this.isCheckpointUnavailableError(error)) {\n throw error;\n }\n }\n }\n\n private _scheduleCheckpointRefresh(): void {\n if (!this._checkpointName || !this._sandbox) {\n return;\n }\n\n const idleTimeoutMinutes = this._idleTimeoutMinutes ?? this._sandbox.idleTimeoutMinutes;\n if (!idleTimeoutMinutes) {\n return;\n }\n\n if (this._checkpointRefreshTimer) {\n clearTimeout(this._checkpointRefreshTimer);\n }\n\n const delayMs = Math.max(1_000, idleTimeoutMinutes * 60_000 - 10_000);\n this._checkpointRefreshTimer = setTimeout(() => {\n this._checkpointRefreshTimer = null;\n const sandbox = this._sandbox;\n if (!sandbox) {\n return;\n }\n\n const refresh = this._checkpointSandbox(sandbox).finally(() => {\n if (this._checkpointRefreshInFlight === refresh) {\n this._checkpointRefreshInFlight = null;\n }\n });\n this._checkpointRefreshInFlight = refresh;\n this._checkpointRefreshInFlight.catch(error => {\n this.logger.warn(`${LOG_PREFIX} Failed to refresh Railway sandbox checkpoint ${this._checkpointName}:`, error);\n });\n }, delayMs);\n this._checkpointRefreshTimer.unref?.();\n }\n\n private _cancelCheckpointRefresh(): void {\n if (this._checkpointRefreshTimer) {\n clearTimeout(this._checkpointRefreshTimer);\n this._checkpointRefreshTimer = null;\n }\n }\n\n private async _flushCheckpointRefresh(): Promise<void> {\n this._cancelCheckpointRefresh();\n\n if (this._checkpointRefreshInFlight) {\n await this._checkpointRefreshInFlight;\n return;\n }\n\n if (this._sandbox) {\n await this._checkpointSandbox(this._sandbox);\n }\n }\n\n private isCheckpointUnavailableError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n return (\n message.includes('checkpoint') &&\n ['not found', 'does not exist', 'missing', 'unknown', 'no checkpoint'].some(phrase => message.includes(phrase))\n );\n }\n\n private isCheckpointAlreadyExistsError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n return (\n message.includes('checkpoint') &&\n (['already exists', 'must be unused', 'unique'].some(phrase => message.includes(phrase)) ||\n (message.includes('name') && message.includes('used')))\n );\n }\n\n private isSandboxUnavailableError(error: unknown, seen = new Set<unknown>()): boolean {\n if (error && typeof error === 'object') {\n if (seen.has(error)) return false;\n seen.add(error);\n }\n\n if (\n error instanceof SandboxNotFoundError ||\n error instanceof SandboxFailedError ||\n (error instanceof SandboxTimeoutError && error.resource === 'sandbox')\n ) {\n return true;\n }\n\n if (error && typeof error === 'object') {\n const errorLike = error as { name?: unknown; message?: unknown; resource?: unknown; cause?: unknown };\n const name = typeof errorLike.name === 'string' ? errorLike.name : '';\n const message = typeof errorLike.message === 'string' ? errorLike.message.toLowerCase() : '';\n\n if (\n name === 'SandboxNotFoundError' ||\n name === 'SandboxFailedError' ||\n (name === 'SandboxTimeoutError' && errorLike.resource === 'sandbox')\n ) {\n return true;\n }\n\n if (\n message.includes('sandbox') &&\n ['not found', 'destroyed', 'failed', 'not running', 'unavailable'].some(phrase => message.includes(phrase))\n ) {\n return true;\n }\n\n if (errorLike.cause !== undefined) {\n return this.isSandboxUnavailableError(errorLike.cause, seen);\n }\n }\n\n return false;\n }\n\n /**\n * Stop the Railway sandbox.\n *\n * Railway sandboxes have no separate \"stopped\" state — they're either\n * running or destroyed — so stopping destroys the sandbox.\n */\n async stop(): Promise<void> {\n await this._teardown();\n }\n\n /**\n * Destroy the Railway sandbox and release its resources.\n */\n async destroy(): Promise<void> {\n await this._teardown();\n }\n\n private async _teardown(): Promise<void> {\n if (!this._sandbox) {\n this._cancelCheckpointRefresh();\n return;\n }\n const sandbox = this._sandbox;\n try {\n await this._flushCheckpointRefresh();\n } catch (error) {\n this.logger.warn(`${LOG_PREFIX} Failed to flush checkpoint before teardown:`, error);\n }\n this._sandbox = null;\n try {\n await sandbox.destroy();\n } catch (error) {\n this.logger.warn(`${LOG_PREFIX} Failed to destroy Railway sandbox ${sandbox.id}:`, error);\n }\n }\n\n /**\n * Resolve the configured template into a `SandboxTemplate` that Railway\n * builds during `Sandbox.create()`. Accepts either a pre-built\n * `SandboxTemplate` or a builder callback over `Sandbox.template()`.\n */\n private _resolveTemplate(): SandboxTemplate {\n const option = this._templateOption!;\n return typeof option === 'function' ? option(Sandbox.template()) : option;\n }\n\n /**\n * Fork this running sandbox into a new, independent `RailwaySandbox`.\n *\n * Clones the filesystem (a fresh boot, not live processes) into the same\n * environment. The returned sandbox is already started and reattached to the\n * forked Railway sandbox; it inherits this sandbox's credentials and defaults\n * unless overridden via `options`.\n *\n * @throws {SandboxNotReadyError} If this sandbox has not been started.\n */\n async fork(\n options: Pick<RailwaySandboxOptions, 'id' | 'idleTimeoutMinutes' | 'networkIsolation' | 'env'> = {},\n ): Promise<RailwaySandbox> {\n const source = this.railway;\n const forked = await source.fork({\n ...(options.idleTimeoutMinutes !== undefined && { idleTimeoutMinutes: options.idleTimeoutMinutes }),\n ...(options.networkIsolation !== undefined && { networkIsolation: options.networkIsolation }),\n ...(options.env !== undefined && { env: options.env }),\n });\n\n const child = new RailwaySandbox({\n ...(options.id !== undefined && { id: options.id }),\n ...(this._token !== undefined && { token: this._token }),\n ...(this._environmentId !== undefined && { environmentId: this._environmentId }),\n sandboxId: forked.id,\n idleTimeoutMinutes: options.idleTimeoutMinutes ?? this._idleTimeoutMinutes,\n networkIsolation: options.networkIsolation ?? this._networkIsolation,\n env: options.env ?? this._env,\n timeout: this._timeout,\n });\n await child._start();\n return child;\n }\n\n // ---------------------------------------------------------------------------\n // Info & Instructions\n // ---------------------------------------------------------------------------\n\n async getInfo(): Promise<SandboxInfo> {\n return {\n id: this.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n createdAt: this._createdAt ?? new Date(),\n metadata: {\n ...(this._sandbox && {\n railwaySandboxId: this._sandbox.id,\n environmentId: this._sandbox.environmentId,\n region: this._sandbox.region,\n networkIsolation: this._sandbox.networkIsolation,\n ...(this._sandbox.idleTimeoutMinutes != null && {\n idleTimeoutMinutes: this._sandbox.idleTimeoutMinutes,\n }),\n }),\n },\n };\n }\n\n getInstructions(): string {\n const defaultInstructions = this._buildDefaultInstructions();\n\n if (typeof this._instructionsOverride === 'string') {\n return this._instructionsOverride;\n }\n if (typeof this._instructionsOverride === 'function') {\n return this._instructionsOverride({ defaultInstructions });\n }\n return defaultInstructions;\n }\n\n private _buildDefaultInstructions(): string {\n const parts: string[] = [];\n parts.push('Railway cloud sandbox: an isolated Debian Linux VM with outbound internet access.');\n\n if (this._networkIsolation === 'PRIVATE') {\n parts.push('Joined to the environment private network.');\n }\n\n if (this._timeout !== undefined) {\n parts.push(`Default command timeout: ${Math.ceil(this._timeout / 1000)}s.`);\n } else {\n parts.push('Commands run until they exit unless a timeout is set.');\n }\n\n if (this._idleTimeoutMinutes !== undefined) {\n parts.push(`Idle timeout: ${this._idleTimeoutMinutes} minute(s).`);\n }\n\n return parts.join(' ');\n }\n\n // ---------------------------------------------------------------------------\n // Command Execution\n // ---------------------------------------------------------------------------\n\n /**\n * Execute a command in the sandbox and return the result.\n */\n async executeCommand(\n command: string,\n args: string[] = [],\n options: ExecuteCommandOptions = {},\n ): Promise<CommandResult> {\n return this.withRestartRetry(async () => {\n const fullCommand = args.length > 0 ? `${command} ${args.map(shellQuote).join(' ')}` : command;\n const timeout = options.timeout ?? this._timeout;\n const env = options.env\n ? Object.fromEntries(\n Object.entries(options.env).filter((entry): entry is [string, string] => entry[1] !== undefined),\n )\n : undefined;\n const startedAt = Date.now();\n const result = await this.railway.exec(fullCommand, {\n ...(timeout !== undefined && { timeoutSec: Math.ceil(timeout / 1000) }),\n ...(options.cwd !== undefined && { cwd: options.cwd }),\n ...(env !== undefined && { env }),\n });\n const exitCode = result.exitCode ?? -1;\n return {\n success: exitCode === 0,\n exitCode,\n stdout: result.stdout,\n stderr: result.stderr,\n executionTimeMs: Date.now() - startedAt,\n command,\n args,\n timedOut: result.timedOut,\n };\n });\n }\n}\n","/**\n * Railway sandbox provider descriptor for MastraEditor.\n *\n * @example\n * ```typescript\n * import { railwaySandboxProvider } from '@mastra/railway';\n *\n * const editor = new MastraEditor({\n * sandboxes: { [railwaySandboxProvider.id]: railwaySandboxProvider },\n * });\n * ```\n */\nimport type { SandboxProvider } from '@mastra/core/editor';\nimport { RailwaySandbox } from './sandbox';\n\n/**\n * Serializable subset of RailwaySandboxOptions for editor storage.\n */\ninterface RailwayProviderConfig {\n token?: string;\n environmentId?: string;\n sandboxId?: string;\n idleTimeoutMinutes?: number;\n networkIsolation?: 'ISOLATED' | 'PRIVATE';\n env?: Record<string, string>;\n timeout?: number;\n}\n\nexport const railwaySandboxProvider: SandboxProvider<RailwayProviderConfig> = {\n id: 'railway',\n name: 'Railway Sandbox',\n description: 'Ephemeral, isolated Linux VM powered by Railway',\n configSchema: {\n type: 'object',\n properties: {\n token: { type: 'string', description: 'Railway API token (falls back to RAILWAY_API_TOKEN)' },\n environmentId: {\n type: 'string',\n description: 'Railway environment ID (falls back to RAILWAY_ENVIRONMENT_ID)',\n },\n sandboxId: { type: 'string', description: 'Reattach to an existing Railway sandbox by ID' },\n idleTimeoutMinutes: {\n type: 'number',\n description: 'Minutes a sandbox can sit idle before Railway destroys it',\n },\n networkIsolation: {\n type: 'string',\n description: 'Network isolation mode',\n enum: ['ISOLATED', 'PRIVATE'],\n default: 'ISOLATED',\n },\n env: {\n type: 'object',\n description: 'Environment variables',\n additionalProperties: { type: 'string' },\n },\n timeout: { type: 'number', description: 'Default command timeout in ms' },\n },\n },\n createSandbox: config => new RailwaySandbox(config),\n};\n"]}
1
+ {"version":3,"sources":["../src/utils/shell-quote.ts","../src/sandbox/process-manager.ts","../src/sandbox/index.ts","../src/provider.ts"],"names":["ProcessHandle","SandboxProcessManager","MastraSandbox","SandboxNotReadyError","Sandbox","sandbox","checkpoint","SandboxNotFoundError","SandboxFailedError","SandboxTimeoutError"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Shell-quote a single argument for safe use in a command string.\n *\n * Arguments containing only safe characters are returned as-is.\n * All others are wrapped in single quotes with embedded single quotes escaped.\n */\nexport function shellQuote(arg: string): string {\n // Safe characters that don't need quoting\n if (/^[a-zA-Z0-9._\\-/@:=]+$/.test(arg)) return arg;\n // Wrap in single quotes, escaping any embedded single quotes\n return \"'\" + arg.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n","/**\n * Railway Process Manager\n *\n * Implements SandboxProcessManager for Railway sandboxes.\n * Wraps the Railway SDK's `Sandbox.exec()` API.\n *\n * Railway's `exec(command, options)` accepts per-call `cwd` and `env` options\n * (since SDK v3.3.1) and returns an `ExecHandle` that runs the command\n * server-side, independently of the client. Each spawn() starts one exec.\n * The handle streams output via `onStdout`/`onStderr` callbacks wired to\n * `emitStdout`/`emitStderr`, exposes a durable `sessionName`, and can be\n * terminated with `kill(signal)`.\n */\n\nimport { ProcessHandle, SandboxProcessManager } from '@mastra/core/workspace';\nimport type { CommandResult, ProcessInfo, SpawnProcessOptions } from '@mastra/core/workspace';\nimport type { ExecHandle, ExecResult } from 'railway';\nimport type { RailwaySandbox } from './index';\n\nexport const LOG_PREFIX = '[RailwaySandbox]';\n\n// =============================================================================\n// Railway Process Handle\n// =============================================================================\n\n/**\n * Wraps a Railway ExecHandle to conform to Mastra's ProcessHandle.\n * Not exported — internal to this module.\n */\nclass RailwayProcessHandle extends ProcessHandle {\n readonly pid: string;\n\n private readonly _execHandle: ExecHandle;\n private readonly _startTime: number;\n private _exitCode: number | undefined;\n private _waitPromise: Promise<CommandResult> | null = null;\n private _killed = false;\n\n constructor(pid: string, execHandle: ExecHandle, startTime: number, options?: SpawnProcessOptions) {\n super(options);\n this.pid = pid;\n this._execHandle = execHandle;\n this._startTime = startTime;\n\n // Resolve exit code once the command completes so exitCode is available\n // without an explicit wait().\n void this._execHandle.then(\n (result: ExecResult) => {\n // -1 means terminated by a signal (e.g. after kill()).\n this._exitCode = result.exitCode ?? (this._killed ? 137 : -1);\n },\n () => {\n if (this._exitCode === undefined) {\n this._exitCode = 1;\n }\n },\n );\n }\n\n get exitCode(): number | undefined {\n return this._exitCode;\n }\n\n async wait(): Promise<CommandResult> {\n // Idempotent — cache the promise so repeated calls return the same result.\n if (!this._waitPromise) {\n this._waitPromise = this._doWait();\n }\n return this._waitPromise;\n }\n\n private async _doWait(): Promise<CommandResult> {\n try {\n const result = await this._execHandle;\n const exitCode = result.exitCode ?? (this._killed ? 137 : -1);\n this._exitCode = exitCode;\n\n // Railway captures output server-side; surface it through the base buffers\n // if streaming callbacks didn't already populate them.\n if (result.stdout && !this.stdout) this.emitStdout(result.stdout);\n if (result.stderr && !this.stderr) this.emitStderr(result.stderr);\n\n return {\n success: exitCode === 0,\n exitCode,\n stdout: this.stdout,\n stderr: this.stderr,\n executionTimeMs: Date.now() - this._startTime,\n killed: this._killed,\n timedOut: result.timedOut,\n };\n } catch (error) {\n const exitCode = this._exitCode ?? 1;\n this._exitCode = exitCode;\n return {\n success: false,\n exitCode,\n stdout: this.stdout,\n stderr: this.stderr || (error instanceof Error ? error.message : String(error)),\n executionTimeMs: Date.now() - this._startTime,\n killed: this._killed,\n };\n }\n }\n\n async kill(): Promise<boolean> {\n if (this._exitCode !== undefined) return false;\n this._killed = true;\n try {\n return await this._execHandle.kill('TERM');\n } catch {\n // Command may already be gone.\n return false;\n }\n }\n\n async sendStdin(_data: string): Promise<void> {\n // Railway's exec API does not expose stdin streaming.\n throw new Error(`${LOG_PREFIX} sending stdin is not supported by the Railway sandbox provider`);\n }\n}\n\n// =============================================================================\n// Railway Process Manager\n// =============================================================================\n\nexport interface RailwayProcessManagerOptions {\n env?: Record<string, string | undefined>;\n}\n\n/**\n * Railway implementation of SandboxProcessManager.\n * Uses the Railway SDK's `Sandbox.exec()` with one exec per spawned process.\n */\nexport class RailwayProcessManager extends SandboxProcessManager<RailwaySandbox> {\n private _spawnCounter = 0;\n\n constructor(opts: RailwayProcessManagerOptions = {}) {\n super({ env: opts.env });\n }\n\n async spawn(command: string, options: SpawnProcessOptions = {}): Promise<ProcessHandle> {\n const railway = this.sandbox.railway;\n\n // Merge default env with per-spawn env.\n const mergedEnv = { ...this.env, ...options.env };\n const env = Object.fromEntries(\n Object.entries(mergedEnv).filter((entry): entry is [string, string] => entry[1] !== undefined),\n );\n\n const pid = `railway-proc-${Date.now().toString(36)}-${(this._spawnCounter++).toString(36)}`;\n\n // Deferred reference — callbacks fire asynchronously after the handle is\n // assigned, so `handle` is always defined by the time they run.\n let handle: RailwayProcessHandle;\n\n const execHandle = railway.exec(command, {\n ...(options.timeout !== undefined && { timeoutSec: Math.ceil(options.timeout / 1000) }),\n ...(options.cwd !== undefined && { cwd: options.cwd }),\n ...(Object.keys(env).length > 0 && { env }),\n onStdout: (chunk: string) => handle.emitStdout(chunk),\n onStderr: (chunk: string) => handle.emitStderr(chunk),\n });\n\n handle = new RailwayProcessHandle(pid, execHandle, Date.now(), options);\n this._tracked.set(handle.pid, handle);\n return handle;\n }\n\n /**\n * List tracked processes.\n *\n * Railway has no API to enumerate running exec sessions by sandbox, so this\n * reports the processes this manager spawned.\n */\n async list(): Promise<ProcessInfo[]> {\n return Array.from(this._tracked.values()).map(handle => ({\n pid: handle.pid,\n command: handle.command,\n running: handle.exitCode === undefined,\n ...(handle.exitCode !== undefined && { exitCode: handle.exitCode }),\n }));\n }\n}\n","/**\n * Railway Sandbox Provider\n *\n * A Railway sandbox implementation for Mastra workspaces. Provisions an\n * ephemeral, isolated Linux VM on Railway, runs commands in it via the\n * Railway TypeScript SDK, and destroys it on teardown.\n *\n * @see https://docs.railway.com/sandboxes\n */\n\nimport type {\n CommandResult,\n ExecuteCommandOptions,\n InstructionsOption,\n MastraSandboxOptions,\n ProviderStatus,\n SandboxCloneOptions,\n SandboxInfo,\n} from '@mastra/core/workspace';\nimport { MastraSandbox, SandboxNotReadyError } from '@mastra/core/workspace';\nimport { Sandbox, SandboxFailedError, SandboxNotFoundError, SandboxTimeoutError } from 'railway';\nimport type { SandboxNetworkIsolation, SandboxTemplate } from 'railway';\nimport { shellQuote } from '../utils/shell-quote';\nimport { LOG_PREFIX, RailwayProcessManager } from './process-manager';\n\n// =============================================================================\n// Railway Sandbox Options\n// =============================================================================\n\n/**\n * Railway sandbox provider configuration.\n */\nexport interface RailwaySandboxOptions extends Omit<MastraSandboxOptions, 'processes'> {\n /** Unique identifier for this sandbox instance. */\n id?: string;\n /** Railway API token. Falls back to the RAILWAY_API_TOKEN env var. */\n token?: string;\n /** Railway environment ID. Falls back to the RAILWAY_ENVIRONMENT_ID env var. */\n environmentId?: string;\n /**\n * Reattach to an existing Railway sandbox by its Railway ID instead of\n * creating a new one. When set, `start()` calls `Sandbox.connect()`.\n */\n sandboxId?: string;\n /**\n * Reuse a saved Railway sandbox checkpoint as the baseline filesystem for\n * new sandboxes. When the named checkpoint is missing, the sandbox is created\n * normally and a checkpoint is captured after setup succeeds.\n */\n checkpointName?: string;\n /**\n * How long the sandbox can sit idle (no `exec` interaction) before Railway\n * destroys it automatically. Range depends on plan (1–120 minutes on\n * Hobby/Pro, 1–5 on Trial/Free). Defaults to the plan default when omitted.\n */\n idleTimeoutMinutes?: number;\n /**\n * Network isolation mode.\n * - `ISOLATED` (default): outbound internet only, no private network access.\n * - `PRIVATE`: joins the environment's private network.\n */\n networkIsolation?: SandboxNetworkIsolation;\n /** Environment variables baked into the sandbox, available to every command. */\n env?: Record<string, string>;\n /**\n * Provision the sandbox from a custom base image built with the Railway\n * template builder. Use this to pre-install packages or run setup steps so\n * every sandbox created from it starts ready.\n *\n * - Builder callback — receives the base `Sandbox.template()` and returns the\n * configured template. Railway builds the template when `Sandbox.create()`\n * runs during `start()`.\n * ```ts\n * template: t => t.withPackages('git', 'curl').run('npm i -g pnpm')\n * ```\n * - Pre-built `SandboxTemplate` — pass a template to reuse it across\n * sandboxes. Railway still builds the image during sandbox creation.\n *\n * Ignored when `sandboxId` is set (reattach) or when forking.\n */\n template?: SandboxTemplate | ((base: SandboxTemplate) => SandboxTemplate);\n /**\n * Default execution timeout in milliseconds applied to commands that don't\n * specify their own timeout. When omitted, commands run until they exit.\n */\n timeout?: number;\n /**\n * Custom instructions that override the default instructions returned by\n * `getInstructions()`.\n *\n * - `string` — Fully replaces the default instructions. Pass an empty string\n * to suppress instructions entirely.\n * - `(opts) => string` — Receives the default instructions and optional\n * request context so you can extend or customise per-request.\n */\n instructions?: InstructionsOption;\n}\n\n// =============================================================================\n// Railway Sandbox Implementation\n// =============================================================================\n\n/**\n * Railway sandbox provider for Mastra workspaces.\n *\n * Features:\n * - Ephemeral, isolated Linux VM via the Railway TypeScript SDK\n * - Command execution with streaming output and timeouts\n * - Configurable idle timeout and network isolation\n * - Reattach to an existing sandbox by Railway ID\n *\n * @example Basic usage\n * ```typescript\n * import { Workspace } from '@mastra/core/workspace';\n * import { RailwaySandbox } from '@mastra/railway';\n *\n * const sandbox = new RailwaySandbox({\n * // token + environmentId read from RAILWAY_API_TOKEN / RAILWAY_ENVIRONMENT_ID\n * idleTimeoutMinutes: 30,\n * });\n *\n * const workspace = new Workspace({ sandbox });\n * const result = await workspace.executeCode('console.log(\"Hello!\")');\n * ```\n *\n * @example Private networking\n * ```typescript\n * const sandbox = new RailwaySandbox({\n * networkIsolation: 'PRIVATE',\n * env: { NODE_ENV: 'production' },\n * });\n * ```\n */\nexport class RailwaySandbox extends MastraSandbox {\n readonly id: string;\n readonly name = 'RailwaySandbox';\n readonly provider = 'railway';\n status: ProviderStatus = 'pending';\n\n declare readonly processes: RailwayProcessManager;\n\n private _sandbox: Sandbox | null = null;\n private _createdAt: Date | null = null;\n private _checkpointRefreshTimer: ReturnType<typeof setTimeout> | null = null;\n private _checkpointRefreshInFlight: Promise<void> | null = null;\n\n private readonly _token?: string;\n private readonly _environmentId?: string;\n private readonly _sandboxId?: string;\n private readonly _checkpointName?: string;\n private readonly _idleTimeoutMinutes?: number;\n private readonly _networkIsolation?: SandboxNetworkIsolation;\n private readonly _env: Record<string, string>;\n private readonly _timeout?: number;\n private readonly _instructionsOverride?: InstructionsOption;\n private readonly _templateOption?: RailwaySandboxOptions['template'];\n\n constructor(options: RailwaySandboxOptions = {}) {\n super({\n ...options,\n name: 'RailwaySandbox',\n processes: new RailwayProcessManager({ env: options.env }),\n });\n\n this.id = options.id ?? this.generateId();\n this._token = options.token ?? process.env.RAILWAY_API_TOKEN;\n this._environmentId = options.environmentId ?? process.env.RAILWAY_ENVIRONMENT_ID;\n this._sandboxId = options.sandboxId;\n this._checkpointName = options.checkpointName;\n this._idleTimeoutMinutes = options.idleTimeoutMinutes;\n this._networkIsolation = options.networkIsolation;\n this._env = options.env ?? {};\n this._timeout = options.timeout;\n this._instructionsOverride = options.instructions;\n this._templateOption = options.template;\n }\n\n private generateId(): string {\n return `railway-sandbox-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n /**\n * Get the underlying Railway Sandbox instance for direct SDK access.\n *\n * @throws {SandboxNotReadyError} If the sandbox has not been started.\n */\n get railway(): Sandbox {\n if (!this._sandbox) {\n throw new SandboxNotReadyError(this.id);\n }\n return this._sandbox;\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n /**\n * Start the Railway sandbox.\n *\n * Reattaches to an existing sandbox when `sandboxId` is configured,\n * otherwise provisions a new one. Resolves once the sandbox is RUNNING.\n */\n async start(): Promise<void> {\n if (this._sandbox) {\n return;\n }\n\n await this._startRailwaySandbox({ reconnectSandboxId: this._sandboxId, fallbackToCreate: false });\n }\n\n async restart(): Promise<void> {\n const reconnectSandboxId = this._sandbox?.id ?? this._sandboxId;\n this._cancelCheckpointRefresh();\n await this._checkpointRefreshInFlight?.catch(error => {\n this.logger.warn(`${LOG_PREFIX} Failed to flush in-flight checkpoint before restart:`, error);\n });\n this._sandbox = null;\n this._createdAt = null;\n this.status = 'starting';\n\n try {\n await this._startRailwaySandbox({ reconnectSandboxId, fallbackToCreate: true });\n this.status = 'running';\n } catch (error) {\n this.status = 'error';\n throw error;\n }\n }\n\n async withRestartRetry<T>(operation: () => Promise<T>): Promise<T> {\n await this.ensureRunning();\n try {\n return await operation();\n } catch (error) {\n if (!this.isSandboxUnavailableError(error)) {\n throw error;\n }\n\n await this.restart();\n return await operation();\n } finally {\n this._scheduleCheckpointRefresh();\n }\n }\n\n private async _startRailwaySandbox({\n reconnectSandboxId,\n fallbackToCreate,\n }: {\n reconnectSandboxId?: string;\n fallbackToCreate: boolean;\n }): Promise<void> {\n const clientConfig = this._clientConfig();\n const createOptions = this._createOptions(clientConfig);\n\n this._sandbox = reconnectSandboxId\n ? await this._reconnectSandbox(reconnectSandboxId, fallbackToCreate, clientConfig, createOptions)\n : await this._createNewSandbox(createOptions);\n\n this._createdAt = this._sandbox.createdAt ? new Date(this._sandbox.createdAt) : new Date();\n this.logger.debug(`${LOG_PREFIX} Railway sandbox ${this._sandbox.id} ready for logical ID: ${this.id}`);\n this._scheduleCheckpointRefresh();\n }\n\n /**\n * Reconnect to an existing Railway sandbox, creating a fresh one when\n * `fallbackToCreate` is set and the sandbox is unavailable or not running.\n */\n private async _reconnectSandbox(\n reconnectSandboxId: string,\n fallbackToCreate: boolean,\n clientConfig: { token?: string; environmentId?: string },\n createOptions: ReturnType<RailwaySandbox['_createOptions']>,\n ): Promise<Sandbox> {\n this.logger.debug(`${LOG_PREFIX} Reconnecting to Railway sandbox ${reconnectSandboxId}...`);\n\n let connectedSandbox: Sandbox;\n try {\n connectedSandbox = await Sandbox.connect(reconnectSandboxId, clientConfig);\n } catch (error) {\n if (!fallbackToCreate || !this.isSandboxUnavailableError(error)) {\n throw error;\n }\n return this._createNewSandbox(createOptions);\n }\n\n if (connectedSandbox.status === 'RUNNING') {\n return connectedSandbox;\n }\n\n if (!fallbackToCreate) {\n throw new Error(`Railway sandbox ${reconnectSandboxId} is not running (status: ${connectedSandbox.status})`);\n }\n\n return this._createNewSandbox(createOptions);\n }\n\n private _clientConfig(): { token?: string; environmentId?: string } {\n return {\n ...(this._token !== undefined && { token: this._token }),\n ...(this._environmentId !== undefined && { environmentId: this._environmentId }),\n };\n }\n\n private _createOptions(clientConfig: { token?: string; environmentId?: string }) {\n return {\n ...clientConfig,\n ...(this._idleTimeoutMinutes !== undefined && { idleTimeoutMinutes: this._idleTimeoutMinutes }),\n ...(this._networkIsolation !== undefined && { networkIsolation: this._networkIsolation }),\n ...(Object.keys(this._env).length > 0 && { env: this._env }),\n };\n }\n\n private async _createNewSandbox(createOptions: ReturnType<RailwaySandbox['_createOptions']>): Promise<Sandbox> {\n const checkpointSandbox = await this._tryCreateFromCheckpoint(createOptions);\n if (checkpointSandbox) {\n return checkpointSandbox;\n }\n\n if (this._templateOption) {\n const template = this._resolveTemplate();\n this.logger.debug(`${LOG_PREFIX} Creating Railway sandbox from template for: ${this.id}`);\n const sandbox = await Sandbox.create(template, createOptions);\n await this._checkpointSandbox(sandbox);\n return sandbox;\n }\n\n this.logger.debug(`${LOG_PREFIX} Creating Railway sandbox for: ${this.id}`);\n const sandbox = await Sandbox.create(createOptions);\n await this._checkpointSandbox(sandbox);\n return sandbox;\n }\n\n private async _tryCreateFromCheckpoint(\n createOptions: ReturnType<RailwaySandbox['_createOptions']>,\n ): Promise<Sandbox | undefined> {\n if (!this._checkpointName) {\n return undefined;\n }\n\n this.logger.debug(`${LOG_PREFIX} Creating Railway sandbox from checkpoint ${this._checkpointName} for: ${this.id}`);\n\n try {\n const sandbox = await Sandbox.create(this._checkpointName, createOptions);\n return sandbox;\n } catch (error) {\n if (!this.isCheckpointUnavailableError(error)) {\n throw error;\n }\n return undefined;\n }\n }\n\n private async _checkpointSandbox(sandbox: Sandbox): Promise<void> {\n if (!this._checkpointName) {\n return;\n }\n\n try {\n this.logger.debug(`${LOG_PREFIX} Capturing Railway sandbox checkpoint ${this._checkpointName} for: ${this.id}`);\n await sandbox.checkpoint(this._checkpointName);\n } catch (error) {\n if (!this.isCheckpointAlreadyExistsError(error)) {\n throw error;\n }\n\n await this._deleteCheckpointByName(this._checkpointName);\n await sandbox.checkpoint(this._checkpointName);\n }\n }\n\n private async _deleteCheckpointByName(name: string): Promise<void> {\n try {\n const checkpoint = (await Sandbox.checkpoints(this._clientConfig())).find(checkpoint => checkpoint.key === name);\n if (!checkpoint) {\n return;\n }\n\n await Sandbox.deleteCheckpoint(checkpoint.id, this._clientConfig());\n } catch (error) {\n if (!this.isCheckpointUnavailableError(error)) {\n throw error;\n }\n }\n }\n\n private _scheduleCheckpointRefresh(): void {\n if (!this._checkpointName || !this._sandbox) {\n return;\n }\n\n const idleTimeoutMinutes = this._idleTimeoutMinutes ?? this._sandbox.idleTimeoutMinutes;\n if (!idleTimeoutMinutes) {\n return;\n }\n\n if (this._checkpointRefreshTimer) {\n clearTimeout(this._checkpointRefreshTimer);\n }\n\n const delayMs = Math.max(1_000, idleTimeoutMinutes * 60_000 - 10_000);\n this._checkpointRefreshTimer = setTimeout(() => {\n this._checkpointRefreshTimer = null;\n const sandbox = this._sandbox;\n if (!sandbox) {\n return;\n }\n\n const refresh = this._checkpointSandbox(sandbox).finally(() => {\n if (this._checkpointRefreshInFlight === refresh) {\n this._checkpointRefreshInFlight = null;\n }\n });\n this._checkpointRefreshInFlight = refresh;\n this._checkpointRefreshInFlight.catch(error => {\n this.logger.warn(`${LOG_PREFIX} Failed to refresh Railway sandbox checkpoint ${this._checkpointName}:`, error);\n });\n }, delayMs);\n this._checkpointRefreshTimer.unref?.();\n }\n\n private _cancelCheckpointRefresh(): void {\n if (this._checkpointRefreshTimer) {\n clearTimeout(this._checkpointRefreshTimer);\n this._checkpointRefreshTimer = null;\n }\n }\n\n private async _flushCheckpointRefresh(): Promise<void> {\n this._cancelCheckpointRefresh();\n\n if (this._checkpointRefreshInFlight) {\n await this._checkpointRefreshInFlight;\n return;\n }\n\n if (this._sandbox) {\n await this._checkpointSandbox(this._sandbox);\n }\n }\n\n private isCheckpointUnavailableError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n return (\n message.includes('checkpoint') &&\n ['not found', 'does not exist', 'missing', 'unknown', 'no checkpoint'].some(phrase => message.includes(phrase))\n );\n }\n\n private isCheckpointAlreadyExistsError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n return (\n message.includes('checkpoint') &&\n (['already exists', 'must be unused', 'unique'].some(phrase => message.includes(phrase)) ||\n (message.includes('name') && message.includes('used')))\n );\n }\n\n private isSandboxUnavailableError(error: unknown, seen = new Set<unknown>()): boolean {\n if (error && typeof error === 'object') {\n if (seen.has(error)) return false;\n seen.add(error);\n }\n\n if (\n error instanceof SandboxNotFoundError ||\n error instanceof SandboxFailedError ||\n (error instanceof SandboxTimeoutError && error.resource === 'sandbox')\n ) {\n return true;\n }\n\n if (error && typeof error === 'object') {\n const errorLike = error as { name?: unknown; message?: unknown; resource?: unknown; cause?: unknown };\n const name = typeof errorLike.name === 'string' ? errorLike.name : '';\n const message = typeof errorLike.message === 'string' ? errorLike.message.toLowerCase() : '';\n\n if (\n name === 'SandboxNotFoundError' ||\n name === 'SandboxFailedError' ||\n (name === 'SandboxTimeoutError' && errorLike.resource === 'sandbox')\n ) {\n return true;\n }\n\n if (\n message.includes('sandbox') &&\n ['not found', 'destroyed', 'failed', 'not running', 'unavailable'].some(phrase => message.includes(phrase))\n ) {\n return true;\n }\n\n if (errorLike.cause !== undefined) {\n return this.isSandboxUnavailableError(errorLike.cause, seen);\n }\n }\n\n return false;\n }\n\n /**\n * Stop the Railway sandbox.\n *\n * Railway sandboxes have no separate \"stopped\" state — they're either\n * running or destroyed — so stopping destroys the sandbox.\n */\n async stop(): Promise<void> {\n await this._teardown();\n }\n\n /**\n * Destroy the Railway sandbox and release its resources.\n */\n async destroy(): Promise<void> {\n await this._teardown();\n }\n\n private async _teardown(): Promise<void> {\n if (!this._sandbox) {\n this._cancelCheckpointRefresh();\n return;\n }\n const sandbox = this._sandbox;\n try {\n await this._flushCheckpointRefresh();\n } catch (error) {\n this.logger.warn(`${LOG_PREFIX} Failed to flush checkpoint before teardown:`, error);\n }\n this._sandbox = null;\n try {\n await sandbox.destroy();\n } catch (error) {\n this.logger.warn(`${LOG_PREFIX} Failed to destroy Railway sandbox ${sandbox.id}:`, error);\n }\n }\n\n /**\n * Resolve the configured template into a `SandboxTemplate` that Railway\n * builds during `Sandbox.create()`. Accepts either a pre-built\n * `SandboxTemplate` or a builder callback over `Sandbox.template()`.\n */\n private _resolveTemplate(): SandboxTemplate {\n const option = this._templateOption!;\n return typeof option === 'function' ? option(Sandbox.template()) : option;\n }\n\n /**\n * Fork this running sandbox into a new, independent `RailwaySandbox`.\n *\n * Clones the filesystem (a fresh boot, not live processes) into the same\n * environment. The returned sandbox is already started and reattached to the\n * forked Railway sandbox; it inherits this sandbox's credentials and defaults\n * unless overridden via `options`.\n *\n * @throws {SandboxNotReadyError} If this sandbox has not been started.\n */\n async fork(\n options: Pick<RailwaySandboxOptions, 'id' | 'idleTimeoutMinutes' | 'networkIsolation' | 'env'> = {},\n ): Promise<RailwaySandbox> {\n const source = this.railway;\n const forked = await source.fork({\n ...(options.idleTimeoutMinutes !== undefined && { idleTimeoutMinutes: options.idleTimeoutMinutes }),\n ...(options.networkIsolation !== undefined && { networkIsolation: options.networkIsolation }),\n ...(options.env !== undefined && { env: options.env }),\n });\n\n const child = new RailwaySandbox({\n ...(options.id !== undefined && { id: options.id }),\n ...(this._token !== undefined && { token: this._token }),\n ...(this._environmentId !== undefined && { environmentId: this._environmentId }),\n sandboxId: forked.id,\n idleTimeoutMinutes: options.idleTimeoutMinutes ?? this._idleTimeoutMinutes,\n networkIsolation: options.networkIsolation ?? this._networkIsolation,\n env: options.env ?? this._env,\n timeout: this._timeout,\n });\n await child._start();\n return child;\n }\n\n /**\n * Construct a sibling `RailwaySandbox` that inherits this sandbox's\n * credentials and defaults (token, environment, checkpoint, network\n * isolation, timeout, template, instructions) with per-instance overrides.\n *\n * Unlike {@link fork}, `clone` performs no I/O and does not require this\n * sandbox to be started — the returned sandbox is not started and provisions\n * (or reattaches, when `sandboxId` is set) on its own `start()`. Use it when\n * one configured sandbox acts as the template for a fleet of independent\n * sandboxes (e.g. one per project).\n */\n clone(options: SandboxCloneOptions = {}): RailwaySandbox {\n return new RailwaySandbox({\n ...(options.id !== undefined && { id: options.id }),\n ...(this._token !== undefined && { token: this._token }),\n ...(this._environmentId !== undefined && { environmentId: this._environmentId }),\n ...(options.sandboxId !== undefined && { sandboxId: options.sandboxId }),\n ...((options.checkpointName ?? this._checkpointName) !== undefined && {\n checkpointName: options.checkpointName ?? this._checkpointName,\n }),\n idleTimeoutMinutes: options.idleTimeoutMinutes ?? this._idleTimeoutMinutes,\n ...(this._networkIsolation !== undefined && { networkIsolation: this._networkIsolation }),\n env: options.env ?? this._env,\n ...(this._templateOption !== undefined && { template: this._templateOption }),\n ...(this._timeout !== undefined && { timeout: this._timeout }),\n ...(this._instructionsOverride !== undefined && { instructions: this._instructionsOverride }),\n });\n }\n\n /**\n * Whether a Railway API token was resolved at construction (explicit option\n * or the `RAILWAY_API_TOKEN` env fallback). Lets callers gate features on a\n * usable configuration without provisioning a sandbox.\n */\n get hasCredentials(): boolean {\n return this._token !== undefined && this._token !== '';\n }\n\n /** The configured idle teardown window in minutes, if any. */\n get idleTimeoutMinutes(): number | undefined {\n return this._idleTimeoutMinutes;\n }\n\n // ---------------------------------------------------------------------------\n // Info & Instructions\n // ---------------------------------------------------------------------------\n\n async getInfo(): Promise<SandboxInfo> {\n return {\n id: this.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n createdAt: this._createdAt ?? new Date(),\n metadata: {\n ...(this._sandbox && {\n railwaySandboxId: this._sandbox.id,\n environmentId: this._sandbox.environmentId,\n region: this._sandbox.region,\n networkIsolation: this._sandbox.networkIsolation,\n ...(this._sandbox.idleTimeoutMinutes != null && {\n idleTimeoutMinutes: this._sandbox.idleTimeoutMinutes,\n }),\n }),\n },\n };\n }\n\n getInstructions(): string {\n const defaultInstructions = this._buildDefaultInstructions();\n\n if (typeof this._instructionsOverride === 'string') {\n return this._instructionsOverride;\n }\n if (typeof this._instructionsOverride === 'function') {\n return this._instructionsOverride({ defaultInstructions });\n }\n return defaultInstructions;\n }\n\n private _buildDefaultInstructions(): string {\n const parts: string[] = [];\n parts.push('Railway cloud sandbox: an isolated Debian Linux VM with outbound internet access.');\n\n if (this._networkIsolation === 'PRIVATE') {\n parts.push('Joined to the environment private network.');\n }\n\n if (this._timeout !== undefined) {\n parts.push(`Default command timeout: ${Math.ceil(this._timeout / 1000)}s.`);\n } else {\n parts.push('Commands run until they exit unless a timeout is set.');\n }\n\n if (this._idleTimeoutMinutes !== undefined) {\n parts.push(`Idle timeout: ${this._idleTimeoutMinutes} minute(s).`);\n }\n\n return parts.join(' ');\n }\n\n // ---------------------------------------------------------------------------\n // Command Execution\n // ---------------------------------------------------------------------------\n\n /**\n * Execute a command in the sandbox and return the result.\n */\n async executeCommand(\n command: string,\n args: string[] = [],\n options: ExecuteCommandOptions = {},\n ): Promise<CommandResult> {\n return this.withRestartRetry(async () => {\n const fullCommand = args.length > 0 ? `${command} ${args.map(shellQuote).join(' ')}` : command;\n const timeout = options.timeout ?? this._timeout;\n const env = options.env\n ? Object.fromEntries(\n Object.entries(options.env).filter((entry): entry is [string, string] => entry[1] !== undefined),\n )\n : undefined;\n const startedAt = Date.now();\n const result = await this.railway.exec(fullCommand, {\n ...(timeout !== undefined && { timeoutSec: Math.ceil(timeout / 1000) }),\n ...(options.cwd !== undefined && { cwd: options.cwd }),\n ...(env !== undefined && { env }),\n });\n const exitCode = result.exitCode ?? -1;\n return {\n success: exitCode === 0,\n exitCode,\n stdout: result.stdout,\n stderr: result.stderr,\n executionTimeMs: Date.now() - startedAt,\n command,\n args,\n timedOut: result.timedOut,\n };\n });\n }\n}\n","/**\n * Railway sandbox provider descriptor for MastraEditor.\n *\n * @example\n * ```typescript\n * import { railwaySandboxProvider } from '@mastra/railway';\n *\n * const editor = new MastraEditor({\n * sandboxes: { [railwaySandboxProvider.id]: railwaySandboxProvider },\n * });\n * ```\n */\nimport type { SandboxProvider } from '@mastra/core/editor';\nimport { RailwaySandbox } from './sandbox';\n\n/**\n * Serializable subset of RailwaySandboxOptions for editor storage.\n */\ninterface RailwayProviderConfig {\n token?: string;\n environmentId?: string;\n sandboxId?: string;\n idleTimeoutMinutes?: number;\n networkIsolation?: 'ISOLATED' | 'PRIVATE';\n env?: Record<string, string>;\n timeout?: number;\n}\n\nexport const railwaySandboxProvider: SandboxProvider<RailwayProviderConfig> = {\n id: 'railway',\n name: 'Railway Sandbox',\n description: 'Ephemeral, isolated Linux VM powered by Railway',\n configSchema: {\n type: 'object',\n properties: {\n token: { type: 'string', description: 'Railway API token (falls back to RAILWAY_API_TOKEN)' },\n environmentId: {\n type: 'string',\n description: 'Railway environment ID (falls back to RAILWAY_ENVIRONMENT_ID)',\n },\n sandboxId: { type: 'string', description: 'Reattach to an existing Railway sandbox by ID' },\n idleTimeoutMinutes: {\n type: 'number',\n description: 'Minutes a sandbox can sit idle before Railway destroys it',\n },\n networkIsolation: {\n type: 'string',\n description: 'Network isolation mode',\n enum: ['ISOLATED', 'PRIVATE'],\n default: 'ISOLATED',\n },\n env: {\n type: 'object',\n description: 'Environment variables',\n additionalProperties: { type: 'string' },\n },\n timeout: { type: 'number', description: 'Default command timeout in ms' },\n },\n },\n createSandbox: config => new RailwaySandbox(config),\n};\n"]}
package/dist/index.js CHANGED
@@ -486,6 +486,46 @@ var RailwaySandbox = class _RailwaySandbox extends MastraSandbox {
486
486
  await child._start();
487
487
  return child;
488
488
  }
489
+ /**
490
+ * Construct a sibling `RailwaySandbox` that inherits this sandbox's
491
+ * credentials and defaults (token, environment, checkpoint, network
492
+ * isolation, timeout, template, instructions) with per-instance overrides.
493
+ *
494
+ * Unlike {@link fork}, `clone` performs no I/O and does not require this
495
+ * sandbox to be started — the returned sandbox is not started and provisions
496
+ * (or reattaches, when `sandboxId` is set) on its own `start()`. Use it when
497
+ * one configured sandbox acts as the template for a fleet of independent
498
+ * sandboxes (e.g. one per project).
499
+ */
500
+ clone(options = {}) {
501
+ return new _RailwaySandbox({
502
+ ...options.id !== void 0 && { id: options.id },
503
+ ...this._token !== void 0 && { token: this._token },
504
+ ...this._environmentId !== void 0 && { environmentId: this._environmentId },
505
+ ...options.sandboxId !== void 0 && { sandboxId: options.sandboxId },
506
+ ...(options.checkpointName ?? this._checkpointName) !== void 0 && {
507
+ checkpointName: options.checkpointName ?? this._checkpointName
508
+ },
509
+ idleTimeoutMinutes: options.idleTimeoutMinutes ?? this._idleTimeoutMinutes,
510
+ ...this._networkIsolation !== void 0 && { networkIsolation: this._networkIsolation },
511
+ env: options.env ?? this._env,
512
+ ...this._templateOption !== void 0 && { template: this._templateOption },
513
+ ...this._timeout !== void 0 && { timeout: this._timeout },
514
+ ...this._instructionsOverride !== void 0 && { instructions: this._instructionsOverride }
515
+ });
516
+ }
517
+ /**
518
+ * Whether a Railway API token was resolved at construction (explicit option
519
+ * or the `RAILWAY_API_TOKEN` env fallback). Lets callers gate features on a
520
+ * usable configuration without provisioning a sandbox.
521
+ */
522
+ get hasCredentials() {
523
+ return this._token !== void 0 && this._token !== "";
524
+ }
525
+ /** The configured idle teardown window in minutes, if any. */
526
+ get idleTimeoutMinutes() {
527
+ return this._idleTimeoutMinutes;
528
+ }
489
529
  // ---------------------------------------------------------------------------
490
530
  // Info & Instructions
491
531
  // ---------------------------------------------------------------------------
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/shell-quote.ts","../src/sandbox/process-manager.ts","../src/sandbox/index.ts","../src/provider.ts"],"names":["sandbox","checkpoint"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Shell-quote a single argument for safe use in a command string.\n *\n * Arguments containing only safe characters are returned as-is.\n * All others are wrapped in single quotes with embedded single quotes escaped.\n */\nexport function shellQuote(arg: string): string {\n // Safe characters that don't need quoting\n if (/^[a-zA-Z0-9._\\-/@:=]+$/.test(arg)) return arg;\n // Wrap in single quotes, escaping any embedded single quotes\n return \"'\" + arg.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n","/**\n * Railway Process Manager\n *\n * Implements SandboxProcessManager for Railway sandboxes.\n * Wraps the Railway SDK's `Sandbox.exec()` API.\n *\n * Railway's `exec(command, options)` accepts per-call `cwd` and `env` options\n * (since SDK v3.3.1) and returns an `ExecHandle` that runs the command\n * server-side, independently of the client. Each spawn() starts one exec.\n * The handle streams output via `onStdout`/`onStderr` callbacks wired to\n * `emitStdout`/`emitStderr`, exposes a durable `sessionName`, and can be\n * terminated with `kill(signal)`.\n */\n\nimport { ProcessHandle, SandboxProcessManager } from '@mastra/core/workspace';\nimport type { CommandResult, ProcessInfo, SpawnProcessOptions } from '@mastra/core/workspace';\nimport type { ExecHandle, ExecResult } from 'railway';\nimport type { RailwaySandbox } from './index';\n\nexport const LOG_PREFIX = '[RailwaySandbox]';\n\n// =============================================================================\n// Railway Process Handle\n// =============================================================================\n\n/**\n * Wraps a Railway ExecHandle to conform to Mastra's ProcessHandle.\n * Not exported — internal to this module.\n */\nclass RailwayProcessHandle extends ProcessHandle {\n readonly pid: string;\n\n private readonly _execHandle: ExecHandle;\n private readonly _startTime: number;\n private _exitCode: number | undefined;\n private _waitPromise: Promise<CommandResult> | null = null;\n private _killed = false;\n\n constructor(pid: string, execHandle: ExecHandle, startTime: number, options?: SpawnProcessOptions) {\n super(options);\n this.pid = pid;\n this._execHandle = execHandle;\n this._startTime = startTime;\n\n // Resolve exit code once the command completes so exitCode is available\n // without an explicit wait().\n void this._execHandle.then(\n (result: ExecResult) => {\n // -1 means terminated by a signal (e.g. after kill()).\n this._exitCode = result.exitCode ?? (this._killed ? 137 : -1);\n },\n () => {\n if (this._exitCode === undefined) {\n this._exitCode = 1;\n }\n },\n );\n }\n\n get exitCode(): number | undefined {\n return this._exitCode;\n }\n\n async wait(): Promise<CommandResult> {\n // Idempotent — cache the promise so repeated calls return the same result.\n if (!this._waitPromise) {\n this._waitPromise = this._doWait();\n }\n return this._waitPromise;\n }\n\n private async _doWait(): Promise<CommandResult> {\n try {\n const result = await this._execHandle;\n const exitCode = result.exitCode ?? (this._killed ? 137 : -1);\n this._exitCode = exitCode;\n\n // Railway captures output server-side; surface it through the base buffers\n // if streaming callbacks didn't already populate them.\n if (result.stdout && !this.stdout) this.emitStdout(result.stdout);\n if (result.stderr && !this.stderr) this.emitStderr(result.stderr);\n\n return {\n success: exitCode === 0,\n exitCode,\n stdout: this.stdout,\n stderr: this.stderr,\n executionTimeMs: Date.now() - this._startTime,\n killed: this._killed,\n timedOut: result.timedOut,\n };\n } catch (error) {\n const exitCode = this._exitCode ?? 1;\n this._exitCode = exitCode;\n return {\n success: false,\n exitCode,\n stdout: this.stdout,\n stderr: this.stderr || (error instanceof Error ? error.message : String(error)),\n executionTimeMs: Date.now() - this._startTime,\n killed: this._killed,\n };\n }\n }\n\n async kill(): Promise<boolean> {\n if (this._exitCode !== undefined) return false;\n this._killed = true;\n try {\n return await this._execHandle.kill('TERM');\n } catch {\n // Command may already be gone.\n return false;\n }\n }\n\n async sendStdin(_data: string): Promise<void> {\n // Railway's exec API does not expose stdin streaming.\n throw new Error(`${LOG_PREFIX} sending stdin is not supported by the Railway sandbox provider`);\n }\n}\n\n// =============================================================================\n// Railway Process Manager\n// =============================================================================\n\nexport interface RailwayProcessManagerOptions {\n env?: Record<string, string | undefined>;\n}\n\n/**\n * Railway implementation of SandboxProcessManager.\n * Uses the Railway SDK's `Sandbox.exec()` with one exec per spawned process.\n */\nexport class RailwayProcessManager extends SandboxProcessManager<RailwaySandbox> {\n private _spawnCounter = 0;\n\n constructor(opts: RailwayProcessManagerOptions = {}) {\n super({ env: opts.env });\n }\n\n async spawn(command: string, options: SpawnProcessOptions = {}): Promise<ProcessHandle> {\n const railway = this.sandbox.railway;\n\n // Merge default env with per-spawn env.\n const mergedEnv = { ...this.env, ...options.env };\n const env = Object.fromEntries(\n Object.entries(mergedEnv).filter((entry): entry is [string, string] => entry[1] !== undefined),\n );\n\n const pid = `railway-proc-${Date.now().toString(36)}-${(this._spawnCounter++).toString(36)}`;\n\n // Deferred reference — callbacks fire asynchronously after the handle is\n // assigned, so `handle` is always defined by the time they run.\n let handle: RailwayProcessHandle;\n\n const execHandle = railway.exec(command, {\n ...(options.timeout !== undefined && { timeoutSec: Math.ceil(options.timeout / 1000) }),\n ...(options.cwd !== undefined && { cwd: options.cwd }),\n ...(Object.keys(env).length > 0 && { env }),\n onStdout: (chunk: string) => handle.emitStdout(chunk),\n onStderr: (chunk: string) => handle.emitStderr(chunk),\n });\n\n handle = new RailwayProcessHandle(pid, execHandle, Date.now(), options);\n this._tracked.set(handle.pid, handle);\n return handle;\n }\n\n /**\n * List tracked processes.\n *\n * Railway has no API to enumerate running exec sessions by sandbox, so this\n * reports the processes this manager spawned.\n */\n async list(): Promise<ProcessInfo[]> {\n return Array.from(this._tracked.values()).map(handle => ({\n pid: handle.pid,\n command: handle.command,\n running: handle.exitCode === undefined,\n ...(handle.exitCode !== undefined && { exitCode: handle.exitCode }),\n }));\n }\n}\n","/**\n * Railway Sandbox Provider\n *\n * A Railway sandbox implementation for Mastra workspaces. Provisions an\n * ephemeral, isolated Linux VM on Railway, runs commands in it via the\n * Railway TypeScript SDK, and destroys it on teardown.\n *\n * @see https://docs.railway.com/sandboxes\n */\n\nimport type {\n CommandResult,\n ExecuteCommandOptions,\n InstructionsOption,\n MastraSandboxOptions,\n ProviderStatus,\n SandboxInfo,\n} from '@mastra/core/workspace';\nimport { MastraSandbox, SandboxNotReadyError } from '@mastra/core/workspace';\nimport { Sandbox, SandboxFailedError, SandboxNotFoundError, SandboxTimeoutError } from 'railway';\nimport type { SandboxNetworkIsolation, SandboxTemplate } from 'railway';\nimport { shellQuote } from '../utils/shell-quote';\nimport { LOG_PREFIX, RailwayProcessManager } from './process-manager';\n\n// =============================================================================\n// Railway Sandbox Options\n// =============================================================================\n\n/**\n * Railway sandbox provider configuration.\n */\nexport interface RailwaySandboxOptions extends Omit<MastraSandboxOptions, 'processes'> {\n /** Unique identifier for this sandbox instance. */\n id?: string;\n /** Railway API token. Falls back to the RAILWAY_API_TOKEN env var. */\n token?: string;\n /** Railway environment ID. Falls back to the RAILWAY_ENVIRONMENT_ID env var. */\n environmentId?: string;\n /**\n * Reattach to an existing Railway sandbox by its Railway ID instead of\n * creating a new one. When set, `start()` calls `Sandbox.connect()`.\n */\n sandboxId?: string;\n /**\n * Reuse a saved Railway sandbox checkpoint as the baseline filesystem for\n * new sandboxes. When the named checkpoint is missing, the sandbox is created\n * normally and a checkpoint is captured after setup succeeds.\n */\n checkpointName?: string;\n /**\n * How long the sandbox can sit idle (no `exec` interaction) before Railway\n * destroys it automatically. Range depends on plan (1–120 minutes on\n * Hobby/Pro, 1–5 on Trial/Free). Defaults to the plan default when omitted.\n */\n idleTimeoutMinutes?: number;\n /**\n * Network isolation mode.\n * - `ISOLATED` (default): outbound internet only, no private network access.\n * - `PRIVATE`: joins the environment's private network.\n */\n networkIsolation?: SandboxNetworkIsolation;\n /** Environment variables baked into the sandbox, available to every command. */\n env?: Record<string, string>;\n /**\n * Provision the sandbox from a custom base image built with the Railway\n * template builder. Use this to pre-install packages or run setup steps so\n * every sandbox created from it starts ready.\n *\n * - Builder callback — receives the base `Sandbox.template()` and returns the\n * configured template. Railway builds the template when `Sandbox.create()`\n * runs during `start()`.\n * ```ts\n * template: t => t.withPackages('git', 'curl').run('npm i -g pnpm')\n * ```\n * - Pre-built `SandboxTemplate` — pass a template to reuse it across\n * sandboxes. Railway still builds the image during sandbox creation.\n *\n * Ignored when `sandboxId` is set (reattach) or when forking.\n */\n template?: SandboxTemplate | ((base: SandboxTemplate) => SandboxTemplate);\n /**\n * Default execution timeout in milliseconds applied to commands that don't\n * specify their own timeout. When omitted, commands run until they exit.\n */\n timeout?: number;\n /**\n * Custom instructions that override the default instructions returned by\n * `getInstructions()`.\n *\n * - `string` — Fully replaces the default instructions. Pass an empty string\n * to suppress instructions entirely.\n * - `(opts) => string` — Receives the default instructions and optional\n * request context so you can extend or customise per-request.\n */\n instructions?: InstructionsOption;\n}\n\n// =============================================================================\n// Railway Sandbox Implementation\n// =============================================================================\n\n/**\n * Railway sandbox provider for Mastra workspaces.\n *\n * Features:\n * - Ephemeral, isolated Linux VM via the Railway TypeScript SDK\n * - Command execution with streaming output and timeouts\n * - Configurable idle timeout and network isolation\n * - Reattach to an existing sandbox by Railway ID\n *\n * @example Basic usage\n * ```typescript\n * import { Workspace } from '@mastra/core/workspace';\n * import { RailwaySandbox } from '@mastra/railway';\n *\n * const sandbox = new RailwaySandbox({\n * // token + environmentId read from RAILWAY_API_TOKEN / RAILWAY_ENVIRONMENT_ID\n * idleTimeoutMinutes: 30,\n * });\n *\n * const workspace = new Workspace({ sandbox });\n * const result = await workspace.executeCode('console.log(\"Hello!\")');\n * ```\n *\n * @example Private networking\n * ```typescript\n * const sandbox = new RailwaySandbox({\n * networkIsolation: 'PRIVATE',\n * env: { NODE_ENV: 'production' },\n * });\n * ```\n */\nexport class RailwaySandbox extends MastraSandbox {\n readonly id: string;\n readonly name = 'RailwaySandbox';\n readonly provider = 'railway';\n status: ProviderStatus = 'pending';\n\n declare readonly processes: RailwayProcessManager;\n\n private _sandbox: Sandbox | null = null;\n private _createdAt: Date | null = null;\n private _checkpointRefreshTimer: ReturnType<typeof setTimeout> | null = null;\n private _checkpointRefreshInFlight: Promise<void> | null = null;\n\n private readonly _token?: string;\n private readonly _environmentId?: string;\n private readonly _sandboxId?: string;\n private readonly _checkpointName?: string;\n private readonly _idleTimeoutMinutes?: number;\n private readonly _networkIsolation?: SandboxNetworkIsolation;\n private readonly _env: Record<string, string>;\n private readonly _timeout?: number;\n private readonly _instructionsOverride?: InstructionsOption;\n private readonly _templateOption?: RailwaySandboxOptions['template'];\n\n constructor(options: RailwaySandboxOptions = {}) {\n super({\n ...options,\n name: 'RailwaySandbox',\n processes: new RailwayProcessManager({ env: options.env }),\n });\n\n this.id = options.id ?? this.generateId();\n this._token = options.token ?? process.env.RAILWAY_API_TOKEN;\n this._environmentId = options.environmentId ?? process.env.RAILWAY_ENVIRONMENT_ID;\n this._sandboxId = options.sandboxId;\n this._checkpointName = options.checkpointName;\n this._idleTimeoutMinutes = options.idleTimeoutMinutes;\n this._networkIsolation = options.networkIsolation;\n this._env = options.env ?? {};\n this._timeout = options.timeout;\n this._instructionsOverride = options.instructions;\n this._templateOption = options.template;\n }\n\n private generateId(): string {\n return `railway-sandbox-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n /**\n * Get the underlying Railway Sandbox instance for direct SDK access.\n *\n * @throws {SandboxNotReadyError} If the sandbox has not been started.\n */\n get railway(): Sandbox {\n if (!this._sandbox) {\n throw new SandboxNotReadyError(this.id);\n }\n return this._sandbox;\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n /**\n * Start the Railway sandbox.\n *\n * Reattaches to an existing sandbox when `sandboxId` is configured,\n * otherwise provisions a new one. Resolves once the sandbox is RUNNING.\n */\n async start(): Promise<void> {\n if (this._sandbox) {\n return;\n }\n\n await this._startRailwaySandbox({ reconnectSandboxId: this._sandboxId, fallbackToCreate: false });\n }\n\n async restart(): Promise<void> {\n const reconnectSandboxId = this._sandbox?.id ?? this._sandboxId;\n this._cancelCheckpointRefresh();\n await this._checkpointRefreshInFlight?.catch(error => {\n this.logger.warn(`${LOG_PREFIX} Failed to flush in-flight checkpoint before restart:`, error);\n });\n this._sandbox = null;\n this._createdAt = null;\n this.status = 'starting';\n\n try {\n await this._startRailwaySandbox({ reconnectSandboxId, fallbackToCreate: true });\n this.status = 'running';\n } catch (error) {\n this.status = 'error';\n throw error;\n }\n }\n\n async withRestartRetry<T>(operation: () => Promise<T>): Promise<T> {\n await this.ensureRunning();\n try {\n return await operation();\n } catch (error) {\n if (!this.isSandboxUnavailableError(error)) {\n throw error;\n }\n\n await this.restart();\n return await operation();\n } finally {\n this._scheduleCheckpointRefresh();\n }\n }\n\n private async _startRailwaySandbox({\n reconnectSandboxId,\n fallbackToCreate,\n }: {\n reconnectSandboxId?: string;\n fallbackToCreate: boolean;\n }): Promise<void> {\n const clientConfig = this._clientConfig();\n const createOptions = this._createOptions(clientConfig);\n\n this._sandbox = reconnectSandboxId\n ? await this._reconnectSandbox(reconnectSandboxId, fallbackToCreate, clientConfig, createOptions)\n : await this._createNewSandbox(createOptions);\n\n this._createdAt = this._sandbox.createdAt ? new Date(this._sandbox.createdAt) : new Date();\n this.logger.debug(`${LOG_PREFIX} Railway sandbox ${this._sandbox.id} ready for logical ID: ${this.id}`);\n this._scheduleCheckpointRefresh();\n }\n\n /**\n * Reconnect to an existing Railway sandbox, creating a fresh one when\n * `fallbackToCreate` is set and the sandbox is unavailable or not running.\n */\n private async _reconnectSandbox(\n reconnectSandboxId: string,\n fallbackToCreate: boolean,\n clientConfig: { token?: string; environmentId?: string },\n createOptions: ReturnType<RailwaySandbox['_createOptions']>,\n ): Promise<Sandbox> {\n this.logger.debug(`${LOG_PREFIX} Reconnecting to Railway sandbox ${reconnectSandboxId}...`);\n\n let connectedSandbox: Sandbox;\n try {\n connectedSandbox = await Sandbox.connect(reconnectSandboxId, clientConfig);\n } catch (error) {\n if (!fallbackToCreate || !this.isSandboxUnavailableError(error)) {\n throw error;\n }\n return this._createNewSandbox(createOptions);\n }\n\n if (connectedSandbox.status === 'RUNNING') {\n return connectedSandbox;\n }\n\n if (!fallbackToCreate) {\n throw new Error(`Railway sandbox ${reconnectSandboxId} is not running (status: ${connectedSandbox.status})`);\n }\n\n return this._createNewSandbox(createOptions);\n }\n\n private _clientConfig(): { token?: string; environmentId?: string } {\n return {\n ...(this._token !== undefined && { token: this._token }),\n ...(this._environmentId !== undefined && { environmentId: this._environmentId }),\n };\n }\n\n private _createOptions(clientConfig: { token?: string; environmentId?: string }) {\n return {\n ...clientConfig,\n ...(this._idleTimeoutMinutes !== undefined && { idleTimeoutMinutes: this._idleTimeoutMinutes }),\n ...(this._networkIsolation !== undefined && { networkIsolation: this._networkIsolation }),\n ...(Object.keys(this._env).length > 0 && { env: this._env }),\n };\n }\n\n private async _createNewSandbox(createOptions: ReturnType<RailwaySandbox['_createOptions']>): Promise<Sandbox> {\n const checkpointSandbox = await this._tryCreateFromCheckpoint(createOptions);\n if (checkpointSandbox) {\n return checkpointSandbox;\n }\n\n if (this._templateOption) {\n const template = this._resolveTemplate();\n this.logger.debug(`${LOG_PREFIX} Creating Railway sandbox from template for: ${this.id}`);\n const sandbox = await Sandbox.create(template, createOptions);\n await this._checkpointSandbox(sandbox);\n return sandbox;\n }\n\n this.logger.debug(`${LOG_PREFIX} Creating Railway sandbox for: ${this.id}`);\n const sandbox = await Sandbox.create(createOptions);\n await this._checkpointSandbox(sandbox);\n return sandbox;\n }\n\n private async _tryCreateFromCheckpoint(\n createOptions: ReturnType<RailwaySandbox['_createOptions']>,\n ): Promise<Sandbox | undefined> {\n if (!this._checkpointName) {\n return undefined;\n }\n\n this.logger.debug(`${LOG_PREFIX} Creating Railway sandbox from checkpoint ${this._checkpointName} for: ${this.id}`);\n\n try {\n const sandbox = await Sandbox.create(this._checkpointName, createOptions);\n return sandbox;\n } catch (error) {\n if (!this.isCheckpointUnavailableError(error)) {\n throw error;\n }\n return undefined;\n }\n }\n\n private async _checkpointSandbox(sandbox: Sandbox): Promise<void> {\n if (!this._checkpointName) {\n return;\n }\n\n try {\n this.logger.debug(`${LOG_PREFIX} Capturing Railway sandbox checkpoint ${this._checkpointName} for: ${this.id}`);\n await sandbox.checkpoint(this._checkpointName);\n } catch (error) {\n if (!this.isCheckpointAlreadyExistsError(error)) {\n throw error;\n }\n\n await this._deleteCheckpointByName(this._checkpointName);\n await sandbox.checkpoint(this._checkpointName);\n }\n }\n\n private async _deleteCheckpointByName(name: string): Promise<void> {\n try {\n const checkpoint = (await Sandbox.checkpoints(this._clientConfig())).find(checkpoint => checkpoint.key === name);\n if (!checkpoint) {\n return;\n }\n\n await Sandbox.deleteCheckpoint(checkpoint.id, this._clientConfig());\n } catch (error) {\n if (!this.isCheckpointUnavailableError(error)) {\n throw error;\n }\n }\n }\n\n private _scheduleCheckpointRefresh(): void {\n if (!this._checkpointName || !this._sandbox) {\n return;\n }\n\n const idleTimeoutMinutes = this._idleTimeoutMinutes ?? this._sandbox.idleTimeoutMinutes;\n if (!idleTimeoutMinutes) {\n return;\n }\n\n if (this._checkpointRefreshTimer) {\n clearTimeout(this._checkpointRefreshTimer);\n }\n\n const delayMs = Math.max(1_000, idleTimeoutMinutes * 60_000 - 10_000);\n this._checkpointRefreshTimer = setTimeout(() => {\n this._checkpointRefreshTimer = null;\n const sandbox = this._sandbox;\n if (!sandbox) {\n return;\n }\n\n const refresh = this._checkpointSandbox(sandbox).finally(() => {\n if (this._checkpointRefreshInFlight === refresh) {\n this._checkpointRefreshInFlight = null;\n }\n });\n this._checkpointRefreshInFlight = refresh;\n this._checkpointRefreshInFlight.catch(error => {\n this.logger.warn(`${LOG_PREFIX} Failed to refresh Railway sandbox checkpoint ${this._checkpointName}:`, error);\n });\n }, delayMs);\n this._checkpointRefreshTimer.unref?.();\n }\n\n private _cancelCheckpointRefresh(): void {\n if (this._checkpointRefreshTimer) {\n clearTimeout(this._checkpointRefreshTimer);\n this._checkpointRefreshTimer = null;\n }\n }\n\n private async _flushCheckpointRefresh(): Promise<void> {\n this._cancelCheckpointRefresh();\n\n if (this._checkpointRefreshInFlight) {\n await this._checkpointRefreshInFlight;\n return;\n }\n\n if (this._sandbox) {\n await this._checkpointSandbox(this._sandbox);\n }\n }\n\n private isCheckpointUnavailableError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n return (\n message.includes('checkpoint') &&\n ['not found', 'does not exist', 'missing', 'unknown', 'no checkpoint'].some(phrase => message.includes(phrase))\n );\n }\n\n private isCheckpointAlreadyExistsError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n return (\n message.includes('checkpoint') &&\n (['already exists', 'must be unused', 'unique'].some(phrase => message.includes(phrase)) ||\n (message.includes('name') && message.includes('used')))\n );\n }\n\n private isSandboxUnavailableError(error: unknown, seen = new Set<unknown>()): boolean {\n if (error && typeof error === 'object') {\n if (seen.has(error)) return false;\n seen.add(error);\n }\n\n if (\n error instanceof SandboxNotFoundError ||\n error instanceof SandboxFailedError ||\n (error instanceof SandboxTimeoutError && error.resource === 'sandbox')\n ) {\n return true;\n }\n\n if (error && typeof error === 'object') {\n const errorLike = error as { name?: unknown; message?: unknown; resource?: unknown; cause?: unknown };\n const name = typeof errorLike.name === 'string' ? errorLike.name : '';\n const message = typeof errorLike.message === 'string' ? errorLike.message.toLowerCase() : '';\n\n if (\n name === 'SandboxNotFoundError' ||\n name === 'SandboxFailedError' ||\n (name === 'SandboxTimeoutError' && errorLike.resource === 'sandbox')\n ) {\n return true;\n }\n\n if (\n message.includes('sandbox') &&\n ['not found', 'destroyed', 'failed', 'not running', 'unavailable'].some(phrase => message.includes(phrase))\n ) {\n return true;\n }\n\n if (errorLike.cause !== undefined) {\n return this.isSandboxUnavailableError(errorLike.cause, seen);\n }\n }\n\n return false;\n }\n\n /**\n * Stop the Railway sandbox.\n *\n * Railway sandboxes have no separate \"stopped\" state — they're either\n * running or destroyed — so stopping destroys the sandbox.\n */\n async stop(): Promise<void> {\n await this._teardown();\n }\n\n /**\n * Destroy the Railway sandbox and release its resources.\n */\n async destroy(): Promise<void> {\n await this._teardown();\n }\n\n private async _teardown(): Promise<void> {\n if (!this._sandbox) {\n this._cancelCheckpointRefresh();\n return;\n }\n const sandbox = this._sandbox;\n try {\n await this._flushCheckpointRefresh();\n } catch (error) {\n this.logger.warn(`${LOG_PREFIX} Failed to flush checkpoint before teardown:`, error);\n }\n this._sandbox = null;\n try {\n await sandbox.destroy();\n } catch (error) {\n this.logger.warn(`${LOG_PREFIX} Failed to destroy Railway sandbox ${sandbox.id}:`, error);\n }\n }\n\n /**\n * Resolve the configured template into a `SandboxTemplate` that Railway\n * builds during `Sandbox.create()`. Accepts either a pre-built\n * `SandboxTemplate` or a builder callback over `Sandbox.template()`.\n */\n private _resolveTemplate(): SandboxTemplate {\n const option = this._templateOption!;\n return typeof option === 'function' ? option(Sandbox.template()) : option;\n }\n\n /**\n * Fork this running sandbox into a new, independent `RailwaySandbox`.\n *\n * Clones the filesystem (a fresh boot, not live processes) into the same\n * environment. The returned sandbox is already started and reattached to the\n * forked Railway sandbox; it inherits this sandbox's credentials and defaults\n * unless overridden via `options`.\n *\n * @throws {SandboxNotReadyError} If this sandbox has not been started.\n */\n async fork(\n options: Pick<RailwaySandboxOptions, 'id' | 'idleTimeoutMinutes' | 'networkIsolation' | 'env'> = {},\n ): Promise<RailwaySandbox> {\n const source = this.railway;\n const forked = await source.fork({\n ...(options.idleTimeoutMinutes !== undefined && { idleTimeoutMinutes: options.idleTimeoutMinutes }),\n ...(options.networkIsolation !== undefined && { networkIsolation: options.networkIsolation }),\n ...(options.env !== undefined && { env: options.env }),\n });\n\n const child = new RailwaySandbox({\n ...(options.id !== undefined && { id: options.id }),\n ...(this._token !== undefined && { token: this._token }),\n ...(this._environmentId !== undefined && { environmentId: this._environmentId }),\n sandboxId: forked.id,\n idleTimeoutMinutes: options.idleTimeoutMinutes ?? this._idleTimeoutMinutes,\n networkIsolation: options.networkIsolation ?? this._networkIsolation,\n env: options.env ?? this._env,\n timeout: this._timeout,\n });\n await child._start();\n return child;\n }\n\n // ---------------------------------------------------------------------------\n // Info & Instructions\n // ---------------------------------------------------------------------------\n\n async getInfo(): Promise<SandboxInfo> {\n return {\n id: this.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n createdAt: this._createdAt ?? new Date(),\n metadata: {\n ...(this._sandbox && {\n railwaySandboxId: this._sandbox.id,\n environmentId: this._sandbox.environmentId,\n region: this._sandbox.region,\n networkIsolation: this._sandbox.networkIsolation,\n ...(this._sandbox.idleTimeoutMinutes != null && {\n idleTimeoutMinutes: this._sandbox.idleTimeoutMinutes,\n }),\n }),\n },\n };\n }\n\n getInstructions(): string {\n const defaultInstructions = this._buildDefaultInstructions();\n\n if (typeof this._instructionsOverride === 'string') {\n return this._instructionsOverride;\n }\n if (typeof this._instructionsOverride === 'function') {\n return this._instructionsOverride({ defaultInstructions });\n }\n return defaultInstructions;\n }\n\n private _buildDefaultInstructions(): string {\n const parts: string[] = [];\n parts.push('Railway cloud sandbox: an isolated Debian Linux VM with outbound internet access.');\n\n if (this._networkIsolation === 'PRIVATE') {\n parts.push('Joined to the environment private network.');\n }\n\n if (this._timeout !== undefined) {\n parts.push(`Default command timeout: ${Math.ceil(this._timeout / 1000)}s.`);\n } else {\n parts.push('Commands run until they exit unless a timeout is set.');\n }\n\n if (this._idleTimeoutMinutes !== undefined) {\n parts.push(`Idle timeout: ${this._idleTimeoutMinutes} minute(s).`);\n }\n\n return parts.join(' ');\n }\n\n // ---------------------------------------------------------------------------\n // Command Execution\n // ---------------------------------------------------------------------------\n\n /**\n * Execute a command in the sandbox and return the result.\n */\n async executeCommand(\n command: string,\n args: string[] = [],\n options: ExecuteCommandOptions = {},\n ): Promise<CommandResult> {\n return this.withRestartRetry(async () => {\n const fullCommand = args.length > 0 ? `${command} ${args.map(shellQuote).join(' ')}` : command;\n const timeout = options.timeout ?? this._timeout;\n const env = options.env\n ? Object.fromEntries(\n Object.entries(options.env).filter((entry): entry is [string, string] => entry[1] !== undefined),\n )\n : undefined;\n const startedAt = Date.now();\n const result = await this.railway.exec(fullCommand, {\n ...(timeout !== undefined && { timeoutSec: Math.ceil(timeout / 1000) }),\n ...(options.cwd !== undefined && { cwd: options.cwd }),\n ...(env !== undefined && { env }),\n });\n const exitCode = result.exitCode ?? -1;\n return {\n success: exitCode === 0,\n exitCode,\n stdout: result.stdout,\n stderr: result.stderr,\n executionTimeMs: Date.now() - startedAt,\n command,\n args,\n timedOut: result.timedOut,\n };\n });\n }\n}\n","/**\n * Railway sandbox provider descriptor for MastraEditor.\n *\n * @example\n * ```typescript\n * import { railwaySandboxProvider } from '@mastra/railway';\n *\n * const editor = new MastraEditor({\n * sandboxes: { [railwaySandboxProvider.id]: railwaySandboxProvider },\n * });\n * ```\n */\nimport type { SandboxProvider } from '@mastra/core/editor';\nimport { RailwaySandbox } from './sandbox';\n\n/**\n * Serializable subset of RailwaySandboxOptions for editor storage.\n */\ninterface RailwayProviderConfig {\n token?: string;\n environmentId?: string;\n sandboxId?: string;\n idleTimeoutMinutes?: number;\n networkIsolation?: 'ISOLATED' | 'PRIVATE';\n env?: Record<string, string>;\n timeout?: number;\n}\n\nexport const railwaySandboxProvider: SandboxProvider<RailwayProviderConfig> = {\n id: 'railway',\n name: 'Railway Sandbox',\n description: 'Ephemeral, isolated Linux VM powered by Railway',\n configSchema: {\n type: 'object',\n properties: {\n token: { type: 'string', description: 'Railway API token (falls back to RAILWAY_API_TOKEN)' },\n environmentId: {\n type: 'string',\n description: 'Railway environment ID (falls back to RAILWAY_ENVIRONMENT_ID)',\n },\n sandboxId: { type: 'string', description: 'Reattach to an existing Railway sandbox by ID' },\n idleTimeoutMinutes: {\n type: 'number',\n description: 'Minutes a sandbox can sit idle before Railway destroys it',\n },\n networkIsolation: {\n type: 'string',\n description: 'Network isolation mode',\n enum: ['ISOLATED', 'PRIVATE'],\n default: 'ISOLATED',\n },\n env: {\n type: 'object',\n description: 'Environment variables',\n additionalProperties: { type: 'string' },\n },\n timeout: { type: 'number', description: 'Default command timeout in ms' },\n },\n },\n createSandbox: config => new RailwaySandbox(config),\n};\n"]}
1
+ {"version":3,"sources":["../src/utils/shell-quote.ts","../src/sandbox/process-manager.ts","../src/sandbox/index.ts","../src/provider.ts"],"names":["sandbox","checkpoint"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Shell-quote a single argument for safe use in a command string.\n *\n * Arguments containing only safe characters are returned as-is.\n * All others are wrapped in single quotes with embedded single quotes escaped.\n */\nexport function shellQuote(arg: string): string {\n // Safe characters that don't need quoting\n if (/^[a-zA-Z0-9._\\-/@:=]+$/.test(arg)) return arg;\n // Wrap in single quotes, escaping any embedded single quotes\n return \"'\" + arg.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n","/**\n * Railway Process Manager\n *\n * Implements SandboxProcessManager for Railway sandboxes.\n * Wraps the Railway SDK's `Sandbox.exec()` API.\n *\n * Railway's `exec(command, options)` accepts per-call `cwd` and `env` options\n * (since SDK v3.3.1) and returns an `ExecHandle` that runs the command\n * server-side, independently of the client. Each spawn() starts one exec.\n * The handle streams output via `onStdout`/`onStderr` callbacks wired to\n * `emitStdout`/`emitStderr`, exposes a durable `sessionName`, and can be\n * terminated with `kill(signal)`.\n */\n\nimport { ProcessHandle, SandboxProcessManager } from '@mastra/core/workspace';\nimport type { CommandResult, ProcessInfo, SpawnProcessOptions } from '@mastra/core/workspace';\nimport type { ExecHandle, ExecResult } from 'railway';\nimport type { RailwaySandbox } from './index';\n\nexport const LOG_PREFIX = '[RailwaySandbox]';\n\n// =============================================================================\n// Railway Process Handle\n// =============================================================================\n\n/**\n * Wraps a Railway ExecHandle to conform to Mastra's ProcessHandle.\n * Not exported — internal to this module.\n */\nclass RailwayProcessHandle extends ProcessHandle {\n readonly pid: string;\n\n private readonly _execHandle: ExecHandle;\n private readonly _startTime: number;\n private _exitCode: number | undefined;\n private _waitPromise: Promise<CommandResult> | null = null;\n private _killed = false;\n\n constructor(pid: string, execHandle: ExecHandle, startTime: number, options?: SpawnProcessOptions) {\n super(options);\n this.pid = pid;\n this._execHandle = execHandle;\n this._startTime = startTime;\n\n // Resolve exit code once the command completes so exitCode is available\n // without an explicit wait().\n void this._execHandle.then(\n (result: ExecResult) => {\n // -1 means terminated by a signal (e.g. after kill()).\n this._exitCode = result.exitCode ?? (this._killed ? 137 : -1);\n },\n () => {\n if (this._exitCode === undefined) {\n this._exitCode = 1;\n }\n },\n );\n }\n\n get exitCode(): number | undefined {\n return this._exitCode;\n }\n\n async wait(): Promise<CommandResult> {\n // Idempotent — cache the promise so repeated calls return the same result.\n if (!this._waitPromise) {\n this._waitPromise = this._doWait();\n }\n return this._waitPromise;\n }\n\n private async _doWait(): Promise<CommandResult> {\n try {\n const result = await this._execHandle;\n const exitCode = result.exitCode ?? (this._killed ? 137 : -1);\n this._exitCode = exitCode;\n\n // Railway captures output server-side; surface it through the base buffers\n // if streaming callbacks didn't already populate them.\n if (result.stdout && !this.stdout) this.emitStdout(result.stdout);\n if (result.stderr && !this.stderr) this.emitStderr(result.stderr);\n\n return {\n success: exitCode === 0,\n exitCode,\n stdout: this.stdout,\n stderr: this.stderr,\n executionTimeMs: Date.now() - this._startTime,\n killed: this._killed,\n timedOut: result.timedOut,\n };\n } catch (error) {\n const exitCode = this._exitCode ?? 1;\n this._exitCode = exitCode;\n return {\n success: false,\n exitCode,\n stdout: this.stdout,\n stderr: this.stderr || (error instanceof Error ? error.message : String(error)),\n executionTimeMs: Date.now() - this._startTime,\n killed: this._killed,\n };\n }\n }\n\n async kill(): Promise<boolean> {\n if (this._exitCode !== undefined) return false;\n this._killed = true;\n try {\n return await this._execHandle.kill('TERM');\n } catch {\n // Command may already be gone.\n return false;\n }\n }\n\n async sendStdin(_data: string): Promise<void> {\n // Railway's exec API does not expose stdin streaming.\n throw new Error(`${LOG_PREFIX} sending stdin is not supported by the Railway sandbox provider`);\n }\n}\n\n// =============================================================================\n// Railway Process Manager\n// =============================================================================\n\nexport interface RailwayProcessManagerOptions {\n env?: Record<string, string | undefined>;\n}\n\n/**\n * Railway implementation of SandboxProcessManager.\n * Uses the Railway SDK's `Sandbox.exec()` with one exec per spawned process.\n */\nexport class RailwayProcessManager extends SandboxProcessManager<RailwaySandbox> {\n private _spawnCounter = 0;\n\n constructor(opts: RailwayProcessManagerOptions = {}) {\n super({ env: opts.env });\n }\n\n async spawn(command: string, options: SpawnProcessOptions = {}): Promise<ProcessHandle> {\n const railway = this.sandbox.railway;\n\n // Merge default env with per-spawn env.\n const mergedEnv = { ...this.env, ...options.env };\n const env = Object.fromEntries(\n Object.entries(mergedEnv).filter((entry): entry is [string, string] => entry[1] !== undefined),\n );\n\n const pid = `railway-proc-${Date.now().toString(36)}-${(this._spawnCounter++).toString(36)}`;\n\n // Deferred reference — callbacks fire asynchronously after the handle is\n // assigned, so `handle` is always defined by the time they run.\n let handle: RailwayProcessHandle;\n\n const execHandle = railway.exec(command, {\n ...(options.timeout !== undefined && { timeoutSec: Math.ceil(options.timeout / 1000) }),\n ...(options.cwd !== undefined && { cwd: options.cwd }),\n ...(Object.keys(env).length > 0 && { env }),\n onStdout: (chunk: string) => handle.emitStdout(chunk),\n onStderr: (chunk: string) => handle.emitStderr(chunk),\n });\n\n handle = new RailwayProcessHandle(pid, execHandle, Date.now(), options);\n this._tracked.set(handle.pid, handle);\n return handle;\n }\n\n /**\n * List tracked processes.\n *\n * Railway has no API to enumerate running exec sessions by sandbox, so this\n * reports the processes this manager spawned.\n */\n async list(): Promise<ProcessInfo[]> {\n return Array.from(this._tracked.values()).map(handle => ({\n pid: handle.pid,\n command: handle.command,\n running: handle.exitCode === undefined,\n ...(handle.exitCode !== undefined && { exitCode: handle.exitCode }),\n }));\n }\n}\n","/**\n * Railway Sandbox Provider\n *\n * A Railway sandbox implementation for Mastra workspaces. Provisions an\n * ephemeral, isolated Linux VM on Railway, runs commands in it via the\n * Railway TypeScript SDK, and destroys it on teardown.\n *\n * @see https://docs.railway.com/sandboxes\n */\n\nimport type {\n CommandResult,\n ExecuteCommandOptions,\n InstructionsOption,\n MastraSandboxOptions,\n ProviderStatus,\n SandboxCloneOptions,\n SandboxInfo,\n} from '@mastra/core/workspace';\nimport { MastraSandbox, SandboxNotReadyError } from '@mastra/core/workspace';\nimport { Sandbox, SandboxFailedError, SandboxNotFoundError, SandboxTimeoutError } from 'railway';\nimport type { SandboxNetworkIsolation, SandboxTemplate } from 'railway';\nimport { shellQuote } from '../utils/shell-quote';\nimport { LOG_PREFIX, RailwayProcessManager } from './process-manager';\n\n// =============================================================================\n// Railway Sandbox Options\n// =============================================================================\n\n/**\n * Railway sandbox provider configuration.\n */\nexport interface RailwaySandboxOptions extends Omit<MastraSandboxOptions, 'processes'> {\n /** Unique identifier for this sandbox instance. */\n id?: string;\n /** Railway API token. Falls back to the RAILWAY_API_TOKEN env var. */\n token?: string;\n /** Railway environment ID. Falls back to the RAILWAY_ENVIRONMENT_ID env var. */\n environmentId?: string;\n /**\n * Reattach to an existing Railway sandbox by its Railway ID instead of\n * creating a new one. When set, `start()` calls `Sandbox.connect()`.\n */\n sandboxId?: string;\n /**\n * Reuse a saved Railway sandbox checkpoint as the baseline filesystem for\n * new sandboxes. When the named checkpoint is missing, the sandbox is created\n * normally and a checkpoint is captured after setup succeeds.\n */\n checkpointName?: string;\n /**\n * How long the sandbox can sit idle (no `exec` interaction) before Railway\n * destroys it automatically. Range depends on plan (1–120 minutes on\n * Hobby/Pro, 1–5 on Trial/Free). Defaults to the plan default when omitted.\n */\n idleTimeoutMinutes?: number;\n /**\n * Network isolation mode.\n * - `ISOLATED` (default): outbound internet only, no private network access.\n * - `PRIVATE`: joins the environment's private network.\n */\n networkIsolation?: SandboxNetworkIsolation;\n /** Environment variables baked into the sandbox, available to every command. */\n env?: Record<string, string>;\n /**\n * Provision the sandbox from a custom base image built with the Railway\n * template builder. Use this to pre-install packages or run setup steps so\n * every sandbox created from it starts ready.\n *\n * - Builder callback — receives the base `Sandbox.template()` and returns the\n * configured template. Railway builds the template when `Sandbox.create()`\n * runs during `start()`.\n * ```ts\n * template: t => t.withPackages('git', 'curl').run('npm i -g pnpm')\n * ```\n * - Pre-built `SandboxTemplate` — pass a template to reuse it across\n * sandboxes. Railway still builds the image during sandbox creation.\n *\n * Ignored when `sandboxId` is set (reattach) or when forking.\n */\n template?: SandboxTemplate | ((base: SandboxTemplate) => SandboxTemplate);\n /**\n * Default execution timeout in milliseconds applied to commands that don't\n * specify their own timeout. When omitted, commands run until they exit.\n */\n timeout?: number;\n /**\n * Custom instructions that override the default instructions returned by\n * `getInstructions()`.\n *\n * - `string` — Fully replaces the default instructions. Pass an empty string\n * to suppress instructions entirely.\n * - `(opts) => string` — Receives the default instructions and optional\n * request context so you can extend or customise per-request.\n */\n instructions?: InstructionsOption;\n}\n\n// =============================================================================\n// Railway Sandbox Implementation\n// =============================================================================\n\n/**\n * Railway sandbox provider for Mastra workspaces.\n *\n * Features:\n * - Ephemeral, isolated Linux VM via the Railway TypeScript SDK\n * - Command execution with streaming output and timeouts\n * - Configurable idle timeout and network isolation\n * - Reattach to an existing sandbox by Railway ID\n *\n * @example Basic usage\n * ```typescript\n * import { Workspace } from '@mastra/core/workspace';\n * import { RailwaySandbox } from '@mastra/railway';\n *\n * const sandbox = new RailwaySandbox({\n * // token + environmentId read from RAILWAY_API_TOKEN / RAILWAY_ENVIRONMENT_ID\n * idleTimeoutMinutes: 30,\n * });\n *\n * const workspace = new Workspace({ sandbox });\n * const result = await workspace.executeCode('console.log(\"Hello!\")');\n * ```\n *\n * @example Private networking\n * ```typescript\n * const sandbox = new RailwaySandbox({\n * networkIsolation: 'PRIVATE',\n * env: { NODE_ENV: 'production' },\n * });\n * ```\n */\nexport class RailwaySandbox extends MastraSandbox {\n readonly id: string;\n readonly name = 'RailwaySandbox';\n readonly provider = 'railway';\n status: ProviderStatus = 'pending';\n\n declare readonly processes: RailwayProcessManager;\n\n private _sandbox: Sandbox | null = null;\n private _createdAt: Date | null = null;\n private _checkpointRefreshTimer: ReturnType<typeof setTimeout> | null = null;\n private _checkpointRefreshInFlight: Promise<void> | null = null;\n\n private readonly _token?: string;\n private readonly _environmentId?: string;\n private readonly _sandboxId?: string;\n private readonly _checkpointName?: string;\n private readonly _idleTimeoutMinutes?: number;\n private readonly _networkIsolation?: SandboxNetworkIsolation;\n private readonly _env: Record<string, string>;\n private readonly _timeout?: number;\n private readonly _instructionsOverride?: InstructionsOption;\n private readonly _templateOption?: RailwaySandboxOptions['template'];\n\n constructor(options: RailwaySandboxOptions = {}) {\n super({\n ...options,\n name: 'RailwaySandbox',\n processes: new RailwayProcessManager({ env: options.env }),\n });\n\n this.id = options.id ?? this.generateId();\n this._token = options.token ?? process.env.RAILWAY_API_TOKEN;\n this._environmentId = options.environmentId ?? process.env.RAILWAY_ENVIRONMENT_ID;\n this._sandboxId = options.sandboxId;\n this._checkpointName = options.checkpointName;\n this._idleTimeoutMinutes = options.idleTimeoutMinutes;\n this._networkIsolation = options.networkIsolation;\n this._env = options.env ?? {};\n this._timeout = options.timeout;\n this._instructionsOverride = options.instructions;\n this._templateOption = options.template;\n }\n\n private generateId(): string {\n return `railway-sandbox-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n /**\n * Get the underlying Railway Sandbox instance for direct SDK access.\n *\n * @throws {SandboxNotReadyError} If the sandbox has not been started.\n */\n get railway(): Sandbox {\n if (!this._sandbox) {\n throw new SandboxNotReadyError(this.id);\n }\n return this._sandbox;\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n /**\n * Start the Railway sandbox.\n *\n * Reattaches to an existing sandbox when `sandboxId` is configured,\n * otherwise provisions a new one. Resolves once the sandbox is RUNNING.\n */\n async start(): Promise<void> {\n if (this._sandbox) {\n return;\n }\n\n await this._startRailwaySandbox({ reconnectSandboxId: this._sandboxId, fallbackToCreate: false });\n }\n\n async restart(): Promise<void> {\n const reconnectSandboxId = this._sandbox?.id ?? this._sandboxId;\n this._cancelCheckpointRefresh();\n await this._checkpointRefreshInFlight?.catch(error => {\n this.logger.warn(`${LOG_PREFIX} Failed to flush in-flight checkpoint before restart:`, error);\n });\n this._sandbox = null;\n this._createdAt = null;\n this.status = 'starting';\n\n try {\n await this._startRailwaySandbox({ reconnectSandboxId, fallbackToCreate: true });\n this.status = 'running';\n } catch (error) {\n this.status = 'error';\n throw error;\n }\n }\n\n async withRestartRetry<T>(operation: () => Promise<T>): Promise<T> {\n await this.ensureRunning();\n try {\n return await operation();\n } catch (error) {\n if (!this.isSandboxUnavailableError(error)) {\n throw error;\n }\n\n await this.restart();\n return await operation();\n } finally {\n this._scheduleCheckpointRefresh();\n }\n }\n\n private async _startRailwaySandbox({\n reconnectSandboxId,\n fallbackToCreate,\n }: {\n reconnectSandboxId?: string;\n fallbackToCreate: boolean;\n }): Promise<void> {\n const clientConfig = this._clientConfig();\n const createOptions = this._createOptions(clientConfig);\n\n this._sandbox = reconnectSandboxId\n ? await this._reconnectSandbox(reconnectSandboxId, fallbackToCreate, clientConfig, createOptions)\n : await this._createNewSandbox(createOptions);\n\n this._createdAt = this._sandbox.createdAt ? new Date(this._sandbox.createdAt) : new Date();\n this.logger.debug(`${LOG_PREFIX} Railway sandbox ${this._sandbox.id} ready for logical ID: ${this.id}`);\n this._scheduleCheckpointRefresh();\n }\n\n /**\n * Reconnect to an existing Railway sandbox, creating a fresh one when\n * `fallbackToCreate` is set and the sandbox is unavailable or not running.\n */\n private async _reconnectSandbox(\n reconnectSandboxId: string,\n fallbackToCreate: boolean,\n clientConfig: { token?: string; environmentId?: string },\n createOptions: ReturnType<RailwaySandbox['_createOptions']>,\n ): Promise<Sandbox> {\n this.logger.debug(`${LOG_PREFIX} Reconnecting to Railway sandbox ${reconnectSandboxId}...`);\n\n let connectedSandbox: Sandbox;\n try {\n connectedSandbox = await Sandbox.connect(reconnectSandboxId, clientConfig);\n } catch (error) {\n if (!fallbackToCreate || !this.isSandboxUnavailableError(error)) {\n throw error;\n }\n return this._createNewSandbox(createOptions);\n }\n\n if (connectedSandbox.status === 'RUNNING') {\n return connectedSandbox;\n }\n\n if (!fallbackToCreate) {\n throw new Error(`Railway sandbox ${reconnectSandboxId} is not running (status: ${connectedSandbox.status})`);\n }\n\n return this._createNewSandbox(createOptions);\n }\n\n private _clientConfig(): { token?: string; environmentId?: string } {\n return {\n ...(this._token !== undefined && { token: this._token }),\n ...(this._environmentId !== undefined && { environmentId: this._environmentId }),\n };\n }\n\n private _createOptions(clientConfig: { token?: string; environmentId?: string }) {\n return {\n ...clientConfig,\n ...(this._idleTimeoutMinutes !== undefined && { idleTimeoutMinutes: this._idleTimeoutMinutes }),\n ...(this._networkIsolation !== undefined && { networkIsolation: this._networkIsolation }),\n ...(Object.keys(this._env).length > 0 && { env: this._env }),\n };\n }\n\n private async _createNewSandbox(createOptions: ReturnType<RailwaySandbox['_createOptions']>): Promise<Sandbox> {\n const checkpointSandbox = await this._tryCreateFromCheckpoint(createOptions);\n if (checkpointSandbox) {\n return checkpointSandbox;\n }\n\n if (this._templateOption) {\n const template = this._resolveTemplate();\n this.logger.debug(`${LOG_PREFIX} Creating Railway sandbox from template for: ${this.id}`);\n const sandbox = await Sandbox.create(template, createOptions);\n await this._checkpointSandbox(sandbox);\n return sandbox;\n }\n\n this.logger.debug(`${LOG_PREFIX} Creating Railway sandbox for: ${this.id}`);\n const sandbox = await Sandbox.create(createOptions);\n await this._checkpointSandbox(sandbox);\n return sandbox;\n }\n\n private async _tryCreateFromCheckpoint(\n createOptions: ReturnType<RailwaySandbox['_createOptions']>,\n ): Promise<Sandbox | undefined> {\n if (!this._checkpointName) {\n return undefined;\n }\n\n this.logger.debug(`${LOG_PREFIX} Creating Railway sandbox from checkpoint ${this._checkpointName} for: ${this.id}`);\n\n try {\n const sandbox = await Sandbox.create(this._checkpointName, createOptions);\n return sandbox;\n } catch (error) {\n if (!this.isCheckpointUnavailableError(error)) {\n throw error;\n }\n return undefined;\n }\n }\n\n private async _checkpointSandbox(sandbox: Sandbox): Promise<void> {\n if (!this._checkpointName) {\n return;\n }\n\n try {\n this.logger.debug(`${LOG_PREFIX} Capturing Railway sandbox checkpoint ${this._checkpointName} for: ${this.id}`);\n await sandbox.checkpoint(this._checkpointName);\n } catch (error) {\n if (!this.isCheckpointAlreadyExistsError(error)) {\n throw error;\n }\n\n await this._deleteCheckpointByName(this._checkpointName);\n await sandbox.checkpoint(this._checkpointName);\n }\n }\n\n private async _deleteCheckpointByName(name: string): Promise<void> {\n try {\n const checkpoint = (await Sandbox.checkpoints(this._clientConfig())).find(checkpoint => checkpoint.key === name);\n if (!checkpoint) {\n return;\n }\n\n await Sandbox.deleteCheckpoint(checkpoint.id, this._clientConfig());\n } catch (error) {\n if (!this.isCheckpointUnavailableError(error)) {\n throw error;\n }\n }\n }\n\n private _scheduleCheckpointRefresh(): void {\n if (!this._checkpointName || !this._sandbox) {\n return;\n }\n\n const idleTimeoutMinutes = this._idleTimeoutMinutes ?? this._sandbox.idleTimeoutMinutes;\n if (!idleTimeoutMinutes) {\n return;\n }\n\n if (this._checkpointRefreshTimer) {\n clearTimeout(this._checkpointRefreshTimer);\n }\n\n const delayMs = Math.max(1_000, idleTimeoutMinutes * 60_000 - 10_000);\n this._checkpointRefreshTimer = setTimeout(() => {\n this._checkpointRefreshTimer = null;\n const sandbox = this._sandbox;\n if (!sandbox) {\n return;\n }\n\n const refresh = this._checkpointSandbox(sandbox).finally(() => {\n if (this._checkpointRefreshInFlight === refresh) {\n this._checkpointRefreshInFlight = null;\n }\n });\n this._checkpointRefreshInFlight = refresh;\n this._checkpointRefreshInFlight.catch(error => {\n this.logger.warn(`${LOG_PREFIX} Failed to refresh Railway sandbox checkpoint ${this._checkpointName}:`, error);\n });\n }, delayMs);\n this._checkpointRefreshTimer.unref?.();\n }\n\n private _cancelCheckpointRefresh(): void {\n if (this._checkpointRefreshTimer) {\n clearTimeout(this._checkpointRefreshTimer);\n this._checkpointRefreshTimer = null;\n }\n }\n\n private async _flushCheckpointRefresh(): Promise<void> {\n this._cancelCheckpointRefresh();\n\n if (this._checkpointRefreshInFlight) {\n await this._checkpointRefreshInFlight;\n return;\n }\n\n if (this._sandbox) {\n await this._checkpointSandbox(this._sandbox);\n }\n }\n\n private isCheckpointUnavailableError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n return (\n message.includes('checkpoint') &&\n ['not found', 'does not exist', 'missing', 'unknown', 'no checkpoint'].some(phrase => message.includes(phrase))\n );\n }\n\n private isCheckpointAlreadyExistsError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n return (\n message.includes('checkpoint') &&\n (['already exists', 'must be unused', 'unique'].some(phrase => message.includes(phrase)) ||\n (message.includes('name') && message.includes('used')))\n );\n }\n\n private isSandboxUnavailableError(error: unknown, seen = new Set<unknown>()): boolean {\n if (error && typeof error === 'object') {\n if (seen.has(error)) return false;\n seen.add(error);\n }\n\n if (\n error instanceof SandboxNotFoundError ||\n error instanceof SandboxFailedError ||\n (error instanceof SandboxTimeoutError && error.resource === 'sandbox')\n ) {\n return true;\n }\n\n if (error && typeof error === 'object') {\n const errorLike = error as { name?: unknown; message?: unknown; resource?: unknown; cause?: unknown };\n const name = typeof errorLike.name === 'string' ? errorLike.name : '';\n const message = typeof errorLike.message === 'string' ? errorLike.message.toLowerCase() : '';\n\n if (\n name === 'SandboxNotFoundError' ||\n name === 'SandboxFailedError' ||\n (name === 'SandboxTimeoutError' && errorLike.resource === 'sandbox')\n ) {\n return true;\n }\n\n if (\n message.includes('sandbox') &&\n ['not found', 'destroyed', 'failed', 'not running', 'unavailable'].some(phrase => message.includes(phrase))\n ) {\n return true;\n }\n\n if (errorLike.cause !== undefined) {\n return this.isSandboxUnavailableError(errorLike.cause, seen);\n }\n }\n\n return false;\n }\n\n /**\n * Stop the Railway sandbox.\n *\n * Railway sandboxes have no separate \"stopped\" state — they're either\n * running or destroyed — so stopping destroys the sandbox.\n */\n async stop(): Promise<void> {\n await this._teardown();\n }\n\n /**\n * Destroy the Railway sandbox and release its resources.\n */\n async destroy(): Promise<void> {\n await this._teardown();\n }\n\n private async _teardown(): Promise<void> {\n if (!this._sandbox) {\n this._cancelCheckpointRefresh();\n return;\n }\n const sandbox = this._sandbox;\n try {\n await this._flushCheckpointRefresh();\n } catch (error) {\n this.logger.warn(`${LOG_PREFIX} Failed to flush checkpoint before teardown:`, error);\n }\n this._sandbox = null;\n try {\n await sandbox.destroy();\n } catch (error) {\n this.logger.warn(`${LOG_PREFIX} Failed to destroy Railway sandbox ${sandbox.id}:`, error);\n }\n }\n\n /**\n * Resolve the configured template into a `SandboxTemplate` that Railway\n * builds during `Sandbox.create()`. Accepts either a pre-built\n * `SandboxTemplate` or a builder callback over `Sandbox.template()`.\n */\n private _resolveTemplate(): SandboxTemplate {\n const option = this._templateOption!;\n return typeof option === 'function' ? option(Sandbox.template()) : option;\n }\n\n /**\n * Fork this running sandbox into a new, independent `RailwaySandbox`.\n *\n * Clones the filesystem (a fresh boot, not live processes) into the same\n * environment. The returned sandbox is already started and reattached to the\n * forked Railway sandbox; it inherits this sandbox's credentials and defaults\n * unless overridden via `options`.\n *\n * @throws {SandboxNotReadyError} If this sandbox has not been started.\n */\n async fork(\n options: Pick<RailwaySandboxOptions, 'id' | 'idleTimeoutMinutes' | 'networkIsolation' | 'env'> = {},\n ): Promise<RailwaySandbox> {\n const source = this.railway;\n const forked = await source.fork({\n ...(options.idleTimeoutMinutes !== undefined && { idleTimeoutMinutes: options.idleTimeoutMinutes }),\n ...(options.networkIsolation !== undefined && { networkIsolation: options.networkIsolation }),\n ...(options.env !== undefined && { env: options.env }),\n });\n\n const child = new RailwaySandbox({\n ...(options.id !== undefined && { id: options.id }),\n ...(this._token !== undefined && { token: this._token }),\n ...(this._environmentId !== undefined && { environmentId: this._environmentId }),\n sandboxId: forked.id,\n idleTimeoutMinutes: options.idleTimeoutMinutes ?? this._idleTimeoutMinutes,\n networkIsolation: options.networkIsolation ?? this._networkIsolation,\n env: options.env ?? this._env,\n timeout: this._timeout,\n });\n await child._start();\n return child;\n }\n\n /**\n * Construct a sibling `RailwaySandbox` that inherits this sandbox's\n * credentials and defaults (token, environment, checkpoint, network\n * isolation, timeout, template, instructions) with per-instance overrides.\n *\n * Unlike {@link fork}, `clone` performs no I/O and does not require this\n * sandbox to be started — the returned sandbox is not started and provisions\n * (or reattaches, when `sandboxId` is set) on its own `start()`. Use it when\n * one configured sandbox acts as the template for a fleet of independent\n * sandboxes (e.g. one per project).\n */\n clone(options: SandboxCloneOptions = {}): RailwaySandbox {\n return new RailwaySandbox({\n ...(options.id !== undefined && { id: options.id }),\n ...(this._token !== undefined && { token: this._token }),\n ...(this._environmentId !== undefined && { environmentId: this._environmentId }),\n ...(options.sandboxId !== undefined && { sandboxId: options.sandboxId }),\n ...((options.checkpointName ?? this._checkpointName) !== undefined && {\n checkpointName: options.checkpointName ?? this._checkpointName,\n }),\n idleTimeoutMinutes: options.idleTimeoutMinutes ?? this._idleTimeoutMinutes,\n ...(this._networkIsolation !== undefined && { networkIsolation: this._networkIsolation }),\n env: options.env ?? this._env,\n ...(this._templateOption !== undefined && { template: this._templateOption }),\n ...(this._timeout !== undefined && { timeout: this._timeout }),\n ...(this._instructionsOverride !== undefined && { instructions: this._instructionsOverride }),\n });\n }\n\n /**\n * Whether a Railway API token was resolved at construction (explicit option\n * or the `RAILWAY_API_TOKEN` env fallback). Lets callers gate features on a\n * usable configuration without provisioning a sandbox.\n */\n get hasCredentials(): boolean {\n return this._token !== undefined && this._token !== '';\n }\n\n /** The configured idle teardown window in minutes, if any. */\n get idleTimeoutMinutes(): number | undefined {\n return this._idleTimeoutMinutes;\n }\n\n // ---------------------------------------------------------------------------\n // Info & Instructions\n // ---------------------------------------------------------------------------\n\n async getInfo(): Promise<SandboxInfo> {\n return {\n id: this.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n createdAt: this._createdAt ?? new Date(),\n metadata: {\n ...(this._sandbox && {\n railwaySandboxId: this._sandbox.id,\n environmentId: this._sandbox.environmentId,\n region: this._sandbox.region,\n networkIsolation: this._sandbox.networkIsolation,\n ...(this._sandbox.idleTimeoutMinutes != null && {\n idleTimeoutMinutes: this._sandbox.idleTimeoutMinutes,\n }),\n }),\n },\n };\n }\n\n getInstructions(): string {\n const defaultInstructions = this._buildDefaultInstructions();\n\n if (typeof this._instructionsOverride === 'string') {\n return this._instructionsOverride;\n }\n if (typeof this._instructionsOverride === 'function') {\n return this._instructionsOverride({ defaultInstructions });\n }\n return defaultInstructions;\n }\n\n private _buildDefaultInstructions(): string {\n const parts: string[] = [];\n parts.push('Railway cloud sandbox: an isolated Debian Linux VM with outbound internet access.');\n\n if (this._networkIsolation === 'PRIVATE') {\n parts.push('Joined to the environment private network.');\n }\n\n if (this._timeout !== undefined) {\n parts.push(`Default command timeout: ${Math.ceil(this._timeout / 1000)}s.`);\n } else {\n parts.push('Commands run until they exit unless a timeout is set.');\n }\n\n if (this._idleTimeoutMinutes !== undefined) {\n parts.push(`Idle timeout: ${this._idleTimeoutMinutes} minute(s).`);\n }\n\n return parts.join(' ');\n }\n\n // ---------------------------------------------------------------------------\n // Command Execution\n // ---------------------------------------------------------------------------\n\n /**\n * Execute a command in the sandbox and return the result.\n */\n async executeCommand(\n command: string,\n args: string[] = [],\n options: ExecuteCommandOptions = {},\n ): Promise<CommandResult> {\n return this.withRestartRetry(async () => {\n const fullCommand = args.length > 0 ? `${command} ${args.map(shellQuote).join(' ')}` : command;\n const timeout = options.timeout ?? this._timeout;\n const env = options.env\n ? Object.fromEntries(\n Object.entries(options.env).filter((entry): entry is [string, string] => entry[1] !== undefined),\n )\n : undefined;\n const startedAt = Date.now();\n const result = await this.railway.exec(fullCommand, {\n ...(timeout !== undefined && { timeoutSec: Math.ceil(timeout / 1000) }),\n ...(options.cwd !== undefined && { cwd: options.cwd }),\n ...(env !== undefined && { env }),\n });\n const exitCode = result.exitCode ?? -1;\n return {\n success: exitCode === 0,\n exitCode,\n stdout: result.stdout,\n stderr: result.stderr,\n executionTimeMs: Date.now() - startedAt,\n command,\n args,\n timedOut: result.timedOut,\n };\n });\n }\n}\n","/**\n * Railway sandbox provider descriptor for MastraEditor.\n *\n * @example\n * ```typescript\n * import { railwaySandboxProvider } from '@mastra/railway';\n *\n * const editor = new MastraEditor({\n * sandboxes: { [railwaySandboxProvider.id]: railwaySandboxProvider },\n * });\n * ```\n */\nimport type { SandboxProvider } from '@mastra/core/editor';\nimport { RailwaySandbox } from './sandbox';\n\n/**\n * Serializable subset of RailwaySandboxOptions for editor storage.\n */\ninterface RailwayProviderConfig {\n token?: string;\n environmentId?: string;\n sandboxId?: string;\n idleTimeoutMinutes?: number;\n networkIsolation?: 'ISOLATED' | 'PRIVATE';\n env?: Record<string, string>;\n timeout?: number;\n}\n\nexport const railwaySandboxProvider: SandboxProvider<RailwayProviderConfig> = {\n id: 'railway',\n name: 'Railway Sandbox',\n description: 'Ephemeral, isolated Linux VM powered by Railway',\n configSchema: {\n type: 'object',\n properties: {\n token: { type: 'string', description: 'Railway API token (falls back to RAILWAY_API_TOKEN)' },\n environmentId: {\n type: 'string',\n description: 'Railway environment ID (falls back to RAILWAY_ENVIRONMENT_ID)',\n },\n sandboxId: { type: 'string', description: 'Reattach to an existing Railway sandbox by ID' },\n idleTimeoutMinutes: {\n type: 'number',\n description: 'Minutes a sandbox can sit idle before Railway destroys it',\n },\n networkIsolation: {\n type: 'string',\n description: 'Network isolation mode',\n enum: ['ISOLATED', 'PRIVATE'],\n default: 'ISOLATED',\n },\n env: {\n type: 'object',\n description: 'Environment variables',\n additionalProperties: { type: 'string' },\n },\n timeout: { type: 'number', description: 'Default command timeout in ms' },\n },\n },\n createSandbox: config => new RailwaySandbox(config),\n};\n"]}
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * @see https://docs.railway.com/sandboxes
9
9
  */
10
- import type { CommandResult, ExecuteCommandOptions, InstructionsOption, MastraSandboxOptions, ProviderStatus, SandboxInfo } from '@mastra/core/workspace';
10
+ import type { CommandResult, ExecuteCommandOptions, InstructionsOption, MastraSandboxOptions, ProviderStatus, SandboxCloneOptions, SandboxInfo } from '@mastra/core/workspace';
11
11
  import { MastraSandbox } from '@mastra/core/workspace';
12
12
  import { Sandbox } from 'railway';
13
13
  import type { SandboxNetworkIsolation, SandboxTemplate } from 'railway';
@@ -195,6 +195,26 @@ export declare class RailwaySandbox extends MastraSandbox {
195
195
  * @throws {SandboxNotReadyError} If this sandbox has not been started.
196
196
  */
197
197
  fork(options?: Pick<RailwaySandboxOptions, 'id' | 'idleTimeoutMinutes' | 'networkIsolation' | 'env'>): Promise<RailwaySandbox>;
198
+ /**
199
+ * Construct a sibling `RailwaySandbox` that inherits this sandbox's
200
+ * credentials and defaults (token, environment, checkpoint, network
201
+ * isolation, timeout, template, instructions) with per-instance overrides.
202
+ *
203
+ * Unlike {@link fork}, `clone` performs no I/O and does not require this
204
+ * sandbox to be started — the returned sandbox is not started and provisions
205
+ * (or reattaches, when `sandboxId` is set) on its own `start()`. Use it when
206
+ * one configured sandbox acts as the template for a fleet of independent
207
+ * sandboxes (e.g. one per project).
208
+ */
209
+ clone(options?: SandboxCloneOptions): RailwaySandbox;
210
+ /**
211
+ * Whether a Railway API token was resolved at construction (explicit option
212
+ * or the `RAILWAY_API_TOKEN` env fallback). Lets callers gate features on a
213
+ * usable configuration without provisioning a sandbox.
214
+ */
215
+ get hasCredentials(): boolean;
216
+ /** The configured idle teardown window in minutes, if any. */
217
+ get idleTimeoutMinutes(): number | undefined;
198
218
  getInfo(): Promise<SandboxInfo>;
199
219
  getInstructions(): string;
200
220
  private _buildDefaultInstructions;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sandbox/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sandbox/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/railway",
3
- "version": "0.3.1",
3
+ "version": "0.4.0-alpha.1",
4
4
  "description": "Railway cloud sandbox provider for Mastra workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -27,14 +27,14 @@
27
27
  "@vitest/coverage-v8": "4.1.10",
28
28
  "@vitest/ui": "4.1.10",
29
29
  "dotenv": "^17.4.2",
30
- "eslint": "^10.4.1",
30
+ "eslint": "^10.7.0",
31
31
  "tsup": "^8.5.1",
32
32
  "typescript": "^6.0.3",
33
33
  "vitest": "4.1.10",
34
34
  "@internal/lint": "0.0.114",
35
35
  "@internal/types-builder": "0.0.89",
36
- "@internal/workspace-test-utils": "0.0.58",
37
- "@mastra/core": "1.51.0"
36
+ "@mastra/core": "1.52.0-alpha.11",
37
+ "@internal/workspace-test-utils": "0.0.58"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "@mastra/core": ">=1.12.0-0 <2.0.0-0"