@mastra/platform-workspace 0.1.0 → 0.2.0-alpha.0

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,37 @@
1
1
  # @mastra/platform
2
2
 
3
+ ## 0.2.0-alpha.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Added `clone()` support to `PlatformSandbox`. `clone()` constructs an unstarted sibling sandbox that inherits the template's configuration (access token, project, environment, network isolation, timeout, instructions, env, idle timeout) with per-instance overrides for `id`, `sandboxId`, `env`, and `idleTimeoutMinutes`, so one configured sandbox can act as a template for a fleet of sandbox clones (for example, one per project). ([#19647](https://github.com/mastra-ai/mastra/pull/19647))
8
+
9
+ ```ts
10
+ const template = new PlatformSandbox({
11
+ accessToken,
12
+ projectId,
13
+ environmentId,
14
+ });
15
+
16
+ const projectSandbox = template.clone({
17
+ id: 'mc-project-42',
18
+ env: { GITHUB_TOKEN: token },
19
+ idleTimeoutMinutes: 30,
20
+ });
21
+ await projectSandbox.start();
22
+ ```
23
+
24
+ This brings `PlatformSandbox` up to parity with the other sandbox providers (`@mastra/railway`, `@mastra/e2b`, `@mastra/daytona`, `@mastra/modal`, `@mastra/docker`, `@mastra/blaxel`, `@mastra/apple-container`, `@mastra/vercel`) so it can be used with `MastraFactory` fleets and the MC Web factory.
25
+
26
+ ### Patch Changes
27
+
28
+ - `PlatformSandbox` now includes its caller-facing `id` on the `POST /v1/projects/:projectId/sandbox` wire body when provisioning a new sandbox. The Mastra Platform treats this as an advisory recovery key so callers can opt into checkpoint-based sandbox recovery — if the platform recognizes the id from a previous session, the new sandbox boots from the most recent checkpoint instead of the base template. Unknown ids fall through to a fresh sandbox, so existing callers see no change in behavior. ([#19648](https://github.com/mastra-ai/mastra/pull/19648))
29
+
30
+ No API changes — the value sent is the same `id` you already pass to `new PlatformSandbox({ id })` (or the auto-generated one).
31
+
32
+ - Updated dependencies [[`a40adeb`](https://github.com/mastra-ai/mastra/commit/a40adeb222b961a56a58af56a106106525721b74), [`821648b`](https://github.com/mastra-ai/mastra/commit/821648bf2871ef840100c7bacbecf676010bd12a), [`11f6cd9`](https://github.com/mastra-ai/mastra/commit/11f6cd96fe42582403416608beb212cc1a2cc79e)]:
33
+ - @mastra/core@1.52.0-alpha.6
34
+
3
35
  ## 0.1.0
4
36
 
5
37
  ### Minor Changes
package/dist/index.cjs CHANGED
@@ -399,7 +399,7 @@ var PlatformProcessManager = class extends workspace.SandboxProcessManager {
399
399
  }));
400
400
  }
401
401
  };
