@mastra/mesa 0.0.0 → 0.2.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +30 -0
- package/dist/index.cjs +23 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +23 -1
- package/dist/index.js.map +1 -1
- package/package.json +18 -18
package/LICENSE.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
Portions of this software are licensed as follows:
|
|
2
|
+
|
|
3
|
+
- All content that resides under any directory named "ee/" within this
|
|
4
|
+
repository, including but not limited to:
|
|
5
|
+
- `packages/core/src/auth/ee/`
|
|
6
|
+
- `packages/server/src/server/auth/ee/`
|
|
7
|
+
is licensed under the license defined in `ee/LICENSE`.
|
|
8
|
+
|
|
9
|
+
- All third-party components incorporated into the Mastra Software are
|
|
10
|
+
licensed under the original license provided by the owner of the
|
|
11
|
+
applicable component.
|
|
12
|
+
|
|
13
|
+
- Content outside of the above-mentioned directories or restrictions is
|
|
14
|
+
available under the "Apache License 2.0" as defined below.
|
|
15
|
+
|
|
16
|
+
# Apache License 2.0
|
|
17
|
+
|
|
18
|
+
Copyright (c) 2025 Kepler Software, Inc.
|
|
19
|
+
|
|
20
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
21
|
+
you may not use this file except in compliance with the License.
|
|
22
|
+
You may obtain a copy of the License at
|
|
23
|
+
|
|
24
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
25
|
+
|
|
26
|
+
Unless required by applicable law or agreed to in writing, software
|
|
27
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
28
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
29
|
+
See the License for the specific language governing permissions and
|
|
30
|
+
limitations under the License.
|
package/dist/index.cjs
CHANGED
|
@@ -398,6 +398,15 @@ var MesaFilesystem = class extends workspace.MastraFilesystem {
|
|
|
398
398
|
} catch (error) {
|
|
399
399
|
const mapped = mapMesaError(error, parent, "directory");
|
|
400
400
|
if (!(mapped instanceof workspace.FileExistsError)) throw mapped;
|
|
401
|
+
try {
|
|
402
|
+
const stats = await this.filesystem.stat(parent);
|
|
403
|
+
if (!stats.isDirectory) {
|
|
404
|
+
throw new workspace.NotDirectoryError(parent);
|
|
405
|
+
}
|
|
406
|
+
} catch (statError) {
|
|
407
|
+
if (statError instanceof workspace.NotDirectoryError) throw statError;
|
|
408
|
+
throw mapMesaError(statError, parent, "directory");
|
|
409
|
+
}
|
|
401
410
|
}
|
|
402
411
|
}
|
|
403
412
|
async assertParentDirectoryExists(inputPath) {
|
|
@@ -491,7 +500,20 @@ var mesaFilesystemProvider = {
|
|
|
491
500
|
}
|
|
492
501
|
}
|
|
493
502
|
},
|
|
494
|
-
cache: {
|
|
503
|
+
cache: {
|
|
504
|
+
type: "object",
|
|
505
|
+
description: "Mesa filesystem cache configuration",
|
|
506
|
+
properties: {
|
|
507
|
+
diskCache: {
|
|
508
|
+
type: "object",
|
|
509
|
+
required: ["path"],
|
|
510
|
+
properties: {
|
|
511
|
+
path: { type: "string", description: "Disk cache path" },
|
|
512
|
+
maxSizeBytes: { type: "number", description: "Maximum disk cache size in bytes" }
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
},
|
|
495
517
|
ttl: { type: "number", description: "Mesa mount token lifetime in seconds" },
|
|
496
518
|
readOnly: { type: "boolean", description: "Mount all repos as read-only", default: false }
|
|
497
519
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/filesystem/index.ts","../src/provider.ts"],"names":["path","DirectoryNotFoundError","FileNotFoundError","FileExistsError","NotDirectoryError","IsDirectoryError","DirectoryNotEmptyError","MastraFilesystem","Mesa","WorkspaceReadOnlyError","StaleFileError"],"mappings":"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","file":"index.cjs","sourcesContent":["import path from 'node:path/posix';\n\nimport type {\n CopyOptions,\n FileContent,\n FileEntry,\n FilesystemInfo,\n FileStat,\n ListOptions,\n MastraFilesystemOptions,\n ProviderStatus,\n ReadOptions,\n RemoveOptions,\n WriteOptions,\n} from '@mastra/core/workspace';\nimport {\n DirectoryNotEmptyError,\n DirectoryNotFoundError,\n FileExistsError,\n FileNotFoundError,\n IsDirectoryError,\n MastraFilesystem,\n NotDirectoryError,\n StaleFileError,\n WorkspaceReadOnlyError,\n} from '@mastra/core/workspace';\nimport { Mesa } from '@mesadev/sdk';\nimport type { Bash, MesaBashOptions, MesaFileSystem, MesaOptions, RepoConfig, TelemetryConfig } from '@mesadev/sdk';\n\ntype MesaFsStat = Awaited<ReturnType<MesaFileSystem['stat']>>;\ntype MesaDirent = Awaited<ReturnType<NonNullable<MesaFileSystem['readdirWithFileTypes']>>>[number];\n\nexport interface MesaFilesystemOptions extends MastraFilesystemOptions {\n /** Mesa API key. Falls back to MESA_API_KEY when omitted. */\n apiKey?: string;\n /** Block all write operations through the Mastra filesystem interface. */\n readOnly?: boolean;\n /** Mesa org slug. Falls back to Mesa SDK org inference when omitted. */\n org?: string;\n /** Mesa repos to mount. */\n repos: RepoConfig[];\n /** Mesa filesystem cache configuration. */\n cache?: {\n diskCache?: {\n path: string;\n maxSizeBytes?: number;\n };\n };\n /** Mesa mount token lifetime in seconds. */\n ttl?: number;\n /** Mesa filesystem telemetry configuration. */\n telemetry?: TelemetryConfig;\n /** Custom fetch implementation for Mesa API calls. */\n fetch?: MesaOptions['fetch'];\n /** User agent for Mesa API calls. */\n userAgent?: string;\n}\n\nfunction generateId(): string {\n return `mesa-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction normalizePath(inputPath: string): string {\n return path.normalize(inputPath.startsWith('/') ? inputPath : `/${inputPath}`);\n}\n\nfunction getExtension(name: string): string {\n const dot = name.lastIndexOf('.');\n return dot === -1 ? '' : name.slice(dot);\n}\n\nfunction matchesExtension(name: string, extensions?: string[]): boolean {\n if (!extensions) return true;\n const ext = getExtension(name);\n return extensions.some(candidate => candidate === ext || candidate === ext.slice(1));\n}\n\nfunction toMesaContent(content: FileContent): string | Uint8Array {\n if (typeof content === 'string') return content;\n if (Buffer.isBuffer(content)) return new Uint8Array(content);\n return content;\n}\n\ntype MesaErrorKind = 'notFound' | 'alreadyExists' | 'notDirectory' | 'isDirectory' | 'directoryNotEmpty';\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction getMesaErrorKind(error: unknown): MesaErrorKind | undefined {\n const err =\n error && typeof error === 'object' ? (error as { code?: unknown; name?: unknown; message?: unknown }) : undefined;\n const code = typeof err?.code === 'string' ? err.code : undefined;\n const name = typeof err?.name === 'string' ? err.name : undefined;\n\n for (const value of [code, name]) {\n switch (value) {\n case 'ENOENT':\n case 'NotFound':\n case 'NoSuchFile':\n case 'NoSuchKey':\n return 'notFound';\n case 'EEXIST':\n case 'AlreadyExists':\n return 'alreadyExists';\n case 'ENOTDIR':\n case 'NotDirectory':\n return 'notDirectory';\n case 'EISDIR':\n case 'IsDirectory':\n return 'isDirectory';\n case 'ENOTEMPTY':\n case 'DirectoryNotEmpty':\n return 'directoryNotEmpty';\n }\n }\n\n const message =\n typeof err?.message === 'string' ? err.message : error instanceof Error ? error.message : String(error);\n if (/\\b(no such file|not found|enoent)\\b/i.test(message)) return 'notFound';\n if (/\\b(already exists|eexist)\\b/i.test(message)) return 'alreadyExists';\n if (/\\b(not a directory|enotdir)\\b/i.test(message)) return 'notDirectory';\n if (/\\b(is a directory|eisdir)\\b/i.test(message)) return 'isDirectory';\n if (/\\b(directory not empty|enotempty)\\b/i.test(message)) return 'directoryNotEmpty';\n\n return undefined;\n}\n\nfunction mapMesaError(error: unknown, inputPath: string, context: 'file' | 'directory' = 'file'): Error {\n switch (getMesaErrorKind(error)) {\n case 'notFound':\n return context === 'directory' ? new DirectoryNotFoundError(inputPath) : new FileNotFoundError(inputPath);\n case 'alreadyExists':\n return new FileExistsError(inputPath);\n case 'notDirectory':\n return new NotDirectoryError(inputPath);\n case 'isDirectory':\n return new IsDirectoryError(inputPath);\n case 'directoryNotEmpty':\n return new DirectoryNotEmptyError(inputPath);\n default:\n return toError(error);\n }\n}\n\n/**\n * Workspace filesystem adapter backed by Mesa.\n *\n * This provider runs in the Mastra process and implements the workspace file\n * API against Mesa repos. It does not mount Mesa into a sandbox.\n */\nexport class MesaFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'MesaFilesystem';\n readonly provider = 'mesa';\n readonly readOnly?: boolean;\n readonly icon = 'mesa';\n readonly displayName = 'Mesa';\n readonly description = 'Versioned Mesa filesystem for workspace files';\n\n status: ProviderStatus = 'pending';\n\n private readonly _apiKey?: string;\n private readonly _org?: string;\n private readonly _repos?: RepoConfig[];\n private readonly _cache?: {\n diskCache?: {\n path: string;\n maxSizeBytes?: number;\n };\n };\n private readonly _ttl?: number;\n private readonly _telemetry?: TelemetryConfig;\n private readonly _fetch?: MesaOptions['fetch'];\n private readonly _userAgent?: string;\n\n private _mesa?: Mesa;\n private _filesystem?: MesaFileSystem;\n\n constructor(options: MesaFilesystemOptions) {\n super({ name: 'MesaFilesystem', ...options });\n\n this.id = generateId();\n this.readOnly = options.readOnly;\n this._org = options.org;\n this._repos = options.repos;\n this._apiKey = options.apiKey;\n this._cache = options.cache;\n this._ttl = options.ttl;\n this._telemetry = options.telemetry;\n this._fetch = options.fetch;\n this._userAgent = options.userAgent;\n }\n\n /**\n * The active Mesa client, available after initialization when this instance\n * created the client itself.\n */\n get client(): Mesa | undefined {\n return this._mesa;\n }\n\n /**\n * The active Mesa filesystem. Accessing this before initialization throws.\n */\n get filesystem(): MesaFileSystem {\n if (!this._filesystem) {\n throw new Error('MesaFilesystem is not initialized. Call init() first or perform a filesystem operation.');\n }\n return this._filesystem;\n }\n\n override async init(): Promise<void> {\n if (!this._repos || this._repos.length === 0) {\n throw new Error('MesaFilesystem requires at least one repo.');\n }\n\n this._mesa = new Mesa({\n apiKey: this._apiKey,\n org: this._org,\n fetch: this._fetch,\n userAgent: this._userAgent,\n });\n\n const repos = this.readOnly ? this._repos.map(repo => ({ ...repo, readOnly: true })) : this._repos;\n this._filesystem = await this._mesa.fs.mount({\n repos,\n cache: this._cache,\n ttl: this._ttl,\n telemetry: this._telemetry,\n });\n }\n\n getInfo(): FilesystemInfo<{\n org?: string;\n repos?: string[];\n mode: 'mounted' | 'client';\n }> {\n return {\n id: this.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n error: this.error,\n readOnly: this.readOnly,\n icon: this.icon,\n metadata: {\n ...(this._org && { org: this._org }),\n ...(this._repos && { repos: this._repos.map(repo => repo.name) }),\n mode: 'client',\n },\n };\n }\n\n getInstructions(): string {\n const parts = ['Mesa filesystem. Paths are rooted at the Mesa mount. Include the org and repo name in paths.'];\n\n if (this._org) {\n parts.push(`Org: \"${this._org}\".`);\n } else {\n parts.push('Use the Mesa org resolved by the SDK as the first path segment.');\n }\n\n if (this._repos && this._repos.length > 0) {\n const repoNames = this._repos.map(repo => `\"${repo.name}\"`).join(', ');\n const firstRepo = this._repos[0]?.name ?? 'repo';\n const orgSegment = this._org ?? 'org';\n parts.push(`Mounted repos: ${repoNames}. For example \"/${orgSegment}/${firstRepo}/file.txt\".`);\n }\n\n parts.push('Files are versioned by Mesa.');\n\n if (this.readOnly) {\n parts.push('Mounted read-only.');\n }\n\n return parts.join(' ');\n }\n\n async readFile(inputPath: string, options?: ReadOptions): Promise<string | Buffer> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n const buffer = Buffer.from(await this.filesystem.readFileBuffer(target));\n if (options?.encoding) return buffer.toString(options.encoding);\n return buffer;\n } catch (error) {\n throw mapMesaError(error, inputPath);\n }\n }\n\n async writeFile(inputPath: string, content: FileContent, options?: WriteOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('writeFile');\n const target = normalizePath(inputPath);\n\n if (options?.overwrite === false && (await this.exists(target))) {\n throw new FileExistsError(inputPath);\n }\n\n if (options?.expectedMtime) {\n await this.assertExpectedMtime(inputPath, options.expectedMtime);\n }\n\n if (options?.recursive === false) {\n await this.assertParentDirectoryExists(target);\n } else {\n await this.ensureParentDirectory(target);\n }\n\n try {\n await this.filesystem.writeFile(target, toMesaContent(content));\n } catch (error) {\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof NotDirectoryError) throw new NotDirectoryError(path.dirname(target));\n if (mapped instanceof FileNotFoundError) throw new DirectoryNotFoundError(path.dirname(target));\n throw mapped;\n }\n }\n\n async appendFile(inputPath: string, content: FileContent): Promise<void> {\n await this.ensureReady();\n this.assertWritable('appendFile');\n const target = normalizePath(inputPath);\n\n await this.ensureParentDirectory(target);\n\n try {\n await this.filesystem.appendFile(target, toMesaContent(content));\n } catch (error) {\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof FileNotFoundError) throw new DirectoryNotFoundError(path.dirname(target));\n throw mapped;\n }\n }\n\n async deleteFile(inputPath: string, options?: RemoveOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('deleteFile');\n const target = normalizePath(inputPath);\n\n try {\n const stats = await this.filesystem.stat(target);\n if (stats.isDirectory) throw new IsDirectoryError(inputPath);\n await this.filesystem.rm(target, { force: options?.force });\n } catch (error) {\n if (error instanceof IsDirectoryError) throw error;\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof FileNotFoundError) {\n if (options?.force) return;\n throw mapped;\n }\n throw mapped;\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('copyFile');\n const source = normalizePath(src);\n const target = normalizePath(dest);\n\n if (options?.overwrite === false && (await this.exists(target))) {\n throw new FileExistsError(dest);\n }\n\n await this.ensureParentDirectory(target);\n\n try {\n await this.filesystem.cp(source, target, { recursive: options?.recursive });\n } catch (error) {\n const mapped = mapMesaError(error, src);\n if (mapped instanceof FileExistsError) throw new FileExistsError(dest);\n throw mapped;\n }\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('moveFile');\n const source = normalizePath(src);\n const target = normalizePath(dest);\n\n if (options?.overwrite === false && (await this.exists(target))) {\n throw new FileExistsError(dest);\n }\n\n await this.ensureParentDirectory(target);\n\n try {\n await this.filesystem.mv(source, target);\n } catch (error) {\n const mapped = mapMesaError(error, src);\n if (mapped instanceof FileExistsError) throw new FileExistsError(dest);\n throw mapped;\n }\n }\n\n async mkdir(inputPath: string, options?: { recursive?: boolean }): Promise<void> {\n await this.ensureReady();\n this.assertWritable('mkdir');\n const target = normalizePath(inputPath);\n\n try {\n await this.filesystem.mkdir(target, { recursive: options?.recursive ?? true });\n } catch (error) {\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof FileNotFoundError) throw new DirectoryNotFoundError(path.dirname(target));\n throw mapped;\n }\n }\n\n async rmdir(inputPath: string, options?: RemoveOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('rmdir');\n const target = normalizePath(inputPath);\n\n try {\n const stats = await this.filesystem.stat(target);\n if (!stats.isDirectory) throw new NotDirectoryError(inputPath);\n\n if (!options?.recursive) {\n const entries = await this.filesystem.readdirWithFileTypes(target);\n if (entries.length > 0) throw new DirectoryNotEmptyError(inputPath);\n }\n\n await this.filesystem.rm(target, { recursive: options?.recursive ?? true, force: options?.force });\n } catch (error) {\n if (error instanceof NotDirectoryError) throw error;\n if (error instanceof DirectoryNotEmptyError) throw error;\n const mapped = mapMesaError(error, inputPath, 'directory');\n if (mapped instanceof DirectoryNotFoundError) {\n if (options?.force) return;\n throw mapped;\n }\n throw mapped;\n }\n }\n\n async readdir(inputPath: string, options?: ListOptions): Promise<FileEntry[]> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n return await this.readDirectory(target, options);\n } catch (error) {\n throw mapMesaError(error, inputPath, 'directory');\n }\n }\n\n async exists(inputPath: string): Promise<boolean> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n return await this.filesystem.exists(target);\n } catch (error) {\n if (getMesaErrorKind(error) === 'notFound') return false;\n throw mapMesaError(error, inputPath);\n }\n }\n\n async stat(inputPath: string): Promise<FileStat> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n const stats = await this.filesystem.stat(target);\n return this.toFileStat(target, stats);\n } catch (error) {\n throw mapMesaError(error, inputPath);\n }\n }\n\n async realpath(inputPath: string): Promise<string> {\n await this.ensureReady();\n try {\n return await this.filesystem.realpath(normalizePath(inputPath));\n } catch (error) {\n throw mapMesaError(error, inputPath);\n }\n }\n\n /**\n * Create a Mesa-backed Bash runtime for this filesystem.\n */\n async bash(options?: MesaBashOptions): Promise<Bash> {\n await this.ensureReady();\n return this.filesystem.bash(options);\n }\n\n /**\n * Mesa change management operations for the mounted filesystem.\n */\n get change(): MesaFileSystem['change'] {\n return this.filesystem.change;\n }\n\n /**\n * Mesa bookmark management operations for the mounted filesystem.\n */\n get bookmark(): MesaFileSystem['bookmark'] {\n return this.filesystem.bookmark;\n }\n\n private assertWritable(operation: string): void {\n if (this.readOnly) {\n throw new WorkspaceReadOnlyError(operation);\n }\n }\n\n private async assertExpectedMtime(inputPath: string, expectedMtime: Date): Promise<void> {\n try {\n const currentStat = await this.stat(inputPath);\n if (currentStat.modifiedAt.getTime() !== expectedMtime.getTime()) {\n throw new StaleFileError(inputPath, expectedMtime, currentStat.modifiedAt);\n }\n } catch (error) {\n if (error instanceof StaleFileError) throw error;\n if (error instanceof FileNotFoundError) return;\n throw error;\n }\n }\n\n private async ensureParentDirectory(inputPath: string): Promise<void> {\n const parent = path.dirname(inputPath);\n if (parent === '/' || parent === inputPath) return;\n\n try {\n await this.filesystem.mkdir(parent, { recursive: true });\n } catch (error) {\n const mapped = mapMesaError(error, parent, 'directory');\n if (!(mapped instanceof FileExistsError)) throw mapped;\n }\n }\n\n private async assertParentDirectoryExists(inputPath: string): Promise<void> {\n const parent = path.dirname(inputPath);\n if (parent === '/' || parent === inputPath) return;\n\n try {\n const stats = await this.filesystem.stat(parent);\n if (!stats.isDirectory) {\n throw new NotDirectoryError(parent);\n }\n } catch (error) {\n if (error instanceof NotDirectoryError) throw error;\n throw mapMesaError(error, parent, 'directory');\n }\n }\n\n private async readDirectory(inputPath: string, options?: ListOptions, depth = 0): Promise<FileEntry[]> {\n const entries = await this.filesystem.readdirWithFileTypes(inputPath);\n const extensions = options?.extension\n ? Array.isArray(options.extension)\n ? options.extension\n : [options.extension]\n : undefined;\n\n const result: FileEntry[] = [];\n for (const entry of entries) {\n const childPath = path.join(inputPath, entry.name);\n if (entry.isFile) {\n if (matchesExtension(entry.name, extensions)) {\n const stat = await this.safeStat(childPath);\n result.push({ name: entry.name, type: 'file', size: stat?.size });\n }\n continue;\n }\n\n if (entry.isDirectory) {\n result.push({ name: entry.name, type: 'directory' });\n\n if (options?.recursive && (options.maxDepth === undefined || depth < options.maxDepth)) {\n const childEntries = await this.readDirectory(childPath, options, depth + 1);\n result.push(...childEntries.map(child => ({ ...child, name: `${entry.name}/${child.name}` })));\n }\n continue;\n }\n\n result.push(this.toFileEntry(entry));\n }\n\n return result;\n }\n\n private async safeStat(inputPath: string): Promise<MesaFsStat | undefined> {\n try {\n return await this.filesystem.stat(inputPath);\n } catch {\n return undefined;\n }\n }\n\n private toFileEntry(entry: MesaDirent): FileEntry {\n return {\n name: entry.name,\n type: entry.isDirectory ? 'directory' : 'file',\n isSymlink: entry.isSymbolicLink || undefined,\n };\n }\n\n private toFileStat(inputPath: string, stats: MesaFsStat): FileStat {\n const target = normalizePath(inputPath);\n\n return {\n name: target === '/' ? '/' : path.basename(target),\n path: target,\n type: stats.isDirectory ? 'directory' : 'file',\n size: stats.isDirectory ? 0 : stats.size,\n createdAt: stats.mtime,\n modifiedAt: stats.mtime,\n };\n }\n}\n","/**\n * Mesa filesystem provider descriptor for MastraEditor.\n */\nimport type { FilesystemProvider } from '@mastra/core/editor';\n\nimport { MesaFilesystem } from './filesystem';\nimport type { MesaFilesystemOptions } from './filesystem';\n\nexport const mesaFilesystemProvider: FilesystemProvider<MesaFilesystemOptions> = {\n id: 'mesa',\n name: 'Mesa',\n description: 'Versioned Mesa filesystem for workspace files',\n configSchema: {\n type: 'object',\n required: ['repos'],\n properties: {\n apiKey: { type: 'string', description: 'Mesa API key. Falls back to MESA_API_KEY when omitted.' },\n org: { type: 'string', description: 'Mesa org slug' },\n repos: {\n type: 'array',\n description: 'Mesa repos to mount',\n minItems: 1,\n items: {\n type: 'object',\n required: ['name'],\n properties: {\n name: { type: 'string', description: 'Mesa repo name' },\n bookmark: { type: 'string', description: 'Bookmark to mount' },\n changeId: { type: 'string', description: 'Change ID to mount' },\n readOnly: { type: 'boolean', description: 'Mount this repo as read-only' },\n },\n },\n },\n cache: { type: 'object', description: 'Mesa filesystem cache configuration' },\n ttl: { type: 'number', description: 'Mesa mount token lifetime in seconds' },\n readOnly: { type: 'boolean', description: 'Mount all repos as read-only', default: false },\n },\n },\n createFilesystem: config => new MesaFilesystem(config),\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/filesystem/index.ts","../src/provider.ts"],"names":["path","DirectoryNotFoundError","FileNotFoundError","FileExistsError","NotDirectoryError","IsDirectoryError","DirectoryNotEmptyError","MastraFilesystem","Mesa","WorkspaceReadOnlyError","StaleFileError"],"mappings":"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","file":"index.cjs","sourcesContent":["import path from 'node:path/posix';\n\nimport type {\n CopyOptions,\n FileContent,\n FileEntry,\n FilesystemInfo,\n FileStat,\n ListOptions,\n MastraFilesystemOptions,\n ProviderStatus,\n ReadOptions,\n RemoveOptions,\n WriteOptions,\n} from '@mastra/core/workspace';\nimport {\n DirectoryNotEmptyError,\n DirectoryNotFoundError,\n FileExistsError,\n FileNotFoundError,\n IsDirectoryError,\n MastraFilesystem,\n NotDirectoryError,\n StaleFileError,\n WorkspaceReadOnlyError,\n} from '@mastra/core/workspace';\nimport { Mesa } from '@mesadev/sdk';\nimport type { Bash, MesaBashOptions, MesaFileSystem, MesaOptions, RepoConfig, TelemetryConfig } from '@mesadev/sdk';\n\ntype MesaFsStat = Awaited<ReturnType<MesaFileSystem['stat']>>;\ntype MesaDirent = Awaited<ReturnType<NonNullable<MesaFileSystem['readdirWithFileTypes']>>>[number];\n\nexport interface MesaFilesystemOptions extends MastraFilesystemOptions {\n /** Mesa API key. Falls back to MESA_API_KEY when omitted. */\n apiKey?: string;\n /** Block all write operations through the Mastra filesystem interface. */\n readOnly?: boolean;\n /** Mesa org slug. Falls back to Mesa SDK org inference when omitted. */\n org?: string;\n /** Mesa repos to mount. */\n repos: RepoConfig[];\n /** Mesa filesystem cache configuration. */\n cache?: {\n diskCache?: {\n path: string;\n maxSizeBytes?: number;\n };\n };\n /** Mesa mount token lifetime in seconds. */\n ttl?: number;\n /** Mesa filesystem telemetry configuration. */\n telemetry?: TelemetryConfig;\n /** Custom fetch implementation for Mesa API calls. */\n fetch?: MesaOptions['fetch'];\n /** User agent for Mesa API calls. */\n userAgent?: string;\n}\n\nfunction generateId(): string {\n return `mesa-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction normalizePath(inputPath: string): string {\n return path.normalize(inputPath.startsWith('/') ? inputPath : `/${inputPath}`);\n}\n\nfunction getExtension(name: string): string {\n const dot = name.lastIndexOf('.');\n return dot === -1 ? '' : name.slice(dot);\n}\n\nfunction matchesExtension(name: string, extensions?: string[]): boolean {\n if (!extensions) return true;\n const ext = getExtension(name);\n return extensions.some(candidate => candidate === ext || candidate === ext.slice(1));\n}\n\nfunction toMesaContent(content: FileContent): string | Uint8Array {\n if (typeof content === 'string') return content;\n if (Buffer.isBuffer(content)) return new Uint8Array(content);\n return content;\n}\n\ntype MesaErrorKind = 'notFound' | 'alreadyExists' | 'notDirectory' | 'isDirectory' | 'directoryNotEmpty';\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction getMesaErrorKind(error: unknown): MesaErrorKind | undefined {\n const err =\n error && typeof error === 'object' ? (error as { code?: unknown; name?: unknown; message?: unknown }) : undefined;\n const code = typeof err?.code === 'string' ? err.code : undefined;\n const name = typeof err?.name === 'string' ? err.name : undefined;\n\n for (const value of [code, name]) {\n switch (value) {\n case 'ENOENT':\n case 'NotFound':\n case 'NoSuchFile':\n case 'NoSuchKey':\n return 'notFound';\n case 'EEXIST':\n case 'AlreadyExists':\n return 'alreadyExists';\n case 'ENOTDIR':\n case 'NotDirectory':\n return 'notDirectory';\n case 'EISDIR':\n case 'IsDirectory':\n return 'isDirectory';\n case 'ENOTEMPTY':\n case 'DirectoryNotEmpty':\n return 'directoryNotEmpty';\n }\n }\n\n const message =\n typeof err?.message === 'string' ? err.message : error instanceof Error ? error.message : String(error);\n if (/\\b(no such file|not found|enoent)\\b/i.test(message)) return 'notFound';\n if (/\\b(already exists|eexist)\\b/i.test(message)) return 'alreadyExists';\n if (/\\b(not a directory|enotdir)\\b/i.test(message)) return 'notDirectory';\n if (/\\b(is a directory|eisdir)\\b/i.test(message)) return 'isDirectory';\n if (/\\b(directory not empty|enotempty)\\b/i.test(message)) return 'directoryNotEmpty';\n\n return undefined;\n}\n\nfunction mapMesaError(error: unknown, inputPath: string, context: 'file' | 'directory' = 'file'): Error {\n switch (getMesaErrorKind(error)) {\n case 'notFound':\n return context === 'directory' ? new DirectoryNotFoundError(inputPath) : new FileNotFoundError(inputPath);\n case 'alreadyExists':\n return new FileExistsError(inputPath);\n case 'notDirectory':\n return new NotDirectoryError(inputPath);\n case 'isDirectory':\n return new IsDirectoryError(inputPath);\n case 'directoryNotEmpty':\n return new DirectoryNotEmptyError(inputPath);\n default:\n return toError(error);\n }\n}\n\n/**\n * Workspace filesystem adapter backed by Mesa.\n *\n * This provider runs in the Mastra process and implements the workspace file\n * API against Mesa repos. It does not mount Mesa into a sandbox.\n */\nexport class MesaFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'MesaFilesystem';\n readonly provider = 'mesa';\n readonly readOnly?: boolean;\n readonly icon = 'mesa';\n readonly displayName = 'Mesa';\n readonly description = 'Versioned Mesa filesystem for workspace files';\n\n status: ProviderStatus = 'pending';\n\n private readonly _apiKey?: string;\n private readonly _org?: string;\n private readonly _repos?: RepoConfig[];\n private readonly _cache?: {\n diskCache?: {\n path: string;\n maxSizeBytes?: number;\n };\n };\n private readonly _ttl?: number;\n private readonly _telemetry?: TelemetryConfig;\n private readonly _fetch?: MesaOptions['fetch'];\n private readonly _userAgent?: string;\n\n private _mesa?: Mesa;\n private _filesystem?: MesaFileSystem;\n\n constructor(options: MesaFilesystemOptions) {\n super({ name: 'MesaFilesystem', ...options });\n\n this.id = generateId();\n this.readOnly = options.readOnly;\n this._org = options.org;\n this._repos = options.repos;\n this._apiKey = options.apiKey;\n this._cache = options.cache;\n this._ttl = options.ttl;\n this._telemetry = options.telemetry;\n this._fetch = options.fetch;\n this._userAgent = options.userAgent;\n }\n\n /**\n * The active Mesa client, available after initialization when this instance\n * created the client itself.\n */\n get client(): Mesa | undefined {\n return this._mesa;\n }\n\n /**\n * The active Mesa filesystem. Accessing this before initialization throws.\n */\n get filesystem(): MesaFileSystem {\n if (!this._filesystem) {\n throw new Error('MesaFilesystem is not initialized. Call init() first or perform a filesystem operation.');\n }\n return this._filesystem;\n }\n\n override async init(): Promise<void> {\n if (!this._repos || this._repos.length === 0) {\n throw new Error('MesaFilesystem requires at least one repo.');\n }\n\n this._mesa = new Mesa({\n apiKey: this._apiKey,\n org: this._org,\n fetch: this._fetch,\n userAgent: this._userAgent,\n });\n\n const repos = this.readOnly ? this._repos.map(repo => ({ ...repo, readOnly: true })) : this._repos;\n this._filesystem = await this._mesa.fs.mount({\n repos,\n cache: this._cache,\n ttl: this._ttl,\n telemetry: this._telemetry,\n });\n }\n\n getInfo(): FilesystemInfo<{\n org?: string;\n repos?: string[];\n mode: 'mounted' | 'client';\n }> {\n return {\n id: this.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n error: this.error,\n readOnly: this.readOnly,\n icon: this.icon,\n metadata: {\n ...(this._org && { org: this._org }),\n ...(this._repos && { repos: this._repos.map(repo => repo.name) }),\n mode: 'client',\n },\n };\n }\n\n getInstructions(): string {\n const parts = ['Mesa filesystem. Paths are rooted at the Mesa mount. Include the org and repo name in paths.'];\n\n if (this._org) {\n parts.push(`Org: \"${this._org}\".`);\n } else {\n parts.push('Use the Mesa org resolved by the SDK as the first path segment.');\n }\n\n if (this._repos && this._repos.length > 0) {\n const repoNames = this._repos.map(repo => `\"${repo.name}\"`).join(', ');\n const firstRepo = this._repos[0]?.name ?? 'repo';\n const orgSegment = this._org ?? 'org';\n parts.push(`Mounted repos: ${repoNames}. For example \"/${orgSegment}/${firstRepo}/file.txt\".`);\n }\n\n parts.push('Files are versioned by Mesa.');\n\n if (this.readOnly) {\n parts.push('Mounted read-only.');\n }\n\n return parts.join(' ');\n }\n\n async readFile(inputPath: string, options?: ReadOptions): Promise<string | Buffer> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n const buffer = Buffer.from(await this.filesystem.readFileBuffer(target));\n if (options?.encoding) return buffer.toString(options.encoding);\n return buffer;\n } catch (error) {\n throw mapMesaError(error, inputPath);\n }\n }\n\n async writeFile(inputPath: string, content: FileContent, options?: WriteOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('writeFile');\n const target = normalizePath(inputPath);\n\n if (options?.overwrite === false && (await this.exists(target))) {\n throw new FileExistsError(inputPath);\n }\n\n if (options?.expectedMtime) {\n await this.assertExpectedMtime(inputPath, options.expectedMtime);\n }\n\n if (options?.recursive === false) {\n await this.assertParentDirectoryExists(target);\n } else {\n await this.ensureParentDirectory(target);\n }\n\n try {\n await this.filesystem.writeFile(target, toMesaContent(content));\n } catch (error) {\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof NotDirectoryError) throw new NotDirectoryError(path.dirname(target));\n if (mapped instanceof FileNotFoundError) throw new DirectoryNotFoundError(path.dirname(target));\n throw mapped;\n }\n }\n\n async appendFile(inputPath: string, content: FileContent): Promise<void> {\n await this.ensureReady();\n this.assertWritable('appendFile');\n const target = normalizePath(inputPath);\n\n await this.ensureParentDirectory(target);\n\n try {\n await this.filesystem.appendFile(target, toMesaContent(content));\n } catch (error) {\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof FileNotFoundError) throw new DirectoryNotFoundError(path.dirname(target));\n throw mapped;\n }\n }\n\n async deleteFile(inputPath: string, options?: RemoveOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('deleteFile');\n const target = normalizePath(inputPath);\n\n try {\n const stats = await this.filesystem.stat(target);\n if (stats.isDirectory) throw new IsDirectoryError(inputPath);\n await this.filesystem.rm(target, { force: options?.force });\n } catch (error) {\n if (error instanceof IsDirectoryError) throw error;\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof FileNotFoundError) {\n if (options?.force) return;\n throw mapped;\n }\n throw mapped;\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('copyFile');\n const source = normalizePath(src);\n const target = normalizePath(dest);\n\n if (options?.overwrite === false && (await this.exists(target))) {\n throw new FileExistsError(dest);\n }\n\n await this.ensureParentDirectory(target);\n\n try {\n await this.filesystem.cp(source, target, { recursive: options?.recursive });\n } catch (error) {\n const mapped = mapMesaError(error, src);\n if (mapped instanceof FileExistsError) throw new FileExistsError(dest);\n throw mapped;\n }\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('moveFile');\n const source = normalizePath(src);\n const target = normalizePath(dest);\n\n if (options?.overwrite === false && (await this.exists(target))) {\n throw new FileExistsError(dest);\n }\n\n await this.ensureParentDirectory(target);\n\n try {\n await this.filesystem.mv(source, target);\n } catch (error) {\n const mapped = mapMesaError(error, src);\n if (mapped instanceof FileExistsError) throw new FileExistsError(dest);\n throw mapped;\n }\n }\n\n async mkdir(inputPath: string, options?: { recursive?: boolean }): Promise<void> {\n await this.ensureReady();\n this.assertWritable('mkdir');\n const target = normalizePath(inputPath);\n\n try {\n await this.filesystem.mkdir(target, { recursive: options?.recursive ?? true });\n } catch (error) {\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof FileNotFoundError) throw new DirectoryNotFoundError(path.dirname(target));\n throw mapped;\n }\n }\n\n async rmdir(inputPath: string, options?: RemoveOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('rmdir');\n const target = normalizePath(inputPath);\n\n try {\n const stats = await this.filesystem.stat(target);\n if (!stats.isDirectory) throw new NotDirectoryError(inputPath);\n\n if (!options?.recursive) {\n const entries = await this.filesystem.readdirWithFileTypes(target);\n if (entries.length > 0) throw new DirectoryNotEmptyError(inputPath);\n }\n\n await this.filesystem.rm(target, { recursive: options?.recursive ?? true, force: options?.force });\n } catch (error) {\n if (error instanceof NotDirectoryError) throw error;\n if (error instanceof DirectoryNotEmptyError) throw error;\n const mapped = mapMesaError(error, inputPath, 'directory');\n if (mapped instanceof DirectoryNotFoundError) {\n if (options?.force) return;\n throw mapped;\n }\n throw mapped;\n }\n }\n\n async readdir(inputPath: string, options?: ListOptions): Promise<FileEntry[]> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n return await this.readDirectory(target, options);\n } catch (error) {\n throw mapMesaError(error, inputPath, 'directory');\n }\n }\n\n async exists(inputPath: string): Promise<boolean> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n return await this.filesystem.exists(target);\n } catch (error) {\n if (getMesaErrorKind(error) === 'notFound') return false;\n throw mapMesaError(error, inputPath);\n }\n }\n\n async stat(inputPath: string): Promise<FileStat> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n const stats = await this.filesystem.stat(target);\n return this.toFileStat(target, stats);\n } catch (error) {\n throw mapMesaError(error, inputPath);\n }\n }\n\n async realpath(inputPath: string): Promise<string> {\n await this.ensureReady();\n try {\n return await this.filesystem.realpath(normalizePath(inputPath));\n } catch (error) {\n throw mapMesaError(error, inputPath);\n }\n }\n\n /**\n * Create a Mesa-backed Bash runtime for this filesystem.\n */\n async bash(options?: MesaBashOptions): Promise<Bash> {\n await this.ensureReady();\n return this.filesystem.bash(options);\n }\n\n /**\n * Mesa change management operations for the mounted filesystem.\n */\n get change(): MesaFileSystem['change'] {\n return this.filesystem.change;\n }\n\n /**\n * Mesa bookmark management operations for the mounted filesystem.\n */\n get bookmark(): MesaFileSystem['bookmark'] {\n return this.filesystem.bookmark;\n }\n\n private assertWritable(operation: string): void {\n if (this.readOnly) {\n throw new WorkspaceReadOnlyError(operation);\n }\n }\n\n private async assertExpectedMtime(inputPath: string, expectedMtime: Date): Promise<void> {\n try {\n const currentStat = await this.stat(inputPath);\n if (currentStat.modifiedAt.getTime() !== expectedMtime.getTime()) {\n throw new StaleFileError(inputPath, expectedMtime, currentStat.modifiedAt);\n }\n } catch (error) {\n if (error instanceof StaleFileError) throw error;\n if (error instanceof FileNotFoundError) return;\n throw error;\n }\n }\n\n private async ensureParentDirectory(inputPath: string): Promise<void> {\n const parent = path.dirname(inputPath);\n if (parent === '/' || parent === inputPath) return;\n\n try {\n await this.filesystem.mkdir(parent, { recursive: true });\n } catch (error) {\n const mapped = mapMesaError(error, parent, 'directory');\n if (!(mapped instanceof FileExistsError)) throw mapped;\n try {\n const stats = await this.filesystem.stat(parent);\n if (!stats.isDirectory) {\n throw new NotDirectoryError(parent);\n }\n } catch (statError) {\n if (statError instanceof NotDirectoryError) throw statError;\n throw mapMesaError(statError, parent, 'directory');\n }\n }\n }\n\n private async assertParentDirectoryExists(inputPath: string): Promise<void> {\n const parent = path.dirname(inputPath);\n if (parent === '/' || parent === inputPath) return;\n\n try {\n const stats = await this.filesystem.stat(parent);\n if (!stats.isDirectory) {\n throw new NotDirectoryError(parent);\n }\n } catch (error) {\n if (error instanceof NotDirectoryError) throw error;\n throw mapMesaError(error, parent, 'directory');\n }\n }\n\n private async readDirectory(inputPath: string, options?: ListOptions, depth = 0): Promise<FileEntry[]> {\n const entries = await this.filesystem.readdirWithFileTypes(inputPath);\n const extensions = options?.extension\n ? Array.isArray(options.extension)\n ? options.extension\n : [options.extension]\n : undefined;\n\n const result: FileEntry[] = [];\n for (const entry of entries) {\n const childPath = path.join(inputPath, entry.name);\n if (entry.isFile) {\n if (matchesExtension(entry.name, extensions)) {\n const stat = await this.safeStat(childPath);\n result.push({ name: entry.name, type: 'file', size: stat?.size });\n }\n continue;\n }\n\n if (entry.isDirectory) {\n result.push({ name: entry.name, type: 'directory' });\n\n if (options?.recursive && (options.maxDepth === undefined || depth < options.maxDepth)) {\n const childEntries = await this.readDirectory(childPath, options, depth + 1);\n result.push(...childEntries.map(child => ({ ...child, name: `${entry.name}/${child.name}` })));\n }\n continue;\n }\n\n result.push(this.toFileEntry(entry));\n }\n\n return result;\n }\n\n private async safeStat(inputPath: string): Promise<MesaFsStat | undefined> {\n try {\n return await this.filesystem.stat(inputPath);\n } catch {\n return undefined;\n }\n }\n\n private toFileEntry(entry: MesaDirent): FileEntry {\n return {\n name: entry.name,\n type: entry.isDirectory ? 'directory' : 'file',\n isSymlink: entry.isSymbolicLink || undefined,\n };\n }\n\n private toFileStat(inputPath: string, stats: MesaFsStat): FileStat {\n const target = normalizePath(inputPath);\n\n return {\n name: target === '/' ? '/' : path.basename(target),\n path: target,\n type: stats.isDirectory ? 'directory' : 'file',\n size: stats.isDirectory ? 0 : stats.size,\n createdAt: stats.mtime,\n modifiedAt: stats.mtime,\n };\n }\n}\n","/**\n * Mesa filesystem provider descriptor for MastraEditor.\n */\nimport type { FilesystemProvider } from '@mastra/core/editor';\n\nimport { MesaFilesystem } from './filesystem';\nimport type { MesaFilesystemOptions } from './filesystem';\n\nexport const mesaFilesystemProvider: FilesystemProvider<MesaFilesystemOptions> = {\n id: 'mesa',\n name: 'Mesa',\n description: 'Versioned Mesa filesystem for workspace files',\n configSchema: {\n type: 'object',\n required: ['repos'],\n properties: {\n apiKey: { type: 'string', description: 'Mesa API key. Falls back to MESA_API_KEY when omitted.' },\n org: { type: 'string', description: 'Mesa org slug' },\n repos: {\n type: 'array',\n description: 'Mesa repos to mount',\n minItems: 1,\n items: {\n type: 'object',\n required: ['name'],\n properties: {\n name: { type: 'string', description: 'Mesa repo name' },\n bookmark: { type: 'string', description: 'Bookmark to mount' },\n changeId: { type: 'string', description: 'Change ID to mount' },\n readOnly: { type: 'boolean', description: 'Mount this repo as read-only' },\n },\n },\n },\n cache: {\n type: 'object',\n description: 'Mesa filesystem cache configuration',\n properties: {\n diskCache: {\n type: 'object',\n required: ['path'],\n properties: {\n path: { type: 'string', description: 'Disk cache path' },\n maxSizeBytes: { type: 'number', description: 'Maximum disk cache size in bytes' },\n },\n },\n },\n },\n ttl: { type: 'number', description: 'Mesa mount token lifetime in seconds' },\n readOnly: { type: 'boolean', description: 'Mount all repos as read-only', default: false },\n },\n },\n createFilesystem: config => new MesaFilesystem(config),\n};\n"]}
|
package/dist/index.js
CHANGED
|
@@ -392,6 +392,15 @@ var MesaFilesystem = class extends MastraFilesystem {
|
|
|
392
392
|
} catch (error) {
|
|
393
393
|
const mapped = mapMesaError(error, parent, "directory");
|
|
394
394
|
if (!(mapped instanceof FileExistsError)) throw mapped;
|
|
395
|
+
try {
|
|
396
|
+
const stats = await this.filesystem.stat(parent);
|
|
397
|
+
if (!stats.isDirectory) {
|
|
398
|
+
throw new NotDirectoryError(parent);
|
|
399
|
+
}
|
|
400
|
+
} catch (statError) {
|
|
401
|
+
if (statError instanceof NotDirectoryError) throw statError;
|
|
402
|
+
throw mapMesaError(statError, parent, "directory");
|
|
403
|
+
}
|
|
395
404
|
}
|
|
396
405
|
}
|
|
397
406
|
async assertParentDirectoryExists(inputPath) {
|
|
@@ -485,7 +494,20 @@ var mesaFilesystemProvider = {
|
|
|
485
494
|
}
|
|
486
495
|
}
|
|
487
496
|
},
|
|
488
|
-
cache: {
|
|
497
|
+
cache: {
|
|
498
|
+
type: "object",
|
|
499
|
+
description: "Mesa filesystem cache configuration",
|
|
500
|
+
properties: {
|
|
501
|
+
diskCache: {
|
|
502
|
+
type: "object",
|
|
503
|
+
required: ["path"],
|
|
504
|
+
properties: {
|
|
505
|
+
path: { type: "string", description: "Disk cache path" },
|
|
506
|
+
maxSizeBytes: { type: "number", description: "Maximum disk cache size in bytes" }
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
},
|
|
489
511
|
ttl: { type: "number", description: "Mesa mount token lifetime in seconds" },
|
|
490
512
|
readOnly: { type: "boolean", description: "Mount all repos as read-only", default: false }
|
|
491
513
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/filesystem/index.ts","../src/provider.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import path from 'node:path/posix';\n\nimport type {\n CopyOptions,\n FileContent,\n FileEntry,\n FilesystemInfo,\n FileStat,\n ListOptions,\n MastraFilesystemOptions,\n ProviderStatus,\n ReadOptions,\n RemoveOptions,\n WriteOptions,\n} from '@mastra/core/workspace';\nimport {\n DirectoryNotEmptyError,\n DirectoryNotFoundError,\n FileExistsError,\n FileNotFoundError,\n IsDirectoryError,\n MastraFilesystem,\n NotDirectoryError,\n StaleFileError,\n WorkspaceReadOnlyError,\n} from '@mastra/core/workspace';\nimport { Mesa } from '@mesadev/sdk';\nimport type { Bash, MesaBashOptions, MesaFileSystem, MesaOptions, RepoConfig, TelemetryConfig } from '@mesadev/sdk';\n\ntype MesaFsStat = Awaited<ReturnType<MesaFileSystem['stat']>>;\ntype MesaDirent = Awaited<ReturnType<NonNullable<MesaFileSystem['readdirWithFileTypes']>>>[number];\n\nexport interface MesaFilesystemOptions extends MastraFilesystemOptions {\n /** Mesa API key. Falls back to MESA_API_KEY when omitted. */\n apiKey?: string;\n /** Block all write operations through the Mastra filesystem interface. */\n readOnly?: boolean;\n /** Mesa org slug. Falls back to Mesa SDK org inference when omitted. */\n org?: string;\n /** Mesa repos to mount. */\n repos: RepoConfig[];\n /** Mesa filesystem cache configuration. */\n cache?: {\n diskCache?: {\n path: string;\n maxSizeBytes?: number;\n };\n };\n /** Mesa mount token lifetime in seconds. */\n ttl?: number;\n /** Mesa filesystem telemetry configuration. */\n telemetry?: TelemetryConfig;\n /** Custom fetch implementation for Mesa API calls. */\n fetch?: MesaOptions['fetch'];\n /** User agent for Mesa API calls. */\n userAgent?: string;\n}\n\nfunction generateId(): string {\n return `mesa-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction normalizePath(inputPath: string): string {\n return path.normalize(inputPath.startsWith('/') ? inputPath : `/${inputPath}`);\n}\n\nfunction getExtension(name: string): string {\n const dot = name.lastIndexOf('.');\n return dot === -1 ? '' : name.slice(dot);\n}\n\nfunction matchesExtension(name: string, extensions?: string[]): boolean {\n if (!extensions) return true;\n const ext = getExtension(name);\n return extensions.some(candidate => candidate === ext || candidate === ext.slice(1));\n}\n\nfunction toMesaContent(content: FileContent): string | Uint8Array {\n if (typeof content === 'string') return content;\n if (Buffer.isBuffer(content)) return new Uint8Array(content);\n return content;\n}\n\ntype MesaErrorKind = 'notFound' | 'alreadyExists' | 'notDirectory' | 'isDirectory' | 'directoryNotEmpty';\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction getMesaErrorKind(error: unknown): MesaErrorKind | undefined {\n const err =\n error && typeof error === 'object' ? (error as { code?: unknown; name?: unknown; message?: unknown }) : undefined;\n const code = typeof err?.code === 'string' ? err.code : undefined;\n const name = typeof err?.name === 'string' ? err.name : undefined;\n\n for (const value of [code, name]) {\n switch (value) {\n case 'ENOENT':\n case 'NotFound':\n case 'NoSuchFile':\n case 'NoSuchKey':\n return 'notFound';\n case 'EEXIST':\n case 'AlreadyExists':\n return 'alreadyExists';\n case 'ENOTDIR':\n case 'NotDirectory':\n return 'notDirectory';\n case 'EISDIR':\n case 'IsDirectory':\n return 'isDirectory';\n case 'ENOTEMPTY':\n case 'DirectoryNotEmpty':\n return 'directoryNotEmpty';\n }\n }\n\n const message =\n typeof err?.message === 'string' ? err.message : error instanceof Error ? error.message : String(error);\n if (/\\b(no such file|not found|enoent)\\b/i.test(message)) return 'notFound';\n if (/\\b(already exists|eexist)\\b/i.test(message)) return 'alreadyExists';\n if (/\\b(not a directory|enotdir)\\b/i.test(message)) return 'notDirectory';\n if (/\\b(is a directory|eisdir)\\b/i.test(message)) return 'isDirectory';\n if (/\\b(directory not empty|enotempty)\\b/i.test(message)) return 'directoryNotEmpty';\n\n return undefined;\n}\n\nfunction mapMesaError(error: unknown, inputPath: string, context: 'file' | 'directory' = 'file'): Error {\n switch (getMesaErrorKind(error)) {\n case 'notFound':\n return context === 'directory' ? new DirectoryNotFoundError(inputPath) : new FileNotFoundError(inputPath);\n case 'alreadyExists':\n return new FileExistsError(inputPath);\n case 'notDirectory':\n return new NotDirectoryError(inputPath);\n case 'isDirectory':\n return new IsDirectoryError(inputPath);\n case 'directoryNotEmpty':\n return new DirectoryNotEmptyError(inputPath);\n default:\n return toError(error);\n }\n}\n\n/**\n * Workspace filesystem adapter backed by Mesa.\n *\n * This provider runs in the Mastra process and implements the workspace file\n * API against Mesa repos. It does not mount Mesa into a sandbox.\n */\nexport class MesaFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'MesaFilesystem';\n readonly provider = 'mesa';\n readonly readOnly?: boolean;\n readonly icon = 'mesa';\n readonly displayName = 'Mesa';\n readonly description = 'Versioned Mesa filesystem for workspace files';\n\n status: ProviderStatus = 'pending';\n\n private readonly _apiKey?: string;\n private readonly _org?: string;\n private readonly _repos?: RepoConfig[];\n private readonly _cache?: {\n diskCache?: {\n path: string;\n maxSizeBytes?: number;\n };\n };\n private readonly _ttl?: number;\n private readonly _telemetry?: TelemetryConfig;\n private readonly _fetch?: MesaOptions['fetch'];\n private readonly _userAgent?: string;\n\n private _mesa?: Mesa;\n private _filesystem?: MesaFileSystem;\n\n constructor(options: MesaFilesystemOptions) {\n super({ name: 'MesaFilesystem', ...options });\n\n this.id = generateId();\n this.readOnly = options.readOnly;\n this._org = options.org;\n this._repos = options.repos;\n this._apiKey = options.apiKey;\n this._cache = options.cache;\n this._ttl = options.ttl;\n this._telemetry = options.telemetry;\n this._fetch = options.fetch;\n this._userAgent = options.userAgent;\n }\n\n /**\n * The active Mesa client, available after initialization when this instance\n * created the client itself.\n */\n get client(): Mesa | undefined {\n return this._mesa;\n }\n\n /**\n * The active Mesa filesystem. Accessing this before initialization throws.\n */\n get filesystem(): MesaFileSystem {\n if (!this._filesystem) {\n throw new Error('MesaFilesystem is not initialized. Call init() first or perform a filesystem operation.');\n }\n return this._filesystem;\n }\n\n override async init(): Promise<void> {\n if (!this._repos || this._repos.length === 0) {\n throw new Error('MesaFilesystem requires at least one repo.');\n }\n\n this._mesa = new Mesa({\n apiKey: this._apiKey,\n org: this._org,\n fetch: this._fetch,\n userAgent: this._userAgent,\n });\n\n const repos = this.readOnly ? this._repos.map(repo => ({ ...repo, readOnly: true })) : this._repos;\n this._filesystem = await this._mesa.fs.mount({\n repos,\n cache: this._cache,\n ttl: this._ttl,\n telemetry: this._telemetry,\n });\n }\n\n getInfo(): FilesystemInfo<{\n org?: string;\n repos?: string[];\n mode: 'mounted' | 'client';\n }> {\n return {\n id: this.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n error: this.error,\n readOnly: this.readOnly,\n icon: this.icon,\n metadata: {\n ...(this._org && { org: this._org }),\n ...(this._repos && { repos: this._repos.map(repo => repo.name) }),\n mode: 'client',\n },\n };\n }\n\n getInstructions(): string {\n const parts = ['Mesa filesystem. Paths are rooted at the Mesa mount. Include the org and repo name in paths.'];\n\n if (this._org) {\n parts.push(`Org: \"${this._org}\".`);\n } else {\n parts.push('Use the Mesa org resolved by the SDK as the first path segment.');\n }\n\n if (this._repos && this._repos.length > 0) {\n const repoNames = this._repos.map(repo => `\"${repo.name}\"`).join(', ');\n const firstRepo = this._repos[0]?.name ?? 'repo';\n const orgSegment = this._org ?? 'org';\n parts.push(`Mounted repos: ${repoNames}. For example \"/${orgSegment}/${firstRepo}/file.txt\".`);\n }\n\n parts.push('Files are versioned by Mesa.');\n\n if (this.readOnly) {\n parts.push('Mounted read-only.');\n }\n\n return parts.join(' ');\n }\n\n async readFile(inputPath: string, options?: ReadOptions): Promise<string | Buffer> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n const buffer = Buffer.from(await this.filesystem.readFileBuffer(target));\n if (options?.encoding) return buffer.toString(options.encoding);\n return buffer;\n } catch (error) {\n throw mapMesaError(error, inputPath);\n }\n }\n\n async writeFile(inputPath: string, content: FileContent, options?: WriteOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('writeFile');\n const target = normalizePath(inputPath);\n\n if (options?.overwrite === false && (await this.exists(target))) {\n throw new FileExistsError(inputPath);\n }\n\n if (options?.expectedMtime) {\n await this.assertExpectedMtime(inputPath, options.expectedMtime);\n }\n\n if (options?.recursive === false) {\n await this.assertParentDirectoryExists(target);\n } else {\n await this.ensureParentDirectory(target);\n }\n\n try {\n await this.filesystem.writeFile(target, toMesaContent(content));\n } catch (error) {\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof NotDirectoryError) throw new NotDirectoryError(path.dirname(target));\n if (mapped instanceof FileNotFoundError) throw new DirectoryNotFoundError(path.dirname(target));\n throw mapped;\n }\n }\n\n async appendFile(inputPath: string, content: FileContent): Promise<void> {\n await this.ensureReady();\n this.assertWritable('appendFile');\n const target = normalizePath(inputPath);\n\n await this.ensureParentDirectory(target);\n\n try {\n await this.filesystem.appendFile(target, toMesaContent(content));\n } catch (error) {\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof FileNotFoundError) throw new DirectoryNotFoundError(path.dirname(target));\n throw mapped;\n }\n }\n\n async deleteFile(inputPath: string, options?: RemoveOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('deleteFile');\n const target = normalizePath(inputPath);\n\n try {\n const stats = await this.filesystem.stat(target);\n if (stats.isDirectory) throw new IsDirectoryError(inputPath);\n await this.filesystem.rm(target, { force: options?.force });\n } catch (error) {\n if (error instanceof IsDirectoryError) throw error;\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof FileNotFoundError) {\n if (options?.force) return;\n throw mapped;\n }\n throw mapped;\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('copyFile');\n const source = normalizePath(src);\n const target = normalizePath(dest);\n\n if (options?.overwrite === false && (await this.exists(target))) {\n throw new FileExistsError(dest);\n }\n\n await this.ensureParentDirectory(target);\n\n try {\n await this.filesystem.cp(source, target, { recursive: options?.recursive });\n } catch (error) {\n const mapped = mapMesaError(error, src);\n if (mapped instanceof FileExistsError) throw new FileExistsError(dest);\n throw mapped;\n }\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('moveFile');\n const source = normalizePath(src);\n const target = normalizePath(dest);\n\n if (options?.overwrite === false && (await this.exists(target))) {\n throw new FileExistsError(dest);\n }\n\n await this.ensureParentDirectory(target);\n\n try {\n await this.filesystem.mv(source, target);\n } catch (error) {\n const mapped = mapMesaError(error, src);\n if (mapped instanceof FileExistsError) throw new FileExistsError(dest);\n throw mapped;\n }\n }\n\n async mkdir(inputPath: string, options?: { recursive?: boolean }): Promise<void> {\n await this.ensureReady();\n this.assertWritable('mkdir');\n const target = normalizePath(inputPath);\n\n try {\n await this.filesystem.mkdir(target, { recursive: options?.recursive ?? true });\n } catch (error) {\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof FileNotFoundError) throw new DirectoryNotFoundError(path.dirname(target));\n throw mapped;\n }\n }\n\n async rmdir(inputPath: string, options?: RemoveOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('rmdir');\n const target = normalizePath(inputPath);\n\n try {\n const stats = await this.filesystem.stat(target);\n if (!stats.isDirectory) throw new NotDirectoryError(inputPath);\n\n if (!options?.recursive) {\n const entries = await this.filesystem.readdirWithFileTypes(target);\n if (entries.length > 0) throw new DirectoryNotEmptyError(inputPath);\n }\n\n await this.filesystem.rm(target, { recursive: options?.recursive ?? true, force: options?.force });\n } catch (error) {\n if (error instanceof NotDirectoryError) throw error;\n if (error instanceof DirectoryNotEmptyError) throw error;\n const mapped = mapMesaError(error, inputPath, 'directory');\n if (mapped instanceof DirectoryNotFoundError) {\n if (options?.force) return;\n throw mapped;\n }\n throw mapped;\n }\n }\n\n async readdir(inputPath: string, options?: ListOptions): Promise<FileEntry[]> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n return await this.readDirectory(target, options);\n } catch (error) {\n throw mapMesaError(error, inputPath, 'directory');\n }\n }\n\n async exists(inputPath: string): Promise<boolean> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n return await this.filesystem.exists(target);\n } catch (error) {\n if (getMesaErrorKind(error) === 'notFound') return false;\n throw mapMesaError(error, inputPath);\n }\n }\n\n async stat(inputPath: string): Promise<FileStat> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n const stats = await this.filesystem.stat(target);\n return this.toFileStat(target, stats);\n } catch (error) {\n throw mapMesaError(error, inputPath);\n }\n }\n\n async realpath(inputPath: string): Promise<string> {\n await this.ensureReady();\n try {\n return await this.filesystem.realpath(normalizePath(inputPath));\n } catch (error) {\n throw mapMesaError(error, inputPath);\n }\n }\n\n /**\n * Create a Mesa-backed Bash runtime for this filesystem.\n */\n async bash(options?: MesaBashOptions): Promise<Bash> {\n await this.ensureReady();\n return this.filesystem.bash(options);\n }\n\n /**\n * Mesa change management operations for the mounted filesystem.\n */\n get change(): MesaFileSystem['change'] {\n return this.filesystem.change;\n }\n\n /**\n * Mesa bookmark management operations for the mounted filesystem.\n */\n get bookmark(): MesaFileSystem['bookmark'] {\n return this.filesystem.bookmark;\n }\n\n private assertWritable(operation: string): void {\n if (this.readOnly) {\n throw new WorkspaceReadOnlyError(operation);\n }\n }\n\n private async assertExpectedMtime(inputPath: string, expectedMtime: Date): Promise<void> {\n try {\n const currentStat = await this.stat(inputPath);\n if (currentStat.modifiedAt.getTime() !== expectedMtime.getTime()) {\n throw new StaleFileError(inputPath, expectedMtime, currentStat.modifiedAt);\n }\n } catch (error) {\n if (error instanceof StaleFileError) throw error;\n if (error instanceof FileNotFoundError) return;\n throw error;\n }\n }\n\n private async ensureParentDirectory(inputPath: string): Promise<void> {\n const parent = path.dirname(inputPath);\n if (parent === '/' || parent === inputPath) return;\n\n try {\n await this.filesystem.mkdir(parent, { recursive: true });\n } catch (error) {\n const mapped = mapMesaError(error, parent, 'directory');\n if (!(mapped instanceof FileExistsError)) throw mapped;\n }\n }\n\n private async assertParentDirectoryExists(inputPath: string): Promise<void> {\n const parent = path.dirname(inputPath);\n if (parent === '/' || parent === inputPath) return;\n\n try {\n const stats = await this.filesystem.stat(parent);\n if (!stats.isDirectory) {\n throw new NotDirectoryError(parent);\n }\n } catch (error) {\n if (error instanceof NotDirectoryError) throw error;\n throw mapMesaError(error, parent, 'directory');\n }\n }\n\n private async readDirectory(inputPath: string, options?: ListOptions, depth = 0): Promise<FileEntry[]> {\n const entries = await this.filesystem.readdirWithFileTypes(inputPath);\n const extensions = options?.extension\n ? Array.isArray(options.extension)\n ? options.extension\n : [options.extension]\n : undefined;\n\n const result: FileEntry[] = [];\n for (const entry of entries) {\n const childPath = path.join(inputPath, entry.name);\n if (entry.isFile) {\n if (matchesExtension(entry.name, extensions)) {\n const stat = await this.safeStat(childPath);\n result.push({ name: entry.name, type: 'file', size: stat?.size });\n }\n continue;\n }\n\n if (entry.isDirectory) {\n result.push({ name: entry.name, type: 'directory' });\n\n if (options?.recursive && (options.maxDepth === undefined || depth < options.maxDepth)) {\n const childEntries = await this.readDirectory(childPath, options, depth + 1);\n result.push(...childEntries.map(child => ({ ...child, name: `${entry.name}/${child.name}` })));\n }\n continue;\n }\n\n result.push(this.toFileEntry(entry));\n }\n\n return result;\n }\n\n private async safeStat(inputPath: string): Promise<MesaFsStat | undefined> {\n try {\n return await this.filesystem.stat(inputPath);\n } catch {\n return undefined;\n }\n }\n\n private toFileEntry(entry: MesaDirent): FileEntry {\n return {\n name: entry.name,\n type: entry.isDirectory ? 'directory' : 'file',\n isSymlink: entry.isSymbolicLink || undefined,\n };\n }\n\n private toFileStat(inputPath: string, stats: MesaFsStat): FileStat {\n const target = normalizePath(inputPath);\n\n return {\n name: target === '/' ? '/' : path.basename(target),\n path: target,\n type: stats.isDirectory ? 'directory' : 'file',\n size: stats.isDirectory ? 0 : stats.size,\n createdAt: stats.mtime,\n modifiedAt: stats.mtime,\n };\n }\n}\n","/**\n * Mesa filesystem provider descriptor for MastraEditor.\n */\nimport type { FilesystemProvider } from '@mastra/core/editor';\n\nimport { MesaFilesystem } from './filesystem';\nimport type { MesaFilesystemOptions } from './filesystem';\n\nexport const mesaFilesystemProvider: FilesystemProvider<MesaFilesystemOptions> = {\n id: 'mesa',\n name: 'Mesa',\n description: 'Versioned Mesa filesystem for workspace files',\n configSchema: {\n type: 'object',\n required: ['repos'],\n properties: {\n apiKey: { type: 'string', description: 'Mesa API key. Falls back to MESA_API_KEY when omitted.' },\n org: { type: 'string', description: 'Mesa org slug' },\n repos: {\n type: 'array',\n description: 'Mesa repos to mount',\n minItems: 1,\n items: {\n type: 'object',\n required: ['name'],\n properties: {\n name: { type: 'string', description: 'Mesa repo name' },\n bookmark: { type: 'string', description: 'Bookmark to mount' },\n changeId: { type: 'string', description: 'Change ID to mount' },\n readOnly: { type: 'boolean', description: 'Mount this repo as read-only' },\n },\n },\n },\n cache: { type: 'object', description: 'Mesa filesystem cache configuration' },\n ttl: { type: 'number', description: 'Mesa mount token lifetime in seconds' },\n readOnly: { type: 'boolean', description: 'Mount all repos as read-only', default: false },\n },\n },\n createFilesystem: config => new MesaFilesystem(config),\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/filesystem/index.ts","../src/provider.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import path from 'node:path/posix';\n\nimport type {\n CopyOptions,\n FileContent,\n FileEntry,\n FilesystemInfo,\n FileStat,\n ListOptions,\n MastraFilesystemOptions,\n ProviderStatus,\n ReadOptions,\n RemoveOptions,\n WriteOptions,\n} from '@mastra/core/workspace';\nimport {\n DirectoryNotEmptyError,\n DirectoryNotFoundError,\n FileExistsError,\n FileNotFoundError,\n IsDirectoryError,\n MastraFilesystem,\n NotDirectoryError,\n StaleFileError,\n WorkspaceReadOnlyError,\n} from '@mastra/core/workspace';\nimport { Mesa } from '@mesadev/sdk';\nimport type { Bash, MesaBashOptions, MesaFileSystem, MesaOptions, RepoConfig, TelemetryConfig } from '@mesadev/sdk';\n\ntype MesaFsStat = Awaited<ReturnType<MesaFileSystem['stat']>>;\ntype MesaDirent = Awaited<ReturnType<NonNullable<MesaFileSystem['readdirWithFileTypes']>>>[number];\n\nexport interface MesaFilesystemOptions extends MastraFilesystemOptions {\n /** Mesa API key. Falls back to MESA_API_KEY when omitted. */\n apiKey?: string;\n /** Block all write operations through the Mastra filesystem interface. */\n readOnly?: boolean;\n /** Mesa org slug. Falls back to Mesa SDK org inference when omitted. */\n org?: string;\n /** Mesa repos to mount. */\n repos: RepoConfig[];\n /** Mesa filesystem cache configuration. */\n cache?: {\n diskCache?: {\n path: string;\n maxSizeBytes?: number;\n };\n };\n /** Mesa mount token lifetime in seconds. */\n ttl?: number;\n /** Mesa filesystem telemetry configuration. */\n telemetry?: TelemetryConfig;\n /** Custom fetch implementation for Mesa API calls. */\n fetch?: MesaOptions['fetch'];\n /** User agent for Mesa API calls. */\n userAgent?: string;\n}\n\nfunction generateId(): string {\n return `mesa-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction normalizePath(inputPath: string): string {\n return path.normalize(inputPath.startsWith('/') ? inputPath : `/${inputPath}`);\n}\n\nfunction getExtension(name: string): string {\n const dot = name.lastIndexOf('.');\n return dot === -1 ? '' : name.slice(dot);\n}\n\nfunction matchesExtension(name: string, extensions?: string[]): boolean {\n if (!extensions) return true;\n const ext = getExtension(name);\n return extensions.some(candidate => candidate === ext || candidate === ext.slice(1));\n}\n\nfunction toMesaContent(content: FileContent): string | Uint8Array {\n if (typeof content === 'string') return content;\n if (Buffer.isBuffer(content)) return new Uint8Array(content);\n return content;\n}\n\ntype MesaErrorKind = 'notFound' | 'alreadyExists' | 'notDirectory' | 'isDirectory' | 'directoryNotEmpty';\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction getMesaErrorKind(error: unknown): MesaErrorKind | undefined {\n const err =\n error && typeof error === 'object' ? (error as { code?: unknown; name?: unknown; message?: unknown }) : undefined;\n const code = typeof err?.code === 'string' ? err.code : undefined;\n const name = typeof err?.name === 'string' ? err.name : undefined;\n\n for (const value of [code, name]) {\n switch (value) {\n case 'ENOENT':\n case 'NotFound':\n case 'NoSuchFile':\n case 'NoSuchKey':\n return 'notFound';\n case 'EEXIST':\n case 'AlreadyExists':\n return 'alreadyExists';\n case 'ENOTDIR':\n case 'NotDirectory':\n return 'notDirectory';\n case 'EISDIR':\n case 'IsDirectory':\n return 'isDirectory';\n case 'ENOTEMPTY':\n case 'DirectoryNotEmpty':\n return 'directoryNotEmpty';\n }\n }\n\n const message =\n typeof err?.message === 'string' ? err.message : error instanceof Error ? error.message : String(error);\n if (/\\b(no such file|not found|enoent)\\b/i.test(message)) return 'notFound';\n if (/\\b(already exists|eexist)\\b/i.test(message)) return 'alreadyExists';\n if (/\\b(not a directory|enotdir)\\b/i.test(message)) return 'notDirectory';\n if (/\\b(is a directory|eisdir)\\b/i.test(message)) return 'isDirectory';\n if (/\\b(directory not empty|enotempty)\\b/i.test(message)) return 'directoryNotEmpty';\n\n return undefined;\n}\n\nfunction mapMesaError(error: unknown, inputPath: string, context: 'file' | 'directory' = 'file'): Error {\n switch (getMesaErrorKind(error)) {\n case 'notFound':\n return context === 'directory' ? new DirectoryNotFoundError(inputPath) : new FileNotFoundError(inputPath);\n case 'alreadyExists':\n return new FileExistsError(inputPath);\n case 'notDirectory':\n return new NotDirectoryError(inputPath);\n case 'isDirectory':\n return new IsDirectoryError(inputPath);\n case 'directoryNotEmpty':\n return new DirectoryNotEmptyError(inputPath);\n default:\n return toError(error);\n }\n}\n\n/**\n * Workspace filesystem adapter backed by Mesa.\n *\n * This provider runs in the Mastra process and implements the workspace file\n * API against Mesa repos. It does not mount Mesa into a sandbox.\n */\nexport class MesaFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'MesaFilesystem';\n readonly provider = 'mesa';\n readonly readOnly?: boolean;\n readonly icon = 'mesa';\n readonly displayName = 'Mesa';\n readonly description = 'Versioned Mesa filesystem for workspace files';\n\n status: ProviderStatus = 'pending';\n\n private readonly _apiKey?: string;\n private readonly _org?: string;\n private readonly _repos?: RepoConfig[];\n private readonly _cache?: {\n diskCache?: {\n path: string;\n maxSizeBytes?: number;\n };\n };\n private readonly _ttl?: number;\n private readonly _telemetry?: TelemetryConfig;\n private readonly _fetch?: MesaOptions['fetch'];\n private readonly _userAgent?: string;\n\n private _mesa?: Mesa;\n private _filesystem?: MesaFileSystem;\n\n constructor(options: MesaFilesystemOptions) {\n super({ name: 'MesaFilesystem', ...options });\n\n this.id = generateId();\n this.readOnly = options.readOnly;\n this._org = options.org;\n this._repos = options.repos;\n this._apiKey = options.apiKey;\n this._cache = options.cache;\n this._ttl = options.ttl;\n this._telemetry = options.telemetry;\n this._fetch = options.fetch;\n this._userAgent = options.userAgent;\n }\n\n /**\n * The active Mesa client, available after initialization when this instance\n * created the client itself.\n */\n get client(): Mesa | undefined {\n return this._mesa;\n }\n\n /**\n * The active Mesa filesystem. Accessing this before initialization throws.\n */\n get filesystem(): MesaFileSystem {\n if (!this._filesystem) {\n throw new Error('MesaFilesystem is not initialized. Call init() first or perform a filesystem operation.');\n }\n return this._filesystem;\n }\n\n override async init(): Promise<void> {\n if (!this._repos || this._repos.length === 0) {\n throw new Error('MesaFilesystem requires at least one repo.');\n }\n\n this._mesa = new Mesa({\n apiKey: this._apiKey,\n org: this._org,\n fetch: this._fetch,\n userAgent: this._userAgent,\n });\n\n const repos = this.readOnly ? this._repos.map(repo => ({ ...repo, readOnly: true })) : this._repos;\n this._filesystem = await this._mesa.fs.mount({\n repos,\n cache: this._cache,\n ttl: this._ttl,\n telemetry: this._telemetry,\n });\n }\n\n getInfo(): FilesystemInfo<{\n org?: string;\n repos?: string[];\n mode: 'mounted' | 'client';\n }> {\n return {\n id: this.id,\n name: this.name,\n provider: this.provider,\n status: this.status,\n error: this.error,\n readOnly: this.readOnly,\n icon: this.icon,\n metadata: {\n ...(this._org && { org: this._org }),\n ...(this._repos && { repos: this._repos.map(repo => repo.name) }),\n mode: 'client',\n },\n };\n }\n\n getInstructions(): string {\n const parts = ['Mesa filesystem. Paths are rooted at the Mesa mount. Include the org and repo name in paths.'];\n\n if (this._org) {\n parts.push(`Org: \"${this._org}\".`);\n } else {\n parts.push('Use the Mesa org resolved by the SDK as the first path segment.');\n }\n\n if (this._repos && this._repos.length > 0) {\n const repoNames = this._repos.map(repo => `\"${repo.name}\"`).join(', ');\n const firstRepo = this._repos[0]?.name ?? 'repo';\n const orgSegment = this._org ?? 'org';\n parts.push(`Mounted repos: ${repoNames}. For example \"/${orgSegment}/${firstRepo}/file.txt\".`);\n }\n\n parts.push('Files are versioned by Mesa.');\n\n if (this.readOnly) {\n parts.push('Mounted read-only.');\n }\n\n return parts.join(' ');\n }\n\n async readFile(inputPath: string, options?: ReadOptions): Promise<string | Buffer> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n const buffer = Buffer.from(await this.filesystem.readFileBuffer(target));\n if (options?.encoding) return buffer.toString(options.encoding);\n return buffer;\n } catch (error) {\n throw mapMesaError(error, inputPath);\n }\n }\n\n async writeFile(inputPath: string, content: FileContent, options?: WriteOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('writeFile');\n const target = normalizePath(inputPath);\n\n if (options?.overwrite === false && (await this.exists(target))) {\n throw new FileExistsError(inputPath);\n }\n\n if (options?.expectedMtime) {\n await this.assertExpectedMtime(inputPath, options.expectedMtime);\n }\n\n if (options?.recursive === false) {\n await this.assertParentDirectoryExists(target);\n } else {\n await this.ensureParentDirectory(target);\n }\n\n try {\n await this.filesystem.writeFile(target, toMesaContent(content));\n } catch (error) {\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof NotDirectoryError) throw new NotDirectoryError(path.dirname(target));\n if (mapped instanceof FileNotFoundError) throw new DirectoryNotFoundError(path.dirname(target));\n throw mapped;\n }\n }\n\n async appendFile(inputPath: string, content: FileContent): Promise<void> {\n await this.ensureReady();\n this.assertWritable('appendFile');\n const target = normalizePath(inputPath);\n\n await this.ensureParentDirectory(target);\n\n try {\n await this.filesystem.appendFile(target, toMesaContent(content));\n } catch (error) {\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof FileNotFoundError) throw new DirectoryNotFoundError(path.dirname(target));\n throw mapped;\n }\n }\n\n async deleteFile(inputPath: string, options?: RemoveOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('deleteFile');\n const target = normalizePath(inputPath);\n\n try {\n const stats = await this.filesystem.stat(target);\n if (stats.isDirectory) throw new IsDirectoryError(inputPath);\n await this.filesystem.rm(target, { force: options?.force });\n } catch (error) {\n if (error instanceof IsDirectoryError) throw error;\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof FileNotFoundError) {\n if (options?.force) return;\n throw mapped;\n }\n throw mapped;\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('copyFile');\n const source = normalizePath(src);\n const target = normalizePath(dest);\n\n if (options?.overwrite === false && (await this.exists(target))) {\n throw new FileExistsError(dest);\n }\n\n await this.ensureParentDirectory(target);\n\n try {\n await this.filesystem.cp(source, target, { recursive: options?.recursive });\n } catch (error) {\n const mapped = mapMesaError(error, src);\n if (mapped instanceof FileExistsError) throw new FileExistsError(dest);\n throw mapped;\n }\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('moveFile');\n const source = normalizePath(src);\n const target = normalizePath(dest);\n\n if (options?.overwrite === false && (await this.exists(target))) {\n throw new FileExistsError(dest);\n }\n\n await this.ensureParentDirectory(target);\n\n try {\n await this.filesystem.mv(source, target);\n } catch (error) {\n const mapped = mapMesaError(error, src);\n if (mapped instanceof FileExistsError) throw new FileExistsError(dest);\n throw mapped;\n }\n }\n\n async mkdir(inputPath: string, options?: { recursive?: boolean }): Promise<void> {\n await this.ensureReady();\n this.assertWritable('mkdir');\n const target = normalizePath(inputPath);\n\n try {\n await this.filesystem.mkdir(target, { recursive: options?.recursive ?? true });\n } catch (error) {\n const mapped = mapMesaError(error, inputPath);\n if (mapped instanceof FileNotFoundError) throw new DirectoryNotFoundError(path.dirname(target));\n throw mapped;\n }\n }\n\n async rmdir(inputPath: string, options?: RemoveOptions): Promise<void> {\n await this.ensureReady();\n this.assertWritable('rmdir');\n const target = normalizePath(inputPath);\n\n try {\n const stats = await this.filesystem.stat(target);\n if (!stats.isDirectory) throw new NotDirectoryError(inputPath);\n\n if (!options?.recursive) {\n const entries = await this.filesystem.readdirWithFileTypes(target);\n if (entries.length > 0) throw new DirectoryNotEmptyError(inputPath);\n }\n\n await this.filesystem.rm(target, { recursive: options?.recursive ?? true, force: options?.force });\n } catch (error) {\n if (error instanceof NotDirectoryError) throw error;\n if (error instanceof DirectoryNotEmptyError) throw error;\n const mapped = mapMesaError(error, inputPath, 'directory');\n if (mapped instanceof DirectoryNotFoundError) {\n if (options?.force) return;\n throw mapped;\n }\n throw mapped;\n }\n }\n\n async readdir(inputPath: string, options?: ListOptions): Promise<FileEntry[]> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n return await this.readDirectory(target, options);\n } catch (error) {\n throw mapMesaError(error, inputPath, 'directory');\n }\n }\n\n async exists(inputPath: string): Promise<boolean> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n return await this.filesystem.exists(target);\n } catch (error) {\n if (getMesaErrorKind(error) === 'notFound') return false;\n throw mapMesaError(error, inputPath);\n }\n }\n\n async stat(inputPath: string): Promise<FileStat> {\n await this.ensureReady();\n const target = normalizePath(inputPath);\n\n try {\n const stats = await this.filesystem.stat(target);\n return this.toFileStat(target, stats);\n } catch (error) {\n throw mapMesaError(error, inputPath);\n }\n }\n\n async realpath(inputPath: string): Promise<string> {\n await this.ensureReady();\n try {\n return await this.filesystem.realpath(normalizePath(inputPath));\n } catch (error) {\n throw mapMesaError(error, inputPath);\n }\n }\n\n /**\n * Create a Mesa-backed Bash runtime for this filesystem.\n */\n async bash(options?: MesaBashOptions): Promise<Bash> {\n await this.ensureReady();\n return this.filesystem.bash(options);\n }\n\n /**\n * Mesa change management operations for the mounted filesystem.\n */\n get change(): MesaFileSystem['change'] {\n return this.filesystem.change;\n }\n\n /**\n * Mesa bookmark management operations for the mounted filesystem.\n */\n get bookmark(): MesaFileSystem['bookmark'] {\n return this.filesystem.bookmark;\n }\n\n private assertWritable(operation: string): void {\n if (this.readOnly) {\n throw new WorkspaceReadOnlyError(operation);\n }\n }\n\n private async assertExpectedMtime(inputPath: string, expectedMtime: Date): Promise<void> {\n try {\n const currentStat = await this.stat(inputPath);\n if (currentStat.modifiedAt.getTime() !== expectedMtime.getTime()) {\n throw new StaleFileError(inputPath, expectedMtime, currentStat.modifiedAt);\n }\n } catch (error) {\n if (error instanceof StaleFileError) throw error;\n if (error instanceof FileNotFoundError) return;\n throw error;\n }\n }\n\n private async ensureParentDirectory(inputPath: string): Promise<void> {\n const parent = path.dirname(inputPath);\n if (parent === '/' || parent === inputPath) return;\n\n try {\n await this.filesystem.mkdir(parent, { recursive: true });\n } catch (error) {\n const mapped = mapMesaError(error, parent, 'directory');\n if (!(mapped instanceof FileExistsError)) throw mapped;\n try {\n const stats = await this.filesystem.stat(parent);\n if (!stats.isDirectory) {\n throw new NotDirectoryError(parent);\n }\n } catch (statError) {\n if (statError instanceof NotDirectoryError) throw statError;\n throw mapMesaError(statError, parent, 'directory');\n }\n }\n }\n\n private async assertParentDirectoryExists(inputPath: string): Promise<void> {\n const parent = path.dirname(inputPath);\n if (parent === '/' || parent === inputPath) return;\n\n try {\n const stats = await this.filesystem.stat(parent);\n if (!stats.isDirectory) {\n throw new NotDirectoryError(parent);\n }\n } catch (error) {\n if (error instanceof NotDirectoryError) throw error;\n throw mapMesaError(error, parent, 'directory');\n }\n }\n\n private async readDirectory(inputPath: string, options?: ListOptions, depth = 0): Promise<FileEntry[]> {\n const entries = await this.filesystem.readdirWithFileTypes(inputPath);\n const extensions = options?.extension\n ? Array.isArray(options.extension)\n ? options.extension\n : [options.extension]\n : undefined;\n\n const result: FileEntry[] = [];\n for (const entry of entries) {\n const childPath = path.join(inputPath, entry.name);\n if (entry.isFile) {\n if (matchesExtension(entry.name, extensions)) {\n const stat = await this.safeStat(childPath);\n result.push({ name: entry.name, type: 'file', size: stat?.size });\n }\n continue;\n }\n\n if (entry.isDirectory) {\n result.push({ name: entry.name, type: 'directory' });\n\n if (options?.recursive && (options.maxDepth === undefined || depth < options.maxDepth)) {\n const childEntries = await this.readDirectory(childPath, options, depth + 1);\n result.push(...childEntries.map(child => ({ ...child, name: `${entry.name}/${child.name}` })));\n }\n continue;\n }\n\n result.push(this.toFileEntry(entry));\n }\n\n return result;\n }\n\n private async safeStat(inputPath: string): Promise<MesaFsStat | undefined> {\n try {\n return await this.filesystem.stat(inputPath);\n } catch {\n return undefined;\n }\n }\n\n private toFileEntry(entry: MesaDirent): FileEntry {\n return {\n name: entry.name,\n type: entry.isDirectory ? 'directory' : 'file',\n isSymlink: entry.isSymbolicLink || undefined,\n };\n }\n\n private toFileStat(inputPath: string, stats: MesaFsStat): FileStat {\n const target = normalizePath(inputPath);\n\n return {\n name: target === '/' ? '/' : path.basename(target),\n path: target,\n type: stats.isDirectory ? 'directory' : 'file',\n size: stats.isDirectory ? 0 : stats.size,\n createdAt: stats.mtime,\n modifiedAt: stats.mtime,\n };\n }\n}\n","/**\n * Mesa filesystem provider descriptor for MastraEditor.\n */\nimport type { FilesystemProvider } from '@mastra/core/editor';\n\nimport { MesaFilesystem } from './filesystem';\nimport type { MesaFilesystemOptions } from './filesystem';\n\nexport const mesaFilesystemProvider: FilesystemProvider<MesaFilesystemOptions> = {\n id: 'mesa',\n name: 'Mesa',\n description: 'Versioned Mesa filesystem for workspace files',\n configSchema: {\n type: 'object',\n required: ['repos'],\n properties: {\n apiKey: { type: 'string', description: 'Mesa API key. Falls back to MESA_API_KEY when omitted.' },\n org: { type: 'string', description: 'Mesa org slug' },\n repos: {\n type: 'array',\n description: 'Mesa repos to mount',\n minItems: 1,\n items: {\n type: 'object',\n required: ['name'],\n properties: {\n name: { type: 'string', description: 'Mesa repo name' },\n bookmark: { type: 'string', description: 'Bookmark to mount' },\n changeId: { type: 'string', description: 'Change ID to mount' },\n readOnly: { type: 'boolean', description: 'Mount this repo as read-only' },\n },\n },\n },\n cache: {\n type: 'object',\n description: 'Mesa filesystem cache configuration',\n properties: {\n diskCache: {\n type: 'object',\n required: ['path'],\n properties: {\n path: { type: 'string', description: 'Disk cache path' },\n maxSizeBytes: { type: 'number', description: 'Maximum disk cache size in bytes' },\n },\n },\n },\n },\n ttl: { type: 'number', description: 'Mesa mount token lifetime in seconds' },\n readOnly: { type: 'boolean', description: 'Mount all repos as read-only', default: false },\n },\n },\n createFilesystem: config => new MesaFilesystem(config),\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/mesa",
|
|
3
|
-
"version": "0.0.0",
|
|
3
|
+
"version": "0.2.0-alpha.0",
|
|
4
4
|
"description": "Mesa filesystem provider for Mastra workspaces",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -18,30 +18,20 @@
|
|
|
18
18
|
},
|
|
19
19
|
"./package.json": "./package.json"
|
|
20
20
|
},
|
|
21
|
-
"scripts": {
|
|
22
|
-
"build": "tsup --silent --config tsup.config.ts",
|
|
23
|
-
"build:lib": "pnpm build",
|
|
24
|
-
"build:watch": "pnpm build --watch",
|
|
25
|
-
"test:unit": "vitest run --exclude '**/*.integration.test.ts'",
|
|
26
|
-
"test:watch": "vitest watch",
|
|
27
|
-
"test": "pnpm test:unit",
|
|
28
|
-
"test:cloud": "vitest run ./src/**/*.integration.test.ts",
|
|
29
|
-
"lint": "eslint ."
|
|
30
|
-
},
|
|
31
21
|
"license": "Apache-2.0",
|
|
32
22
|
"dependencies": {
|
|
33
23
|
"@mesadev/sdk": "0.38.0"
|
|
34
24
|
},
|
|
35
25
|
"devDependencies": {
|
|
36
|
-
"@internal/lint": "workspace:*",
|
|
37
|
-
"@internal/types-builder": "workspace:*",
|
|
38
|
-
"@internal/workspace-test-utils": "workspace:*",
|
|
39
|
-
"@mastra/core": "workspace:*",
|
|
40
26
|
"@types/node": "22.19.21",
|
|
41
27
|
"eslint": "^10.4.1",
|
|
42
28
|
"tsup": "^8.5.1",
|
|
43
|
-
"typescript": "
|
|
44
|
-
"vitest": "
|
|
29
|
+
"typescript": "^6.0.3",
|
|
30
|
+
"vitest": "4.1.8",
|
|
31
|
+
"@internal/types-builder": "0.0.85",
|
|
32
|
+
"@internal/lint": "0.0.110",
|
|
33
|
+
"@internal/workspace-test-utils": "0.0.54",
|
|
34
|
+
"@mastra/core": "1.49.0-alpha.2"
|
|
45
35
|
},
|
|
46
36
|
"peerDependencies": {
|
|
47
37
|
"@mastra/core": ">=1.4.0-0 <2.0.0-0"
|
|
@@ -61,5 +51,15 @@
|
|
|
61
51
|
},
|
|
62
52
|
"engines": {
|
|
63
53
|
"node": ">=22.13.0"
|
|
54
|
+
},
|
|
55
|
+
"scripts": {
|
|
56
|
+
"build": "tsup --silent --config tsup.config.ts",
|
|
57
|
+
"build:lib": "pnpm build",
|
|
58
|
+
"build:watch": "pnpm build --watch",
|
|
59
|
+
"test:unit": "vitest run --exclude '**/*.integration.test.ts'",
|
|
60
|
+
"test:watch": "vitest watch",
|
|
61
|
+
"test": "pnpm test:unit",
|
|
62
|
+
"test:cloud": "vitest run ./src/**/*.integration.test.ts",
|
|
63
|
+
"lint": "eslint ."
|
|
64
64
|
}
|
|
65
|
-
}
|
|
65
|
+
}
|