@mastra/platform-workspace 0.2.0 → 0.2.1-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 +9 -0
- package/dist/index.cjs +10 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/sandbox.d.ts.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @mastra/platform
|
|
2
2
|
|
|
3
|
+
## 0.2.1-alpha.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Fixed PlatformSandbox reattach so stale sandbox IDs are recreated before commands run. ([#20102](https://github.com/mastra-ai/mastra/pull/20102))
|
|
8
|
+
|
|
9
|
+
- Updated dependencies [[`df6a9ce`](https://github.com/mastra-ai/mastra/commit/df6a9ce87214f7aadb2edfe62f67605fe998a0a4)]:
|
|
10
|
+
- @mastra/core@1.52.2-alpha.0
|
|
11
|
+
|
|
3
12
|
## 0.2.0
|
|
4
13
|
|
|
5
14
|
### Minor Changes
|
package/dist/index.cjs
CHANGED
|
@@ -462,9 +462,17 @@ var PlatformSandbox = class _PlatformSandbox extends workspace.MastraSandbox {
|
|
|
462
462
|
}
|
|
463
463
|
async start() {
|
|
464
464
|
if (this._sandboxId) {
|
|
465
|
-
|
|
466
|
-
|
|
465
|
+
try {
|
|
466
|
+
const response2 = await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}`);
|
|
467
|
+
const json2 = await response2.json();
|
|
468
|
+
this._createdAt = json2.createdAt ? new Date(json2.createdAt) : /* @__PURE__ */ new Date();
|
|
469
|
+
return;
|
|
470
|
+
} catch (error) {
|
|
471
|
+
if (!(error instanceof PlatformApiError) || error.status !== 404) throw error;
|
|
472
|
+
this._sandboxId = void 0;
|
|
473
|
+
}
|
|
467
474
|
}
|
|
475
|
+
if (!this._environmentId) throw new Error("environmentId is required");
|
|
468
476
|
const response = await this._client.request("/sandbox", {
|
|
469
477
|
method: "POST",
|
|
470
478
|
headers: { "content-type": "application/json" },
|
package/dist/index.cjs.map
CHANGED
|
@@ -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(\n options.accessToken ??\n process.env.MASTRA_PLATFORM_SECRET_KEY ??\n // Deprecated alias — prefer MASTRA_PLATFORM_SECRET_KEY.\n process.env.MASTRA_PLATFORM_ACCESS_TOKEN,\n 'accessToken',\n ),\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 secret key (falls back to MASTRA_PLATFORM_SECRET_KEY)',\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 secret key (falls back to MASTRA_PLATFORM_SECRET_KEY)',\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","response","json","SandboxNotReadyError"],"mappings":";;;;;;;;;;;AAUA,IAAM,iBAAA,GAAoB,8BAAA;AAO1B,IAAM,0BAAA,GAA6B,GAAA;AAE5B,SAAS,aAAA,CAAc,OAA2B,IAAA,EAAsB;AAC7E,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,YAAA,CAAc,CAAA;AACjD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,uBAAuB,OAAA,EAAgC;AACrE,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,aAAA;AAAA,MACX,OAAA,CAAQ,WAAA,IACN,OAAA,CAAQ,GAAA,CAAI,0BAAA;AAAA,MAEZ,QAAQ,GAAA,CAAI,4BAAA;AAAA,MACd;AAAA,KACF;AAAA,IACA,WAAW,aAAA,CAAc,OAAA,CAAQ,aAAa,OAAA,CAAQ,GAAA,CAAI,mBAAmB,WAAW,CAAA;AAAA,IACxF,WAAW,OAAA,CAAQ,GAAA,CAAI,8BAA8B,iBAAA,EAAmB,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IACzF,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA,GAC1B;AACF;AAcA,SAAS,gBAAgB,IAAA,EAA8C;AACrE,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,MAAM,OAAO,MAAA;AAC1D,EAAA,MAAM,MAAO,MAAA,CAA+B,KAAA;AAC5C,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,MAAM,OAAO,MAAA;AACpD,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,GAAA;AAC1B,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAO,IAAA,KAAS,UAAU,OAAO,MAAA;AACpE,EAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AACzB;AAEO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EACjC,MAAA;AAAA,EACA,IAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA,EAEA,YAAA;AAAA,EAET,WAAA,CAAY,QAAgB,IAAA,EAAc;AACxC,IAAA,MAAM,MAAA,GAAS,gBAAgB,IAAI,CAAA;AACnC,IAAA,MAAM,OAAA,GAAU,SAAS,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,CAAA,CAAA,GAAK,IAAA;AAC/D,IAAA,KAAA,CAAM,CAAA,mCAAA,EAAsC,MAAM,CAAA,EAAG,OAAA,GAAU,KAAK,OAAO,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AACpF,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,eAAe,MAAA,EAAQ,OAAA;AAAA,EAC9B;AACF;AAEO,IAAM,iBAAN,MAAqB;AAAA,EACjB,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EAET,YAAY,OAAA,EAAgC;AAC1C,IAAA,MAAM,QAAA,GAAW,uBAAuB,OAAO,CAAA;AAC/C,IAAA,IAAA,CAAK,cAAc,QAAA,CAAS,WAAA;AAC5B,IAAA,IAAA,CAAK,YAAY,QAAA,CAAS,SAAA;AAC1B,IAAA,IAAA,CAAK,WAAW,QAAA,CAAS,QAAA;AACzB,IAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,KAAA;AAAA,EACxB;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAc,OAAA,GAAkC,EAAC,EAAsB;AACnF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,aAAA,EAAgB,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAC,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AAC/F,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA,IAAS,EAAE,CAAA,EAAG;AAC9D,MAAA,IAAI,KAAA,KAAU,QAAW,GAAA,CAAI,YAAA,CAAa,IAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAC3C,IAAA,OAAA,CAAQ,GAAA,CAAI,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,WAAW,CAAA,CAAE,CAAA;AAGzD,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,GAAG,cAAa,GAAI,OAAA;AAG3C,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,MAAA,IAAU,WAAA,CAAY,QAAQ,0BAA0B,CAAA;AACpF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,EAAE,GAAG,YAAA,EAAc,OAAA,EAAS,MAAA,EAAQ,CAAA;AAC3E,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,gBAAA,CAAiB,QAAA,CAAS,QAAQ,MAAM,QAAA,CAAS,MAAM,CAAA;AAAA,IACnE;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;ACpFA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,KAAU,GAAA,EAAK,OAAO,GAAA;AACpC,EAAA,IAAI,aAAa,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA,GAAQ,IAAI,KAAK,CAAA,CAAA;AAC1D,EAAA,UAAA,GAAaA,yBAAA,CAAS,KAAA,CAAM,SAAA,CAAU,UAAU,CAAA;AAChD,EAAA,OAAO,UAAA,KAAe,MAAM,GAAA,GAAM,UAAA;AACpC;AAEA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,MAAM,UAAA,GAAa,cAAc,IAAI,CAAA;AACrC,EAAA,OAAO,UAAA,KAAe,GAAA,GAAM,EAAA,GAAK,UAAA,CAAW,MAAM,CAAC,CAAA;AACrD;AAQA,SAAS,cAAc,GAAA,EAAqB;AAC1C,EAAA,OAAO,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAI,kBAAkB,CAAA,CAAE,KAAK,GAAG,CAAA;AACxD;AAEA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,MAAM,UAAA,GAAa,cAAc,IAAI,CAAA;AACrC,EAAA,IAAI,UAAA,KAAe,KAAK,OAAO,EAAA;AAC/B,EAAA,OAAO,WAAW,KAAA,CAAM,UAAA,CAAW,WAAA,CAAY,GAAG,IAAI,CAAC,CAAA;AACzD;AAEA,SAAS,cAAc,OAAA,EAAuC;AAC5D,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AACxC,EAAA,OAAOC,aAAA,CAAO,KAAK,OAAO,CAAA;AAC5B;AAEA,SAAS,UAAA,CAAW,SAAkB,IAAA,EAAoB;AACxD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC9B,EAAA,OAAO,QAAQ,IAAI,IAAA,CAAK,KAAK,CAAA,mBAAI,IAAI,KAAK,CAAC,CAAA;AAC7C;AAEA,SAAS,WAAW,OAAA,EAA0B;AAC5C,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAC1C,EAAA,OAAO,KAAA,GAAQ,MAAA,CAAO,KAAK,CAAA,GAAI,CAAA;AACjC;AAEA,SAAS,WAAW,KAAA,EAAyB;AAC3C,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,QAAA,IAAY,KAAA,IAAS,MAAM,MAAA,KAAW,GAAA;AAC9F;AAEO,IAAM,kBAAA,GAAN,cAAiCC,0BAAA,CAAiB;AAAA,EAC9C,EAAA;AAAA,EACA,IAAA,GAAO,oBAAA;AAAA,EACP,QAAA,GAAW,UAAA;AAAA,EACX,QAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACT,MAAA,GAAyB,SAAA;AAAA,EAER,OAAA;AAAA,EACA,WAAA;AAAA,EACA,qBAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAAqC,EAAC,EAAG;AACnD,IAAA,KAAA,CAAM,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,sBAAsB,CAAA;AAChD,IAAA,IAAA,CAAK,EAAA,GAAK,OAAA,CAAQ,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AACxC,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,IAAI,2BAAA,IAA+B,EAAA;AACpF,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAC/D,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,IAAA,IAAQ,OAAA;AAC5B,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,wBAAwB,OAAA,CAAQ,YAAA;AACrC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,cAAA,CAAe,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEQ,UAAA,GAAqB;AAC3B,IAAA,OAAO,eAAe,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EACzF;AAAA,EAEA,MAAM,QAAA,CAAS,IAAA,EAAc,OAAA,EAAiD;AAC5E,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,QAC5B,CAAA,IAAA,EAAO,kBAAA,CAAmB,IAAA,CAAK,WAAW,CAAC,IAAI,aAAA,CAAc,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA;AAAA,OACjF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,WAAW,KAAK,CAAA,EAAG,MAAM,IAAIC,4BAAkB,IAAI,CAAA;AACvD,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,MAAMC,WAASH,aAAA,CAAO,IAAA,CAAK,MAAM,QAAA,CAAS,aAAa,CAAA;AACvD,IAAA,OAAO,SAAS,QAAA,GAAWG,QAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,GAAIA,QAAA;AAAA,EACjE;AAAA,EAEA,MAAM,SAAA,CAAU,IAAA,EAAc,OAAA,EAAsB,OAAA,EAAuC;AACzF,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAM,IAAIC,iCAAuB,WAAW,CAAA;AAC/D,IAAA,MAAM,UAAkC,EAAC;AACzC,IAAA,IAAI,OAAA,EAAS,QAAA,EAAU,OAAA,CAAQ,cAAc,IAAI,OAAA,CAAQ,QAAA;AACzD,IAAA,IAAI,OAAA,EAAS,SAAA,KAAc,KAAA,EAAO,OAAA,CAAQ,eAAe,CAAA,GAAI,GAAA;AAC7D,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAA,IAAA,EAAO,mBAAmB,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,aAAA,CAAc,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA,CAAA,EAAI;AAAA,QAC5G,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM,cAAc,OAAO;AAAA,OAC5B,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,QAAA,IAAY,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,GAAA,EAAK;AAC5F,QAAA,MAAM,IAAIC,0BAAgB,IAAI,CAAA;AAAA,MAChC;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,UAAA,CAAW,IAAA,EAAc,OAAA,EAAqC;AAClE,IAAA,MAAM,QAAA,GAAY,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,GAAK,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,GAAIL,aAAA,CAAO,MAAM,CAAC,CAAA;AACvF,IAAA,MAAM,IAAA,CAAK,SAAA;AAAA,MACT,IAAA;AAAA,MACAA,cAAO,MAAA,CAAO,CAACA,aAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,GAAI,QAAA,GAAWA,aAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAGA,aAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAC;AAAA,KACpG;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CAAW,IAAA,EAAc,OAAA,EAAwC;AACrE,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAM,IAAII,iCAAuB,YAAY,CAAA;AAChE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAA,IAAA,EAAO,mBAAmB,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,aAAA,CAAc,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA,CAAA,EAAI;AAAA,QAC5G,MAAA,EAAQ,QAAA;AAAA,QACR,KAAA,EAAO,EAAE,SAAA,EAAW,OAAA,EAAS,SAAA;AAAU,OACxC,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,UAAA,CAAW,KAAK,CAAA,IAAK,OAAA,EAAS,KAAA,EAAO;AACzC,MAAA,IAAI,WAAW,KAAK,CAAA,EAAG,MAAM,IAAIF,4BAAkB,IAAI,CAAA;AACvD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,CAAS,GAAA,EAAa,IAAA,EAAc,OAAA,EAAsC;AAC9E,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAM,IAAIE,iCAAuB,UAAU,CAAA;AAI9D,IAAA,IAAI,OAAA,EAAS,cAAc,KAAA,EAAO;AAChC,MAAA,MAAM,IAAI,MAAM,mGAA8F,CAAA;AAAA,IAChH;AACA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAA,IAAA,EAAO,mBAAmB,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,aAAA,CAAc,WAAA,CAAY,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI;AAAA,MAC3G,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO,EAAE,EAAA,EAAI,MAAA,EAAO;AAAA,MACpB,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,aAAa,WAAA,CAAY,IAAI,GAAG;AAAA,KACxD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,QAAA,CAAS,GAAA,EAAa,IAAA,EAAc,OAAA,EAAsC;AAC9E,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAM,IAAIA,iCAAuB,UAAU,CAAA;AAE9D,IAAA,IAAI,OAAA,EAAS,cAAc,KAAA,EAAO;AAChC,MAAA,MAAM,IAAI,MAAM,mGAA8F,CAAA;AAAA,IAChH;AACA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAA,IAAA,EAAO,mBAAmB,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,aAAA,CAAc,WAAA,CAAY,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI;AAAA,MAC3G,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO,EAAE,EAAA,EAAI,QAAA,EAAS;AAAA,MACtB,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,aAAa,WAAA,CAAY,IAAI,GAAG;AAAA,KACxD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,CAAM,IAAA,EAAc,QAAA,EAAmD;AAC3E,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAM,IAAIA,iCAAuB,OAAO,CAAA;AAC3D,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAA,IAAA,EAAO,mBAAmB,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,aAAA,CAAc,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA,CAAA,EAAI;AAAA,MAC5G,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO,EAAE,EAAA,EAAI,OAAA;AAAQ,KACtB,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,CAAM,IAAA,EAAc,OAAA,EAAwC;AAChE,IAAA,MAAM,KAAK,UAAA,CAAW,IAAA,CAAK,QAAA,CAAS,GAAG,IAAI,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,CAAA,CAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,OAAO,CAAA;AAAA,EAC1G;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAc,OAAA,EAA6C;AACvE,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,MAAM,MAAA,GAAS,YAAY,IAAI,CAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA;AAAA,MAClC,CAAA,IAAA,EAAO,mBAAmB,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,aAAA,CAAc,MAAM,CAAC,CAAA,CAAA;AAAA,MACpE;AAAA,QACE,KAAA,EAAO;AAAA,UACL,SAAA,EAAW,OAAA,EAAS,SAAA,GAAY,MAAA,GAAY,GAAA;AAAA,UAC5C,MAAA,EAAQ,SAAS,CAAA,EAAG,MAAA,CAAO,QAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,CAAA,CAAA,GAAM;AAAA;AACrD;AACF,KACF;AACA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,cAAA,IAAkB,EAAC,EAAG,GAAA,CAAI,CAAAE,OAAAA,MAAW;AAAA,QAC5C,MAAM,YAAA,CAAaA,OAAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,QAC5C,IAAA,EAAM;AAAA,OACR,CAAE,CAAA;AAAA,MACF,IAAI,IAAA,CAAK,QAAA,IAAY,EAAC,EACnB,OAAO,CAAA,MAAA,KAAU,MAAA,CAAO,GAAA,IAAO,CAAC,OAAO,GAAA,CAAI,QAAA,CAAS,GAAG,CAAC,CAAA,CACxD,IAAI,CAAA,MAAA,MAAW;AAAA,QACd,IAAA,EAAM,YAAA,CAAa,MAAA,CAAO,GAAI,CAAA;AAAA,QAC9B,IAAA,EAAM,MAAA;AAAA,QACN,MAAM,MAAA,CAAO;AAAA,OACf,CAAE;AAAA,KACN,CAAE,MAAA;AAAA,MACA,CAAA,KAAA,KAAS,CAAC,OAAA,EAAS,SAAA,IAAa,KAAA,CAAM,IAAA,KAAS,WAAA,IAAe,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,OAAA,CAAQ,SAAS;AAAA,KAC9G;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,IAAA,EAAgC;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AACpB,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,UAAA,CAAW,KAAK,CAAA,IAAK,KAAA,YAAiBJ,6BAAmB,OAAO,KAAA;AACpE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,IAAA,EAAiC;AAC1C,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,MAAM,UAAA,GAAa,cAAc,IAAI,CAAA;AACrC,IAAA,IAAI,eAAe,GAAA,EAAK;AACtB,MAAA,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,MAAM,GAAA,EAAK,IAAA,EAAM,aAAa,IAAA,EAAM,CAAA,EAAG,SAAA,kBAAW,IAAI,KAAK,CAAC,CAAA,EAAG,4BAAY,IAAI,IAAA,CAAK,CAAC,CAAA,EAAE;AAAA,IAC5G;AACA,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,QAC5B,CAAA,IAAA,EAAO,kBAAA,CAAmB,IAAA,CAAK,WAAW,CAAC,IAAI,aAAA,CAAc,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA,CAAA;AAAA,QAC/E;AAAA,UACE,MAAA,EAAQ;AAAA;AACV,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,WAAW,KAAK,CAAA,EAAG,MAAM,IAAIA,4BAAkB,IAAI,CAAA;AACvD,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAa,IAAI,CAAA;AAAA,MACvB,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM,UAAA,CAAW,QAAA,CAAS,GAAG,IAAI,WAAA,GAAc,MAAA;AAAA,MAC/C,IAAA,EAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA;AAAA,MACjC,SAAA,EAAW,UAAA,CAAW,QAAA,CAAS,OAAA,EAAS,eAAe,CAAA;AAAA,MACvD,UAAA,EAAY,UAAA,CAAW,QAAA,CAAS,OAAA,EAAS,eAAe,CAAA;AAAA,MACxD,QAAA,EAAU,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK;AAAA,KACpD;AAAA,EACF;AAAA,EAEA,SAAS,IAAA,EAA+B;AACtC,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,EAC5C;AAAA,EAEA,gBAAgB,IAAA,EAAoD;AAClE,IAAA,MAAM,mBAAA,GAAsB,CAAA,qDAAA,EAAwD,IAAA,CAAK,WAAW,CAAA,+BAAA,CAAA;AACpG,IAAA,IAAI,OAAO,IAAA,CAAK,qBAAA,KAA0B,UAAA,EAAY;AACpD,MAAA,OAAO,KAAK,qBAAA,CAAsB,EAAE,qBAAqB,cAAA,EAAgB,IAAA,EAAM,gBAAgB,CAAA;AAAA,IACjG;AACA,IAAA,IAAI,OAAO,IAAA,CAAK,qBAAA,KAA0B,QAAA,SAAiB,IAAA,CAAK,qBAAA;AAChE,IAAA,OAAO,mBAAA;AAAA,EACT;AAAA,EAEA,OAAA,GAA8F;AAC5F,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAA,EAAU;AAAA,QACR,YAAY,IAAA,CAAK,WAAA;AAAA,QACjB,GAAI,IAAA,CAAK,WAAA,IAAe,EAAE,WAAA,EAAa,KAAK,WAAA,EAAY;AAAA,QACxD,GAAI,IAAA,CAAK,WAAA,IAAe,EAAE,WAAA,EAAa,KAAK,WAAA;AAAY;AAC1D,KACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAA,CAAiB,MAAc,SAAA,EAAuC;AAC7E,EAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,SAAA,GAAY,CAAC,SAAS,CAAA;AACpE,EAAA,OAAO,WAAW,IAAA,CAAK,CAAA,GAAA,KAAO,IAAA,CAAK,QAAA,CAAS,GAAG,CAAC,CAAA;AAClD;AC/QA,SAAS,YAAA,CAAa,SAAiB,IAAA,EAAyB;AAC9D,EAAA,OAAO,IAAA,EAAM,MAAA,GAAS,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,GAAK,OAAA;AACzE;AAEA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,IAAI,wBAAA,CAAyB,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,GAAA;AAC/C,EAAA,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAC,CAAA,CAAA,CAAA;AACvC;AAEA,IAAM,qBAAA,GAAN,cAAoCK,uBAAA,CAAc;AAAA,EACvC,GAAA;AAAA,EACQ,aAAA;AAAA,EACT,aAAA;AAAA,EAER,WAAA,CAAY,GAAA,EAAa,aAAA,EAAuC,OAAA,EAA+B;AAC7F,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA,CAAc,IAAA,CAAK,CAAA,MAAA,KAAU;AAChD,MAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,QAAA;AAC5B,MAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,UAAA,CAAW,OAAO,MAAM,CAAA;AAChD,MAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,UAAA,CAAW,OAAO,MAAM,CAAA;AAChD,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,IAAI,QAAA,GAA+B;AACjC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,MAAM,IAAA,GAA+B;AACnC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,MAAM,IAAA,GAAyB;AAK7B,IAAA,MAAM,IAAI,MAAM,kFAAkF,CAAA;AAAA,EACpG;AAAA,EAEA,MAAM,SAAA,GAA2B;AAC/B,IAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,EAC7E;AACF,CAAA;AAEA,IAAM,sBAAA,GAAN,cAAqCC,+BAAA,CAAuC;AAAA,EAClE,YAAA,GAAe,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASvB,MAAM,KAAA,CAAM,OAAA,EAAiB,OAAA,GAA+B,EAAC,EAA2B;AACtF,IAAA,MAAM,GAAA,GAAM,CAAA,cAAA,EAAiB,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAA,CAAK,IAAA,CAAK,YAAA,EAAA,EAAgB,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAC1F,IAAA,MAAM,gBAAgB,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,OAAA,EAAS,QAAW,OAAO,CAAA;AAC7E,IAAA,MAAM,MAAA,GAAS,IAAI,qBAAA,CAAsB,GAAA,EAAK,eAAe,OAAO,CAAA;AACpE,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,GAAA,EAAK,MAAM,CAAA;AACpC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAA,GAA+B;AACnC,IAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,CAAE,IAAI,CAAA,MAAA,MAAW;AAAA,MACvD,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAA,EAAS,OAAO,QAAA,KAAa,MAAA;AAAA,MAC7B,GAAI,MAAA,CAAO,QAAA,KAAa,UAAa,EAAE,QAAA,EAAU,OAAO,QAAA;AAAS,KACnE,CAAE,CAAA;AAAA,EACJ;AACF,CAAA;AAEO,IAAM,eAAA,GAAN,MAAM,gBAAA,SAAwBC,uBAAA,CAAc;AAAA,EACxC,EAAA;AAAA,EACA,IAAA,GAAO,iBAAA;AAAA,EACP,QAAA,GAAW,UAAA;AAAA,EACpB,MAAA,GAAyB,SAAA;AAAA,EAGR,OAAA;AAAA,EACA,cAAA;AAAA,EACT,UAAA;AAAA,EACS,mBAAA;AAAA,EACA,iBAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,qBAAA;AAAA,EACT,UAAA,GAA0B,IAAA;AAAA,EAElC,WAAA,CAAY,OAAA,GAAkC,EAAC,EAAG;AAChD,IAAA,KAAA,CAAM,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,mBAAmB,SAAA,EAAW,IAAI,sBAAA,EAAuB,EAAG,CAAA;AACtF,IAAA,IAAA,CAAK,EAAA,GAAK,OAAA,CAAQ,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AACxC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,cAAA,CAAe,OAAO,CAAA;AACzC,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA,CAAQ,aAAA,IAAiB,OAAA,CAAQ,IAAI,qBAAA,IAAyB,EAAA;AACpF,IAAA,IAAI,CAAC,KAAK,cAAA,IAAkB,CAAC,QAAQ,SAAA,EAAW,MAAM,IAAI,KAAA,CAAM,2BAA2B,CAAA;AAC3F,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,SAAA;AAC1B,IAAA,IAAA,CAAK,sBAAsB,OAAA,CAAQ,kBAAA;AACnC,IAAA,IAAA,CAAK,oBAAoB,OAAA,CAAQ,gBAAA;AACjC,IAAA,IAAA,CAAK,IAAA,GAAO,OAAA,CAAQ,GAAA,IAAO,EAAC;AAC5B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,OAAA;AACxB,IAAA,IAAA,CAAK,wBAAwB,OAAA,CAAQ,YAAA;AAAA,EACvC;AAAA,EAEQ,UAAA,GAAqB;AAC3B,IAAA,OAAO,oBAAoB,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,KAAA,CAAM,OAAA,GAA+B,EAAC,EAAoB;AACxD,IAAA,OAAO,IAAI,gBAAA,CAAgB;AAAA,MACzB,GAAI,OAAA,CAAQ,EAAA,KAAO,UAAa,EAAE,EAAA,EAAI,QAAQ,EAAA,EAAG;AAAA,MACjD,WAAA,EAAa,KAAK,OAAA,CAAQ,WAAA;AAAA,MAC1B,SAAA,EAAW,KAAK,OAAA,CAAQ,SAAA;AAAA,MACxB,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,MACpB,eAAe,IAAA,CAAK,cAAA;AAAA,MACpB,GAAI,OAAA,CAAQ,SAAA,KAAc,UAAa,EAAE,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,MACtE,kBAAA,EAAoB,OAAA,CAAQ,kBAAA,IAAsB,IAAA,CAAK,mBAAA;AAAA,MACvD,GAAI,IAAA,CAAK,iBAAA,KAAsB,UAAa,EAAE,gBAAA,EAAkB,KAAK,iBAAA,EAAkB;AAAA,MACvF,GAAA,EAAK,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAK,IAAA;AAAA,MACzB,GAAI,IAAA,CAAK,QAAA,KAAa,UAAa,EAAE,OAAA,EAAS,KAAK,QAAA,EAAS;AAAA,MAC5D,GAAI,IAAA,CAAK,qBAAA,KAA0B,UAAa,EAAE,YAAA,EAAc,KAAK,qBAAA;AAAsB,KAC5F,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAI;AACF,QAAA,MAAMC,SAAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,YAAY,kBAAA,CAAmB,IAAA,CAAK,UAAU,CAAC,CAAA,CAAE,CAAA;AAC7F,QAAA,MAAMC,KAAAA,GAAQ,MAAMD,SAAAA,CAAS,IAAA,EAAK;AAClC,QAAA,IAAA,CAAK,UAAA,GAAaC,MAAK,SAAA,GAAY,IAAI,KAAKA,KAAAA,CAAK,SAAS,CAAA,mBAAI,IAAI,IAAA,EAAK;AACvE,QAAA;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,EAAE,KAAA,YAAiB,gBAAA,CAAA,IAAqB,KAAA,CAAM,MAAA,KAAW,KAAK,MAAM,KAAA;AACxE,QAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,EAAgB,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAErE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,UAAA,EAAY;AAAA,MACtD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA;AAAA;AAAA;AAAA;AAAA,QAKnB,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,eAAe,IAAA,CAAK,cAAA;AAAA,QACpB,oBAAoB,IAAA,CAAK,mBAAA;AAAA,QACzB,kBAAkB,IAAA,CAAK,iBAAA;AAAA,QACvB,KAAK,IAAA,CAAK;AAAA,OACX;AAAA,KACF,CAAA;AACD,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,EAAA;AACvB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,SAAA,GAAY,IAAI,KAAK,IAAA,CAAK,SAAS,CAAA,mBAAI,IAAI,IAAA,EAAK;AAAA,EACzE;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,EACrB;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACtB,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAA,SAAA,EAAY,kBAAA,CAAmB,IAAA,CAAK,UAAU,CAAC,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,QAAA,EAAU,CAAA;AAGlG,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,cAAA,CAAe,OAAA,EAAiB,IAAA,EAAiB,OAAA,EAAyD;AAC9G,IAAA,MAAM,KAAK,aAAA,EAAc;AACzB,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,QAAkB,IAAIC,8BAAA,CAAqB,KAAK,EAAE,CAAA;AAE5D,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,OAAA,EAAS,IAAI,CAAA;AAG9C,IAAA,MAAM,gBAAA,GAAmB,OAAA,EAAS,OAAA,IAAW,IAAA,CAAK,QAAA;AAClD,IAAA,MAAM,aAAa,gBAAA,IAAoB,IAAA,GAAO,KAAK,IAAA,CAAK,gBAAA,GAAmB,GAAI,CAAA,GAAI,MAAA;AAInF,IAAA,MAAM,YAAA,GACJ,oBAAoB,IAAA,IAAQ,gBAAA,GAAmB,IAAI,WAAA,CAAY,OAAA,CAAQ,gBAAA,GAAmB,GAAM,CAAA,GAAI,MAAA;AACtG,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,YAAY,kBAAA,CAAmB,IAAA,CAAK,UAAU,CAAC,CAAA,KAAA,CAAA,EAAS;AAAA,MAClG,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,OAAA,EAAS,WAAA;AAAA,QACT,UAAA;AAAA,QACA,KAAK,OAAA,EAAS,GAAA;AAAA,QACd,KAAK,OAAA,EAAS;AAAA,OACf,CAAA;AAAA,MACD,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,WAAW,GAAA,GAAM,CAAA,CAAA;AACzD,IAAA,OAAO;AAAA,MACL,SAAS,QAAA,KAAa,CAAA;AAAA,MACtB,QAAA;AAAA,MACA,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,eAAA,EAAiB,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAAA,MAC9B,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAAgC;AACpC,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,OAAO;AAAA,QACL,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,SAAA,EAAW,IAAA,CAAK,UAAA,oBAAc,IAAI,IAAA;AAAK,OACzC;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,YAAY,kBAAA,CAAmB,IAAA,CAAK,UAAU,CAAC,CAAA,CAAE,CAAA;AAC7F,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA,EAAW,IAAA,CAAK,SAAA,GAAY,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,GAAK,IAAA,CAAK,UAAA,oBAAc,IAAI,IAAA,EAAK;AAAA,MACpF,QAAA,EAAU;AAAA,QACR,kBAAA,EAAoB,KAAK,kBAAA,IAAsB,MAAA;AAAA,QAC/C,gBAAgB,IAAA,CAAK;AAAA;AACvB,KACF;AAAA,EACF;AAAA,EAEA,gBAAgB,IAAA,EAAoD;AAClE,IAAA,MAAM,mBAAA,GAAsB,mBAAmB,IAAA,CAAK,UAAA,GAAa,IAAI,IAAA,CAAK,UAAU,KAAK,EAAE,CAAA,iDAAA,CAAA;AAC3F,IAAA,IAAI,OAAO,IAAA,CAAK,qBAAA,KAA0B,UAAA,EAAY;AACpD,MAAA,OAAO,KAAK,qBAAA,CAAsB,EAAE,qBAAqB,cAAA,EAAgB,IAAA,EAAM,gBAAgB,CAAA;AAAA,IACjG;AACA,IAAA,IAAI,OAAO,IAAA,CAAK,qBAAA,KAA0B,QAAA,SAAiB,IAAA,CAAK,qBAAA;AAChE,IAAA,OAAO,mBAAA;AAAA,EACT;AACF;;;ACvUO,IAAM,uBAAA,GAAmE;AAAA,EAC9E,EAAA,EAAI,UAAA;AAAA,EACJ,IAAA,EAAM,yBAAA;AAAA,EACN,WAAA,EAAa,8EAAA;AAAA,EACb,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uDAAA,EAAwD;AAAA,MAClG,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+DAAA,EAAgE;AAAA,MAC9G,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,gDAAA,EAAiD;AAAA,MAC3F,kBAAA,EAAoB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,wDAAA,EAAyD;AAAA,MAC5G,gBAAA,EAAkB;AAAA,QAChB,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,wBAAA;AAAA,QACb,IAAA,EAAM,CAAC,UAAA,EAAY,SAAS,CAAA;AAAA,QAC5B,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,yBAAyB,oBAAA,EAAsB,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,MACtG,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+BAAA;AAAgC;AAC1E,GACF;AAAA,EACA,aAAA,EAAe,CAAA,MAAA,KAAU,IAAI,eAAA,CAAgB,MAAM;AACrD;AAEO,IAAM,0BAAA,GAA4E;AAAA,EACvF,EAAA,EAAI,UAAA;AAAA,EACJ,IAAA,EAAM,4BAAA;AAAA,EACN,WAAA,EAAa,yEAAA;AAAA,EACb,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uDAAA,EAAwD;AAAA,MAClG,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,UAAU,EAAE,IAAA,EAAM,WAAW,WAAA,EAAa,oBAAA,EAAsB,SAAS,KAAA;AAAM;AACjF,GACF;AAAA,EACA,gBAAA,EAAkB,CAAA,MAAA,KAAU,IAAI,kBAAA,CAAmB,MAAM;AAC3D","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(\n options.accessToken ??\n process.env.MASTRA_PLATFORM_SECRET_KEY ??\n // Deprecated alias — prefer MASTRA_PLATFORM_SECRET_KEY.\n process.env.MASTRA_PLATFORM_ACCESS_TOKEN,\n 'accessToken',\n ),\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 { PlatformApiError, 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 try {\n const response = await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}`);\n const json = (await response.json()) as CreateSandboxResponse;\n this._createdAt = json.createdAt ? new Date(json.createdAt) : new Date();\n return;\n } catch (error) {\n if (!(error instanceof PlatformApiError) || error.status !== 404) throw error;\n this._sandboxId = undefined;\n }\n }\n\n if (!this._environmentId) throw new Error('environmentId is required');\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 secret key (falls back to MASTRA_PLATFORM_SECRET_KEY)',\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 secret key (falls back to MASTRA_PLATFORM_SECRET_KEY)',\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
|
@@ -456,9 +456,17 @@ var PlatformSandbox = class _PlatformSandbox extends MastraSandbox {
|
|
|
456
456
|
}
|
|
457
457
|
async start() {
|
|
458
458
|
if (this._sandboxId) {
|
|
459
|
-
|
|
460
|
-
|
|
459
|
+
try {
|
|
460
|
+
const response2 = await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}`);
|
|
461
|
+
const json2 = await response2.json();
|
|
462
|
+
this._createdAt = json2.createdAt ? new Date(json2.createdAt) : /* @__PURE__ */ new Date();
|
|
463
|
+
return;
|
|
464
|
+
} catch (error) {
|
|
465
|
+
if (!(error instanceof PlatformApiError) || error.status !== 404) throw error;
|
|
466
|
+
this._sandboxId = void 0;
|
|
467
|
+
}
|
|
461
468
|
}
|
|
469
|
+
if (!this._environmentId) throw new Error("environmentId is required");
|
|
462
470
|
const response = await this._client.request("/sandbox", {
|
|
463
471
|
method: "POST",
|
|
464
472
|
headers: { "content-type": "application/json" },
|
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(\n options.accessToken ??\n process.env.MASTRA_PLATFORM_SECRET_KEY ??\n // Deprecated alias — prefer MASTRA_PLATFORM_SECRET_KEY.\n process.env.MASTRA_PLATFORM_ACCESS_TOKEN,\n 'accessToken',\n ),\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 secret key (falls back to MASTRA_PLATFORM_SECRET_KEY)',\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 secret key (falls back to MASTRA_PLATFORM_SECRET_KEY)',\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","response","json"],"mappings":";;;;;AAUA,IAAM,iBAAA,GAAoB,8BAAA;AAO1B,IAAM,0BAAA,GAA6B,GAAA;AAE5B,SAAS,aAAA,CAAc,OAA2B,IAAA,EAAsB;AAC7E,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,YAAA,CAAc,CAAA;AACjD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,uBAAuB,OAAA,EAAgC;AACrE,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,aAAA;AAAA,MACX,OAAA,CAAQ,WAAA,IACN,OAAA,CAAQ,GAAA,CAAI,0BAAA;AAAA,MAEZ,QAAQ,GAAA,CAAI,4BAAA;AAAA,MACd;AAAA,KACF;AAAA,IACA,WAAW,aAAA,CAAc,OAAA,CAAQ,aAAa,OAAA,CAAQ,GAAA,CAAI,mBAAmB,WAAW,CAAA;AAAA,IACxF,WAAW,OAAA,CAAQ,GAAA,CAAI,8BAA8B,iBAAA,EAAmB,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IACzF,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA,GAC1B;AACF;AAcA,SAAS,gBAAgB,IAAA,EAA8C;AACrE,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,MAAM,OAAO,MAAA;AAC1D,EAAA,MAAM,MAAO,MAAA,CAA+B,KAAA;AAC5C,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,MAAM,OAAO,MAAA;AACpD,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,GAAA;AAC1B,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAO,IAAA,KAAS,UAAU,OAAO,MAAA;AACpE,EAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AACzB;AAEO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EACjC,MAAA;AAAA,EACA,IAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA,EAEA,YAAA;AAAA,EAET,WAAA,CAAY,QAAgB,IAAA,EAAc;AACxC,IAAA,MAAM,MAAA,GAAS,gBAAgB,IAAI,CAAA;AACnC,IAAA,MAAM,OAAA,GAAU,SAAS,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,CAAA,CAAA,GAAK,IAAA;AAC/D,IAAA,KAAA,CAAM,CAAA,mCAAA,EAAsC,MAAM,CAAA,EAAG,OAAA,GAAU,KAAK,OAAO,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AACpF,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,eAAe,MAAA,EAAQ,OAAA;AAAA,EAC9B;AACF;AAEO,IAAM,iBAAN,MAAqB;AAAA,EACjB,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EAET,YAAY,OAAA,EAAgC;AAC1C,IAAA,MAAM,QAAA,GAAW,uBAAuB,OAAO,CAAA;AAC/C,IAAA,IAAA,CAAK,cAAc,QAAA,CAAS,WAAA;AAC5B,IAAA,IAAA,CAAK,YAAY,QAAA,CAAS,SAAA;AAC1B,IAAA,IAAA,CAAK,WAAW,QAAA,CAAS,QAAA;AACzB,IAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,KAAA;AAAA,EACxB;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAc,OAAA,GAAkC,EAAC,EAAsB;AACnF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,aAAA,EAAgB,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAC,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AAC/F,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA,IAAS,EAAE,CAAA,EAAG;AAC9D,MAAA,IAAI,KAAA,KAAU,QAAW,GAAA,CAAI,YAAA,CAAa,IAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAC3C,IAAA,OAAA,CAAQ,GAAA,CAAI,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,WAAW,CAAA,CAAE,CAAA;AAGzD,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,GAAG,cAAa,GAAI,OAAA;AAG3C,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,MAAA,IAAU,WAAA,CAAY,QAAQ,0BAA0B,CAAA;AACpF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,EAAE,GAAG,YAAA,EAAc,OAAA,EAAS,MAAA,EAAQ,CAAA;AAC3E,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,gBAAA,CAAiB,QAAA,CAAS,QAAQ,MAAM,QAAA,CAAS,MAAM,CAAA;AAAA,IACnE;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;ACpFA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,KAAU,GAAA,EAAK,OAAO,GAAA;AACpC,EAAA,IAAI,aAAa,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA,GAAQ,IAAI,KAAK,CAAA,CAAA;AAC1D,EAAA,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,SAAA,CAAU,UAAU,CAAA;AAChD,EAAA,OAAO,UAAA,KAAe,MAAM,GAAA,GAAM,UAAA;AACpC;AAEA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,MAAM,UAAA,GAAa,cAAc,IAAI,CAAA;AACrC,EAAA,OAAO,UAAA,KAAe,GAAA,GAAM,EAAA,GAAK,UAAA,CAAW,MAAM,CAAC,CAAA;AACrD;AAQA,SAAS,cAAc,GAAA,EAAqB;AAC1C,EAAA,OAAO,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAI,kBAAkB,CAAA,CAAE,KAAK,GAAG,CAAA;AACxD;AAEA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,MAAM,UAAA,GAAa,cAAc,IAAI,CAAA;AACrC,EAAA,IAAI,UAAA,KAAe,KAAK,OAAO,EAAA;AAC/B,EAAA,OAAO,WAAW,KAAA,CAAM,UAAA,CAAW,WAAA,CAAY,GAAG,IAAI,CAAC,CAAA;AACzD;AAEA,SAAS,cAAc,OAAA,EAAuC;AAC5D,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AACxC,EAAA,OAAO,MAAA,CAAO,KAAK,OAAO,CAAA;AAC5B;AAEA,SAAS,UAAA,CAAW,SAAkB,IAAA,EAAoB;AACxD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC9B,EAAA,OAAO,QAAQ,IAAI,IAAA,CAAK,KAAK,CAAA,mBAAI,IAAI,KAAK,CAAC,CAAA;AAC7C;AAEA,SAAS,WAAW,OAAA,EAA0B;AAC5C,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAC1C,EAAA,OAAO,KAAA,GAAQ,MAAA,CAAO,KAAK,CAAA,GAAI,CAAA;AACjC;AAEA,SAAS,WAAW,KAAA,EAAyB;AAC3C,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,QAAA,IAAY,KAAA,IAAS,MAAM,MAAA,KAAW,GAAA;AAC9F;AAEO,IAAM,kBAAA,GAAN,cAAiC,gBAAA,CAAiB;AAAA,EAC9C,EAAA;AAAA,EACA,IAAA,GAAO,oBAAA;AAAA,EACP,QAAA,GAAW,UAAA;AAAA,EACX,QAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACT,MAAA,GAAyB,SAAA;AAAA,EAER,OAAA;AAAA,EACA,WAAA;AAAA,EACA,qBAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAAqC,EAAC,EAAG;AACnD,IAAA,KAAA,CAAM,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,sBAAsB,CAAA;AAChD,IAAA,IAAA,CAAK,EAAA,GAAK,OAAA,CAAQ,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AACxC,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,IAAI,2BAAA,IAA+B,EAAA;AACpF,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAC/D,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,IAAA,IAAQ,OAAA;AAC5B,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,wBAAwB,OAAA,CAAQ,YAAA;AACrC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,cAAA,CAAe,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEQ,UAAA,GAAqB;AAC3B,IAAA,OAAO,eAAe,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EACzF;AAAA,EAEA,MAAM,QAAA,CAAS,IAAA,EAAc,OAAA,EAAiD;AAC5E,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,QAC5B,CAAA,IAAA,EAAO,kBAAA,CAAmB,IAAA,CAAK,WAAW,CAAC,IAAI,aAAA,CAAc,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA;AAAA,OACjF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,WAAW,KAAK,CAAA,EAAG,MAAM,IAAI,kBAAkB,IAAI,CAAA;AACvD,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,MAAM,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,QAAA,CAAS,aAAa,CAAA;AACvD,IAAA,OAAO,SAAS,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,GAAI,MAAA;AAAA,EACjE;AAAA,EAEA,MAAM,SAAA,CAAU,IAAA,EAAc,OAAA,EAAsB,OAAA,EAAuC;AACzF,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAM,IAAI,uBAAuB,WAAW,CAAA;AAC/D,IAAA,MAAM,UAAkC,EAAC;AACzC,IAAA,IAAI,OAAA,EAAS,QAAA,EAAU,OAAA,CAAQ,cAAc,IAAI,OAAA,CAAQ,QAAA;AACzD,IAAA,IAAI,OAAA,EAAS,SAAA,KAAc,KAAA,EAAO,OAAA,CAAQ,eAAe,CAAA,GAAI,GAAA;AAC7D,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAA,IAAA,EAAO,mBAAmB,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,aAAA,CAAc,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA,CAAA,EAAI;AAAA,QAC5G,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM,cAAc,OAAO;AAAA,OAC5B,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,QAAA,IAAY,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,GAAA,EAAK;AAC5F,QAAA,MAAM,IAAI,gBAAgB,IAAI,CAAA;AAAA,MAChC;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,UAAA,CAAW,IAAA,EAAc,OAAA,EAAqC;AAClE,IAAA,MAAM,QAAA,GAAY,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,GAAK,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,GAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AACvF,IAAA,MAAM,IAAA,CAAK,SAAA;AAAA,MACT,IAAA;AAAA,MACA,OAAO,MAAA,CAAO,CAAC,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,GAAI,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAC;AAAA,KACpG;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CAAW,IAAA,EAAc,OAAA,EAAwC;AACrE,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAM,IAAI,uBAAuB,YAAY,CAAA;AAChE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAA,IAAA,EAAO,mBAAmB,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,aAAA,CAAc,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA,CAAA,EAAI;AAAA,QAC5G,MAAA,EAAQ,QAAA;AAAA,QACR,KAAA,EAAO,EAAE,SAAA,EAAW,OAAA,EAAS,SAAA;AAAU,OACxC,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,UAAA,CAAW,KAAK,CAAA,IAAK,OAAA,EAAS,KAAA,EAAO;AACzC,MAAA,IAAI,WAAW,KAAK,CAAA,EAAG,MAAM,IAAI,kBAAkB,IAAI,CAAA;AACvD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,CAAS,GAAA,EAAa,IAAA,EAAc,OAAA,EAAsC;AAC9E,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAM,IAAI,uBAAuB,UAAU,CAAA;AAI9D,IAAA,IAAI,OAAA,EAAS,cAAc,KAAA,EAAO;AAChC,MAAA,MAAM,IAAI,MAAM,mGAA8F,CAAA;AAAA,IAChH;AACA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAA,IAAA,EAAO,mBAAmB,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,aAAA,CAAc,WAAA,CAAY,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI;AAAA,MAC3G,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO,EAAE,EAAA,EAAI,MAAA,EAAO;AAAA,MACpB,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,aAAa,WAAA,CAAY,IAAI,GAAG;AAAA,KACxD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,QAAA,CAAS,GAAA,EAAa,IAAA,EAAc,OAAA,EAAsC;AAC9E,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAM,IAAI,uBAAuB,UAAU,CAAA;AAE9D,IAAA,IAAI,OAAA,EAAS,cAAc,KAAA,EAAO;AAChC,MAAA,MAAM,IAAI,MAAM,mGAA8F,CAAA;AAAA,IAChH;AACA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAA,IAAA,EAAO,mBAAmB,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,aAAA,CAAc,WAAA,CAAY,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI;AAAA,MAC3G,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO,EAAE,EAAA,EAAI,QAAA,EAAS;AAAA,MACtB,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,aAAa,WAAA,CAAY,IAAI,GAAG;AAAA,KACxD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,CAAM,IAAA,EAAc,QAAA,EAAmD;AAC3E,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAM,IAAI,uBAAuB,OAAO,CAAA;AAC3D,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAA,IAAA,EAAO,mBAAmB,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,aAAA,CAAc,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA,CAAA,EAAI;AAAA,MAC5G,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO,EAAE,EAAA,EAAI,OAAA;AAAQ,KACtB,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,CAAM,IAAA,EAAc,OAAA,EAAwC;AAChE,IAAA,MAAM,KAAK,UAAA,CAAW,IAAA,CAAK,QAAA,CAAS,GAAG,IAAI,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,CAAA,CAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,OAAO,CAAA;AAAA,EAC1G;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAc,OAAA,EAA6C;AACvE,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,MAAM,MAAA,GAAS,YAAY,IAAI,CAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA;AAAA,MAClC,CAAA,IAAA,EAAO,mBAAmB,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,aAAA,CAAc,MAAM,CAAC,CAAA,CAAA;AAAA,MACpE;AAAA,QACE,KAAA,EAAO;AAAA,UACL,SAAA,EAAW,OAAA,EAAS,SAAA,GAAY,MAAA,GAAY,GAAA;AAAA,UAC5C,MAAA,EAAQ,SAAS,CAAA,EAAG,MAAA,CAAO,QAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,CAAA,CAAA,GAAM;AAAA;AACrD;AACF,KACF;AACA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,cAAA,IAAkB,EAAC,EAAG,GAAA,CAAI,CAAAA,OAAAA,MAAW;AAAA,QAC5C,MAAM,YAAA,CAAaA,OAAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,QAC5C,IAAA,EAAM;AAAA,OACR,CAAE,CAAA;AAAA,MACF,IAAI,IAAA,CAAK,QAAA,IAAY,EAAC,EACnB,OAAO,CAAA,MAAA,KAAU,MAAA,CAAO,GAAA,IAAO,CAAC,OAAO,GAAA,CAAI,QAAA,CAAS,GAAG,CAAC,CAAA,CACxD,IAAI,CAAA,MAAA,MAAW;AAAA,QACd,IAAA,EAAM,YAAA,CAAa,MAAA,CAAO,GAAI,CAAA;AAAA,QAC9B,IAAA,EAAM,MAAA;AAAA,QACN,MAAM,MAAA,CAAO;AAAA,OACf,CAAE;AAAA,KACN,CAAE,MAAA;AAAA,MACA,CAAA,KAAA,KAAS,CAAC,OAAA,EAAS,SAAA,IAAa,KAAA,CAAM,IAAA,KAAS,WAAA,IAAe,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,OAAA,CAAQ,SAAS;AAAA,KAC9G;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,IAAA,EAAgC;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AACpB,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,UAAA,CAAW,KAAK,CAAA,IAAK,KAAA,YAAiB,mBAAmB,OAAO,KAAA;AACpE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,IAAA,EAAiC;AAC1C,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,MAAM,UAAA,GAAa,cAAc,IAAI,CAAA;AACrC,IAAA,IAAI,eAAe,GAAA,EAAK;AACtB,MAAA,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,MAAM,GAAA,EAAK,IAAA,EAAM,aAAa,IAAA,EAAM,CAAA,EAAG,SAAA,kBAAW,IAAI,KAAK,CAAC,CAAA,EAAG,4BAAY,IAAI,IAAA,CAAK,CAAC,CAAA,EAAE;AAAA,IAC5G;AACA,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,QAC5B,CAAA,IAAA,EAAO,kBAAA,CAAmB,IAAA,CAAK,WAAW,CAAC,IAAI,aAAA,CAAc,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA,CAAA;AAAA,QAC/E;AAAA,UACE,MAAA,EAAQ;AAAA;AACV,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,WAAW,KAAK,CAAA,EAAG,MAAM,IAAI,kBAAkB,IAAI,CAAA;AACvD,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAa,IAAI,CAAA;AAAA,MACvB,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM,UAAA,CAAW,QAAA,CAAS,GAAG,IAAI,WAAA,GAAc,MAAA;AAAA,MAC/C,IAAA,EAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA;AAAA,MACjC,SAAA,EAAW,UAAA,CAAW,QAAA,CAAS,OAAA,EAAS,eAAe,CAAA;AAAA,MACvD,UAAA,EAAY,UAAA,CAAW,QAAA,CAAS,OAAA,EAAS,eAAe,CAAA;AAAA,MACxD,QAAA,EAAU,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK;AAAA,KACpD;AAAA,EACF;AAAA,EAEA,SAAS,IAAA,EAA+B;AACtC,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,EAC5C;AAAA,EAEA,gBAAgB,IAAA,EAAoD;AAClE,IAAA,MAAM,mBAAA,GAAsB,CAAA,qDAAA,EAAwD,IAAA,CAAK,WAAW,CAAA,+BAAA,CAAA;AACpG,IAAA,IAAI,OAAO,IAAA,CAAK,qBAAA,KAA0B,UAAA,EAAY;AACpD,MAAA,OAAO,KAAK,qBAAA,CAAsB,EAAE,qBAAqB,cAAA,EAAgB,IAAA,EAAM,gBAAgB,CAAA;AAAA,IACjG;AACA,IAAA,IAAI,OAAO,IAAA,CAAK,qBAAA,KAA0B,QAAA,SAAiB,IAAA,CAAK,qBAAA;AAChE,IAAA,OAAO,mBAAA;AAAA,EACT;AAAA,EAEA,OAAA,GAA8F;AAC5F,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAA,EAAU;AAAA,QACR,YAAY,IAAA,CAAK,WAAA;AAAA,QACjB,GAAI,IAAA,CAAK,WAAA,IAAe,EAAE,WAAA,EAAa,KAAK,WAAA,EAAY;AAAA,QACxD,GAAI,IAAA,CAAK,WAAA,IAAe,EAAE,WAAA,EAAa,KAAK,WAAA;AAAY;AAC1D,KACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAA,CAAiB,MAAc,SAAA,EAAuC;AAC7E,EAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,SAAA,GAAY,CAAC,SAAS,CAAA;AACpE,EAAA,OAAO,WAAW,IAAA,CAAK,CAAA,GAAA,KAAO,IAAA,CAAK,QAAA,CAAS,GAAG,CAAC,CAAA;AAClD;AC/QA,SAAS,YAAA,CAAa,SAAiB,IAAA,EAAyB;AAC9D,EAAA,OAAO,IAAA,EAAM,MAAA,GAAS,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,GAAK,OAAA;AACzE;AAEA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,IAAI,wBAAA,CAAyB,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,GAAA;AAC/C,EAAA,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAC,CAAA,CAAA,CAAA;AACvC;AAEA,IAAM,qBAAA,GAAN,cAAoC,aAAA,CAAc;AAAA,EACvC,GAAA;AAAA,EACQ,aAAA;AAAA,EACT,aAAA;AAAA,EAER,WAAA,CAAY,GAAA,EAAa,aAAA,EAAuC,OAAA,EAA+B;AAC7F,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA,CAAc,IAAA,CAAK,CAAA,MAAA,KAAU;AAChD,MAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,QAAA;AAC5B,MAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,UAAA,CAAW,OAAO,MAAM,CAAA;AAChD,MAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,UAAA,CAAW,OAAO,MAAM,CAAA;AAChD,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,IAAI,QAAA,GAA+B;AACjC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,MAAM,IAAA,GAA+B;AACnC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,MAAM,IAAA,GAAyB;AAK7B,IAAA,MAAM,IAAI,MAAM,kFAAkF,CAAA;AAAA,EACpG;AAAA,EAEA,MAAM,SAAA,GAA2B;AAC/B,IAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,EAC7E;AACF,CAAA;AAEA,IAAM,sBAAA,GAAN,cAAqC,qBAAA,CAAuC;AAAA,EAClE,YAAA,GAAe,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASvB,MAAM,KAAA,CAAM,OAAA,EAAiB,OAAA,GAA+B,EAAC,EAA2B;AACtF,IAAA,MAAM,GAAA,GAAM,CAAA,cAAA,EAAiB,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAA,CAAK,IAAA,CAAK,YAAA,EAAA,EAAgB,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAC1F,IAAA,MAAM,gBAAgB,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,OAAA,EAAS,QAAW,OAAO,CAAA;AAC7E,IAAA,MAAM,MAAA,GAAS,IAAI,qBAAA,CAAsB,GAAA,EAAK,eAAe,OAAO,CAAA;AACpE,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,GAAA,EAAK,MAAM,CAAA;AACpC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAA,GAA+B;AACnC,IAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,CAAE,IAAI,CAAA,MAAA,MAAW;AAAA,MACvD,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAA,EAAS,OAAO,QAAA,KAAa,MAAA;AAAA,MAC7B,GAAI,MAAA,CAAO,QAAA,KAAa,UAAa,EAAE,QAAA,EAAU,OAAO,QAAA;AAAS,KACnE,CAAE,CAAA;AAAA,EACJ;AACF,CAAA;AAEO,IAAM,eAAA,GAAN,MAAM,gBAAA,SAAwB,aAAA,CAAc;AAAA,EACxC,EAAA;AAAA,EACA,IAAA,GAAO,iBAAA;AAAA,EACP,QAAA,GAAW,UAAA;AAAA,EACpB,MAAA,GAAyB,SAAA;AAAA,EAGR,OAAA;AAAA,EACA,cAAA;AAAA,EACT,UAAA;AAAA,EACS,mBAAA;AAAA,EACA,iBAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,qBAAA;AAAA,EACT,UAAA,GAA0B,IAAA;AAAA,EAElC,WAAA,CAAY,OAAA,GAAkC,EAAC,EAAG;AAChD,IAAA,KAAA,CAAM,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,mBAAmB,SAAA,EAAW,IAAI,sBAAA,EAAuB,EAAG,CAAA;AACtF,IAAA,IAAA,CAAK,EAAA,GAAK,OAAA,CAAQ,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AACxC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,cAAA,CAAe,OAAO,CAAA;AACzC,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA,CAAQ,aAAA,IAAiB,OAAA,CAAQ,IAAI,qBAAA,IAAyB,EAAA;AACpF,IAAA,IAAI,CAAC,KAAK,cAAA,IAAkB,CAAC,QAAQ,SAAA,EAAW,MAAM,IAAI,KAAA,CAAM,2BAA2B,CAAA;AAC3F,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,SAAA;AAC1B,IAAA,IAAA,CAAK,sBAAsB,OAAA,CAAQ,kBAAA;AACnC,IAAA,IAAA,CAAK,oBAAoB,OAAA,CAAQ,gBAAA;AACjC,IAAA,IAAA,CAAK,IAAA,GAAO,OAAA,CAAQ,GAAA,IAAO,EAAC;AAC5B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,OAAA;AACxB,IAAA,IAAA,CAAK,wBAAwB,OAAA,CAAQ,YAAA;AAAA,EACvC;AAAA,EAEQ,UAAA,GAAqB;AAC3B,IAAA,OAAO,oBAAoB,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,KAAA,CAAM,OAAA,GAA+B,EAAC,EAAoB;AACxD,IAAA,OAAO,IAAI,gBAAA,CAAgB;AAAA,MACzB,GAAI,OAAA,CAAQ,EAAA,KAAO,UAAa,EAAE,EAAA,EAAI,QAAQ,EAAA,EAAG;AAAA,MACjD,WAAA,EAAa,KAAK,OAAA,CAAQ,WAAA;AAAA,MAC1B,SAAA,EAAW,KAAK,OAAA,CAAQ,SAAA;AAAA,MACxB,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,MACpB,eAAe,IAAA,CAAK,cAAA;AAAA,MACpB,GAAI,OAAA,CAAQ,SAAA,KAAc,UAAa,EAAE,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,MACtE,kBAAA,EAAoB,OAAA,CAAQ,kBAAA,IAAsB,IAAA,CAAK,mBAAA;AAAA,MACvD,GAAI,IAAA,CAAK,iBAAA,KAAsB,UAAa,EAAE,gBAAA,EAAkB,KAAK,iBAAA,EAAkB;AAAA,MACvF,GAAA,EAAK,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAK,IAAA;AAAA,MACzB,GAAI,IAAA,CAAK,QAAA,KAAa,UAAa,EAAE,OAAA,EAAS,KAAK,QAAA,EAAS;AAAA,MAC5D,GAAI,IAAA,CAAK,qBAAA,KAA0B,UAAa,EAAE,YAAA,EAAc,KAAK,qBAAA;AAAsB,KAC5F,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAI;AACF,QAAA,MAAMC,SAAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,YAAY,kBAAA,CAAmB,IAAA,CAAK,UAAU,CAAC,CAAA,CAAE,CAAA;AAC7F,QAAA,MAAMC,KAAAA,GAAQ,MAAMD,SAAAA,CAAS,IAAA,EAAK;AAClC,QAAA,IAAA,CAAK,UAAA,GAAaC,MAAK,SAAA,GAAY,IAAI,KAAKA,KAAAA,CAAK,SAAS,CAAA,mBAAI,IAAI,IAAA,EAAK;AACvE,QAAA;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,EAAE,KAAA,YAAiB,gBAAA,CAAA,IAAqB,KAAA,CAAM,MAAA,KAAW,KAAK,MAAM,KAAA;AACxE,QAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,EAAgB,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAErE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,UAAA,EAAY;AAAA,MACtD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA;AAAA;AAAA;AAAA;AAAA,QAKnB,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,eAAe,IAAA,CAAK,cAAA;AAAA,QACpB,oBAAoB,IAAA,CAAK,mBAAA;AAAA,QACzB,kBAAkB,IAAA,CAAK,iBAAA;AAAA,QACvB,KAAK,IAAA,CAAK;AAAA,OACX;AAAA,KACF,CAAA;AACD,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,EAAA;AACvB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,SAAA,GAAY,IAAI,KAAK,IAAA,CAAK,SAAS,CAAA,mBAAI,IAAI,IAAA,EAAK;AAAA,EACzE;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,EACrB;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACtB,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAA,SAAA,EAAY,kBAAA,CAAmB,IAAA,CAAK,UAAU,CAAC,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,QAAA,EAAU,CAAA;AAGlG,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,cAAA,CAAe,OAAA,EAAiB,IAAA,EAAiB,OAAA,EAAyD;AAC9G,IAAA,MAAM,KAAK,aAAA,EAAc;AACzB,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,QAAkB,IAAI,oBAAA,CAAqB,KAAK,EAAE,CAAA;AAE5D,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,OAAA,EAAS,IAAI,CAAA;AAG9C,IAAA,MAAM,gBAAA,GAAmB,OAAA,EAAS,OAAA,IAAW,IAAA,CAAK,QAAA;AAClD,IAAA,MAAM,aAAa,gBAAA,IAAoB,IAAA,GAAO,KAAK,IAAA,CAAK,gBAAA,GAAmB,GAAI,CAAA,GAAI,MAAA;AAInF,IAAA,MAAM,YAAA,GACJ,oBAAoB,IAAA,IAAQ,gBAAA,GAAmB,IAAI,WAAA,CAAY,OAAA,CAAQ,gBAAA,GAAmB,GAAM,CAAA,GAAI,MAAA;AACtG,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,YAAY,kBAAA,CAAmB,IAAA,CAAK,UAAU,CAAC,CAAA,KAAA,CAAA,EAAS;AAAA,MAClG,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,OAAA,EAAS,WAAA;AAAA,QACT,UAAA;AAAA,QACA,KAAK,OAAA,EAAS,GAAA;AAAA,QACd,KAAK,OAAA,EAAS;AAAA,OACf,CAAA;AAAA,MACD,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,WAAW,GAAA,GAAM,CAAA,CAAA;AACzD,IAAA,OAAO;AAAA,MACL,SAAS,QAAA,KAAa,CAAA;AAAA,MACtB,QAAA;AAAA,MACA,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,eAAA,EAAiB,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAAA,MAC9B,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAAgC;AACpC,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,OAAO;AAAA,QACL,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,SAAA,EAAW,IAAA,CAAK,UAAA,oBAAc,IAAI,IAAA;AAAK,OACzC;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,YAAY,kBAAA,CAAmB,IAAA,CAAK,UAAU,CAAC,CAAA,CAAE,CAAA;AAC7F,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA,EAAW,IAAA,CAAK,SAAA,GAAY,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,GAAK,IAAA,CAAK,UAAA,oBAAc,IAAI,IAAA,EAAK;AAAA,MACpF,QAAA,EAAU;AAAA,QACR,kBAAA,EAAoB,KAAK,kBAAA,IAAsB,MAAA;AAAA,QAC/C,gBAAgB,IAAA,CAAK;AAAA;AACvB,KACF;AAAA,EACF;AAAA,EAEA,gBAAgB,IAAA,EAAoD;AAClE,IAAA,MAAM,mBAAA,GAAsB,mBAAmB,IAAA,CAAK,UAAA,GAAa,IAAI,IAAA,CAAK,UAAU,KAAK,EAAE,CAAA,iDAAA,CAAA;AAC3F,IAAA,IAAI,OAAO,IAAA,CAAK,qBAAA,KAA0B,UAAA,EAAY;AACpD,MAAA,OAAO,KAAK,qBAAA,CAAsB,EAAE,qBAAqB,cAAA,EAAgB,IAAA,EAAM,gBAAgB,CAAA;AAAA,IACjG;AACA,IAAA,IAAI,OAAO,IAAA,CAAK,qBAAA,KAA0B,QAAA,SAAiB,IAAA,CAAK,qBAAA;AAChE,IAAA,OAAO,mBAAA;AAAA,EACT;AACF;;;ACvUO,IAAM,uBAAA,GAAmE;AAAA,EAC9E,EAAA,EAAI,UAAA;AAAA,EACJ,IAAA,EAAM,yBAAA;AAAA,EACN,WAAA,EAAa,8EAAA;AAAA,EACb,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uDAAA,EAAwD;AAAA,MAClG,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+DAAA,EAAgE;AAAA,MAC9G,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,gDAAA,EAAiD;AAAA,MAC3F,kBAAA,EAAoB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,wDAAA,EAAyD;AAAA,MAC5G,gBAAA,EAAkB;AAAA,QAChB,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,wBAAA;AAAA,QACb,IAAA,EAAM,CAAC,UAAA,EAAY,SAAS,CAAA;AAAA,QAC5B,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,yBAAyB,oBAAA,EAAsB,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,MACtG,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+BAAA;AAAgC;AAC1E,GACF;AAAA,EACA,aAAA,EAAe,CAAA,MAAA,KAAU,IAAI,eAAA,CAAgB,MAAM;AACrD;AAEO,IAAM,0BAAA,GAA4E;AAAA,EACvF,EAAA,EAAI,UAAA;AAAA,EACJ,IAAA,EAAM,4BAAA;AAAA,EACN,WAAA,EAAa,yEAAA;AAAA,EACb,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uDAAA,EAAwD;AAAA,MAClG,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,UAAU,EAAE,IAAA,EAAM,WAAW,WAAA,EAAa,oBAAA,EAAsB,SAAS,KAAA;AAAM;AACjF,GACF;AAAA,EACA,gBAAA,EAAkB,CAAA,MAAA,KAAU,IAAI,kBAAA,CAAmB,MAAM;AAC3D","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(\n options.accessToken ??\n process.env.MASTRA_PLATFORM_SECRET_KEY ??\n // Deprecated alias — prefer MASTRA_PLATFORM_SECRET_KEY.\n process.env.MASTRA_PLATFORM_ACCESS_TOKEN,\n 'accessToken',\n ),\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 { PlatformApiError, 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 try {\n const response = await this._client.request(`/sandbox/${encodeURIComponent(this._sandboxId)}`);\n const json = (await response.json()) as CreateSandboxResponse;\n this._createdAt = json.createdAt ? new Date(json.createdAt) : new Date();\n return;\n } catch (error) {\n if (!(error instanceof PlatformApiError) || error.status !== 404) throw error;\n this._sandboxId = undefined;\n }\n }\n\n if (!this._environmentId) throw new Error('environmentId is required');\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 secret key (falls back to MASTRA_PLATFORM_SECRET_KEY)',\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 secret key (falls back to MASTRA_PLATFORM_SECRET_KEY)',\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.map
CHANGED
|
@@ -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,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;
|
|
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;IAmCtB,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.2.0",
|
|
3
|
+
"version": "0.2.1-alpha.0",
|
|
4
4
|
"description": "Mastra Platform workspace sandbox and filesystem providers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
"tsup": "^8.5.1",
|
|
28
28
|
"typescript": "^6.0.3",
|
|
29
29
|
"vitest": "4.1.10",
|
|
30
|
-
"@internal/lint": "0.0.
|
|
31
|
-
"@internal/types-builder": "0.0.
|
|
32
|
-
"@mastra/core": "1.52.0"
|
|
30
|
+
"@internal/lint": "0.0.116",
|
|
31
|
+
"@internal/types-builder": "0.0.91",
|
|
32
|
+
"@mastra/core": "1.52.2-alpha.0"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
35
|
"@mastra/core": ">=1.4.0-0 <2.0.0-0"
|