402
- var PlatformSandbox = class extends workspace.MastraSandbox {
402
+ var PlatformSandbox = class _PlatformSandbox extends workspace.MastraSandbox {
403
403
  id;
404
404
  name = "PlatformSandbox";
405
405
  provider = "platform";
@@ -429,6 +429,33 @@ var PlatformSandbox = class extends workspace.MastraSandbox {
429
429
  generateId() {
430
430
  return `platform-sandbox-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
431
431
  }
432
+ /**
433
+ * Construct a sibling {@link PlatformSandbox} that inherits this sandbox's
434
+ * credentials and defaults (access token, project, environment, network
435
+ * isolation, timeout, instructions, env, idle timeout) with per-instance
436
+ * overrides from `options`.
437
+ *
438
+ * Performs no I/O and does not require this sandbox to be started — the
439
+ * returned sandbox is not started and provisions (or reattaches, when
440
+ * `sandboxId` is set) on its own `start()`. Use it when one configured
441
+ * sandbox acts as the template for a fleet of independent sandboxes
442
+ * (e.g. one per project).
443
+ */
444
+ clone(options = {}) {
445
+ return new _PlatformSandbox({
446
+ ...options.id !== void 0 && { id: options.id },
447
+ accessToken: this._client.accessToken,
448
+ projectId: this._client.projectId,
449
+ fetch: this._client.fetch,
450
+ environmentId: this._environmentId,
451
+ ...options.sandboxId !== void 0 && { sandboxId: options.sandboxId },
452
+ idleTimeoutMinutes: options.idleTimeoutMinutes ?? this._idleTimeoutMinutes,
453
+ ...this._networkIsolation !== void 0 && { networkIsolation: this._networkIsolation },
454
+ env: options.env ?? this._env,
455
+ ...this._timeout !== void 0 && { timeout: this._timeout },
456
+ ...this._instructionsOverride !== void 0 && { instructions: this._instructionsOverride }
457
+ });
458
+ }
432
459
  async start() {
433
460
  if (this._sandboxId) {
434
461
  this._createdAt = /* @__PURE__ */ new Date();
@@ -438,6 +465,11 @@ var PlatformSandbox = class extends workspace.MastraSandbox {
438
465
  method: "POST",
439
466
  headers: { "content-type": "application/json" },
440
467
  body: JSON.stringify({
468
+ // Sent so the platform can associate the provisioned resource with a
469
+ // caller-stable identifier (used for opt-in checkpoint recovery). The
470
+ // platform treats it as an advisory key: unknown values fall through
471
+ // to a fresh sandbox, matching pre-existing behavior.
472
+ id: this.id,
441
473
  environmentId: this._environmentId,
442
474
  idleTimeoutMinutes: this._idleTimeoutMinutes,
443
475
  networkIsolation: this._networkIsolation,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/filesystem.ts","../src/sandbox.ts","../src/provider.ts"],"names":["nodePath","Buffer","MastraFilesystem","FileNotFoundError","buffer","WorkspaceReadOnlyError","FileExistsError","prefix","ProcessHandle","SandboxProcessManager","MastraSandbox","SandboxNotReadyError"],"mappings":"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","file":"index.cjs","sourcesContent":["export interface PlatformClientOptions {\n accessToken?: string;\n projectId?: string;\n fetch?: typeof fetch;\n}\n\nexport interface PlatformRequestOptions extends RequestInit {\n query?: Record<string, string | number | boolean | undefined>;\n}\n\nconst DEFAULT_PROXY_URL = 'https://workspaces.mastra.ai';\n\n/**\n * Default per-request timeout for calls to the workspace proxy. Applied only\n * when the caller doesn't already pass an `AbortSignal`. Long-running routes\n * (e.g. `POST /sandbox/:id/exec`) pass their own longer signal.\n */\nconst DEFAULT_REQUEST_TIMEOUT_MS = 60_000;\n\nexport function requireOption(value: string | undefined, name: string): string {\n if (!value) throw new Error(`${name} is required`);\n return value;\n}\n\nexport function resolvePlatformOptions(options: PlatformClientOptions) {\n return {\n accessToken: requireOption(options.accessToken ?? process.env.MASTRA_PLATFORM_ACCESS_TOKEN, 'accessToken'),\n projectId: requireOption(options.projectId ?? process.env.MASTRA_PROJECT_ID, 'projectId'),\n proxyUrl: (process.env.MASTRA_WORKSPACE_PROXY_URL ?? DEFAULT_PROXY_URL).replace(/\\/$/, ''),\n fetch: options.fetch ?? fetch,\n };\n}\n\n/**\n * Structured error shape returned by the workspace proxy. All routes emit\n * `{ error: { message, type } }` on failure — see servers/workspace-proxy in\n * the Platform repo. Kept as a wire-level type so callers can switch on\n * `error.code` without re-parsing `error.body`.\n */\nexport interface PlatformProxyError {\n message: string;\n /** Machine-readable error kind, e.g. `not_found`, `invalid_request`, `authentication_error`. */\n type: string;\n}\n\nfunction parseProxyError(body: string): PlatformProxyError | undefined {\n if (!body) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n return undefined;\n }\n if (typeof parsed !== 'object' || parsed === null) return undefined;\n const err = (parsed as { error?: unknown }).error;\n if (typeof err !== 'object' || err === null) return undefined;\n const { message, type } = err as { message?: unknown; type?: unknown };\n if (typeof message !== 'string' || typeof type !== 'string') return undefined;\n return { message, type };\n}\n\nexport class PlatformApiError extends Error {\n readonly status: number;\n readonly body: string;\n /** Machine-readable proxy error kind (e.g. `not_found`), when the response body matches `{ error: { message, type } }`. */\n readonly code: string | undefined;\n /** Human-readable proxy error message, when the response body matches `{ error: { message, type } }`. */\n readonly proxyMessage: string | undefined;\n\n constructor(status: number, body: string) {\n const parsed = parseProxyError(body);\n const summary = parsed ? `${parsed.type}: ${parsed.message}` : body;\n super(`Platform proxy request failed with ${status}${summary ? `: ${summary}` : ''}`);\n this.name = 'PlatformApiError';\n this.status = status;\n this.body = body;\n this.code = parsed?.type;\n this.proxyMessage = parsed?.message;\n }\n}\n\nexport class PlatformClient {\n readonly accessToken: string;\n readonly projectId: string;\n readonly proxyUrl: string;\n readonly fetch: typeof fetch;\n\n constructor(options: PlatformClientOptions) {\n const resolved = resolvePlatformOptions(options);\n this.accessToken = resolved.accessToken;\n this.projectId = resolved.projectId;\n this.proxyUrl = resolved.proxyUrl;\n this.fetch = resolved.fetch;\n }\n\n async request(path: string, options: PlatformRequestOptions = {}): Promise<Response> {\n const url = new URL(`${this.proxyUrl}/v1/projects/${encodeURIComponent(this.projectId)}${path}`);\n for (const [key, value] of Object.entries(options.query ?? {})) {\n if (value !== undefined) url.searchParams.set(key, String(value));\n }\n\n const headers = new Headers(options.headers);\n headers.set('authorization', `Bearer ${this.accessToken}`);\n\n // Strip our helper-only field so the underlying fetch sees a valid RequestInit.\n const { query: _query, ...fetchOptions } = options;\n // Apply a default timeout only when the caller didn't already supply an\n // AbortSignal — long-running routes (exec) provide their own longer signal.\n const signal = fetchOptions.signal ?? AbortSignal.timeout(DEFAULT_REQUEST_TIMEOUT_MS);\n const response = await this.fetch(url, { ...fetchOptions, headers, signal });\n if (!response.ok) {\n throw new PlatformApiError(response.status, await response.text());\n }\n return response;\n }\n}\n","import { Buffer } from 'node:buffer';\nimport nodePath from 'node:path';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type {\n CopyOptions,\n FileContent,\n FileEntry,\n FileStat,\n FilesystemIcon,\n FilesystemInfo,\n InstructionsOption,\n ListOptions,\n MastraFilesystemOptions,\n ProviderStatus,\n ReadOptions,\n RemoveOptions,\n WriteOptions,\n} from '@mastra/core/workspace';\nimport { FileExistsError, FileNotFoundError, MastraFilesystem, WorkspaceReadOnlyError } from '@mastra/core/workspace';\nimport type { PlatformClientOptions } from './client.js';\nimport { PlatformClient } from './client.js';\n\ninterface ProxyListResponse {\n contents?: Array<{ key?: string; size?: number; lastModified?: string }>;\n commonPrefixes?: string[];\n}\n\nexport interface PlatformFilesystemOptions extends PlatformClientOptions, MastraFilesystemOptions {\n id?: string;\n bucketName?: string;\n readOnly?: boolean;\n displayName?: string;\n icon?: FilesystemIcon;\n description?: string;\n instructions?: InstructionsOption;\n}\n\nfunction normalizePath(input: string): string {\n if (!input || input === '.') return '/';\n let normalized = input.startsWith('/') ? input : `/${input}`;\n normalized = nodePath.posix.normalize(normalized);\n return normalized === '.' ? '/' : normalized;\n}\n\nfunction keyFromPath(path: string): string {\n const normalized = normalizePath(path);\n return normalized === '/' ? '' : normalized.slice(1);\n}\n\n/**\n * Encode each `/`-delimited segment of an object key with `encodeURIComponent`\n * so reserved URL characters (`?`, `#`, `%`, `&`, `+`, spaces, etc.) are\n * treated as part of the key instead of URL syntax. Kept segment-aware so\n * `/` continues to act as a path separator on the wire.\n */\nfunction encodeKeyPath(key: string): string {\n return key.split('/').map(encodeURIComponent).join('/');\n}\n\nfunction nameFromPath(path: string): string {\n const normalized = normalizePath(path);\n if (normalized === '/') return '';\n return normalized.slice(normalized.lastIndexOf('/') + 1);\n}\n\nfunction contentToBody(content: FileContent): string | Buffer {\n if (typeof content === 'string') return content;\n return Buffer.from(content);\n}\n\nfunction headerDate(headers: Headers, name: string): Date {\n const value = headers.get(name);\n return value ? new Date(value) : new Date(0);\n}\n\nfunction headerSize(headers: Headers): number {\n const value = headers.get('content-length');\n return value ? Number(value) : 0;\n}\n\nfunction isNotFound(error: unknown): boolean {\n return typeof error === 'object' && error !== null && 'status' in error && error.status === 404;\n}\n\nexport class PlatformFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'PlatformFilesystem';\n readonly provider = 'platform';\n readonly readOnly?: boolean;\n readonly displayName?: string;\n readonly icon: FilesystemIcon;\n readonly description?: string;\n status: ProviderStatus = 'pending';\n\n private readonly _client: PlatformClient;\n private readonly _bucketName: string;\n private readonly _instructionsOverride?: InstructionsOption;\n\n constructor(options: PlatformFilesystemOptions = {}) {\n super({ ...options, name: 'PlatformFilesystem' });\n this.id = options.id ?? this.generateId();\n this._bucketName = options.bucketName ?? process.env.MASTRA_PLATFORM_BUCKET_NAME ?? '';\n if (!this._bucketName) throw new Error('bucketName is required');\n this.readOnly = options.readOnly;\n this.displayName = options.displayName;\n this.icon = options.icon ?? 'cloud';\n this.description = options.description;\n this._instructionsOverride = options.instructions;\n this._client = new PlatformClient(options);\n }\n\n private generateId(): string {\n return `platform-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n async readFile(path: string, options?: ReadOptions): Promise<string | Buffer> {\n await this.ensureReady();\n let response: Response;\n try {\n response = await this._client.request(\n `/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`,\n );\n } catch (error) {\n if (isNotFound(error)) throw new FileNotFoundError(path);\n throw error;\n }\n const buffer = Buffer.from(await response.arrayBuffer());\n return options?.encoding ? buffer.toString(options.encoding) : buffer;\n }\n\n async writeFile(path: string, content: FileContent, options?: WriteOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('writeFile');\n const headers: Record<string, string> = {};\n if (options?.mimeType) headers['content-type'] = options.mimeType;\n if (options?.overwrite === false) headers['if-none-match'] = '*';\n try {\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`, {\n method: 'PUT',\n headers,\n body: contentToBody(content),\n });\n } catch (error) {\n if (typeof error === 'object' && error !== null && 'status' in error && error.status === 412) {\n throw new FileExistsError(path);\n }\n throw error;\n }\n }\n\n /**\n * Append bytes to a file.\n *\n * **Not atomic.** Object storage behind the workspace proxy has no native\n * append or compare-and-swap primitive, so this implementation is a\n * read-modify-write: it reads the current contents, concatenates the new\n * bytes, and PUTs the whole object back. Concurrent `appendFile` calls to\n * the same path can overwrite each other's writes (\"last write wins\").\n * Use `writeFile` with distinct keys for concurrent writers.\n */\n async appendFile(path: string, content: FileContent): Promise<void> {\n const existing = (await this.exists(path)) ? await this.readFile(path) : Buffer.alloc(0);\n await this.writeFile(\n path,\n Buffer.concat([Buffer.isBuffer(existing) ? existing : Buffer.from(existing), Buffer.from(content)]),\n );\n }\n\n async deleteFile(path: string, options?: RemoveOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('deleteFile');\n try {\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`, {\n method: 'DELETE',\n query: { recursive: options?.recursive },\n });\n } catch (error) {\n if (isNotFound(error) && options?.force) return;\n if (isNotFound(error)) throw new FileNotFoundError(path);\n throw error;\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('copyFile');\n // The workspace proxy's `?op=copy` route always overwrites the destination;\n // there's no conditional wire field to prevent it. Reject the option\n // explicitly instead of silently overwriting when the caller asked us not to.\n if (options?.overwrite === false) {\n throw new Error('PlatformFilesystem.copyFile does not support overwrite: false — the proxy always overwrites.');\n }\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(src))}`, {\n method: 'POST',\n query: { op: 'copy' },\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ destination: keyFromPath(dest) }),\n });\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('moveFile');\n // Same rationale as copyFile: `?op=rename` always overwrites.\n if (options?.overwrite === false) {\n throw new Error('PlatformFilesystem.moveFile does not support overwrite: false — the proxy always overwrites.');\n }\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(src))}`, {\n method: 'POST',\n query: { op: 'rename' },\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ destination: keyFromPath(dest) }),\n });\n }\n\n async mkdir(path: string, _options?: { recursive?: boolean }): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('mkdir');\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`, {\n method: 'POST',\n query: { op: 'mkdir' },\n });\n }\n\n async rmdir(path: string, options?: RemoveOptions): Promise<void> {\n await this.deleteFile(path.endsWith('/') ? path : `${path}/`, { recursive: true, force: options?.force });\n }\n\n async readdir(path: string, options?: ListOptions): Promise<FileEntry[]> {\n await this.ensureReady();\n const prefix = keyFromPath(path);\n const response = await this._client.request(\n `/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(prefix)}`,\n {\n query: {\n delimiter: options?.recursive ? undefined : '/',\n prefix: prefix ? `${prefix.replace(/\\/$/, '')}/` : undefined,\n },\n },\n );\n const json = (await response.json()) as ProxyListResponse;\n return [\n ...(json.commonPrefixes ?? []).map(prefix => ({\n name: nameFromPath(prefix.replace(/\\/$/, '')),\n type: 'directory' as const,\n })),\n ...(json.contents ?? [])\n .filter(object => object.key && !object.key.endsWith('/'))\n .map(object => ({\n name: nameFromPath(object.key!),\n type: 'file' as const,\n size: object.size,\n })),\n ].filter(\n entry => !options?.extension || entry.type === 'directory' || matchesExtension(entry.name, options.extension),\n );\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await this.stat(path);\n return true;\n } catch (error) {\n if (isNotFound(error) || error instanceof FileNotFoundError) return false;\n throw error;\n }\n }\n\n async stat(path: string): Promise<FileStat> {\n await this.ensureReady();\n const normalized = normalizePath(path);\n if (normalized === '/') {\n return { name: '', path: '/', type: 'directory', size: 0, createdAt: new Date(0), modifiedAt: new Date(0) };\n }\n let response: Response;\n try {\n response = await this._client.request(\n `/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`,\n {\n method: 'HEAD',\n },\n );\n } catch (error) {\n if (isNotFound(error)) throw new FileNotFoundError(path);\n throw error;\n }\n return {\n name: nameFromPath(path),\n path: normalized,\n type: normalized.endsWith('/') ? 'directory' : 'file',\n size: headerSize(response.headers),\n createdAt: headerDate(response.headers, 'last-modified'),\n modifiedAt: headerDate(response.headers, 'last-modified'),\n mimeType: response.headers.get('content-type') ?? undefined,\n };\n }\n\n realpath(path: string): Promise<string> {\n return Promise.resolve(normalizePath(path));\n }\n\n getInstructions(opts?: { requestContext?: RequestContext }): string {\n const defaultInstructions = `Platform filesystem backed by Mastra Platform bucket ${this._bucketName}. Use absolute workspace paths.`;\n if (typeof this._instructionsOverride === 'function') {\n return this._instructionsOverride({ defaultInstructions, requestContext: opts?.requestContext });\n }\n if (typeof this._instructionsOverride === 'string') return this._instructionsOverride;\n return defaultInstructions;\n }\n\n getInfo(): FilesystemInfo<{ bucketName: string; displayName?: string; description?: string }> {\n return {\n id: this.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n readOnly: this.readOnly,\n icon: this.icon,\n metadata: {\n bucketName: this._bucketName,\n ...(this.displayName && { displayName: this.displayName }),\n ...(this.description && { description: this.description }),\n },\n };\n }\n}\n\nfunction matchesExtension(name: string, extension: string | string[]): boolean {\n const extensions = Array.isArray(extension) ? extension : [extension];\n return extensions.some(ext => name.endsWith(ext));\n}\n","import type { RequestContext } from '@mastra/core/di';\nimport type {\n CommandResult,\n ExecuteCommandOptions,\n InstructionsOption,\n MastraSandboxOptions,\n ProcessInfo,\n ProviderStatus,\n SandboxInfo,\n SpawnProcessOptions,\n} from '@mastra/core/workspace';\nimport { MastraSandbox, ProcessHandle, SandboxNotReadyError, SandboxProcessManager } from '@mastra/core/workspace';\nimport type { PlatformClientOptions } from './client.js';\nimport { PlatformClient } from './client.js';\n\nexport type PlatformSandboxNetworkIsolation = 'ISOLATED' | 'PRIVATE';\n\nexport interface PlatformSandboxOptions extends Omit<MastraSandboxOptions, 'processes'>, PlatformClientOptions {\n id?: string;\n environmentId?: string;\n sandboxId?: string;\n idleTimeoutMinutes?: number;\n networkIsolation?: PlatformSandboxNetworkIsolation;\n env?: Record<string, string>;\n timeout?: number;\n instructions?: InstructionsOption;\n}\n\ninterface CreateSandboxResponse {\n id: string;\n providerResourceId?: string | null;\n status?: string;\n createdAt?: string;\n destroyedAt?: string | null;\n}\n\ninterface ExecResponse {\n exitCode: number | null;\n stdout: string;\n stderr: string;\n truncated?: boolean;\n timedOut?: boolean;\n}\n\n/**\n * Compose a shell command line from a `command` string and optional `args`.\n *\n * IMPORTANT: `command` is treated as a **shell string** and passed to the\n * remote shell verbatim so callers can use pipes, redirects, and chaining\n * (`ls -la | grep foo`). This matches the contract of {@link MastraSandbox}\n * and the local sandbox implementation. `args` are always shell-quoted so\n * they cannot inject syntax.\n *\n * Callers MUST NOT pass untrusted input as `command`. Untrusted values must\n * be passed via `args`, where they are safely quoted. Passing untrusted\n * input as `command` allows arbitrary shell syntax execution on the remote\n * sandbox.\n */\nfunction buildCommand(command: string, args?: string[]): string {\n return args?.length ? `${command} ${args.map(shellQuote).join(' ')}` : command;\n}\n\nfunction shellQuote(arg: string): string {\n if (/^[a-zA-Z0-9._\\-/=:@]+$/.test(arg)) return arg;\n return `'${arg.replace(/'/g, `'\\\\''`)}'`;\n}\n\nclass PlatformProcessHandle extends ProcessHandle {\n readonly pid: string;\n private readonly resultPromise: Promise<CommandResult>;\n private exitCodeValue: number | undefined;\n\n constructor(pid: string, resultPromise: Promise<CommandResult>, options?: SpawnProcessOptions) {\n super(options);\n this.pid = pid;\n this.resultPromise = resultPromise.then(result => {\n this.exitCodeValue = result.exitCode;\n if (result.stdout) this.emitStdout(result.stdout);\n if (result.stderr) this.emitStderr(result.stderr);\n return result;\n });\n }\n\n get exitCode(): number | undefined {\n return this.exitCodeValue;\n }\n\n async wait(): Promise<CommandResult> {\n return this.resultPromise;\n }\n\n async kill(): Promise<boolean> {\n // The workspace proxy has no cancel-exec endpoint; each `executeCommand`\n // is a synchronous round-trip that has already completed (or timed out)\n // by the time a handle exists to kill. Making this explicit avoids\n // callers silently believing they cancelled a still-running process.\n throw new Error('Platform sandbox command execution does not support killing individual processes');\n }\n\n async sendStdin(): Promise<void> {\n throw new Error('Platform sandbox command execution does not support stdin');\n }\n}\n\nclass PlatformProcessManager extends SandboxProcessManager<PlatformSandbox> {\n private spawnCounter = 0;\n\n /**\n * Spawn a process on the remote sandbox.\n *\n * `command` is interpreted as a shell string by the remote shell, matching\n * the {@link MastraSandbox} contract. See {@link PlatformSandbox.executeCommand}\n * for the untrusted-input caveat: never pass untrusted values as `command`.\n */\n async spawn(command: string, options: SpawnProcessOptions = {}): Promise<ProcessHandle> {\n const pid = `platform-proc-${Date.now().toString(36)}-${(this.spawnCounter++).toString(36)}`;\n const resultPromise = this.sandbox.executeCommand(command, undefined, options);\n const handle = new PlatformProcessHandle(pid, resultPromise, options);\n this._tracked.set(handle.pid, handle);\n return handle;\n }\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\nexport class PlatformSandbox extends MastraSandbox {\n readonly id: string;\n readonly name = 'PlatformSandbox';\n readonly provider = 'platform';\n status: ProviderStatus = 'pending';\n declare readonly processes: PlatformProcessManager;\n\n private readonly _client: PlatformClient;\n private readonly _environmentId: string;\n private _sandboxId?: string;\n private readonly _idleTimeoutMinutes?: number;\n private readonly _networkIsolation?: PlatformSandboxNetworkIsolation;\n private readonly _env: Record<string, string>;\n private readonly _timeout?: number;\n private readonly _instructionsOverride?: InstructionsOption;\n private _createdAt: Date | null = null;\n\n constructor(options: PlatformSandboxOptions = {}) {\n super({ ...options, name: 'PlatformSandbox', processes: new PlatformProcessManager() });\n this.id = options.id ?? this.generateId();\n this._client = new PlatformClient(options);\n this._environmentId = options.environmentId ?? process.env.MASTRA_ENVIRONMENT_ID ?? '';\n if (!this._environmentId && !options.sandboxId) throw new Error('environmentId is required');\n this._sandboxId = options.sandboxId;\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 }\n\n private generateId(): string {\n return `platform-sandbox-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n async start(): Promise<void> {\n if (this._sandboxId) {\n this._createdAt = new Date();\n return;\n }\n\n const response = await this._client.request('/sandbox', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n environmentId: this._environmentId,\n idleTimeoutMinutes: this._idleTimeoutMinutes,\n networkIsolation: this._networkIsolation,\n env: this._env,\n }),\n });\n const json = (await response.json()) as CreateSandboxResponse;\n this._sandboxId = json.id;\n this._createdAt = json.createdAt ? new Date(json.createdAt) : new Date();\n }\n\n async stop(): Promise<void> {\n await this.destroy();\n }\n\n async destroy(): Promise<void> {\n if (!this._sandboxId) return;\n await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}`, { method: 'DELETE' });\n // Clear local state so a subsequent start() creates a fresh remote sandbox\n // instead of taking the reattach branch and pointing exec at a deleted resource.\n this._sandboxId = undefined;\n this._createdAt = null;\n }\n\n /**\n * Execute a command on the remote sandbox.\n *\n * `command` is a **shell string**: it is concatenated verbatim into the\n * command line sent to the remote shell, which lets callers use pipes,\n * redirects, and chaining (`ls -la | grep foo`). This matches the contract\n * of {@link MastraSandbox} and the local sandbox implementation.\n *\n * `args`, when provided, are always shell-quoted so they cannot inject\n * additional shell syntax.\n *\n * Security: callers MUST NOT pass untrusted input as `command`. If any part\n * of the invocation is derived from an untrusted source, pass it through\n * `args` (which is safely quoted) or shell-quote it yourself before\n * inclusion. Untrusted `command` values allow arbitrary shell syntax\n * execution on the remote sandbox.\n */\n async executeCommand(command: string, args?: string[], options?: ExecuteCommandOptions): Promise<CommandResult> {\n await this.ensureRunning();\n if (!this._sandboxId) throw new SandboxNotReadyError(this.id);\n\n const started = Date.now();\n const fullCommand = buildCommand(command, args);\n // Nullish check so an explicit `timeout: 0` is sent as `0` (interpreted as\n // \"no timeout\" by the proxy) instead of being dropped by a truthy check.\n const effectiveTimeout = options?.timeout ?? this._timeout;\n const timeoutSec = effectiveTimeout != null ? Math.ceil(effectiveTimeout / 1000) : undefined;\n // Pass our own signal for exec so the client's default per-request\n // timeout (60s) doesn't cut off commands that expect to run longer.\n // Give the proxy a generous buffer over the requested command timeout.\n const clientSignal =\n effectiveTimeout != null && effectiveTimeout > 0 ? AbortSignal.timeout(effectiveTimeout + 30_000) : undefined;\n const response = await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}/exec`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n command: fullCommand,\n timeoutSec,\n cwd: options?.cwd,\n env: options?.env,\n }),\n signal: clientSignal,\n });\n const json = (await response.json()) as ExecResponse;\n const exitCode = json.exitCode ?? (json.timedOut ? 124 : 1);\n return {\n success: exitCode === 0,\n exitCode,\n stdout: json.stdout,\n stderr: json.stderr,\n executionTimeMs: Date.now() - started,\n timedOut: json.timedOut,\n command: fullCommand,\n };\n }\n\n async getInfo(): Promise<SandboxInfo> {\n if (!this._sandboxId) {\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 };\n }\n const response = await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}`);\n const json = (await response.json()) as CreateSandboxResponse;\n return {\n id: json.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n createdAt: json.createdAt ? new Date(json.createdAt) : (this._createdAt ?? new Date()),\n metadata: {\n providerResourceId: json.providerResourceId ?? undefined,\n platformStatus: json.status,\n },\n };\n }\n\n getInstructions(opts?: { requestContext?: RequestContext }): string {\n const defaultInstructions = `Platform sandbox${this._sandboxId ? ` ${this._sandboxId}` : ''}. Execute commands with the sandbox command APIs.`;\n if (typeof this._instructionsOverride === 'function') {\n return this._instructionsOverride({ defaultInstructions, requestContext: opts?.requestContext });\n }\n if (typeof this._instructionsOverride === 'string') return this._instructionsOverride;\n return defaultInstructions;\n }\n}\n","import type { FilesystemProvider, SandboxProvider } from '@mastra/core/editor';\nimport type { PlatformFilesystemOptions } from './filesystem.js';\nimport { PlatformFilesystem } from './filesystem.js';\nimport type { PlatformSandboxOptions } from './sandbox.js';\nimport { PlatformSandbox } from './sandbox.js';\n\nexport const platformSandboxProvider: SandboxProvider<PlatformSandboxOptions> = {\n id: 'platform',\n name: 'Mastra Platform Sandbox',\n description: 'Environment-scoped sandbox execution through Mastra Platform workspace proxy',\n configSchema: {\n type: 'object',\n properties: {\n accessToken: {\n type: 'string',\n description: 'Mastra Platform access token (falls back to MASTRA_PLATFORM_ACCESS_TOKEN)',\n },\n projectId: { type: 'string', description: 'Platform project ID (falls back to MASTRA_PROJECT_ID)' },\n environmentId: { type: 'string', description: 'Platform environment ID (falls back to MASTRA_ENVIRONMENT_ID)' },\n sandboxId: { type: 'string', description: 'Reattach to an existing Platform sandbox by ID' },\n idleTimeoutMinutes: { type: 'number', description: 'Minutes before the sandbox can be destroyed while idle' },\n networkIsolation: {\n type: 'string',\n description: 'Network isolation mode',\n enum: ['ISOLATED', 'PRIVATE'],\n default: 'ISOLATED',\n },\n env: { type: 'object', description: 'Environment variables', additionalProperties: { type: 'string' } },\n timeout: { type: 'number', description: 'Default command timeout in ms' },\n },\n },\n createSandbox: config => new PlatformSandbox(config),\n};\n\nexport const platformFilesystemProvider: FilesystemProvider<PlatformFilesystemOptions> = {\n id: 'platform',\n name: 'Mastra Platform Filesystem',\n description: 'Bucket-backed filesystem access through Mastra Platform workspace proxy',\n configSchema: {\n type: 'object',\n properties: {\n accessToken: {\n type: 'string',\n description: 'Mastra Platform access token (falls back to MASTRA_PLATFORM_ACCESS_TOKEN)',\n },\n projectId: { type: 'string', description: 'Platform project ID (falls back to MASTRA_PROJECT_ID)' },\n bucketName: {\n type: 'string',\n description: 'Platform workspace bucket name (falls back to MASTRA_PLATFORM_BUCKET_NAME)',\n },\n readOnly: { type: 'boolean', description: 'Mount as read-only', default: false },\n },\n },\n createFilesystem: config => new PlatformFilesystem(config),\n};\n"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/filesystem.ts","../src/sandbox.ts","../src/provider.ts"],"names":["nodePath","Buffer","MastraFilesystem","FileNotFoundError","buffer","WorkspaceReadOnlyError","FileExistsError","prefix","ProcessHandle","SandboxProcessManager","MastraSandbox","SandboxNotReadyError"],"mappings":"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","file":"index.cjs","sourcesContent":["export interface PlatformClientOptions {\n accessToken?: string;\n projectId?: string;\n fetch?: typeof fetch;\n}\n\nexport interface PlatformRequestOptions extends RequestInit {\n query?: Record<string, string | number | boolean | undefined>;\n}\n\nconst DEFAULT_PROXY_URL = 'https://workspaces.mastra.ai';\n\n/**\n * Default per-request timeout for calls to the workspace proxy. Applied only\n * when the caller doesn't already pass an `AbortSignal`. Long-running routes\n * (e.g. `POST /sandbox/:id/exec`) pass their own longer signal.\n */\nconst DEFAULT_REQUEST_TIMEOUT_MS = 60_000;\n\nexport function requireOption(value: string | undefined, name: string): string {\n if (!value) throw new Error(`${name} is required`);\n return value;\n}\n\nexport function resolvePlatformOptions(options: PlatformClientOptions) {\n return {\n accessToken: requireOption(options.accessToken ?? process.env.MASTRA_PLATFORM_ACCESS_TOKEN, 'accessToken'),\n projectId: requireOption(options.projectId ?? process.env.MASTRA_PROJECT_ID, 'projectId'),\n proxyUrl: (process.env.MASTRA_WORKSPACE_PROXY_URL ?? DEFAULT_PROXY_URL).replace(/\\/$/, ''),\n fetch: options.fetch ?? fetch,\n };\n}\n\n/**\n * Structured error shape returned by the workspace proxy. All routes emit\n * `{ error: { message, type } }` on failure — see servers/workspace-proxy in\n * the Platform repo. Kept as a wire-level type so callers can switch on\n * `error.code` without re-parsing `error.body`.\n */\nexport interface PlatformProxyError {\n message: string;\n /** Machine-readable error kind, e.g. `not_found`, `invalid_request`, `authentication_error`. */\n type: string;\n}\n\nfunction parseProxyError(body: string): PlatformProxyError | undefined {\n if (!body) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n return undefined;\n }\n if (typeof parsed !== 'object' || parsed === null) return undefined;\n const err = (parsed as { error?: unknown }).error;\n if (typeof err !== 'object' || err === null) return undefined;\n const { message, type } = err as { message?: unknown; type?: unknown };\n if (typeof message !== 'string' || typeof type !== 'string') return undefined;\n return { message, type };\n}\n\nexport class PlatformApiError extends Error {\n readonly status: number;\n readonly body: string;\n /** Machine-readable proxy error kind (e.g. `not_found`), when the response body matches `{ error: { message, type } }`. */\n readonly code: string | undefined;\n /** Human-readable proxy error message, when the response body matches `{ error: { message, type } }`. */\n readonly proxyMessage: string | undefined;\n\n constructor(status: number, body: string) {\n const parsed = parseProxyError(body);\n const summary = parsed ? `${parsed.type}: ${parsed.message}` : body;\n super(`Platform proxy request failed with ${status}${summary ? `: ${summary}` : ''}`);\n this.name = 'PlatformApiError';\n this.status = status;\n this.body = body;\n this.code = parsed?.type;\n this.proxyMessage = parsed?.message;\n }\n}\n\nexport class PlatformClient {\n readonly accessToken: string;\n readonly projectId: string;\n readonly proxyUrl: string;\n readonly fetch: typeof fetch;\n\n constructor(options: PlatformClientOptions) {\n const resolved = resolvePlatformOptions(options);\n this.accessToken = resolved.accessToken;\n this.projectId = resolved.projectId;\n this.proxyUrl = resolved.proxyUrl;\n this.fetch = resolved.fetch;\n }\n\n async request(path: string, options: PlatformRequestOptions = {}): Promise<Response> {\n const url = new URL(`${this.proxyUrl}/v1/projects/${encodeURIComponent(this.projectId)}${path}`);\n for (const [key, value] of Object.entries(options.query ?? {})) {\n if (value !== undefined) url.searchParams.set(key, String(value));\n }\n\n const headers = new Headers(options.headers);\n headers.set('authorization', `Bearer ${this.accessToken}`);\n\n // Strip our helper-only field so the underlying fetch sees a valid RequestInit.\n const { query: _query, ...fetchOptions } = options;\n // Apply a default timeout only when the caller didn't already supply an\n // AbortSignal — long-running routes (exec) provide their own longer signal.\n const signal = fetchOptions.signal ?? AbortSignal.timeout(DEFAULT_REQUEST_TIMEOUT_MS);\n const response = await this.fetch(url, { ...fetchOptions, headers, signal });\n if (!response.ok) {\n throw new PlatformApiError(response.status, await response.text());\n }\n return response;\n }\n}\n","import { Buffer } from 'node:buffer';\nimport nodePath from 'node:path';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type {\n CopyOptions,\n FileContent,\n FileEntry,\n FileStat,\n FilesystemIcon,\n FilesystemInfo,\n InstructionsOption,\n ListOptions,\n MastraFilesystemOptions,\n ProviderStatus,\n ReadOptions,\n RemoveOptions,\n WriteOptions,\n} from '@mastra/core/workspace';\nimport { FileExistsError, FileNotFoundError, MastraFilesystem, WorkspaceReadOnlyError } from '@mastra/core/workspace';\nimport type { PlatformClientOptions } from './client.js';\nimport { PlatformClient } from './client.js';\n\ninterface ProxyListResponse {\n contents?: Array<{ key?: string; size?: number; lastModified?: string }>;\n commonPrefixes?: string[];\n}\n\nexport interface PlatformFilesystemOptions extends PlatformClientOptions, MastraFilesystemOptions {\n id?: string;\n bucketName?: string;\n readOnly?: boolean;\n displayName?: string;\n icon?: FilesystemIcon;\n description?: string;\n instructions?: InstructionsOption;\n}\n\nfunction normalizePath(input: string): string {\n if (!input || input === '.') return '/';\n let normalized = input.startsWith('/') ? input : `/${input}`;\n normalized = nodePath.posix.normalize(normalized);\n return normalized === '.' ? '/' : normalized;\n}\n\nfunction keyFromPath(path: string): string {\n const normalized = normalizePath(path);\n return normalized === '/' ? '' : normalized.slice(1);\n}\n\n/**\n * Encode each `/`-delimited segment of an object key with `encodeURIComponent`\n * so reserved URL characters (`?`, `#`, `%`, `&`, `+`, spaces, etc.) are\n * treated as part of the key instead of URL syntax. Kept segment-aware so\n * `/` continues to act as a path separator on the wire.\n */\nfunction encodeKeyPath(key: string): string {\n return key.split('/').map(encodeURIComponent).join('/');\n}\n\nfunction nameFromPath(path: string): string {\n const normalized = normalizePath(path);\n if (normalized === '/') return '';\n return normalized.slice(normalized.lastIndexOf('/') + 1);\n}\n\nfunction contentToBody(content: FileContent): string | Buffer {\n if (typeof content === 'string') return content;\n return Buffer.from(content);\n}\n\nfunction headerDate(headers: Headers, name: string): Date {\n const value = headers.get(name);\n return value ? new Date(value) : new Date(0);\n}\n\nfunction headerSize(headers: Headers): number {\n const value = headers.get('content-length');\n return value ? Number(value) : 0;\n}\n\nfunction isNotFound(error: unknown): boolean {\n return typeof error === 'object' && error !== null && 'status' in error && error.status === 404;\n}\n\nexport class PlatformFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'PlatformFilesystem';\n readonly provider = 'platform';\n readonly readOnly?: boolean;\n readonly displayName?: string;\n readonly icon: FilesystemIcon;\n readonly description?: string;\n status: ProviderStatus = 'pending';\n\n private readonly _client: PlatformClient;\n private readonly _bucketName: string;\n private readonly _instructionsOverride?: InstructionsOption;\n\n constructor(options: PlatformFilesystemOptions = {}) {\n super({ ...options, name: 'PlatformFilesystem' });\n this.id = options.id ?? this.generateId();\n this._bucketName = options.bucketName ?? process.env.MASTRA_PLATFORM_BUCKET_NAME ?? '';\n if (!this._bucketName) throw new Error('bucketName is required');\n this.readOnly = options.readOnly;\n this.displayName = options.displayName;\n this.icon = options.icon ?? 'cloud';\n this.description = options.description;\n this._instructionsOverride = options.instructions;\n this._client = new PlatformClient(options);\n }\n\n private generateId(): string {\n return `platform-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n async readFile(path: string, options?: ReadOptions): Promise<string | Buffer> {\n await this.ensureReady();\n let response: Response;\n try {\n response = await this._client.request(\n `/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`,\n );\n } catch (error) {\n if (isNotFound(error)) throw new FileNotFoundError(path);\n throw error;\n }\n const buffer = Buffer.from(await response.arrayBuffer());\n return options?.encoding ? buffer.toString(options.encoding) : buffer;\n }\n\n async writeFile(path: string, content: FileContent, options?: WriteOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('writeFile');\n const headers: Record<string, string> = {};\n if (options?.mimeType) headers['content-type'] = options.mimeType;\n if (options?.overwrite === false) headers['if-none-match'] = '*';\n try {\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`, {\n method: 'PUT',\n headers,\n body: contentToBody(content),\n });\n } catch (error) {\n if (typeof error === 'object' && error !== null && 'status' in error && error.status === 412) {\n throw new FileExistsError(path);\n }\n throw error;\n }\n }\n\n /**\n * Append bytes to a file.\n *\n * **Not atomic.** Object storage behind the workspace proxy has no native\n * append or compare-and-swap primitive, so this implementation is a\n * read-modify-write: it reads the current contents, concatenates the new\n * bytes, and PUTs the whole object back. Concurrent `appendFile` calls to\n * the same path can overwrite each other's writes (\"last write wins\").\n * Use `writeFile` with distinct keys for concurrent writers.\n */\n async appendFile(path: string, content: FileContent): Promise<void> {\n const existing = (await this.exists(path)) ? await this.readFile(path) : Buffer.alloc(0);\n await this.writeFile(\n path,\n Buffer.concat([Buffer.isBuffer(existing) ? existing : Buffer.from(existing), Buffer.from(content)]),\n );\n }\n\n async deleteFile(path: string, options?: RemoveOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('deleteFile');\n try {\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`, {\n method: 'DELETE',\n query: { recursive: options?.recursive },\n });\n } catch (error) {\n if (isNotFound(error) && options?.force) return;\n if (isNotFound(error)) throw new FileNotFoundError(path);\n throw error;\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('copyFile');\n // The workspace proxy's `?op=copy` route always overwrites the destination;\n // there's no conditional wire field to prevent it. Reject the option\n // explicitly instead of silently overwriting when the caller asked us not to.\n if (options?.overwrite === false) {\n throw new Error('PlatformFilesystem.copyFile does not support overwrite: false — the proxy always overwrites.');\n }\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(src))}`, {\n method: 'POST',\n query: { op: 'copy' },\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ destination: keyFromPath(dest) }),\n });\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('moveFile');\n // Same rationale as copyFile: `?op=rename` always overwrites.\n if (options?.overwrite === false) {\n throw new Error('PlatformFilesystem.moveFile does not support overwrite: false — the proxy always overwrites.');\n }\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(src))}`, {\n method: 'POST',\n query: { op: 'rename' },\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ destination: keyFromPath(dest) }),\n });\n }\n\n async mkdir(path: string, _options?: { recursive?: boolean }): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('mkdir');\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`, {\n method: 'POST',\n query: { op: 'mkdir' },\n });\n }\n\n async rmdir(path: string, options?: RemoveOptions): Promise<void> {\n await this.deleteFile(path.endsWith('/') ? path : `${path}/`, { recursive: true, force: options?.force });\n }\n\n async readdir(path: string, options?: ListOptions): Promise<FileEntry[]> {\n await this.ensureReady();\n const prefix = keyFromPath(path);\n const response = await this._client.request(\n `/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(prefix)}`,\n {\n query: {\n delimiter: options?.recursive ? undefined : '/',\n prefix: prefix ? `${prefix.replace(/\\/$/, '')}/` : undefined,\n },\n },\n );\n const json = (await response.json()) as ProxyListResponse;\n return [\n ...(json.commonPrefixes ?? []).map(prefix => ({\n name: nameFromPath(prefix.replace(/\\/$/, '')),\n type: 'directory' as const,\n })),\n ...(json.contents ?? [])\n .filter(object => object.key && !object.key.endsWith('/'))\n .map(object => ({\n name: nameFromPath(object.key!),\n type: 'file' as const,\n size: object.size,\n })),\n ].filter(\n entry => !options?.extension || entry.type === 'directory' || matchesExtension(entry.name, options.extension),\n );\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await this.stat(path);\n return true;\n } catch (error) {\n if (isNotFound(error) || error instanceof FileNotFoundError) return false;\n throw error;\n }\n }\n\n async stat(path: string): Promise<FileStat> {\n await this.ensureReady();\n const normalized = normalizePath(path);\n if (normalized === '/') {\n return { name: '', path: '/', type: 'directory', size: 0, createdAt: new Date(0), modifiedAt: new Date(0) };\n }\n let response: Response;\n try {\n response = await this._client.request(\n `/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`,\n {\n method: 'HEAD',\n },\n );\n } catch (error) {\n if (isNotFound(error)) throw new FileNotFoundError(path);\n throw error;\n }\n return {\n name: nameFromPath(path),\n path: normalized,\n type: normalized.endsWith('/') ? 'directory' : 'file',\n size: headerSize(response.headers),\n createdAt: headerDate(response.headers, 'last-modified'),\n modifiedAt: headerDate(response.headers, 'last-modified'),\n mimeType: response.headers.get('content-type') ?? undefined,\n };\n }\n\n realpath(path: string): Promise<string> {\n return Promise.resolve(normalizePath(path));\n }\n\n getInstructions(opts?: { requestContext?: RequestContext }): string {\n const defaultInstructions = `Platform filesystem backed by Mastra Platform bucket ${this._bucketName}. Use absolute workspace paths.`;\n if (typeof this._instructionsOverride === 'function') {\n return this._instructionsOverride({ defaultInstructions, requestContext: opts?.requestContext });\n }\n if (typeof this._instructionsOverride === 'string') return this._instructionsOverride;\n return defaultInstructions;\n }\n\n getInfo(): FilesystemInfo<{ bucketName: string; displayName?: string; description?: string }> {\n return {\n id: this.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n readOnly: this.readOnly,\n icon: this.icon,\n metadata: {\n bucketName: this._bucketName,\n ...(this.displayName && { displayName: this.displayName }),\n ...(this.description && { description: this.description }),\n },\n };\n }\n}\n\nfunction matchesExtension(name: string, extension: string | string[]): boolean {\n const extensions = Array.isArray(extension) ? extension : [extension];\n return extensions.some(ext => name.endsWith(ext));\n}\n","import type { RequestContext } from '@mastra/core/di';\nimport type {\n CommandResult,\n ExecuteCommandOptions,\n InstructionsOption,\n MastraSandboxOptions,\n ProcessInfo,\n ProviderStatus,\n SandboxCloneOptions,\n SandboxInfo,\n SpawnProcessOptions,\n} from '@mastra/core/workspace';\nimport { MastraSandbox, ProcessHandle, SandboxNotReadyError, SandboxProcessManager } from '@mastra/core/workspace';\nimport type { PlatformClientOptions } from './client.js';\nimport { PlatformClient } from './client.js';\n\nexport type PlatformSandboxNetworkIsolation = 'ISOLATED' | 'PRIVATE';\n\nexport interface PlatformSandboxOptions extends Omit<MastraSandboxOptions, 'processes'>, PlatformClientOptions {\n id?: string;\n environmentId?: string;\n sandboxId?: string;\n idleTimeoutMinutes?: number;\n networkIsolation?: PlatformSandboxNetworkIsolation;\n env?: Record<string, string>;\n timeout?: number;\n instructions?: InstructionsOption;\n}\n\ninterface CreateSandboxResponse {\n id: string;\n providerResourceId?: string | null;\n status?: string;\n createdAt?: string;\n destroyedAt?: string | null;\n}\n\ninterface ExecResponse {\n exitCode: number | null;\n stdout: string;\n stderr: string;\n truncated?: boolean;\n timedOut?: boolean;\n}\n\n/**\n * Compose a shell command line from a `command` string and optional `args`.\n *\n * IMPORTANT: `command` is treated as a **shell string** and passed to the\n * remote shell verbatim so callers can use pipes, redirects, and chaining\n * (`ls -la | grep foo`). This matches the contract of {@link MastraSandbox}\n * and the local sandbox implementation. `args` are always shell-quoted so\n * they cannot inject syntax.\n *\n * Callers MUST NOT pass untrusted input as `command`. Untrusted values must\n * be passed via `args`, where they are safely quoted. Passing untrusted\n * input as `command` allows arbitrary shell syntax execution on the remote\n * sandbox.\n */\nfunction buildCommand(command: string, args?: string[]): string {\n return args?.length ? `${command} ${args.map(shellQuote).join(' ')}` : command;\n}\n\nfunction shellQuote(arg: string): string {\n if (/^[a-zA-Z0-9._\\-/=:@]+$/.test(arg)) return arg;\n return `'${arg.replace(/'/g, `'\\\\''`)}'`;\n}\n\nclass PlatformProcessHandle extends ProcessHandle {\n readonly pid: string;\n private readonly resultPromise: Promise<CommandResult>;\n private exitCodeValue: number | undefined;\n\n constructor(pid: string, resultPromise: Promise<CommandResult>, options?: SpawnProcessOptions) {\n super(options);\n this.pid = pid;\n this.resultPromise = resultPromise.then(result => {\n this.exitCodeValue = result.exitCode;\n if (result.stdout) this.emitStdout(result.stdout);\n if (result.stderr) this.emitStderr(result.stderr);\n return result;\n });\n }\n\n get exitCode(): number | undefined {\n return this.exitCodeValue;\n }\n\n async wait(): Promise<CommandResult> {\n return this.resultPromise;\n }\n\n async kill(): Promise<boolean> {\n // The workspace proxy has no cancel-exec endpoint; each `executeCommand`\n // is a synchronous round-trip that has already completed (or timed out)\n // by the time a handle exists to kill. Making this explicit avoids\n // callers silently believing they cancelled a still-running process.\n throw new Error('Platform sandbox command execution does not support killing individual processes');\n }\n\n async sendStdin(): Promise<void> {\n throw new Error('Platform sandbox command execution does not support stdin');\n }\n}\n\nclass PlatformProcessManager extends SandboxProcessManager<PlatformSandbox> {\n private spawnCounter = 0;\n\n /**\n * Spawn a process on the remote sandbox.\n *\n * `command` is interpreted as a shell string by the remote shell, matching\n * the {@link MastraSandbox} contract. See {@link PlatformSandbox.executeCommand}\n * for the untrusted-input caveat: never pass untrusted values as `command`.\n */\n async spawn(command: string, options: SpawnProcessOptions = {}): Promise<ProcessHandle> {\n const pid = `platform-proc-${Date.now().toString(36)}-${(this.spawnCounter++).toString(36)}`;\n const resultPromise = this.sandbox.executeCommand(command, undefined, options);\n const handle = new PlatformProcessHandle(pid, resultPromise, options);\n this._tracked.set(handle.pid, handle);\n return handle;\n }\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\nexport class PlatformSandbox extends MastraSandbox {\n readonly id: string;\n readonly name = 'PlatformSandbox';\n readonly provider = 'platform';\n status: ProviderStatus = 'pending';\n declare readonly processes: PlatformProcessManager;\n\n private readonly _client: PlatformClient;\n private readonly _environmentId: string;\n private _sandboxId?: string;\n private readonly _idleTimeoutMinutes?: number;\n private readonly _networkIsolation?: PlatformSandboxNetworkIsolation;\n private readonly _env: Record<string, string>;\n private readonly _timeout?: number;\n private readonly _instructionsOverride?: InstructionsOption;\n private _createdAt: Date | null = null;\n\n constructor(options: PlatformSandboxOptions = {}) {\n super({ ...options, name: 'PlatformSandbox', processes: new PlatformProcessManager() });\n this.id = options.id ?? this.generateId();\n this._client = new PlatformClient(options);\n this._environmentId = options.environmentId ?? process.env.MASTRA_ENVIRONMENT_ID ?? '';\n if (!this._environmentId && !options.sandboxId) throw new Error('environmentId is required');\n this._sandboxId = options.sandboxId;\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 }\n\n private generateId(): string {\n return `platform-sandbox-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n /**\n * Construct a sibling {@link PlatformSandbox} that inherits this sandbox's\n * credentials and defaults (access token, project, environment, network\n * isolation, timeout, instructions, env, idle timeout) with per-instance\n * overrides from `options`.\n *\n * Performs no I/O and does not require this sandbox to be started — the\n * returned sandbox is not started and provisions (or reattaches, when\n * `sandboxId` is set) on its own `start()`. Use it when one configured\n * sandbox acts as the template for a fleet of independent sandboxes\n * (e.g. one per project).\n */\n clone(options: SandboxCloneOptions = {}): PlatformSandbox {\n return new PlatformSandbox({\n ...(options.id !== undefined && { id: options.id }),\n accessToken: this._client.accessToken,\n projectId: this._client.projectId,\n fetch: this._client.fetch,\n environmentId: this._environmentId,\n ...(options.sandboxId !== undefined && { sandboxId: options.sandboxId }),\n idleTimeoutMinutes: options.idleTimeoutMinutes ?? this._idleTimeoutMinutes,\n ...(this._networkIsolation !== undefined && { networkIsolation: this._networkIsolation }),\n env: options.env ?? this._env,\n ...(this._timeout !== undefined && { timeout: this._timeout }),\n ...(this._instructionsOverride !== undefined && { instructions: this._instructionsOverride }),\n });\n }\n\n async start(): Promise<void> {\n if (this._sandboxId) {\n this._createdAt = new Date();\n return;\n }\n\n const response = await this._client.request('/sandbox', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n // Sent so the platform can associate the provisioned resource with a\n // caller-stable identifier (used for opt-in checkpoint recovery). The\n // platform treats it as an advisory key: unknown values fall through\n // to a fresh sandbox, matching pre-existing behavior.\n id: this.id,\n environmentId: this._environmentId,\n idleTimeoutMinutes: this._idleTimeoutMinutes,\n networkIsolation: this._networkIsolation,\n env: this._env,\n }),\n });\n const json = (await response.json()) as CreateSandboxResponse;\n this._sandboxId = json.id;\n this._createdAt = json.createdAt ? new Date(json.createdAt) : new Date();\n }\n\n async stop(): Promise<void> {\n await this.destroy();\n }\n\n async destroy(): Promise<void> {\n if (!this._sandboxId) return;\n await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}`, { method: 'DELETE' });\n // Clear local state so a subsequent start() creates a fresh remote sandbox\n // instead of taking the reattach branch and pointing exec at a deleted resource.\n this._sandboxId = undefined;\n this._createdAt = null;\n }\n\n /**\n * Execute a command on the remote sandbox.\n *\n * `command` is a **shell string**: it is concatenated verbatim into the\n * command line sent to the remote shell, which lets callers use pipes,\n * redirects, and chaining (`ls -la | grep foo`). This matches the contract\n * of {@link MastraSandbox} and the local sandbox implementation.\n *\n * `args`, when provided, are always shell-quoted so they cannot inject\n * additional shell syntax.\n *\n * Security: callers MUST NOT pass untrusted input as `command`. If any part\n * of the invocation is derived from an untrusted source, pass it through\n * `args` (which is safely quoted) or shell-quote it yourself before\n * inclusion. Untrusted `command` values allow arbitrary shell syntax\n * execution on the remote sandbox.\n */\n async executeCommand(command: string, args?: string[], options?: ExecuteCommandOptions): Promise<CommandResult> {\n await this.ensureRunning();\n if (!this._sandboxId) throw new SandboxNotReadyError(this.id);\n\n const started = Date.now();\n const fullCommand = buildCommand(command, args);\n // Nullish check so an explicit `timeout: 0` is sent as `0` (interpreted as\n // \"no timeout\" by the proxy) instead of being dropped by a truthy check.\n const effectiveTimeout = options?.timeout ?? this._timeout;\n const timeoutSec = effectiveTimeout != null ? Math.ceil(effectiveTimeout / 1000) : undefined;\n // Pass our own signal for exec so the client's default per-request\n // timeout (60s) doesn't cut off commands that expect to run longer.\n // Give the proxy a generous buffer over the requested command timeout.\n const clientSignal =\n effectiveTimeout != null && effectiveTimeout > 0 ? AbortSignal.timeout(effectiveTimeout + 30_000) : undefined;\n const response = await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}/exec`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n command: fullCommand,\n timeoutSec,\n cwd: options?.cwd,\n env: options?.env,\n }),\n signal: clientSignal,\n });\n const json = (await response.json()) as ExecResponse;\n const exitCode = json.exitCode ?? (json.timedOut ? 124 : 1);\n return {\n success: exitCode === 0,\n exitCode,\n stdout: json.stdout,\n stderr: json.stderr,\n executionTimeMs: Date.now() - started,\n timedOut: json.timedOut,\n command: fullCommand,\n };\n }\n\n async getInfo(): Promise<SandboxInfo> {\n if (!this._sandboxId) {\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 };\n }\n const response = await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}`);\n const json = (await response.json()) as CreateSandboxResponse;\n return {\n id: json.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n createdAt: json.createdAt ? new Date(json.createdAt) : (this._createdAt ?? new Date()),\n metadata: {\n providerResourceId: json.providerResourceId ?? undefined,\n platformStatus: json.status,\n },\n };\n }\n\n getInstructions(opts?: { requestContext?: RequestContext }): string {\n const defaultInstructions = `Platform sandbox${this._sandboxId ? ` ${this._sandboxId}` : ''}. Execute commands with the sandbox command APIs.`;\n if (typeof this._instructionsOverride === 'function') {\n return this._instructionsOverride({ defaultInstructions, requestContext: opts?.requestContext });\n }\n if (typeof this._instructionsOverride === 'string') return this._instructionsOverride;\n return defaultInstructions;\n }\n}\n","import type { FilesystemProvider, SandboxProvider } from '@mastra/core/editor';\nimport type { PlatformFilesystemOptions } from './filesystem.js';\nimport { PlatformFilesystem } from './filesystem.js';\nimport type { PlatformSandboxOptions } from './sandbox.js';\nimport { PlatformSandbox } from './sandbox.js';\n\nexport const platformSandboxProvider: SandboxProvider<PlatformSandboxOptions> = {\n id: 'platform',\n name: 'Mastra Platform Sandbox',\n description: 'Environment-scoped sandbox execution through Mastra Platform workspace proxy',\n configSchema: {\n type: 'object',\n properties: {\n accessToken: {\n type: 'string',\n description: 'Mastra Platform access token (falls back to MASTRA_PLATFORM_ACCESS_TOKEN)',\n },\n projectId: { type: 'string', description: 'Platform project ID (falls back to MASTRA_PROJECT_ID)' },\n environmentId: { type: 'string', description: 'Platform environment ID (falls back to MASTRA_ENVIRONMENT_ID)' },\n sandboxId: { type: 'string', description: 'Reattach to an existing Platform sandbox by ID' },\n idleTimeoutMinutes: { type: 'number', description: 'Minutes before the sandbox can be destroyed while idle' },\n networkIsolation: {\n type: 'string',\n description: 'Network isolation mode',\n enum: ['ISOLATED', 'PRIVATE'],\n default: 'ISOLATED',\n },\n env: { type: 'object', description: 'Environment variables', additionalProperties: { type: 'string' } },\n timeout: { type: 'number', description: 'Default command timeout in ms' },\n },\n },\n createSandbox: config => new PlatformSandbox(config),\n};\n\nexport const platformFilesystemProvider: FilesystemProvider<PlatformFilesystemOptions> = {\n id: 'platform',\n name: 'Mastra Platform Filesystem',\n description: 'Bucket-backed filesystem access through Mastra Platform workspace proxy',\n configSchema: {\n type: 'object',\n properties: {\n accessToken: {\n type: 'string',\n description: 'Mastra Platform access token (falls back to MASTRA_PLATFORM_ACCESS_TOKEN)',\n },\n projectId: { type: 'string', description: 'Platform project ID (falls back to MASTRA_PROJECT_ID)' },\n bucketName: {\n type: 'string',\n description: 'Platform workspace bucket name (falls back to MASTRA_PLATFORM_BUCKET_NAME)',\n },\n readOnly: { type: 'boolean', description: 'Mount as read-only', default: false },\n },\n },\n createFilesystem: config => new PlatformFilesystem(config),\n};\n"]}
package/dist/index.js CHANGED
@@ -393,7 +393,7 @@ var PlatformProcessManager = class extends SandboxProcessManager {
393
393
  }));
394
394
  }
395
395
  };
396
- var PlatformSandbox = class extends MastraSandbox {
396
+ var PlatformSandbox = class _PlatformSandbox extends MastraSandbox {
397
397
  id;
398
398
  name = "PlatformSandbox";
399
399
  provider = "platform";
@@ -423,6 +423,33 @@ var PlatformSandbox = class extends MastraSandbox {
423
423
  generateId() {
424
424
  return `platform-sandbox-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
425
425
  }
426
+ /**
427
+ * Construct a sibling {@link PlatformSandbox} that inherits this sandbox's
428
+ * credentials and defaults (access token, project, environment, network
429
+ * isolation, timeout, instructions, env, idle timeout) with per-instance
430
+ * overrides from `options`.
431
+ *
432
+ * Performs no I/O and does not require this sandbox to be started — the
433
+ * returned sandbox is not started and provisions (or reattaches, when
434
+ * `sandboxId` is set) on its own `start()`. Use it when one configured
435
+ * sandbox acts as the template for a fleet of independent sandboxes
436
+ * (e.g. one per project).
437
+ */
438
+ clone(options = {}) {
439
+ return new _PlatformSandbox({
440
+ ...options.id !== void 0 && { id: options.id },
441
+ accessToken: this._client.accessToken,
442
+ projectId: this._client.projectId,
443
+ fetch: this._client.fetch,
444
+ environmentId: this._environmentId,
445
+ ...options.sandboxId !== void 0 && { sandboxId: options.sandboxId },
446
+ idleTimeoutMinutes: options.idleTimeoutMinutes ?? this._idleTimeoutMinutes,
447
+ ...this._networkIsolation !== void 0 && { networkIsolation: this._networkIsolation },
448
+ env: options.env ?? this._env,
449
+ ...this._timeout !== void 0 && { timeout: this._timeout },
450
+ ...this._instructionsOverride !== void 0 && { instructions: this._instructionsOverride }
451
+ });
452
+ }
426
453
  async start() {
427
454
  if (this._sandboxId) {
428
455
  this._createdAt = /* @__PURE__ */ new Date();
@@ -432,6 +459,11 @@ var PlatformSandbox = class extends MastraSandbox {
432
459
  method: "POST",
433
460
  headers: { "content-type": "application/json" },
434
461
  body: JSON.stringify({
462
+ // Sent so the platform can associate the provisioned resource with a
463
+ // caller-stable identifier (used for opt-in checkpoint recovery). The
464
+ // platform treats it as an advisory key: unknown values fall through
465
+ // to a fresh sandbox, matching pre-existing behavior.
466
+ id: this.id,
435
467
  environmentId: this._environmentId,
436
468
  idleTimeoutMinutes: this._idleTimeoutMinutes,
437
469
  networkIsolation: this._networkIsolation,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/filesystem.ts","../src/sandbox.ts","../src/provider.ts"],"names":["prefix"],"mappings":"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","file":"index.js","sourcesContent":["export interface PlatformClientOptions {\n accessToken?: string;\n projectId?: string;\n fetch?: typeof fetch;\n}\n\nexport interface PlatformRequestOptions extends RequestInit {\n query?: Record<string, string | number | boolean | undefined>;\n}\n\nconst DEFAULT_PROXY_URL = 'https://workspaces.mastra.ai';\n\n/**\n * Default per-request timeout for calls to the workspace proxy. Applied only\n * when the caller doesn't already pass an `AbortSignal`. Long-running routes\n * (e.g. `POST /sandbox/:id/exec`) pass their own longer signal.\n */\nconst DEFAULT_REQUEST_TIMEOUT_MS = 60_000;\n\nexport function requireOption(value: string | undefined, name: string): string {\n if (!value) throw new Error(`${name} is required`);\n return value;\n}\n\nexport function resolvePlatformOptions(options: PlatformClientOptions) {\n return {\n accessToken: requireOption(options.accessToken ?? process.env.MASTRA_PLATFORM_ACCESS_TOKEN, 'accessToken'),\n projectId: requireOption(options.projectId ?? process.env.MASTRA_PROJECT_ID, 'projectId'),\n proxyUrl: (process.env.MASTRA_WORKSPACE_PROXY_URL ?? DEFAULT_PROXY_URL).replace(/\\/$/, ''),\n fetch: options.fetch ?? fetch,\n };\n}\n\n/**\n * Structured error shape returned by the workspace proxy. All routes emit\n * `{ error: { message, type } }` on failure — see servers/workspace-proxy in\n * the Platform repo. Kept as a wire-level type so callers can switch on\n * `error.code` without re-parsing `error.body`.\n */\nexport interface PlatformProxyError {\n message: string;\n /** Machine-readable error kind, e.g. `not_found`, `invalid_request`, `authentication_error`. */\n type: string;\n}\n\nfunction parseProxyError(body: string): PlatformProxyError | undefined {\n if (!body) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n return undefined;\n }\n if (typeof parsed !== 'object' || parsed === null) return undefined;\n const err = (parsed as { error?: unknown }).error;\n if (typeof err !== 'object' || err === null) return undefined;\n const { message, type } = err as { message?: unknown; type?: unknown };\n if (typeof message !== 'string' || typeof type !== 'string') return undefined;\n return { message, type };\n}\n\nexport class PlatformApiError extends Error {\n readonly status: number;\n readonly body: string;\n /** Machine-readable proxy error kind (e.g. `not_found`), when the response body matches `{ error: { message, type } }`. */\n readonly code: string | undefined;\n /** Human-readable proxy error message, when the response body matches `{ error: { message, type } }`. */\n readonly proxyMessage: string | undefined;\n\n constructor(status: number, body: string) {\n const parsed = parseProxyError(body);\n const summary = parsed ? `${parsed.type}: ${parsed.message}` : body;\n super(`Platform proxy request failed with ${status}${summary ? `: ${summary}` : ''}`);\n this.name = 'PlatformApiError';\n this.status = status;\n this.body = body;\n this.code = parsed?.type;\n this.proxyMessage = parsed?.message;\n }\n}\n\nexport class PlatformClient {\n readonly accessToken: string;\n readonly projectId: string;\n readonly proxyUrl: string;\n readonly fetch: typeof fetch;\n\n constructor(options: PlatformClientOptions) {\n const resolved = resolvePlatformOptions(options);\n this.accessToken = resolved.accessToken;\n this.projectId = resolved.projectId;\n this.proxyUrl = resolved.proxyUrl;\n this.fetch = resolved.fetch;\n }\n\n async request(path: string, options: PlatformRequestOptions = {}): Promise<Response> {\n const url = new URL(`${this.proxyUrl}/v1/projects/${encodeURIComponent(this.projectId)}${path}`);\n for (const [key, value] of Object.entries(options.query ?? {})) {\n if (value !== undefined) url.searchParams.set(key, String(value));\n }\n\n const headers = new Headers(options.headers);\n headers.set('authorization', `Bearer ${this.accessToken}`);\n\n // Strip our helper-only field so the underlying fetch sees a valid RequestInit.\n const { query: _query, ...fetchOptions } = options;\n // Apply a default timeout only when the caller didn't already supply an\n // AbortSignal — long-running routes (exec) provide their own longer signal.\n const signal = fetchOptions.signal ?? AbortSignal.timeout(DEFAULT_REQUEST_TIMEOUT_MS);\n const response = await this.fetch(url, { ...fetchOptions, headers, signal });\n if (!response.ok) {\n throw new PlatformApiError(response.status, await response.text());\n }\n return response;\n }\n}\n","import { Buffer } from 'node:buffer';\nimport nodePath from 'node:path';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type {\n CopyOptions,\n FileContent,\n FileEntry,\n FileStat,\n FilesystemIcon,\n FilesystemInfo,\n InstructionsOption,\n ListOptions,\n MastraFilesystemOptions,\n ProviderStatus,\n ReadOptions,\n RemoveOptions,\n WriteOptions,\n} from '@mastra/core/workspace';\nimport { FileExistsError, FileNotFoundError, MastraFilesystem, WorkspaceReadOnlyError } from '@mastra/core/workspace';\nimport type { PlatformClientOptions } from './client.js';\nimport { PlatformClient } from './client.js';\n\ninterface ProxyListResponse {\n contents?: Array<{ key?: string; size?: number; lastModified?: string }>;\n commonPrefixes?: string[];\n}\n\nexport interface PlatformFilesystemOptions extends PlatformClientOptions, MastraFilesystemOptions {\n id?: string;\n bucketName?: string;\n readOnly?: boolean;\n displayName?: string;\n icon?: FilesystemIcon;\n description?: string;\n instructions?: InstructionsOption;\n}\n\nfunction normalizePath(input: string): string {\n if (!input || input === '.') return '/';\n let normalized = input.startsWith('/') ? input : `/${input}`;\n normalized = nodePath.posix.normalize(normalized);\n return normalized === '.' ? '/' : normalized;\n}\n\nfunction keyFromPath(path: string): string {\n const normalized = normalizePath(path);\n return normalized === '/' ? '' : normalized.slice(1);\n}\n\n/**\n * Encode each `/`-delimited segment of an object key with `encodeURIComponent`\n * so reserved URL characters (`?`, `#`, `%`, `&`, `+`, spaces, etc.) are\n * treated as part of the key instead of URL syntax. Kept segment-aware so\n * `/` continues to act as a path separator on the wire.\n */\nfunction encodeKeyPath(key: string): string {\n return key.split('/').map(encodeURIComponent).join('/');\n}\n\nfunction nameFromPath(path: string): string {\n const normalized = normalizePath(path);\n if (normalized === '/') return '';\n return normalized.slice(normalized.lastIndexOf('/') + 1);\n}\n\nfunction contentToBody(content: FileContent): string | Buffer {\n if (typeof content === 'string') return content;\n return Buffer.from(content);\n}\n\nfunction headerDate(headers: Headers, name: string): Date {\n const value = headers.get(name);\n return value ? new Date(value) : new Date(0);\n}\n\nfunction headerSize(headers: Headers): number {\n const value = headers.get('content-length');\n return value ? Number(value) : 0;\n}\n\nfunction isNotFound(error: unknown): boolean {\n return typeof error === 'object' && error !== null && 'status' in error && error.status === 404;\n}\n\nexport class PlatformFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'PlatformFilesystem';\n readonly provider = 'platform';\n readonly readOnly?: boolean;\n readonly displayName?: string;\n readonly icon: FilesystemIcon;\n readonly description?: string;\n status: ProviderStatus = 'pending';\n\n private readonly _client: PlatformClient;\n private readonly _bucketName: string;\n private readonly _instructionsOverride?: InstructionsOption;\n\n constructor(options: PlatformFilesystemOptions = {}) {\n super({ ...options, name: 'PlatformFilesystem' });\n this.id = options.id ?? this.generateId();\n this._bucketName = options.bucketName ?? process.env.MASTRA_PLATFORM_BUCKET_NAME ?? '';\n if (!this._bucketName) throw new Error('bucketName is required');\n this.readOnly = options.readOnly;\n this.displayName = options.displayName;\n this.icon = options.icon ?? 'cloud';\n this.description = options.description;\n this._instructionsOverride = options.instructions;\n this._client = new PlatformClient(options);\n }\n\n private generateId(): string {\n return `platform-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n async readFile(path: string, options?: ReadOptions): Promise<string | Buffer> {\n await this.ensureReady();\n let response: Response;\n try {\n response = await this._client.request(\n `/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`,\n );\n } catch (error) {\n if (isNotFound(error)) throw new FileNotFoundError(path);\n throw error;\n }\n const buffer = Buffer.from(await response.arrayBuffer());\n return options?.encoding ? buffer.toString(options.encoding) : buffer;\n }\n\n async writeFile(path: string, content: FileContent, options?: WriteOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('writeFile');\n const headers: Record<string, string> = {};\n if (options?.mimeType) headers['content-type'] = options.mimeType;\n if (options?.overwrite === false) headers['if-none-match'] = '*';\n try {\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`, {\n method: 'PUT',\n headers,\n body: contentToBody(content),\n });\n } catch (error) {\n if (typeof error === 'object' && error !== null && 'status' in error && error.status === 412) {\n throw new FileExistsError(path);\n }\n throw error;\n }\n }\n\n /**\n * Append bytes to a file.\n *\n * **Not atomic.** Object storage behind the workspace proxy has no native\n * append or compare-and-swap primitive, so this implementation is a\n * read-modify-write: it reads the current contents, concatenates the new\n * bytes, and PUTs the whole object back. Concurrent `appendFile` calls to\n * the same path can overwrite each other's writes (\"last write wins\").\n * Use `writeFile` with distinct keys for concurrent writers.\n */\n async appendFile(path: string, content: FileContent): Promise<void> {\n const existing = (await this.exists(path)) ? await this.readFile(path) : Buffer.alloc(0);\n await this.writeFile(\n path,\n Buffer.concat([Buffer.isBuffer(existing) ? existing : Buffer.from(existing), Buffer.from(content)]),\n );\n }\n\n async deleteFile(path: string, options?: RemoveOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('deleteFile');\n try {\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`, {\n method: 'DELETE',\n query: { recursive: options?.recursive },\n });\n } catch (error) {\n if (isNotFound(error) && options?.force) return;\n if (isNotFound(error)) throw new FileNotFoundError(path);\n throw error;\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('copyFile');\n // The workspace proxy's `?op=copy` route always overwrites the destination;\n // there's no conditional wire field to prevent it. Reject the option\n // explicitly instead of silently overwriting when the caller asked us not to.\n if (options?.overwrite === false) {\n throw new Error('PlatformFilesystem.copyFile does not support overwrite: false — the proxy always overwrites.');\n }\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(src))}`, {\n method: 'POST',\n query: { op: 'copy' },\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ destination: keyFromPath(dest) }),\n });\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('moveFile');\n // Same rationale as copyFile: `?op=rename` always overwrites.\n if (options?.overwrite === false) {\n throw new Error('PlatformFilesystem.moveFile does not support overwrite: false — the proxy always overwrites.');\n }\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(src))}`, {\n method: 'POST',\n query: { op: 'rename' },\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ destination: keyFromPath(dest) }),\n });\n }\n\n async mkdir(path: string, _options?: { recursive?: boolean }): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('mkdir');\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`, {\n method: 'POST',\n query: { op: 'mkdir' },\n });\n }\n\n async rmdir(path: string, options?: RemoveOptions): Promise<void> {\n await this.deleteFile(path.endsWith('/') ? path : `${path}/`, { recursive: true, force: options?.force });\n }\n\n async readdir(path: string, options?: ListOptions): Promise<FileEntry[]> {\n await this.ensureReady();\n const prefix = keyFromPath(path);\n const response = await this._client.request(\n `/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(prefix)}`,\n {\n query: {\n delimiter: options?.recursive ? undefined : '/',\n prefix: prefix ? `${prefix.replace(/\\/$/, '')}/` : undefined,\n },\n },\n );\n const json = (await response.json()) as ProxyListResponse;\n return [\n ...(json.commonPrefixes ?? []).map(prefix => ({\n name: nameFromPath(prefix.replace(/\\/$/, '')),\n type: 'directory' as const,\n })),\n ...(json.contents ?? [])\n .filter(object => object.key && !object.key.endsWith('/'))\n .map(object => ({\n name: nameFromPath(object.key!),\n type: 'file' as const,\n size: object.size,\n })),\n ].filter(\n entry => !options?.extension || entry.type === 'directory' || matchesExtension(entry.name, options.extension),\n );\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await this.stat(path);\n return true;\n } catch (error) {\n if (isNotFound(error) || error instanceof FileNotFoundError) return false;\n throw error;\n }\n }\n\n async stat(path: string): Promise<FileStat> {\n await this.ensureReady();\n const normalized = normalizePath(path);\n if (normalized === '/') {\n return { name: '', path: '/', type: 'directory', size: 0, createdAt: new Date(0), modifiedAt: new Date(0) };\n }\n let response: Response;\n try {\n response = await this._client.request(\n `/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`,\n {\n method: 'HEAD',\n },\n );\n } catch (error) {\n if (isNotFound(error)) throw new FileNotFoundError(path);\n throw error;\n }\n return {\n name: nameFromPath(path),\n path: normalized,\n type: normalized.endsWith('/') ? 'directory' : 'file',\n size: headerSize(response.headers),\n createdAt: headerDate(response.headers, 'last-modified'),\n modifiedAt: headerDate(response.headers, 'last-modified'),\n mimeType: response.headers.get('content-type') ?? undefined,\n };\n }\n\n realpath(path: string): Promise<string> {\n return Promise.resolve(normalizePath(path));\n }\n\n getInstructions(opts?: { requestContext?: RequestContext }): string {\n const defaultInstructions = `Platform filesystem backed by Mastra Platform bucket ${this._bucketName}. Use absolute workspace paths.`;\n if (typeof this._instructionsOverride === 'function') {\n return this._instructionsOverride({ defaultInstructions, requestContext: opts?.requestContext });\n }\n if (typeof this._instructionsOverride === 'string') return this._instructionsOverride;\n return defaultInstructions;\n }\n\n getInfo(): FilesystemInfo<{ bucketName: string; displayName?: string; description?: string }> {\n return {\n id: this.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n readOnly: this.readOnly,\n icon: this.icon,\n metadata: {\n bucketName: this._bucketName,\n ...(this.displayName && { displayName: this.displayName }),\n ...(this.description && { description: this.description }),\n },\n };\n }\n}\n\nfunction matchesExtension(name: string, extension: string | string[]): boolean {\n const extensions = Array.isArray(extension) ? extension : [extension];\n return extensions.some(ext => name.endsWith(ext));\n}\n","import type { RequestContext } from '@mastra/core/di';\nimport type {\n CommandResult,\n ExecuteCommandOptions,\n InstructionsOption,\n MastraSandboxOptions,\n ProcessInfo,\n ProviderStatus,\n SandboxInfo,\n SpawnProcessOptions,\n} from '@mastra/core/workspace';\nimport { MastraSandbox, ProcessHandle, SandboxNotReadyError, SandboxProcessManager } from '@mastra/core/workspace';\nimport type { PlatformClientOptions } from './client.js';\nimport { PlatformClient } from './client.js';\n\nexport type PlatformSandboxNetworkIsolation = 'ISOLATED' | 'PRIVATE';\n\nexport interface PlatformSandboxOptions extends Omit<MastraSandboxOptions, 'processes'>, PlatformClientOptions {\n id?: string;\n environmentId?: string;\n sandboxId?: string;\n idleTimeoutMinutes?: number;\n networkIsolation?: PlatformSandboxNetworkIsolation;\n env?: Record<string, string>;\n timeout?: number;\n instructions?: InstructionsOption;\n}\n\ninterface CreateSandboxResponse {\n id: string;\n providerResourceId?: string | null;\n status?: string;\n createdAt?: string;\n destroyedAt?: string | null;\n}\n\ninterface ExecResponse {\n exitCode: number | null;\n stdout: string;\n stderr: string;\n truncated?: boolean;\n timedOut?: boolean;\n}\n\n/**\n * Compose a shell command line from a `command` string and optional `args`.\n *\n * IMPORTANT: `command` is treated as a **shell string** and passed to the\n * remote shell verbatim so callers can use pipes, redirects, and chaining\n * (`ls -la | grep foo`). This matches the contract of {@link MastraSandbox}\n * and the local sandbox implementation. `args` are always shell-quoted so\n * they cannot inject syntax.\n *\n * Callers MUST NOT pass untrusted input as `command`. Untrusted values must\n * be passed via `args`, where they are safely quoted. Passing untrusted\n * input as `command` allows arbitrary shell syntax execution on the remote\n * sandbox.\n */\nfunction buildCommand(command: string, args?: string[]): string {\n return args?.length ? `${command} ${args.map(shellQuote).join(' ')}` : command;\n}\n\nfunction shellQuote(arg: string): string {\n if (/^[a-zA-Z0-9._\\-/=:@]+$/.test(arg)) return arg;\n return `'${arg.replace(/'/g, `'\\\\''`)}'`;\n}\n\nclass PlatformProcessHandle extends ProcessHandle {\n readonly pid: string;\n private readonly resultPromise: Promise<CommandResult>;\n private exitCodeValue: number | undefined;\n\n constructor(pid: string, resultPromise: Promise<CommandResult>, options?: SpawnProcessOptions) {\n super(options);\n this.pid = pid;\n this.resultPromise = resultPromise.then(result => {\n this.exitCodeValue = result.exitCode;\n if (result.stdout) this.emitStdout(result.stdout);\n if (result.stderr) this.emitStderr(result.stderr);\n return result;\n });\n }\n\n get exitCode(): number | undefined {\n return this.exitCodeValue;\n }\n\n async wait(): Promise<CommandResult> {\n return this.resultPromise;\n }\n\n async kill(): Promise<boolean> {\n // The workspace proxy has no cancel-exec endpoint; each `executeCommand`\n // is a synchronous round-trip that has already completed (or timed out)\n // by the time a handle exists to kill. Making this explicit avoids\n // callers silently believing they cancelled a still-running process.\n throw new Error('Platform sandbox command execution does not support killing individual processes');\n }\n\n async sendStdin(): Promise<void> {\n throw new Error('Platform sandbox command execution does not support stdin');\n }\n}\n\nclass PlatformProcessManager extends SandboxProcessManager<PlatformSandbox> {\n private spawnCounter = 0;\n\n /**\n * Spawn a process on the remote sandbox.\n *\n * `command` is interpreted as a shell string by the remote shell, matching\n * the {@link MastraSandbox} contract. See {@link PlatformSandbox.executeCommand}\n * for the untrusted-input caveat: never pass untrusted values as `command`.\n */\n async spawn(command: string, options: SpawnProcessOptions = {}): Promise<ProcessHandle> {\n const pid = `platform-proc-${Date.now().toString(36)}-${(this.spawnCounter++).toString(36)}`;\n const resultPromise = this.sandbox.executeCommand(command, undefined, options);\n const handle = new PlatformProcessHandle(pid, resultPromise, options);\n this._tracked.set(handle.pid, handle);\n return handle;\n }\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\nexport class PlatformSandbox extends MastraSandbox {\n readonly id: string;\n readonly name = 'PlatformSandbox';\n readonly provider = 'platform';\n status: ProviderStatus = 'pending';\n declare readonly processes: PlatformProcessManager;\n\n private readonly _client: PlatformClient;\n private readonly _environmentId: string;\n private _sandboxId?: string;\n private readonly _idleTimeoutMinutes?: number;\n private readonly _networkIsolation?: PlatformSandboxNetworkIsolation;\n private readonly _env: Record<string, string>;\n private readonly _timeout?: number;\n private readonly _instructionsOverride?: InstructionsOption;\n private _createdAt: Date | null = null;\n\n constructor(options: PlatformSandboxOptions = {}) {\n super({ ...options, name: 'PlatformSandbox', processes: new PlatformProcessManager() });\n this.id = options.id ?? this.generateId();\n this._client = new PlatformClient(options);\n this._environmentId = options.environmentId ?? process.env.MASTRA_ENVIRONMENT_ID ?? '';\n if (!this._environmentId && !options.sandboxId) throw new Error('environmentId is required');\n this._sandboxId = options.sandboxId;\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 }\n\n private generateId(): string {\n return `platform-sandbox-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n async start(): Promise<void> {\n if (this._sandboxId) {\n this._createdAt = new Date();\n return;\n }\n\n const response = await this._client.request('/sandbox', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n environmentId: this._environmentId,\n idleTimeoutMinutes: this._idleTimeoutMinutes,\n networkIsolation: this._networkIsolation,\n env: this._env,\n }),\n });\n const json = (await response.json()) as CreateSandboxResponse;\n this._sandboxId = json.id;\n this._createdAt = json.createdAt ? new Date(json.createdAt) : new Date();\n }\n\n async stop(): Promise<void> {\n await this.destroy();\n }\n\n async destroy(): Promise<void> {\n if (!this._sandboxId) return;\n await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}`, { method: 'DELETE' });\n // Clear local state so a subsequent start() creates a fresh remote sandbox\n // instead of taking the reattach branch and pointing exec at a deleted resource.\n this._sandboxId = undefined;\n this._createdAt = null;\n }\n\n /**\n * Execute a command on the remote sandbox.\n *\n * `command` is a **shell string**: it is concatenated verbatim into the\n * command line sent to the remote shell, which lets callers use pipes,\n * redirects, and chaining (`ls -la | grep foo`). This matches the contract\n * of {@link MastraSandbox} and the local sandbox implementation.\n *\n * `args`, when provided, are always shell-quoted so they cannot inject\n * additional shell syntax.\n *\n * Security: callers MUST NOT pass untrusted input as `command`. If any part\n * of the invocation is derived from an untrusted source, pass it through\n * `args` (which is safely quoted) or shell-quote it yourself before\n * inclusion. Untrusted `command` values allow arbitrary shell syntax\n * execution on the remote sandbox.\n */\n async executeCommand(command: string, args?: string[], options?: ExecuteCommandOptions): Promise<CommandResult> {\n await this.ensureRunning();\n if (!this._sandboxId) throw new SandboxNotReadyError(this.id);\n\n const started = Date.now();\n const fullCommand = buildCommand(command, args);\n // Nullish check so an explicit `timeout: 0` is sent as `0` (interpreted as\n // \"no timeout\" by the proxy) instead of being dropped by a truthy check.\n const effectiveTimeout = options?.timeout ?? this._timeout;\n const timeoutSec = effectiveTimeout != null ? Math.ceil(effectiveTimeout / 1000) : undefined;\n // Pass our own signal for exec so the client's default per-request\n // timeout (60s) doesn't cut off commands that expect to run longer.\n // Give the proxy a generous buffer over the requested command timeout.\n const clientSignal =\n effectiveTimeout != null && effectiveTimeout > 0 ? AbortSignal.timeout(effectiveTimeout + 30_000) : undefined;\n const response = await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}/exec`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n command: fullCommand,\n timeoutSec,\n cwd: options?.cwd,\n env: options?.env,\n }),\n signal: clientSignal,\n });\n const json = (await response.json()) as ExecResponse;\n const exitCode = json.exitCode ?? (json.timedOut ? 124 : 1);\n return {\n success: exitCode === 0,\n exitCode,\n stdout: json.stdout,\n stderr: json.stderr,\n executionTimeMs: Date.now() - started,\n timedOut: json.timedOut,\n command: fullCommand,\n };\n }\n\n async getInfo(): Promise<SandboxInfo> {\n if (!this._sandboxId) {\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 };\n }\n const response = await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}`);\n const json = (await response.json()) as CreateSandboxResponse;\n return {\n id: json.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n createdAt: json.createdAt ? new Date(json.createdAt) : (this._createdAt ?? new Date()),\n metadata: {\n providerResourceId: json.providerResourceId ?? undefined,\n platformStatus: json.status,\n },\n };\n }\n\n getInstructions(opts?: { requestContext?: RequestContext }): string {\n const defaultInstructions = `Platform sandbox${this._sandboxId ? ` ${this._sandboxId}` : ''}. Execute commands with the sandbox command APIs.`;\n if (typeof this._instructionsOverride === 'function') {\n return this._instructionsOverride({ defaultInstructions, requestContext: opts?.requestContext });\n }\n if (typeof this._instructionsOverride === 'string') return this._instructionsOverride;\n return defaultInstructions;\n }\n}\n","import type { FilesystemProvider, SandboxProvider } from '@mastra/core/editor';\nimport type { PlatformFilesystemOptions } from './filesystem.js';\nimport { PlatformFilesystem } from './filesystem.js';\nimport type { PlatformSandboxOptions } from './sandbox.js';\nimport { PlatformSandbox } from './sandbox.js';\n\nexport const platformSandboxProvider: SandboxProvider<PlatformSandboxOptions> = {\n id: 'platform',\n name: 'Mastra Platform Sandbox',\n description: 'Environment-scoped sandbox execution through Mastra Platform workspace proxy',\n configSchema: {\n type: 'object',\n properties: {\n accessToken: {\n type: 'string',\n description: 'Mastra Platform access token (falls back to MASTRA_PLATFORM_ACCESS_TOKEN)',\n },\n projectId: { type: 'string', description: 'Platform project ID (falls back to MASTRA_PROJECT_ID)' },\n environmentId: { type: 'string', description: 'Platform environment ID (falls back to MASTRA_ENVIRONMENT_ID)' },\n sandboxId: { type: 'string', description: 'Reattach to an existing Platform sandbox by ID' },\n idleTimeoutMinutes: { type: 'number', description: 'Minutes before the sandbox can be destroyed while idle' },\n networkIsolation: {\n type: 'string',\n description: 'Network isolation mode',\n enum: ['ISOLATED', 'PRIVATE'],\n default: 'ISOLATED',\n },\n env: { type: 'object', description: 'Environment variables', additionalProperties: { type: 'string' } },\n timeout: { type: 'number', description: 'Default command timeout in ms' },\n },\n },\n createSandbox: config => new PlatformSandbox(config),\n};\n\nexport const platformFilesystemProvider: FilesystemProvider<PlatformFilesystemOptions> = {\n id: 'platform',\n name: 'Mastra Platform Filesystem',\n description: 'Bucket-backed filesystem access through Mastra Platform workspace proxy',\n configSchema: {\n type: 'object',\n properties: {\n accessToken: {\n type: 'string',\n description: 'Mastra Platform access token (falls back to MASTRA_PLATFORM_ACCESS_TOKEN)',\n },\n projectId: { type: 'string', description: 'Platform project ID (falls back to MASTRA_PROJECT_ID)' },\n bucketName: {\n type: 'string',\n description: 'Platform workspace bucket name (falls back to MASTRA_PLATFORM_BUCKET_NAME)',\n },\n readOnly: { type: 'boolean', description: 'Mount as read-only', default: false },\n },\n },\n createFilesystem: config => new PlatformFilesystem(config),\n};\n"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/filesystem.ts","../src/sandbox.ts","../src/provider.ts"],"names":["prefix"],"mappings":"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","file":"index.js","sourcesContent":["export interface PlatformClientOptions {\n accessToken?: string;\n projectId?: string;\n fetch?: typeof fetch;\n}\n\nexport interface PlatformRequestOptions extends RequestInit {\n query?: Record<string, string | number | boolean | undefined>;\n}\n\nconst DEFAULT_PROXY_URL = 'https://workspaces.mastra.ai';\n\n/**\n * Default per-request timeout for calls to the workspace proxy. Applied only\n * when the caller doesn't already pass an `AbortSignal`. Long-running routes\n * (e.g. `POST /sandbox/:id/exec`) pass their own longer signal.\n */\nconst DEFAULT_REQUEST_TIMEOUT_MS = 60_000;\n\nexport function requireOption(value: string | undefined, name: string): string {\n if (!value) throw new Error(`${name} is required`);\n return value;\n}\n\nexport function resolvePlatformOptions(options: PlatformClientOptions) {\n return {\n accessToken: requireOption(options.accessToken ?? process.env.MASTRA_PLATFORM_ACCESS_TOKEN, 'accessToken'),\n projectId: requireOption(options.projectId ?? process.env.MASTRA_PROJECT_ID, 'projectId'),\n proxyUrl: (process.env.MASTRA_WORKSPACE_PROXY_URL ?? DEFAULT_PROXY_URL).replace(/\\/$/, ''),\n fetch: options.fetch ?? fetch,\n };\n}\n\n/**\n * Structured error shape returned by the workspace proxy. All routes emit\n * `{ error: { message, type } }` on failure — see servers/workspace-proxy in\n * the Platform repo. Kept as a wire-level type so callers can switch on\n * `error.code` without re-parsing `error.body`.\n */\nexport interface PlatformProxyError {\n message: string;\n /** Machine-readable error kind, e.g. `not_found`, `invalid_request`, `authentication_error`. */\n type: string;\n}\n\nfunction parseProxyError(body: string): PlatformProxyError | undefined {\n if (!body) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n return undefined;\n }\n if (typeof parsed !== 'object' || parsed === null) return undefined;\n const err = (parsed as { error?: unknown }).error;\n if (typeof err !== 'object' || err === null) return undefined;\n const { message, type } = err as { message?: unknown; type?: unknown };\n if (typeof message !== 'string' || typeof type !== 'string') return undefined;\n return { message, type };\n}\n\nexport class PlatformApiError extends Error {\n readonly status: number;\n readonly body: string;\n /** Machine-readable proxy error kind (e.g. `not_found`), when the response body matches `{ error: { message, type } }`. */\n readonly code: string | undefined;\n /** Human-readable proxy error message, when the response body matches `{ error: { message, type } }`. */\n readonly proxyMessage: string | undefined;\n\n constructor(status: number, body: string) {\n const parsed = parseProxyError(body);\n const summary = parsed ? `${parsed.type}: ${parsed.message}` : body;\n super(`Platform proxy request failed with ${status}${summary ? `: ${summary}` : ''}`);\n this.name = 'PlatformApiError';\n this.status = status;\n this.body = body;\n this.code = parsed?.type;\n this.proxyMessage = parsed?.message;\n }\n}\n\nexport class PlatformClient {\n readonly accessToken: string;\n readonly projectId: string;\n readonly proxyUrl: string;\n readonly fetch: typeof fetch;\n\n constructor(options: PlatformClientOptions) {\n const resolved = resolvePlatformOptions(options);\n this.accessToken = resolved.accessToken;\n this.projectId = resolved.projectId;\n this.proxyUrl = resolved.proxyUrl;\n this.fetch = resolved.fetch;\n }\n\n async request(path: string, options: PlatformRequestOptions = {}): Promise<Response> {\n const url = new URL(`${this.proxyUrl}/v1/projects/${encodeURIComponent(this.projectId)}${path}`);\n for (const [key, value] of Object.entries(options.query ?? {})) {\n if (value !== undefined) url.searchParams.set(key, String(value));\n }\n\n const headers = new Headers(options.headers);\n headers.set('authorization', `Bearer ${this.accessToken}`);\n\n // Strip our helper-only field so the underlying fetch sees a valid RequestInit.\n const { query: _query, ...fetchOptions } = options;\n // Apply a default timeout only when the caller didn't already supply an\n // AbortSignal — long-running routes (exec) provide their own longer signal.\n const signal = fetchOptions.signal ?? AbortSignal.timeout(DEFAULT_REQUEST_TIMEOUT_MS);\n const response = await this.fetch(url, { ...fetchOptions, headers, signal });\n if (!response.ok) {\n throw new PlatformApiError(response.status, await response.text());\n }\n return response;\n }\n}\n","import { Buffer } from 'node:buffer';\nimport nodePath from 'node:path';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type {\n CopyOptions,\n FileContent,\n FileEntry,\n FileStat,\n FilesystemIcon,\n FilesystemInfo,\n InstructionsOption,\n ListOptions,\n MastraFilesystemOptions,\n ProviderStatus,\n ReadOptions,\n RemoveOptions,\n WriteOptions,\n} from '@mastra/core/workspace';\nimport { FileExistsError, FileNotFoundError, MastraFilesystem, WorkspaceReadOnlyError } from '@mastra/core/workspace';\nimport type { PlatformClientOptions } from './client.js';\nimport { PlatformClient } from './client.js';\n\ninterface ProxyListResponse {\n contents?: Array<{ key?: string; size?: number; lastModified?: string }>;\n commonPrefixes?: string[];\n}\n\nexport interface PlatformFilesystemOptions extends PlatformClientOptions, MastraFilesystemOptions {\n id?: string;\n bucketName?: string;\n readOnly?: boolean;\n displayName?: string;\n icon?: FilesystemIcon;\n description?: string;\n instructions?: InstructionsOption;\n}\n\nfunction normalizePath(input: string): string {\n if (!input || input === '.') return '/';\n let normalized = input.startsWith('/') ? input : `/${input}`;\n normalized = nodePath.posix.normalize(normalized);\n return normalized === '.' ? '/' : normalized;\n}\n\nfunction keyFromPath(path: string): string {\n const normalized = normalizePath(path);\n return normalized === '/' ? '' : normalized.slice(1);\n}\n\n/**\n * Encode each `/`-delimited segment of an object key with `encodeURIComponent`\n * so reserved URL characters (`?`, `#`, `%`, `&`, `+`, spaces, etc.) are\n * treated as part of the key instead of URL syntax. Kept segment-aware so\n * `/` continues to act as a path separator on the wire.\n */\nfunction encodeKeyPath(key: string): string {\n return key.split('/').map(encodeURIComponent).join('/');\n}\n\nfunction nameFromPath(path: string): string {\n const normalized = normalizePath(path);\n if (normalized === '/') return '';\n return normalized.slice(normalized.lastIndexOf('/') + 1);\n}\n\nfunction contentToBody(content: FileContent): string | Buffer {\n if (typeof content === 'string') return content;\n return Buffer.from(content);\n}\n\nfunction headerDate(headers: Headers, name: string): Date {\n const value = headers.get(name);\n return value ? new Date(value) : new Date(0);\n}\n\nfunction headerSize(headers: Headers): number {\n const value = headers.get('content-length');\n return value ? Number(value) : 0;\n}\n\nfunction isNotFound(error: unknown): boolean {\n return typeof error === 'object' && error !== null && 'status' in error && error.status === 404;\n}\n\nexport class PlatformFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'PlatformFilesystem';\n readonly provider = 'platform';\n readonly readOnly?: boolean;\n readonly displayName?: string;\n readonly icon: FilesystemIcon;\n readonly description?: string;\n status: ProviderStatus = 'pending';\n\n private readonly _client: PlatformClient;\n private readonly _bucketName: string;\n private readonly _instructionsOverride?: InstructionsOption;\n\n constructor(options: PlatformFilesystemOptions = {}) {\n super({ ...options, name: 'PlatformFilesystem' });\n this.id = options.id ?? this.generateId();\n this._bucketName = options.bucketName ?? process.env.MASTRA_PLATFORM_BUCKET_NAME ?? '';\n if (!this._bucketName) throw new Error('bucketName is required');\n this.readOnly = options.readOnly;\n this.displayName = options.displayName;\n this.icon = options.icon ?? 'cloud';\n this.description = options.description;\n this._instructionsOverride = options.instructions;\n this._client = new PlatformClient(options);\n }\n\n private generateId(): string {\n return `platform-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n async readFile(path: string, options?: ReadOptions): Promise<string | Buffer> {\n await this.ensureReady();\n let response: Response;\n try {\n response = await this._client.request(\n `/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`,\n );\n } catch (error) {\n if (isNotFound(error)) throw new FileNotFoundError(path);\n throw error;\n }\n const buffer = Buffer.from(await response.arrayBuffer());\n return options?.encoding ? buffer.toString(options.encoding) : buffer;\n }\n\n async writeFile(path: string, content: FileContent, options?: WriteOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('writeFile');\n const headers: Record<string, string> = {};\n if (options?.mimeType) headers['content-type'] = options.mimeType;\n if (options?.overwrite === false) headers['if-none-match'] = '*';\n try {\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`, {\n method: 'PUT',\n headers,\n body: contentToBody(content),\n });\n } catch (error) {\n if (typeof error === 'object' && error !== null && 'status' in error && error.status === 412) {\n throw new FileExistsError(path);\n }\n throw error;\n }\n }\n\n /**\n * Append bytes to a file.\n *\n * **Not atomic.** Object storage behind the workspace proxy has no native\n * append or compare-and-swap primitive, so this implementation is a\n * read-modify-write: it reads the current contents, concatenates the new\n * bytes, and PUTs the whole object back. Concurrent `appendFile` calls to\n * the same path can overwrite each other's writes (\"last write wins\").\n * Use `writeFile` with distinct keys for concurrent writers.\n */\n async appendFile(path: string, content: FileContent): Promise<void> {\n const existing = (await this.exists(path)) ? await this.readFile(path) : Buffer.alloc(0);\n await this.writeFile(\n path,\n Buffer.concat([Buffer.isBuffer(existing) ? existing : Buffer.from(existing), Buffer.from(content)]),\n );\n }\n\n async deleteFile(path: string, options?: RemoveOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('deleteFile');\n try {\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`, {\n method: 'DELETE',\n query: { recursive: options?.recursive },\n });\n } catch (error) {\n if (isNotFound(error) && options?.force) return;\n if (isNotFound(error)) throw new FileNotFoundError(path);\n throw error;\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('copyFile');\n // The workspace proxy's `?op=copy` route always overwrites the destination;\n // there's no conditional wire field to prevent it. Reject the option\n // explicitly instead of silently overwriting when the caller asked us not to.\n if (options?.overwrite === false) {\n throw new Error('PlatformFilesystem.copyFile does not support overwrite: false — the proxy always overwrites.');\n }\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(src))}`, {\n method: 'POST',\n query: { op: 'copy' },\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ destination: keyFromPath(dest) }),\n });\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('moveFile');\n // Same rationale as copyFile: `?op=rename` always overwrites.\n if (options?.overwrite === false) {\n throw new Error('PlatformFilesystem.moveFile does not support overwrite: false — the proxy always overwrites.');\n }\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(src))}`, {\n method: 'POST',\n query: { op: 'rename' },\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ destination: keyFromPath(dest) }),\n });\n }\n\n async mkdir(path: string, _options?: { recursive?: boolean }): Promise<void> {\n await this.ensureReady();\n if (this.readOnly) throw new WorkspaceReadOnlyError('mkdir');\n await this._client.request(`/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`, {\n method: 'POST',\n query: { op: 'mkdir' },\n });\n }\n\n async rmdir(path: string, options?: RemoveOptions): Promise<void> {\n await this.deleteFile(path.endsWith('/') ? path : `${path}/`, { recursive: true, force: options?.force });\n }\n\n async readdir(path: string, options?: ListOptions): Promise<FileEntry[]> {\n await this.ensureReady();\n const prefix = keyFromPath(path);\n const response = await this._client.request(\n `/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(prefix)}`,\n {\n query: {\n delimiter: options?.recursive ? undefined : '/',\n prefix: prefix ? `${prefix.replace(/\\/$/, '')}/` : undefined,\n },\n },\n );\n const json = (await response.json()) as ProxyListResponse;\n return [\n ...(json.commonPrefixes ?? []).map(prefix => ({\n name: nameFromPath(prefix.replace(/\\/$/, '')),\n type: 'directory' as const,\n })),\n ...(json.contents ?? [])\n .filter(object => object.key && !object.key.endsWith('/'))\n .map(object => ({\n name: nameFromPath(object.key!),\n type: 'file' as const,\n size: object.size,\n })),\n ].filter(\n entry => !options?.extension || entry.type === 'directory' || matchesExtension(entry.name, options.extension),\n );\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await this.stat(path);\n return true;\n } catch (error) {\n if (isNotFound(error) || error instanceof FileNotFoundError) return false;\n throw error;\n }\n }\n\n async stat(path: string): Promise<FileStat> {\n await this.ensureReady();\n const normalized = normalizePath(path);\n if (normalized === '/') {\n return { name: '', path: '/', type: 'directory', size: 0, createdAt: new Date(0), modifiedAt: new Date(0) };\n }\n let response: Response;\n try {\n response = await this._client.request(\n `/fs/${encodeURIComponent(this._bucketName)}/${encodeKeyPath(keyFromPath(path))}`,\n {\n method: 'HEAD',\n },\n );\n } catch (error) {\n if (isNotFound(error)) throw new FileNotFoundError(path);\n throw error;\n }\n return {\n name: nameFromPath(path),\n path: normalized,\n type: normalized.endsWith('/') ? 'directory' : 'file',\n size: headerSize(response.headers),\n createdAt: headerDate(response.headers, 'last-modified'),\n modifiedAt: headerDate(response.headers, 'last-modified'),\n mimeType: response.headers.get('content-type') ?? undefined,\n };\n }\n\n realpath(path: string): Promise<string> {\n return Promise.resolve(normalizePath(path));\n }\n\n getInstructions(opts?: { requestContext?: RequestContext }): string {\n const defaultInstructions = `Platform filesystem backed by Mastra Platform bucket ${this._bucketName}. Use absolute workspace paths.`;\n if (typeof this._instructionsOverride === 'function') {\n return this._instructionsOverride({ defaultInstructions, requestContext: opts?.requestContext });\n }\n if (typeof this._instructionsOverride === 'string') return this._instructionsOverride;\n return defaultInstructions;\n }\n\n getInfo(): FilesystemInfo<{ bucketName: string; displayName?: string; description?: string }> {\n return {\n id: this.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n readOnly: this.readOnly,\n icon: this.icon,\n metadata: {\n bucketName: this._bucketName,\n ...(this.displayName && { displayName: this.displayName }),\n ...(this.description && { description: this.description }),\n },\n };\n }\n}\n\nfunction matchesExtension(name: string, extension: string | string[]): boolean {\n const extensions = Array.isArray(extension) ? extension : [extension];\n return extensions.some(ext => name.endsWith(ext));\n}\n","import type { RequestContext } from '@mastra/core/di';\nimport type {\n CommandResult,\n ExecuteCommandOptions,\n InstructionsOption,\n MastraSandboxOptions,\n ProcessInfo,\n ProviderStatus,\n SandboxCloneOptions,\n SandboxInfo,\n SpawnProcessOptions,\n} from '@mastra/core/workspace';\nimport { MastraSandbox, ProcessHandle, SandboxNotReadyError, SandboxProcessManager } from '@mastra/core/workspace';\nimport type { PlatformClientOptions } from './client.js';\nimport { PlatformClient } from './client.js';\n\nexport type PlatformSandboxNetworkIsolation = 'ISOLATED' | 'PRIVATE';\n\nexport interface PlatformSandboxOptions extends Omit<MastraSandboxOptions, 'processes'>, PlatformClientOptions {\n id?: string;\n environmentId?: string;\n sandboxId?: string;\n idleTimeoutMinutes?: number;\n networkIsolation?: PlatformSandboxNetworkIsolation;\n env?: Record<string, string>;\n timeout?: number;\n instructions?: InstructionsOption;\n}\n\ninterface CreateSandboxResponse {\n id: string;\n providerResourceId?: string | null;\n status?: string;\n createdAt?: string;\n destroyedAt?: string | null;\n}\n\ninterface ExecResponse {\n exitCode: number | null;\n stdout: string;\n stderr: string;\n truncated?: boolean;\n timedOut?: boolean;\n}\n\n/**\n * Compose a shell command line from a `command` string and optional `args`.\n *\n * IMPORTANT: `command` is treated as a **shell string** and passed to the\n * remote shell verbatim so callers can use pipes, redirects, and chaining\n * (`ls -la | grep foo`). This matches the contract of {@link MastraSandbox}\n * and the local sandbox implementation. `args` are always shell-quoted so\n * they cannot inject syntax.\n *\n * Callers MUST NOT pass untrusted input as `command`. Untrusted values must\n * be passed via `args`, where they are safely quoted. Passing untrusted\n * input as `command` allows arbitrary shell syntax execution on the remote\n * sandbox.\n */\nfunction buildCommand(command: string, args?: string[]): string {\n return args?.length ? `${command} ${args.map(shellQuote).join(' ')}` : command;\n}\n\nfunction shellQuote(arg: string): string {\n if (/^[a-zA-Z0-9._\\-/=:@]+$/.test(arg)) return arg;\n return `'${arg.replace(/'/g, `'\\\\''`)}'`;\n}\n\nclass PlatformProcessHandle extends ProcessHandle {\n readonly pid: string;\n private readonly resultPromise: Promise<CommandResult>;\n private exitCodeValue: number | undefined;\n\n constructor(pid: string, resultPromise: Promise<CommandResult>, options?: SpawnProcessOptions) {\n super(options);\n this.pid = pid;\n this.resultPromise = resultPromise.then(result => {\n this.exitCodeValue = result.exitCode;\n if (result.stdout) this.emitStdout(result.stdout);\n if (result.stderr) this.emitStderr(result.stderr);\n return result;\n });\n }\n\n get exitCode(): number | undefined {\n return this.exitCodeValue;\n }\n\n async wait(): Promise<CommandResult> {\n return this.resultPromise;\n }\n\n async kill(): Promise<boolean> {\n // The workspace proxy has no cancel-exec endpoint; each `executeCommand`\n // is a synchronous round-trip that has already completed (or timed out)\n // by the time a handle exists to kill. Making this explicit avoids\n // callers silently believing they cancelled a still-running process.\n throw new Error('Platform sandbox command execution does not support killing individual processes');\n }\n\n async sendStdin(): Promise<void> {\n throw new Error('Platform sandbox command execution does not support stdin');\n }\n}\n\nclass PlatformProcessManager extends SandboxProcessManager<PlatformSandbox> {\n private spawnCounter = 0;\n\n /**\n * Spawn a process on the remote sandbox.\n *\n * `command` is interpreted as a shell string by the remote shell, matching\n * the {@link MastraSandbox} contract. See {@link PlatformSandbox.executeCommand}\n * for the untrusted-input caveat: never pass untrusted values as `command`.\n */\n async spawn(command: string, options: SpawnProcessOptions = {}): Promise<ProcessHandle> {\n const pid = `platform-proc-${Date.now().toString(36)}-${(this.spawnCounter++).toString(36)}`;\n const resultPromise = this.sandbox.executeCommand(command, undefined, options);\n const handle = new PlatformProcessHandle(pid, resultPromise, options);\n this._tracked.set(handle.pid, handle);\n return handle;\n }\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\nexport class PlatformSandbox extends MastraSandbox {\n readonly id: string;\n readonly name = 'PlatformSandbox';\n readonly provider = 'platform';\n status: ProviderStatus = 'pending';\n declare readonly processes: PlatformProcessManager;\n\n private readonly _client: PlatformClient;\n private readonly _environmentId: string;\n private _sandboxId?: string;\n private readonly _idleTimeoutMinutes?: number;\n private readonly _networkIsolation?: PlatformSandboxNetworkIsolation;\n private readonly _env: Record<string, string>;\n private readonly _timeout?: number;\n private readonly _instructionsOverride?: InstructionsOption;\n private _createdAt: Date | null = null;\n\n constructor(options: PlatformSandboxOptions = {}) {\n super({ ...options, name: 'PlatformSandbox', processes: new PlatformProcessManager() });\n this.id = options.id ?? this.generateId();\n this._client = new PlatformClient(options);\n this._environmentId = options.environmentId ?? process.env.MASTRA_ENVIRONMENT_ID ?? '';\n if (!this._environmentId && !options.sandboxId) throw new Error('environmentId is required');\n this._sandboxId = options.sandboxId;\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 }\n\n private generateId(): string {\n return `platform-sandbox-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n /**\n * Construct a sibling {@link PlatformSandbox} that inherits this sandbox's\n * credentials and defaults (access token, project, environment, network\n * isolation, timeout, instructions, env, idle timeout) with per-instance\n * overrides from `options`.\n *\n * Performs no I/O and does not require this sandbox to be started — the\n * returned sandbox is not started and provisions (or reattaches, when\n * `sandboxId` is set) on its own `start()`. Use it when one configured\n * sandbox acts as the template for a fleet of independent sandboxes\n * (e.g. one per project).\n */\n clone(options: SandboxCloneOptions = {}): PlatformSandbox {\n return new PlatformSandbox({\n ...(options.id !== undefined && { id: options.id }),\n accessToken: this._client.accessToken,\n projectId: this._client.projectId,\n fetch: this._client.fetch,\n environmentId: this._environmentId,\n ...(options.sandboxId !== undefined && { sandboxId: options.sandboxId }),\n idleTimeoutMinutes: options.idleTimeoutMinutes ?? this._idleTimeoutMinutes,\n ...(this._networkIsolation !== undefined && { networkIsolation: this._networkIsolation }),\n env: options.env ?? this._env,\n ...(this._timeout !== undefined && { timeout: this._timeout }),\n ...(this._instructionsOverride !== undefined && { instructions: this._instructionsOverride }),\n });\n }\n\n async start(): Promise<void> {\n if (this._sandboxId) {\n this._createdAt = new Date();\n return;\n }\n\n const response = await this._client.request('/sandbox', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n // Sent so the platform can associate the provisioned resource with a\n // caller-stable identifier (used for opt-in checkpoint recovery). The\n // platform treats it as an advisory key: unknown values fall through\n // to a fresh sandbox, matching pre-existing behavior.\n id: this.id,\n environmentId: this._environmentId,\n idleTimeoutMinutes: this._idleTimeoutMinutes,\n networkIsolation: this._networkIsolation,\n env: this._env,\n }),\n });\n const json = (await response.json()) as CreateSandboxResponse;\n this._sandboxId = json.id;\n this._createdAt = json.createdAt ? new Date(json.createdAt) : new Date();\n }\n\n async stop(): Promise<void> {\n await this.destroy();\n }\n\n async destroy(): Promise<void> {\n if (!this._sandboxId) return;\n await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}`, { method: 'DELETE' });\n // Clear local state so a subsequent start() creates a fresh remote sandbox\n // instead of taking the reattach branch and pointing exec at a deleted resource.\n this._sandboxId = undefined;\n this._createdAt = null;\n }\n\n /**\n * Execute a command on the remote sandbox.\n *\n * `command` is a **shell string**: it is concatenated verbatim into the\n * command line sent to the remote shell, which lets callers use pipes,\n * redirects, and chaining (`ls -la | grep foo`). This matches the contract\n * of {@link MastraSandbox} and the local sandbox implementation.\n *\n * `args`, when provided, are always shell-quoted so they cannot inject\n * additional shell syntax.\n *\n * Security: callers MUST NOT pass untrusted input as `command`. If any part\n * of the invocation is derived from an untrusted source, pass it through\n * `args` (which is safely quoted) or shell-quote it yourself before\n * inclusion. Untrusted `command` values allow arbitrary shell syntax\n * execution on the remote sandbox.\n */\n async executeCommand(command: string, args?: string[], options?: ExecuteCommandOptions): Promise<CommandResult> {\n await this.ensureRunning();\n if (!this._sandboxId) throw new SandboxNotReadyError(this.id);\n\n const started = Date.now();\n const fullCommand = buildCommand(command, args);\n // Nullish check so an explicit `timeout: 0` is sent as `0` (interpreted as\n // \"no timeout\" by the proxy) instead of being dropped by a truthy check.\n const effectiveTimeout = options?.timeout ?? this._timeout;\n const timeoutSec = effectiveTimeout != null ? Math.ceil(effectiveTimeout / 1000) : undefined;\n // Pass our own signal for exec so the client's default per-request\n // timeout (60s) doesn't cut off commands that expect to run longer.\n // Give the proxy a generous buffer over the requested command timeout.\n const clientSignal =\n effectiveTimeout != null && effectiveTimeout > 0 ? AbortSignal.timeout(effectiveTimeout + 30_000) : undefined;\n const response = await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}/exec`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n command: fullCommand,\n timeoutSec,\n cwd: options?.cwd,\n env: options?.env,\n }),\n signal: clientSignal,\n });\n const json = (await response.json()) as ExecResponse;\n const exitCode = json.exitCode ?? (json.timedOut ? 124 : 1);\n return {\n success: exitCode === 0,\n exitCode,\n stdout: json.stdout,\n stderr: json.stderr,\n executionTimeMs: Date.now() - started,\n timedOut: json.timedOut,\n command: fullCommand,\n };\n }\n\n async getInfo(): Promise<SandboxInfo> {\n if (!this._sandboxId) {\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 };\n }\n const response = await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}`);\n const json = (await response.json()) as CreateSandboxResponse;\n return {\n id: json.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n createdAt: json.createdAt ? new Date(json.createdAt) : (this._createdAt ?? new Date()),\n metadata: {\n providerResourceId: json.providerResourceId ?? undefined,\n platformStatus: json.status,\n },\n };\n }\n\n getInstructions(opts?: { requestContext?: RequestContext }): string {\n const defaultInstructions = `Platform sandbox${this._sandboxId ? ` ${this._sandboxId}` : ''}. Execute commands with the sandbox command APIs.`;\n if (typeof this._instructionsOverride === 'function') {\n return this._instructionsOverride({ defaultInstructions, requestContext: opts?.requestContext });\n }\n if (typeof this._instructionsOverride === 'string') return this._instructionsOverride;\n return defaultInstructions;\n }\n}\n","import type { FilesystemProvider, SandboxProvider } from '@mastra/core/editor';\nimport type { PlatformFilesystemOptions } from './filesystem.js';\nimport { PlatformFilesystem } from './filesystem.js';\nimport type { PlatformSandboxOptions } from './sandbox.js';\nimport { PlatformSandbox } from './sandbox.js';\n\nexport const platformSandboxProvider: SandboxProvider<PlatformSandboxOptions> = {\n id: 'platform',\n name: 'Mastra Platform Sandbox',\n description: 'Environment-scoped sandbox execution through Mastra Platform workspace proxy',\n configSchema: {\n type: 'object',\n properties: {\n accessToken: {\n type: 'string',\n description: 'Mastra Platform access token (falls back to MASTRA_PLATFORM_ACCESS_TOKEN)',\n },\n projectId: { type: 'string', description: 'Platform project ID (falls back to MASTRA_PROJECT_ID)' },\n environmentId: { type: 'string', description: 'Platform environment ID (falls back to MASTRA_ENVIRONMENT_ID)' },\n sandboxId: { type: 'string', description: 'Reattach to an existing Platform sandbox by ID' },\n idleTimeoutMinutes: { type: 'number', description: 'Minutes before the sandbox can be destroyed while idle' },\n networkIsolation: {\n type: 'string',\n description: 'Network isolation mode',\n enum: ['ISOLATED', 'PRIVATE'],\n default: 'ISOLATED',\n },\n env: { type: 'object', description: 'Environment variables', additionalProperties: { type: 'string' } },\n timeout: { type: 'number', description: 'Default command timeout in ms' },\n },\n },\n createSandbox: config => new PlatformSandbox(config),\n};\n\nexport const platformFilesystemProvider: FilesystemProvider<PlatformFilesystemOptions> = {\n id: 'platform',\n name: 'Mastra Platform Filesystem',\n description: 'Bucket-backed filesystem access through Mastra Platform workspace proxy',\n configSchema: {\n type: 'object',\n properties: {\n accessToken: {\n type: 'string',\n description: 'Mastra Platform access token (falls back to MASTRA_PLATFORM_ACCESS_TOKEN)',\n },\n projectId: { type: 'string', description: 'Platform project ID (falls back to MASTRA_PROJECT_ID)' },\n bucketName: {\n type: 'string',\n description: 'Platform workspace bucket name (falls back to MASTRA_PLATFORM_BUCKET_NAME)',\n },\n readOnly: { type: 'boolean', description: 'Mount as read-only', default: false },\n },\n },\n createFilesystem: config => new PlatformFilesystem(config),\n};\n"]}
package/dist/sandbox.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { RequestContext } from '@mastra/core/di';
2
- import type { CommandResult, ExecuteCommandOptions, InstructionsOption, MastraSandboxOptions, ProcessInfo, ProviderStatus, SandboxInfo, SpawnProcessOptions } from '@mastra/core/workspace';
2
+ import type { CommandResult, ExecuteCommandOptions, InstructionsOption, MastraSandboxOptions, ProcessInfo, ProviderStatus, SandboxCloneOptions, SandboxInfo, SpawnProcessOptions } from '@mastra/core/workspace';
3
3
  import { MastraSandbox, ProcessHandle, SandboxProcessManager } from '@mastra/core/workspace';
4
4
  import type { PlatformClientOptions } from './client.js';
5
5
  export type PlatformSandboxNetworkIsolation = 'ISOLATED' | 'PRIVATE';
@@ -42,6 +42,19 @@ export declare class PlatformSandbox extends MastraSandbox {
42
42
  private _createdAt;
43
43
  constructor(options?: PlatformSandboxOptions);
44
44
  private generateId;
45
+ /**
46
+ * Construct a sibling {@link PlatformSandbox} that inherits this sandbox's
47
+ * credentials and defaults (access token, project, environment, network
48
+ * isolation, timeout, instructions, env, idle timeout) with per-instance
49
+ * overrides from `options`.
50
+ *
51
+ * Performs no I/O and does not require this sandbox to be started — the
52
+ * returned sandbox is not started and provisions (or reattaches, when
53
+ * `sandboxId` is set) on its own `start()`. Use it when one configured
54
+ * sandbox acts as the template for a fleet of independent sandboxes
55
+ * (e.g. one per project).
56
+ */
57
+ clone(options?: SandboxCloneOptions): PlatformSandbox;
45
58
  start(): Promise<void>;
46
59
  stop(): Promise<void>;
47
60
  destroy(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,WAAW,EACX,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAwB,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACnH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzD,MAAM,MAAM,+BAA+B,GAAG,UAAU,GAAG,SAAS,CAAC;AAErE,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,EAAE,qBAAqB;IAC5G,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,+BAA+B,CAAC;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AA8ED,cAAM,sBAAuB,SAAQ,qBAAqB,CAAC,eAAe,CAAC;IACzE,OAAO,CAAC,YAAY,CAAK;IAEzB;;;;;;OAMG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC;IAQjF,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;CAQrC;AAED,qBAAa,eAAgB,SAAQ,aAAa;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,qBAAqB;IAClC,QAAQ,CAAC,QAAQ,cAAc;IAC/B,MAAM,EAAE,cAAc,CAAa;IACnC,SAAiB,SAAS,EAAE,sBAAsB,CAAC;IAEnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAkC;IACrE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAyB;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAqB;IAC5D,OAAO,CAAC,UAAU,CAAqB;gBAE3B,OAAO,GAAE,sBAA2B;IAchD,OAAO,CAAC,UAAU;IAIZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B;;;;;;;;;;;;;;;;OAgBG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC;IAuCzG,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC;IAyBrC,eAAe,CAAC,IAAI,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,cAAc,CAAA;KAAE,GAAG,MAAM;CAQpE"}
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAwB,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACnH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzD,MAAM,MAAM,+BAA+B,GAAG,UAAU,GAAG,SAAS,CAAC;AAErE,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,EAAE,qBAAqB;IAC5G,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,+BAA+B,CAAC;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AA8ED,cAAM,sBAAuB,SAAQ,qBAAqB,CAAC,eAAe,CAAC;IACzE,OAAO,CAAC,YAAY,CAAK;IAEzB;;;;;;OAMG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC;IAQjF,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;CAQrC;AAED,qBAAa,eAAgB,SAAQ,aAAa;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,qBAAqB;IAClC,QAAQ,CAAC,QAAQ,cAAc;IAC/B,MAAM,EAAE,cAAc,CAAa;IACnC,SAAiB,SAAS,EAAE,sBAAsB,CAAC;IAEnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAkC;IACrE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAyB;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAqB;IAC5D,OAAO,CAAC,UAAU,CAAqB;gBAE3B,OAAO,GAAE,sBAA2B;IAchD,OAAO,CAAC,UAAU;IAIlB;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,OAAO,GAAE,mBAAwB,GAAG,eAAe;IAgBnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B;;;;;;;;;;;;;;;;OAgBG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC;IAuCzG,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC;IAyBrC,eAAe,CAAC,IAAI,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,cAAc,CAAA;KAAE,GAAG,MAAM;CAQpE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/platform-workspace",
3
- "version": "0.1.0",
3
+ "version": "0.2.0-alpha.0",
4
4
  "description": "Mastra Platform workspace sandbox and filesystem providers",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -28,8 +28,8 @@
28
28
  "typescript": "^6.0.3",
29
29
  "vitest": "4.1.10",
30
30
  "@internal/types-builder": "0.0.89",
31
- "@internal/lint": "0.0.114",
32
- "@mastra/core": "1.51.0"
31
+ "@mastra/core": "1.52.0-alpha.8",
32
+ "@internal/lint": "0.0.114"
33
33
  },
34
34
  "peerDependencies": {
35
35
  "@mastra/core": ">=1.4.0-0 <2.0.0-0"