@mastra/gcs 0.1.1-alpha.0 → 0.2.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +127 -0
- package/LICENSE.md +15 -0
- package/dist/filesystem/index.d.ts +31 -0
- package/dist/filesystem/index.d.ts.map +1 -1
- package/dist/index.cjs +33 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -1
- package/package.json +11 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,132 @@
|
|
|
1
1
|
# @mastra/gcs
|
|
2
2
|
|
|
3
|
+
## 0.2.0-alpha.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Added public `storage` and `bucket` getters to access the underlying Google Cloud Storage instances directly. Use these when you need GCS features not exposed through the `WorkspaceFilesystem` interface. ([#14166](https://github.com/mastra-ai/mastra/pull/14166))
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
const gcsStorage = filesystem.storage;
|
|
11
|
+
const gcsBucket = filesystem.bucket;
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- Updated dependencies [[`9cede11`](https://github.com/mastra-ai/mastra/commit/9cede110abac9d93072e0521bb3c8bcafb9fdadf), [`a59f126`](https://github.com/mastra-ai/mastra/commit/a59f1269104f54726699c5cdb98c72c93606d2df), [`c510833`](https://github.com/mastra-ai/mastra/commit/c5108333e8cbc19dafee5f8bfefbcb5ee935335c), [`7296fcc`](https://github.com/mastra-ai/mastra/commit/7296fcc599c876a68699a71c7054a16d5aaf2337), [`00c27f9`](https://github.com/mastra-ai/mastra/commit/00c27f9080731433230a61be69c44e39a7a7b4c7), [`ee19c9b`](https://github.com/mastra-ai/mastra/commit/ee19c9ba3ec3ed91feb214ad539bdc766c53bb01)]:
|
|
17
|
+
- @mastra/core@1.12.0-alpha.1
|
|
18
|
+
|
|
19
|
+
## 0.1.1
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- Added editor provider descriptors for workspace filesystem, sandbox, and blob store packages. Each provider exports an object with `id`, `name`, `description`, `configSchema` (JSON Schema), and a factory method, enabling the editor UI to auto-discover and render configuration forms for workspace providers. ([#13156](https://github.com/mastra-ai/mastra/pull/13156))
|
|
24
|
+
- `@mastra/gcs`: Added `gcsFilesystemProvider` with config schema for bucket, projectId, credentials, prefix, readOnly, and endpoint
|
|
25
|
+
- `@mastra/e2b`: Added `e2bSandboxProvider` with config schema for template, timeout, env, metadata, runtimes, domain, and API settings
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
import { gcsFilesystemProvider } from '@mastra/gcs';
|
|
29
|
+
import { e2bSandboxProvider } from '@mastra/e2b';
|
|
30
|
+
|
|
31
|
+
const editor = new MastraEditor({
|
|
32
|
+
filesystems: {
|
|
33
|
+
gcs: gcsFilesystemProvider,
|
|
34
|
+
},
|
|
35
|
+
sandboxes: {
|
|
36
|
+
e2b: e2bSandboxProvider,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Enumerate available providers and their config schemas for UI rendering
|
|
41
|
+
const fsProviders = editor.getFilesystemProviders();
|
|
42
|
+
const sbProviders = editor.getSandboxProviders();
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
- Added workspace and skill storage domains with full CRUD, versioning, and implementations across LibSQL, Postgres, and MongoDB. Added `editor.workspace` and `editor.skill` namespaces for managing workspace configurations and skill definitions through the editor. Agents stored in the editor can now reference workspaces (by ID or inline config) and skills, with full hydration to runtime `Workspace` instances during agent resolution. ([#13156](https://github.com/mastra-ai/mastra/pull/13156))
|
|
46
|
+
|
|
47
|
+
**Filesystem-native skill versioning (draft → publish model):**
|
|
48
|
+
|
|
49
|
+
Skills are versioned as filesystem trees with content-addressable blob storage. The editing surface (live filesystem) is separated from the serving surface (versioned blob store), enabling a `draft → publish` workflow:
|
|
50
|
+
- `editor.skill.publish(skillId, source, skillPath)` — Snapshots a skill directory from the filesystem into blob storage, creates a new version with a tree manifest, and sets `activeVersionId`
|
|
51
|
+
- Version switching via `editor.skill.update({ id, activeVersionId })` — Points the skill to a previous version without re-publishing
|
|
52
|
+
- Publishing a skill automatically invalidates cached agents that reference it, so they re-hydrate with the updated version on next access
|
|
53
|
+
|
|
54
|
+
**Agent skill resolution strategies:**
|
|
55
|
+
|
|
56
|
+
Agents can reference skills with different resolution strategies:
|
|
57
|
+
- `strategy: 'latest'` — Resolves the skill's active version (honors `activeVersionId` for rollback)
|
|
58
|
+
- `pin: '<versionId>'` — Pins to a specific version, immune to publishes
|
|
59
|
+
- `strategy: 'live'` — Reads directly from the live filesystem (no blob store)
|
|
60
|
+
|
|
61
|
+
**Blob storage infrastructure:**
|
|
62
|
+
- `BlobStore` abstract class for content-addressable storage keyed by SHA-256 hash
|
|
63
|
+
- `InMemoryBlobStore` for testing
|
|
64
|
+
- LibSQL, Postgres, and MongoDB implementations
|
|
65
|
+
- `S3BlobStore` for storing blobs in S3 or S3-compatible storage (AWS, R2, MinIO, DO Spaces)
|
|
66
|
+
- `BlobStoreProvider` interface and `MastraEditorConfig.blobStores` registry for pluggable blob storage
|
|
67
|
+
- `VersionedSkillSource` and `CompositeVersionedSkillSource` for reading skill files from the blob store at runtime
|
|
68
|
+
|
|
69
|
+
**New storage types:**
|
|
70
|
+
- `StorageWorkspaceSnapshotType` and `StorageSkillSnapshotType` with corresponding input/output types
|
|
71
|
+
- `StorageWorkspaceRef` for ID-based or inline workspace references on agents
|
|
72
|
+
- `StorageSkillConfig` for per-agent skill overrides (`pin`, `strategy`, description, instructions)
|
|
73
|
+
- `SkillVersionTree` and `SkillVersionTreeEntry` for tree manifests
|
|
74
|
+
- `StorageBlobEntry` for content-addressable blob entries
|
|
75
|
+
- `SKILL_BLOBS_SCHEMA` for the `mastra_skill_blobs` table
|
|
76
|
+
|
|
77
|
+
**New editor namespaces:**
|
|
78
|
+
- `editor.workspace` — CRUD for workspace configs, plus `hydrateSnapshotToWorkspace()` for resolving to runtime `Workspace` instances
|
|
79
|
+
- `editor.skill` — CRUD for skill definitions, plus `publish()` for filesystem-to-blob snapshots
|
|
80
|
+
|
|
81
|
+
**Provider registries:**
|
|
82
|
+
- `MastraEditorConfig` accepts `filesystems`, `sandboxes`, and `blobStores` provider registries (keyed by provider ID)
|
|
83
|
+
- Built-in `local` filesystem and sandbox providers are auto-registered
|
|
84
|
+
- `editor.resolveBlobStore()` resolves from provider registry or falls back to the storage backend's blobs domain
|
|
85
|
+
- Providers expose `id`, `name`, `description`, `configSchema` (JSON Schema for UI form rendering), and a factory method
|
|
86
|
+
|
|
87
|
+
**Storage adapter support:**
|
|
88
|
+
- LibSQL: Full `workspaces`, `skills`, and `blobs` domain implementations
|
|
89
|
+
- Postgres: Full `workspaces`, `skills`, and `blobs` domain implementations
|
|
90
|
+
- MongoDB: Full `workspaces`, `skills`, and `blobs` domain implementations
|
|
91
|
+
- All three include `workspace`, `skills`, and `skillsFormat` fields on agent versions
|
|
92
|
+
|
|
93
|
+
**Server endpoints:**
|
|
94
|
+
- `GET/POST/PATCH/DELETE /stored/workspaces` — CRUD for stored workspaces
|
|
95
|
+
- `GET/POST/PATCH/DELETE /stored/skills` — CRUD for stored skills
|
|
96
|
+
- `POST /stored/skills/:id/publish` — Publish a skill from a filesystem source
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
import { MastraEditor } from '@mastra/editor';
|
|
100
|
+
import { s3FilesystemProvider, s3BlobStoreProvider } from '@mastra/s3';
|
|
101
|
+
import { e2bSandboxProvider } from '@mastra/e2b';
|
|
102
|
+
|
|
103
|
+
const editor = new MastraEditor({
|
|
104
|
+
filesystems: { s3: s3FilesystemProvider },
|
|
105
|
+
sandboxes: { e2b: e2bSandboxProvider },
|
|
106
|
+
blobStores: { s3: s3BlobStoreProvider },
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// Create a skill and publish it
|
|
110
|
+
const skill = await editor.skill.create({
|
|
111
|
+
name: 'Code Review',
|
|
112
|
+
description: 'Reviews code for best practices',
|
|
113
|
+
instructions: 'Analyze the code and provide feedback...',
|
|
114
|
+
});
|
|
115
|
+
await editor.skill.publish(skill.id, source, 'skills/code-review');
|
|
116
|
+
|
|
117
|
+
// Agents resolve skills by strategy
|
|
118
|
+
await editor.agent.create({
|
|
119
|
+
name: 'Dev Assistant',
|
|
120
|
+
model: { provider: 'openai', name: 'gpt-4' },
|
|
121
|
+
workspace: { type: 'id', workspaceId: workspace.id },
|
|
122
|
+
skills: { [skill.id]: { strategy: 'latest' } },
|
|
123
|
+
skillsFormat: 'xml',
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
- Updated dependencies [[`252580a`](https://github.com/mastra-ai/mastra/commit/252580a71feb0e46d0ccab04a70a79ff6a2ee0ab), [`f8e819f`](https://github.com/mastra-ai/mastra/commit/f8e819fabdfdc43d2da546a3ad81ba23685f603d), [`5c75261`](https://github.com/mastra-ai/mastra/commit/5c7526120d936757d4ffb7b82232e1641ebd45cb), [`e27d832`](https://github.com/mastra-ai/mastra/commit/e27d83281b5e166fd63a13969689e928d8605944), [`e37ef84`](https://github.com/mastra-ai/mastra/commit/e37ef8404043c94ca0c8e35ecdedb093b8087878), [`6fdd3d4`](https://github.com/mastra-ai/mastra/commit/6fdd3d451a07a8e7e216c62ac364f8dd8e36c2af), [`10cf521`](https://github.com/mastra-ai/mastra/commit/10cf52183344743a0d7babe24cd24fd78870c354), [`efdb682`](https://github.com/mastra-ai/mastra/commit/efdb682887f6522149769383908f9790c188ab88), [`0dee7a0`](https://github.com/mastra-ai/mastra/commit/0dee7a0ff4c2507e6eb6e6ee5f9738877ebd4ad1), [`04c2c8e`](https://github.com/mastra-ai/mastra/commit/04c2c8e888984364194131aecb490a3d6e920e61), [`02dc07a`](https://github.com/mastra-ai/mastra/commit/02dc07acc4ad42d93335825e3308f5b42266eba2), [`bb7262b`](https://github.com/mastra-ai/mastra/commit/bb7262b7c0ca76320d985b40510b6ffbbb936582), [`cf1c6e7`](https://github.com/mastra-ai/mastra/commit/cf1c6e789b131f55638fed52183a89d5078b4876), [`5ffadfe`](https://github.com/mastra-ai/mastra/commit/5ffadfefb1468ac2612b20bb84d24c39de6961c0), [`1e1339c`](https://github.com/mastra-ai/mastra/commit/1e1339cc276e571a48cfff5014487877086bfe68), [`d03df73`](https://github.com/mastra-ai/mastra/commit/d03df73f8fe9496064a33e1c3b74ba0479bf9ee6), [`79b8f45`](https://github.com/mastra-ai/mastra/commit/79b8f45a6767e1a5c3d56cd3c5b1214326b81661), [`9bbf08e`](https://github.com/mastra-ai/mastra/commit/9bbf08e3c20731c79dea13a765895b9fcf29cbf1), [`0a25952`](https://github.com/mastra-ai/mastra/commit/0a259526b5e1ac11e6efa53db1f140272962af2d), [`ffa5468`](https://github.com/mastra-ai/mastra/commit/ffa546857fc4821753979b3a34e13b4d76fbbcd4), [`3264a04`](https://github.com/mastra-ai/mastra/commit/3264a04e30340c3c5447433300a035ea0878df85), [`6fdd3d4`](https://github.com/mastra-ai/mastra/commit/6fdd3d451a07a8e7e216c62ac364f8dd8e36c2af), [`088d9ba`](https://github.com/mastra-ai/mastra/commit/088d9ba2577518703c52b0dccd617178d9ee6b0d), [`74fbebd`](https://github.com/mastra-ai/mastra/commit/74fbebd918a03832a2864965a8bea59bf617d3a2), [`aea6217`](https://github.com/mastra-ai/mastra/commit/aea621790bfb2291431b08da0cc5e6e150303ae7), [`b6a855e`](https://github.com/mastra-ai/mastra/commit/b6a855edc056e088279075506442ba1d6fa6def9), [`ae408ea`](https://github.com/mastra-ai/mastra/commit/ae408ea7128f0d2710b78d8623185198e7cb19c1), [`17e942e`](https://github.com/mastra-ai/mastra/commit/17e942eee2ba44985b1f807e6208cdde672f82f9), [`2015cf9`](https://github.com/mastra-ai/mastra/commit/2015cf921649f44c3f5bcd32a2c052335f8e49b4), [`7ef454e`](https://github.com/mastra-ai/mastra/commit/7ef454eaf9dcec6de60021c8f42192052dd490d6), [`2be1d99`](https://github.com/mastra-ai/mastra/commit/2be1d99564ce79acc4846071082bff353035a87a), [`2708fa1`](https://github.com/mastra-ai/mastra/commit/2708fa1055ac91c03e08b598869f6b8fb51fa37f), [`ba74aef`](https://github.com/mastra-ai/mastra/commit/ba74aef5716142dbbe931351f5243c9c6e4128a9), [`ba74aef`](https://github.com/mastra-ai/mastra/commit/ba74aef5716142dbbe931351f5243c9c6e4128a9), [`ec53e89`](https://github.com/mastra-ai/mastra/commit/ec53e8939c76c638991e21af762e51378eff7543), [`9b5a8cb`](https://github.com/mastra-ai/mastra/commit/9b5a8cb13e120811b0bf14140ada314f1c067894), [`607e66b`](https://github.com/mastra-ai/mastra/commit/607e66b02dc7f531ee37799f3456aa2dc0ca7ac5), [`a215d06`](https://github.com/mastra-ai/mastra/commit/a215d06758dcf590eabfe0b7afd4ae39bdbf082c), [`6909c74`](https://github.com/mastra-ai/mastra/commit/6909c74a7781e0447d475e9dbc1dc871b700f426), [`192438f`](https://github.com/mastra-ai/mastra/commit/192438f8a90c4f375e955f8ff179bf8dc6821a83)]:
|
|
128
|
+
- @mastra/core@1.5.0
|
|
129
|
+
|
|
3
130
|
## 0.1.1-alpha.0
|
|
4
131
|
|
|
5
132
|
### Patch Changes
|
package/LICENSE.md
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
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
|
+
|
|
1
16
|
# Apache License 2.0
|
|
2
17
|
|
|
3
18
|
Copyright (c) 2025 Kepler Software, Inc.
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* A filesystem implementation backed by Google Cloud Storage.
|
|
5
5
|
*/
|
|
6
|
+
import { Storage } from '@google-cloud/storage';
|
|
7
|
+
import type { Bucket } from '@google-cloud/storage';
|
|
6
8
|
import type { FileContent, FileStat, FileEntry, ReadOptions, WriteOptions, ListOptions, RemoveOptions, CopyOptions, FilesystemInfo, FilesystemMountConfig, FilesystemIcon, ProviderStatus, MastraFilesystemOptions } from '@mastra/core/workspace';
|
|
7
9
|
import { MastraFilesystem } from '@mastra/core/workspace';
|
|
8
10
|
/**
|
|
@@ -67,6 +69,35 @@ export declare class GCSFilesystem extends MastraFilesystem {
|
|
|
67
69
|
private _storage;
|
|
68
70
|
private _bucket;
|
|
69
71
|
constructor(options: GCSFilesystemOptions);
|
|
72
|
+
/**
|
|
73
|
+
* Get the underlying Google Cloud Storage instance for direct access to GCS APIs.
|
|
74
|
+
*
|
|
75
|
+
* Use this when you need to access GCS features not exposed through the
|
|
76
|
+
* WorkspaceFilesystem interface (e.g., signed URLs, IAM, custom metadata, etc.).
|
|
77
|
+
*
|
|
78
|
+
* @example Access other buckets
|
|
79
|
+
* ```typescript
|
|
80
|
+
* const storage = fs.storage;
|
|
81
|
+
* const [buckets] = await storage.getBuckets();
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
get storage(): Storage;
|
|
85
|
+
/**
|
|
86
|
+
* Get the underlying GCS Bucket instance for direct access to bucket operations.
|
|
87
|
+
*
|
|
88
|
+
* Use this when you need to access bucket features not exposed through the
|
|
89
|
+
* WorkspaceFilesystem interface (e.g., signed URLs, lifecycle rules, etc.).
|
|
90
|
+
*
|
|
91
|
+
* @example Generate a signed URL
|
|
92
|
+
* ```typescript
|
|
93
|
+
* const bucket = fs.bucket;
|
|
94
|
+
* const [url] = await bucket.file('my-file.txt').getSignedUrl({
|
|
95
|
+
* action: 'read',
|
|
96
|
+
* expires: Date.now() + 15 * 60 * 1000,
|
|
97
|
+
* });
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
get bucket(): Bucket;
|
|
70
101
|
/**
|
|
71
102
|
* Get mount configuration for E2B sandbox.
|
|
72
103
|
* Returns GCS-compatible config that works with gcsfuse.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/filesystem/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/filesystem/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -83,6 +83,39 @@ var GCSFilesystem = class extends workspace.MastraFilesystem {
|
|
|
83
83
|
this.description = options.description;
|
|
84
84
|
this.readOnly = options.readOnly;
|
|
85
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Get the underlying Google Cloud Storage instance for direct access to GCS APIs.
|
|
88
|
+
*
|
|
89
|
+
* Use this when you need to access GCS features not exposed through the
|
|
90
|
+
* WorkspaceFilesystem interface (e.g., signed URLs, IAM, custom metadata, etc.).
|
|
91
|
+
*
|
|
92
|
+
* @example Access other buckets
|
|
93
|
+
* ```typescript
|
|
94
|
+
* const storage = fs.storage;
|
|
95
|
+
* const [buckets] = await storage.getBuckets();
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
get storage() {
|
|
99
|
+
return this.getStorage();
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get the underlying GCS Bucket instance for direct access to bucket operations.
|
|
103
|
+
*
|
|
104
|
+
* Use this when you need to access bucket features not exposed through the
|
|
105
|
+
* WorkspaceFilesystem interface (e.g., signed URLs, lifecycle rules, etc.).
|
|
106
|
+
*
|
|
107
|
+
* @example Generate a signed URL
|
|
108
|
+
* ```typescript
|
|
109
|
+
* const bucket = fs.bucket;
|
|
110
|
+
* const [url] = await bucket.file('my-file.txt').getSignedUrl({
|
|
111
|
+
* action: 'read',
|
|
112
|
+
* expires: Date.now() + 15 * 60 * 1000,
|
|
113
|
+
* });
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
get bucket() {
|
|
117
|
+
return this.getBucket();
|
|
118
|
+
}
|
|
86
119
|
/**
|
|
87
120
|
* Get mount configuration for E2B sandbox.
|
|
88
121
|
* Returns GCS-compatible config that works with gcsfuse.
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/filesystem/index.ts","../src/provider.ts"],"names":["MastraFilesystem","Storage","FileNotFoundError","FileExistsError","bucket","prefix"],"mappings":";;;;;;AAyCA,IAAM,UAAA,GAAqC;AAAA;AAAA,EAEzC,MAAA,EAAQ,YAAA;AAAA,EACR,KAAA,EAAO,eAAA;AAAA,EACP,WAAA,EAAa,eAAA;AAAA,EACb,OAAA,EAAS,WAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,UAAA;AAAA,EACR,MAAA,EAAQ,UAAA;AAAA,EACR,MAAA,EAAQ,UAAA;AAAA;AAAA,EAER,KAAA,EAAO,iBAAA;AAAA,EACP,MAAA,EAAQ,iBAAA;AAAA,EACR,KAAA,EAAO,iBAAA;AAAA,EACP,MAAA,EAAQ,iBAAA;AAAA,EACR,MAAA,EAAQ,iBAAA;AAAA,EACR,OAAA,EAAS,kBAAA;AAAA,EACT,OAAA,EAAS,WAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,KAAA,EAAO,eAAA;AAAA,EACP,KAAA,EAAO,aAAA;AAAA,EACP,KAAA,EAAO,oBAAA;AAAA,EACP,OAAA,EAAS,oBAAA;AAAA;AAAA,EAET,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,YAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,eAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,cAAA;AAAA;AAAA,EAER,MAAA,EAAQ,iBAAA;AAAA;AAAA,EAER,MAAA,EAAQ,iBAAA;AAAA,EACR,KAAA,EAAO,kBAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAKA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,MAAM,MAAM,IAAA,CAAK,WAAA,GAAc,KAAA,CAAM,UAAU,IAAI,CAAC,CAAA;AACpD,EAAA,OAAO,GAAA,GAAO,UAAA,CAAW,GAAG,CAAA,IAAK,0BAAA,GAA8B,0BAAA;AACjE;AAqFA,SAAS,YAAY,CAAA,EAAmB;AACtC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,MAAM,CAAA,CAAE,MAAA;AACZ,EAAA,OAAO,KAAA,GAAQ,GAAA,IAAO,CAAA,CAAE,KAAK,MAAM,GAAA,EAAK,KAAA,EAAA;AACxC,EAAA,OAAO,MAAM,KAAA,IAAS,CAAA,CAAE,GAAA,GAAM,CAAC,MAAM,GAAA,EAAK,GAAA,EAAA;AAC1C,EAAA,OAAO,CAAA,CAAE,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAC3B;AAEO,IAAM,aAAA,GAAN,cAA4BA,0BAAA,CAAiB;AAAA,EACzC,EAAA;AAAA,EACA,IAAA,GAAO,eAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX,QAAA;AAAA,EAET,MAAA,GAAyB,SAAA;AAAA;AAAA,EAGhB,WAAA;AAAA,EACA,IAAA,GAAuB,KAAA;AAAA,EACvB,WAAA;AAAA,EAEQ,UAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EAET,QAAA,GAA2B,IAAA;AAAA,EAC3B,OAAA,GAAyB,IAAA;AAAA,EAEjC,YAAY,OAAA,EAA+B;AACzC,IAAA,KAAA,CAAM,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,iBAAiB,CAAA;AAC3C,IAAA,IAAA,CAAK,EAAA,GAAK,QAAQ,EAAA,IAAM,CAAA,OAAA,EAAU,KAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,IAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACnG,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,MAAA;AAC1B,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAE3B,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA,GAAS,YAAY,OAAA,CAAQ,MAAM,IAAI,GAAA,GAAM,EAAA;AACnE,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAGxB,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,WAAA,IAAe,sBAAA;AAC1C,IAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,IAAA,IAAQ,KAAA;AAC5B,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAA,GAAiC;AAC/B,IAAA,MAAM,MAAA,GAAyB;AAAA,MAC7B,IAAA,EAAM,KAAA;AAAA,MACN,QAAQ,IAAA,CAAK;AAAA,KACf;AAGA,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,OAAO,IAAA,CAAK,gBAAgB,QAAA,EAAU;AAC5D,MAAA,MAAA,CAAO,iBAAA,GAAoB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,WAAW,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAIG;AACD,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,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAA,EAAU;AAAA,QACR,QAAQ,IAAA,CAAK,UAAA;AAAA,QACb,GAAI,IAAA,CAAK,QAAA,IAAY,EAAE,QAAA,EAAU,KAAK,QAAA,EAAS;AAAA,QAC/C,GAAI,IAAA,CAAK,MAAA,IAAU,EAAE,MAAA,EAAQ,KAAK,MAAA;AAAO;AAC3C,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAA,GAA0B;AACxB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,GAAW,WAAA,GAAc,YAAA;AAC7C,IAAA,OAAO,CAAA,gCAAA,EAAmC,IAAA,CAAK,UAAU,CAAA,GAAA,EAAM,MAAM,CAAA,8CAAA,CAAA;AAAA,EACvE;AAAA,EAEQ,UAAA,GAAsB;AAC5B,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAE/B,IAAA,MAAM,UAAoG,EAAC;AAE3G,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,OAAA,CAAQ,YAAY,IAAA,CAAK,SAAA;AAAA,IAC3B;AAEA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAI,OAAO,IAAA,CAAK,WAAA,KAAgB,QAAA,EAAU;AAExC,QAAA,OAAA,CAAQ,cAAc,IAAA,CAAK,WAAA;AAAA,MAC7B,CAAA,MAAO;AAEL,QAAA,OAAA,CAAQ,cAAc,IAAA,CAAK,WAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,OAAA,CAAQ,cAAc,IAAA,CAAK,QAAA;AAAA,IAC7B;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAIC,eAAA,CAAQ,OAAO,CAAA;AACnC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEQ,SAAA,GAAoB;AAC1B,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,OAAO,IAAA,CAAK,OAAA;AAE9B,IAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAC7C,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,cAAA,GAAkC;AAC9C,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,KAAK,SAAA,EAAU;AAAA,EACxB;AAAA,EAEQ,MAAM,IAAA,EAAsB;AAElC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACzC,IAAA,OAAO,KAAK,MAAA,GAAS,SAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAA,CAAS,IAAA,EAAc,OAAA,EAAiD;AAC5E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA,EAAe;AACzC,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEzC,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAK,QAAA,EAAS;AAEtC,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAAA,MAC1C;AACA,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,KAAA,IAAS,KAAA,CAAM,SAAS,GAAA,EAAK;AAC/E,QAAA,MAAM,IAAIC,4BAAkB,IAAI,CAAA;AAAA,MAClC;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CAAU,IAAA,EAAc,OAAA,EAAsB,OAAA,EAAuC;AACzF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA,EAAe;AACzC,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEzC,IAAA,IAAI,SAAS,SAAA,KAAc,KAAA,IAAU,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAI;AAC7D,MAAA,MAAM,IAAIC,0BAAgB,IAAI,CAAA;AAAA,IAChC;AAEA,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,KAAY,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAC9F,IAAA,MAAM,WAAA,GAAc,YAAY,IAAI,CAAA;AAEpC,IAAA,MAAM,IAAA,CAAK,KAAK,IAAA,EAAM;AAAA,MACpB,WAAA;AAAA,MACA,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,UAAA,CAAW,IAAA,EAAc,OAAA,EAAqC;AAElE,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,IAAI;AACF,MAAA,QAAA,GAAY,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,EAAE,QAAA,EAAU,SAAS,CAAA;AAAA,IAC7D,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiBD,2BAAA,EAAmB,CAExC,MAAO;AACL,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA;AACnG,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,QAAA,GAAW,aAAa,CAAA;AAAA,EACrD;AAAA,EAEA,MAAM,UAAA,CAAW,IAAA,EAAc,OAAA,EAAwC;AAErE,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACzC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,IAAA,CAAK,MAAM,IAAA,EAAM,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,CAAA;AACjE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA,EAAe;AACzC,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEzC,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,MAAA,EAAO;AAAA,IACpB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,CAAC,SAAS,KAAA,EAAO;AACnB,QAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,KAAA,IAAS,KAAA,CAAM,SAAS,GAAA,EAAK;AAC/E,UAAA,MAAM,IAAIA,4BAAkB,IAAI,CAAA;AAAA,QAClC;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,CAAS,GAAA,EAAa,IAAA,EAAc,OAAA,EAAsC;AAC9E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA,EAAe;AACzC,IAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAC3C,IAAA,MAAM,WAAW,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAE7C,IAAA,IAAI,SAAS,SAAA,KAAc,KAAA,IAAU,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAI;AAC7D,MAAA,MAAM,IAAIC,0BAAgB,IAAI,CAAA;AAAA,IAChC;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,KAAA,IAAS,KAAA,CAAM,SAAS,GAAA,EAAK;AAC/E,QAAA,MAAM,IAAID,4BAAkB,GAAG,CAAA;AAAA,MACjC;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,CAAS,GAAA,EAAa,IAAA,EAAc,OAAA,EAAsC;AAC9E,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,IAAA,EAAM,OAAO,CAAA;AACtC,IAAA,MAAM,KAAK,UAAA,CAAW,GAAA,EAAK,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,CAAM,KAAA,EAAe,QAAA,EAAmD;AAAA,EAG9E;AAAA,EAEA,MAAM,KAAA,CAAM,IAAA,EAAc,OAAA,EAAwC;AAChE,IAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AAEvB,MAAA,MAAME,OAAAA,GAAS,MAAM,IAAA,CAAK,cAAA,EAAe;AACzC,MAAA,MAAMC,OAAAA,GAAS,KAAK,KAAA,CAAM,IAAI,EAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,GAAA;AACrD,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAMD,OAAAA,CAAO,QAAA,CAAS,EAAE,MAAA,EAAAC,OAAAA,EAAQ,UAAA,EAAY,CAAA,EAAG,CAAA;AAC/D,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAE,CAAA;AAAA,MAChD;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA,EAAe;AACzC,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,IAAI,EAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,GAAA;AAErD,IAAA,MAAM,MAAA,CAAO,WAAA,CAAY,EAAE,MAAA,EAAQ,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAc,OAAA,EAA6C;AACvE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA,EAAe;AAEzC,IAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACjD,IAAA,MAAM,YAAA,GAAe,MAAA,GAAS,MAAA,GAAS,GAAA,GAAM,EAAA;AAE7C,IAAA,MAAM,UAAuB,EAAC;AAC9B,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAEjC,IAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,OAAO,QAAA,CAAS;AAAA,MACpC,MAAA,EAAQ,YAAA;AAAA,MACR,YAAA,EAAc;AAAA,KACf,CAAA;AAED,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,MAAM,IAAA,CAAK,IAAA;AACjB,MAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,YAAA,EAAc;AAElC,MAAA,MAAM,YAAA,GAAe,GAAA,CAAI,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA;AAClD,MAAA,IAAI,CAAC,YAAA,EAAc;AAGnB,MAAA,IAAI,YAAA,CAAa,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9B,QAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACxC,QAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1B,UAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AACpB,UAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,aAAa,CAAA;AAAA,QACnD;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,SAAS,SAAA,GAAY,YAAA,GAAe,aAAa,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAG1E,MAAA,IAAI,CAAC,IAAA,EAAM;AAGX,MAAA,IAAI,CAAC,OAAA,EAAS,SAAA,IAAa,YAAA,CAAa,QAAA,CAAS,GAAG,CAAA,EAAG;AACrD,QAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,UAAA,QAAA,CAAS,IAAI,IAAI,CAAA;AACjB,UAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,aAAa,CAAA;AAAA,QAC1C;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,IAAI,OAAA,CAAQ,SAAA,GAAY,CAAC,OAAA,CAAQ,SAAS,CAAA;AAC5F,QAAA,IAAI,CAAC,WAAW,IAAA,CAAK,CAAA,GAAA,KAAO,KAAK,QAAA,CAAS,GAAG,CAAC,CAAA,EAAG;AAC/C,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA;AAAA,QACA,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA,IAAQ,OAAO,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,GAAI;AAAA,OACjE,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,IAAA,EAAgC;AAC3C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAG3B,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA,EAAe;AACzC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAG5B,IAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,KAAK,MAAA,EAAO;AACnC,IAAA,IAAI,QAAQ,OAAO,IAAA;AAGnB,IAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,OAAO,QAAA,CAAS;AAAA,MACpC,MAAA,EAAQ,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,GAAA;AAAA,MACjC,UAAA,EAAY;AAAA,KACb,CAAA;AAED,IAAA,OAAO,MAAM,MAAA,GAAS,CAAA;AAAA,EACxB;AAAA,EAEA,MAAM,KAAK,IAAA,EAAiC;AAC1C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAG3B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,EAAA;AAAA,QACN,IAAA;AAAA,QACA,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,CAAA;AAAA,QACN,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,UAAA,sBAAgB,IAAA;AAAK,OACvB;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA,EAAe;AACzC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAE5B,IAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,KAAK,MAAA,EAAO;AACnC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAK,WAAA,EAAY;AAC1C,MAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,EAAA;AAEtC,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,IAAK,CAAA;AAAA,QAC/B,SAAA,EAAW,SAAS,WAAA,GAAc,IAAI,KAAK,QAAA,CAAS,WAAW,CAAA,mBAAI,IAAI,IAAA,EAAK;AAAA,QAC5E,UAAA,EAAY,SAAS,OAAA,GAAU,IAAI,KAAK,QAAA,CAAS,OAAO,CAAA,mBAAI,IAAI,IAAA;AAAK,OACvE;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACzC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA;AACtD,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,CAAA;AAAA,QACN,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,UAAA,sBAAgB,IAAA;AAAK,OACvB;AAAA,IACF;AAEA,IAAA,MAAM,IAAIH,4BAAkB,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,OAAO,IAAA,EAAgC;AAC3C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AAEjB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA,EAAe;AACzC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAE5B,IAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,KAAK,MAAA,EAAO;AACnC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,IAAA,EAAgC;AAChD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA,EAAe;AAEzC,IAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,OAAO,QAAA,CAAS;AAAA,MACpC,MAAA,EAAQ,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,GAAA;AAAA,MACjC,UAAA,EAAY;AAAA,KACb,CAAA;AAED,IAAA,OAAO,MAAM,MAAA,GAAS,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,IAAA,GAAsB;AAE1B,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,OAAO,MAAA,EAAO;AACrC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,IAAA,CAAK,UAAU,CAAA,gBAAA,CAAkB,CAAA;AAClE,QAAA,GAAA,CAAI,MAAA,GAAS,GAAA;AACb,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,IAAK,MAA8B,MAAA,EAAQ;AACzC,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,MAAM,OAAQ,KAAA,CAA4B,IAAA;AAC1C,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,QAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,QAAA,MAAM,MAAM,IAAI,KAAA;AAAA,UACd;AAAA;AAAA;AAAA;AAAA,SAIF;AACA,QAAA,GAAA,CAAI,MAAA,GAAS,IAAA;AACb,QAAA,MAAM,GAAA;AAAA,MACR;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AACF;;;ACvoBO,IAAM,qBAAA,GAAkE;AAAA,EAC7E,EAAA,EAAI,KAAA;AAAA,EACJ,IAAA,EAAM,sBAAA;AAAA,EACN,WAAA,EAAa,6BAAA;AAAA,EACb,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,CAAC,QAAQ,CAAA;AAAA,IACnB,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,iBAAA,EAAkB;AAAA,MACzD,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,gBAAA,EAAiB;AAAA,MAC3D,WAAA,EAAa;AAAA,QACX,WAAA,EAAa,qDAAA;AAAA,QACb,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,UAAS,EAAG,EAAE,IAAA,EAAM,QAAA,EAAU;AAAA,OAChD;AAAA,MACA,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uCAAA,EAAwC;AAAA,MAC/E,UAAU,EAAE,IAAA,EAAM,WAAW,WAAA,EAAa,oBAAA,EAAsB,SAAS,KAAA,EAAM;AAAA,MAC/E,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+CAAA;AAAgD;AAC3F,GACF;AAAA,EACA,gBAAA,EAAkB,CAAA,MAAA,KAAU,IAAI,aAAA,CAAc,MAAM;AACtD","file":"index.cjs","sourcesContent":["/**\n * GCS Filesystem Provider\n *\n * A filesystem implementation backed by Google Cloud Storage.\n */\n\nimport { Storage } from '@google-cloud/storage';\nimport type { Bucket } from '@google-cloud/storage';\n\nimport type {\n FileContent,\n FileStat,\n FileEntry,\n ReadOptions,\n WriteOptions,\n ListOptions,\n RemoveOptions,\n CopyOptions,\n FilesystemInfo,\n FilesystemMountConfig,\n FilesystemIcon,\n ProviderStatus,\n MastraFilesystemOptions,\n} from '@mastra/core/workspace';\nimport { MastraFilesystem, FileNotFoundError, FileExistsError } from '@mastra/core/workspace';\n\n/**\n * GCS mount configuration.\n * Returned by GCSFilesystem.getMountConfig() for FUSE mounting in sandboxes.\n */\nexport interface GCSMountConfig extends FilesystemMountConfig {\n type: 'gcs';\n /** GCS bucket name */\n bucket: string;\n /** Service account key JSON (optional - omit for public buckets or ADC) */\n serviceAccountKey?: string;\n}\n\n/**\n * Common MIME types by file extension.\n */\nconst MIME_TYPES: Record<string, string> = {\n // Text\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.markdown': 'text/markdown',\n '.html': 'text/html',\n '.htm': 'text/html',\n '.css': 'text/css',\n '.csv': 'text/csv',\n '.xml': 'text/xml',\n // Code\n '.js': 'text/javascript',\n '.mjs': 'text/javascript',\n '.ts': 'text/typescript',\n '.tsx': 'text/typescript',\n '.jsx': 'text/javascript',\n '.json': 'application/json',\n '.yaml': 'text/yaml',\n '.yml': 'text/yaml',\n '.py': 'text/x-python',\n '.rb': 'text/x-ruby',\n '.sh': 'text/x-shellscript',\n '.bash': 'text/x-shellscript',\n // Images\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.ico': 'image/x-icon',\n // Documents\n '.pdf': 'application/pdf',\n // Archives\n '.zip': 'application/zip',\n '.gz': 'application/gzip',\n '.tar': 'application/x-tar',\n};\n\n/**\n * Get MIME type from file path extension.\n */\nfunction getMimeType(path: string): string {\n const ext = path.toLowerCase().match(/\\.[^.]+$/)?.[0];\n return ext ? (MIME_TYPES[ext] ?? 'application/octet-stream') : 'application/octet-stream';\n}\n\n/**\n * GCS filesystem provider configuration.\n */\nexport interface GCSFilesystemOptions extends MastraFilesystemOptions {\n /** Unique identifier for this filesystem instance */\n id?: string;\n /** GCS bucket name */\n bucket: string;\n /** Human-friendly display name for the UI */\n displayName?: string;\n /** Icon identifier for the UI (defaults to 'gcs') */\n icon?: FilesystemIcon;\n /** Description shown in tooltips */\n description?: string;\n /**\n * GCS project ID.\n * Required when using service account credentials.\n */\n projectId?: string;\n /**\n * Service account key JSON object or path to key file.\n * If not provided, uses Application Default Credentials (ADC).\n */\n credentials?: object | string;\n /** Optional prefix for all keys (acts like a subdirectory) */\n prefix?: string;\n /** Mount as read-only (blocks write operations, mounts read-only in sandboxes) */\n readOnly?: boolean;\n /**\n * Custom API endpoint URL.\n * Used for local development with emulators like fake-gcs-server.\n */\n endpoint?: string;\n}\n\n/**\n * GCS filesystem implementation.\n *\n * Stores files in a Google Cloud Storage bucket.\n * Supports mounting into E2B sandboxes via gcsfuse.\n *\n * @example Using Application Default Credentials\n * ```typescript\n * import { GCSFilesystem } from '@mastra/gcs';\n *\n * // Uses ADC (gcloud auth application-default login)\n * const fs = new GCSFilesystem({\n * bucket: 'my-bucket',\n * projectId: 'my-project',\n * });\n * ```\n *\n * @example Using Service Account Key\n * ```typescript\n * import { GCSFilesystem } from '@mastra/gcs';\n *\n * const fs = new GCSFilesystem({\n * bucket: 'my-bucket',\n * projectId: 'my-project',\n * credentials: {\n * type: 'service_account',\n * project_id: 'my-project',\n * private_key_id: '...',\n * private_key: '-----BEGIN PRIVATE KEY-----\\n...',\n * client_email: '...@...iam.gserviceaccount.com',\n * // ... rest of service account key\n * },\n * });\n * ```\n *\n * @example Using Key File Path\n * ```typescript\n * import { GCSFilesystem } from '@mastra/gcs';\n *\n * const fs = new GCSFilesystem({\n * bucket: 'my-bucket',\n * projectId: 'my-project',\n * credentials: '/path/to/service-account-key.json',\n * });\n * ```\n */\n\n/** Trim leading and trailing slashes without regex (avoids polynomial regex on user input). */\nfunction trimSlashes(s: string): string {\n let start = 0;\n let end = s.length;\n while (start < end && s[start] === '/') start++;\n while (end > start && s[end - 1] === '/') end--;\n return s.slice(start, end);\n}\n\nexport class GCSFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'GCSFilesystem';\n readonly provider = 'gcs';\n readonly readOnly?: boolean;\n\n status: ProviderStatus = 'pending';\n\n // Display metadata for UI\n readonly displayName?: string;\n readonly icon: FilesystemIcon = 'gcs';\n readonly description?: string;\n\n private readonly bucketName: string;\n private readonly projectId?: string;\n private readonly credentials?: object | string;\n private readonly prefix: string;\n private readonly endpoint?: string;\n\n private _storage: Storage | null = null;\n private _bucket: Bucket | null = null;\n\n constructor(options: GCSFilesystemOptions) {\n super({ ...options, name: 'GCSFilesystem' });\n this.id = options.id ?? `gcs-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n this.bucketName = options.bucket;\n this.projectId = options.projectId;\n this.credentials = options.credentials;\n // Trim leading/trailing slashes from prefix using iterative approach (avoids polynomial regex)\n this.prefix = options.prefix ? trimSlashes(options.prefix) + '/' : '';\n this.endpoint = options.endpoint;\n\n // Display metadata\n this.displayName = options.displayName ?? 'Google Cloud Storage';\n this.icon = options.icon ?? 'gcs';\n this.description = options.description;\n this.readOnly = options.readOnly;\n }\n\n /**\n * Get mount configuration for E2B sandbox.\n * Returns GCS-compatible config that works with gcsfuse.\n */\n getMountConfig(): GCSMountConfig {\n const config: GCSMountConfig = {\n type: 'gcs',\n bucket: this.bucketName,\n };\n\n // Include service account key if credentials are an object\n if (this.credentials && typeof this.credentials === 'object') {\n config.serviceAccountKey = JSON.stringify(this.credentials);\n }\n\n return config;\n }\n\n /**\n * Get filesystem info for status reporting.\n */\n getInfo(): FilesystemInfo<{\n bucket: string;\n endpoint?: string;\n prefix?: string;\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 bucket: this.bucketName,\n ...(this.endpoint && { endpoint: this.endpoint }),\n ...(this.prefix && { prefix: this.prefix }),\n },\n };\n }\n\n /**\n * Get instructions describing this GCS filesystem.\n * Used by agents to understand storage semantics.\n */\n getInstructions(): string {\n const access = this.readOnly ? 'Read-only' : 'Persistent';\n return `Google Cloud Storage in bucket \"${this.bucketName}\". ${access} storage - files are retained across sessions.`;\n }\n\n private getStorage(): Storage {\n if (this._storage) return this._storage;\n\n const options: { projectId?: string; credentials?: object; keyFilename?: string; apiEndpoint?: string } = {};\n\n if (this.projectId) {\n options.projectId = this.projectId;\n }\n\n if (this.credentials) {\n if (typeof this.credentials === 'string') {\n // Path to key file\n options.keyFilename = this.credentials;\n } else {\n // Credentials object\n options.credentials = this.credentials;\n }\n }\n\n if (this.endpoint) {\n options.apiEndpoint = this.endpoint;\n }\n\n this._storage = new Storage(options);\n return this._storage;\n }\n\n private getBucket(): Bucket {\n if (this._bucket) return this._bucket;\n\n const storage = this.getStorage();\n this._bucket = storage.bucket(this.bucketName);\n return this._bucket;\n }\n\n /**\n * Ensure the filesystem is initialized and return the bucket.\n * Uses base class ensureReady() for status management, then returns bucket.\n */\n private async getReadyBucket(): Promise<Bucket> {\n await this.ensureReady();\n return this.getBucket();\n }\n\n private toKey(path: string): string {\n // Remove leading slash and add prefix\n const cleanPath = path.replace(/^\\/+/, '');\n return this.prefix + cleanPath;\n }\n\n // ---------------------------------------------------------------------------\n // File Operations\n // ---------------------------------------------------------------------------\n\n async readFile(path: string, options?: ReadOptions): Promise<string | Buffer> {\n const bucket = await this.getReadyBucket();\n const file = bucket.file(this.toKey(path));\n\n try {\n const [content] = await file.download();\n\n if (options?.encoding) {\n return content.toString(options.encoding);\n }\n return content;\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 404) {\n throw new FileNotFoundError(path);\n }\n throw error;\n }\n }\n\n async writeFile(path: string, content: FileContent, options?: WriteOptions): Promise<void> {\n const bucket = await this.getReadyBucket();\n const file = bucket.file(this.toKey(path));\n\n if (options?.overwrite === false && (await this.exists(path))) {\n throw new FileExistsError(path);\n }\n\n const body = typeof content === 'string' ? Buffer.from(content, 'utf-8') : Buffer.from(content);\n const contentType = getMimeType(path);\n\n await file.save(body, {\n contentType,\n resumable: false,\n });\n }\n\n async appendFile(path: string, content: FileContent): Promise<void> {\n // GCS doesn't support append, so read + write\n let existing = '';\n try {\n existing = (await this.readFile(path, { encoding: 'utf-8' })) as string;\n } catch (error) {\n if (error instanceof FileNotFoundError) {\n // File doesn't exist, start fresh\n } else {\n throw error;\n }\n }\n\n const appendContent = typeof content === 'string' ? content : Buffer.from(content).toString('utf-8');\n await this.writeFile(path, existing + appendContent);\n }\n\n async deleteFile(path: string, options?: RemoveOptions): Promise<void> {\n // Check if this is a directory - if so, use rmdir instead\n const isDir = await this.isDirectory(path);\n if (isDir) {\n await this.rmdir(path, { recursive: true, force: options?.force });\n return;\n }\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(this.toKey(path));\n\n try {\n await file.delete();\n } catch (error: unknown) {\n if (!options?.force) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 404) {\n throw new FileNotFoundError(path);\n }\n throw error;\n }\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n const bucket = await this.getReadyBucket();\n const srcFile = bucket.file(this.toKey(src));\n const destFile = bucket.file(this.toKey(dest));\n\n if (options?.overwrite === false && (await this.exists(dest))) {\n throw new FileExistsError(dest);\n }\n\n try {\n await srcFile.copy(destFile);\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 404) {\n throw new FileNotFoundError(src);\n }\n throw error;\n }\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.copyFile(src, dest, options);\n await this.deleteFile(src, { force: true });\n }\n\n // ---------------------------------------------------------------------------\n // Directory Operations\n // ---------------------------------------------------------------------------\n\n async mkdir(_path: string, _options?: { recursive?: boolean }): Promise<void> {\n // GCS doesn't have real directories - they're just key prefixes\n // No-op, directories are created implicitly when files are written\n }\n\n async rmdir(path: string, options?: RemoveOptions): Promise<void> {\n if (!options?.recursive) {\n // Quick emptiness check — only fetch one object instead of full readdir\n const bucket = await this.getReadyBucket();\n const prefix = this.toKey(path).replace(/\\/$/, '') + '/';\n const [files] = await bucket.getFiles({ prefix, maxResults: 1 });\n if (files.length > 0) {\n throw new Error(`Directory not empty: ${path}`);\n }\n return;\n }\n\n // Delete all objects with this prefix\n const bucket = await this.getReadyBucket();\n const prefix = this.toKey(path).replace(/\\/$/, '') + '/';\n\n await bucket.deleteFiles({ prefix });\n }\n\n async readdir(path: string, options?: ListOptions): Promise<FileEntry[]> {\n const bucket = await this.getReadyBucket();\n\n const prefix = this.toKey(path).replace(/\\/$/, '');\n const searchPrefix = prefix ? prefix + '/' : '';\n\n const entries: FileEntry[] = [];\n const seenDirs = new Set<string>();\n\n const [files] = await bucket.getFiles({\n prefix: searchPrefix,\n autoPaginate: true,\n });\n\n for (const file of files) {\n const key = file.name;\n if (!key || key === searchPrefix) continue;\n\n const relativePath = key.slice(searchPrefix.length);\n if (!relativePath) continue;\n\n // Skip if this looks like a directory marker\n if (relativePath.endsWith('/')) {\n const dirName = relativePath.slice(0, -1);\n if (!seenDirs.has(dirName)) {\n seenDirs.add(dirName);\n entries.push({ name: dirName, type: 'directory' });\n }\n continue;\n }\n\n const name = options?.recursive ? relativePath : relativePath.split('/')[0];\n\n // Skip if name is undefined or empty\n if (!name) continue;\n\n // For non-recursive listing, if there's a slash, it's a directory\n if (!options?.recursive && relativePath.includes('/')) {\n if (!seenDirs.has(name)) {\n seenDirs.add(name);\n entries.push({ name, type: 'directory' });\n }\n continue;\n }\n\n // Filter by extension if specified\n if (options?.extension) {\n const extensions = Array.isArray(options.extension) ? options.extension : [options.extension];\n if (!extensions.some(ext => name.endsWith(ext))) {\n continue;\n }\n }\n\n entries.push({\n name,\n type: 'file',\n size: file.metadata.size != null ? Number(file.metadata.size) : undefined,\n });\n }\n\n return entries;\n }\n\n // ---------------------------------------------------------------------------\n // Path Operations\n // ---------------------------------------------------------------------------\n\n async exists(path: string): Promise<boolean> {\n const key = this.toKey(path);\n\n // Root path always exists (it's the bucket itself)\n if (!key) return true;\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(key);\n\n // Check if it's a file\n const [exists] = await file.exists();\n if (exists) return true;\n\n // Check if it's a \"directory\" (has objects with this prefix)\n const [files] = await bucket.getFiles({\n prefix: key.replace(/\\/$/, '') + '/',\n maxResults: 1,\n });\n\n return files.length > 0;\n }\n\n async stat(path: string): Promise<FileStat> {\n const key = this.toKey(path);\n\n // Root path is always a directory\n if (!key) {\n return {\n name: '',\n path,\n type: 'directory',\n size: 0,\n createdAt: new Date(),\n modifiedAt: new Date(),\n };\n }\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(key);\n\n const [exists] = await file.exists();\n if (exists) {\n const [metadata] = await file.getMetadata();\n const name = path.split('/').pop() ?? '';\n\n return {\n name,\n path,\n type: 'file',\n size: Number(metadata.size) || 0,\n createdAt: metadata.timeCreated ? new Date(metadata.timeCreated) : new Date(),\n modifiedAt: metadata.updated ? new Date(metadata.updated) : new Date(),\n };\n }\n\n // Check if it's a directory\n const isDir = await this.isDirectory(path);\n if (isDir) {\n const name = path.split('/').filter(Boolean).pop() ?? '';\n return {\n name,\n path,\n type: 'directory',\n size: 0,\n createdAt: new Date(),\n modifiedAt: new Date(),\n };\n }\n\n throw new FileNotFoundError(path);\n }\n\n async isFile(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return false; // Root is a directory, not a file\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(key);\n\n const [exists] = await file.exists();\n return exists;\n }\n\n async isDirectory(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return true; // Root is always a directory\n\n const bucket = await this.getReadyBucket();\n\n const [files] = await bucket.getFiles({\n prefix: key.replace(/\\/$/, '') + '/',\n maxResults: 1,\n });\n\n return files.length > 0;\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle (overrides base class protected methods)\n // ---------------------------------------------------------------------------\n\n /**\n * Initialize the GCS client.\n * Status management is handled by the base class.\n */\n async init(): Promise<void> {\n // Verify we can access the bucket\n const bucket = this.getBucket();\n try {\n const [exists] = await bucket.exists();\n if (!exists) {\n const err = new Error(`Bucket \"${this.bucketName}\" does not exist`) as Error & { status?: number };\n err.status = 404;\n throw err;\n }\n } catch (error) {\n // Check if error already has status (from our 404 throw above)\n if ((error as { status?: number }).status) {\n throw error;\n }\n // Extract status code from GCS errors and add to error for proper HTTP response\n const code = (error as { code?: number }).code;\n if (typeof code === 'number') {\n const message = error instanceof Error ? error.message : String(error);\n const err = new Error(\n message,\n // code === 403\n // ? `Access denied to bucket \"${this.bucketName}\" - check credentials and permissions`\n // : message,\n ) as Error & { status?: number };\n err.status = code;\n throw err;\n }\n throw error;\n }\n }\n\n /**\n * Clean up the GCS client.\n * Status management is handled by the base class.\n */\n async destroy(): Promise<void> {\n this._storage = null;\n this._bucket = null;\n }\n}\n","/**\n * GCS filesystem provider descriptor for MastraEditor.\n *\n * @example\n * ```typescript\n * import { gcsFilesystemProvider } from '@mastra/gcs';\n *\n * const editor = new MastraEditor({\n * filesystems: [gcsFilesystemProvider],\n * });\n * ```\n */\nimport type { FilesystemProvider } from '@mastra/core/editor';\nimport { GCSFilesystem } from './filesystem';\nimport type { GCSFilesystemOptions } from './filesystem';\n\nexport const gcsFilesystemProvider: FilesystemProvider<GCSFilesystemOptions> = {\n id: 'gcs',\n name: 'Google Cloud Storage',\n description: 'Google Cloud Storage bucket',\n configSchema: {\n type: 'object',\n required: ['bucket'],\n properties: {\n bucket: { type: 'string', description: 'GCS bucket name' },\n projectId: { type: 'string', description: 'GCS project ID' },\n credentials: {\n description: 'Service account key JSON object or path to key file',\n oneOf: [{ type: 'object' }, { type: 'string' }],\n },\n prefix: { type: 'string', description: 'Key prefix (acts like a subdirectory)' },\n readOnly: { type: 'boolean', description: 'Mount as read-only', default: false },\n endpoint: { type: 'string', description: 'Custom API endpoint URL (for local emulators)' },\n },\n },\n createFilesystem: config => new GCSFilesystem(config),\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/filesystem/index.ts","../src/provider.ts"],"names":["MastraFilesystem","Storage","FileNotFoundError","FileExistsError","bucket","prefix"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * GCS Filesystem Provider\n *\n * A filesystem implementation backed by Google Cloud Storage.\n */\n\nimport { Storage } from '@google-cloud/storage';\nimport type { Bucket } from '@google-cloud/storage';\n\nimport type {\n FileContent,\n FileStat,\n FileEntry,\n ReadOptions,\n WriteOptions,\n ListOptions,\n RemoveOptions,\n CopyOptions,\n FilesystemInfo,\n FilesystemMountConfig,\n FilesystemIcon,\n ProviderStatus,\n MastraFilesystemOptions,\n} from '@mastra/core/workspace';\nimport { MastraFilesystem, FileNotFoundError, FileExistsError } from '@mastra/core/workspace';\n\n/**\n * GCS mount configuration.\n * Returned by GCSFilesystem.getMountConfig() for FUSE mounting in sandboxes.\n */\nexport interface GCSMountConfig extends FilesystemMountConfig {\n type: 'gcs';\n /** GCS bucket name */\n bucket: string;\n /** Service account key JSON (optional - omit for public buckets or ADC) */\n serviceAccountKey?: string;\n}\n\n/**\n * Common MIME types by file extension.\n */\nconst MIME_TYPES: Record<string, string> = {\n // Text\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.markdown': 'text/markdown',\n '.html': 'text/html',\n '.htm': 'text/html',\n '.css': 'text/css',\n '.csv': 'text/csv',\n '.xml': 'text/xml',\n // Code\n '.js': 'text/javascript',\n '.mjs': 'text/javascript',\n '.ts': 'text/typescript',\n '.tsx': 'text/typescript',\n '.jsx': 'text/javascript',\n '.json': 'application/json',\n '.yaml': 'text/yaml',\n '.yml': 'text/yaml',\n '.py': 'text/x-python',\n '.rb': 'text/x-ruby',\n '.sh': 'text/x-shellscript',\n '.bash': 'text/x-shellscript',\n // Images\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.ico': 'image/x-icon',\n // Documents\n '.pdf': 'application/pdf',\n // Archives\n '.zip': 'application/zip',\n '.gz': 'application/gzip',\n '.tar': 'application/x-tar',\n};\n\n/**\n * Get MIME type from file path extension.\n */\nfunction getMimeType(path: string): string {\n const ext = path.toLowerCase().match(/\\.[^.]+$/)?.[0];\n return ext ? (MIME_TYPES[ext] ?? 'application/octet-stream') : 'application/octet-stream';\n}\n\n/**\n * GCS filesystem provider configuration.\n */\nexport interface GCSFilesystemOptions extends MastraFilesystemOptions {\n /** Unique identifier for this filesystem instance */\n id?: string;\n /** GCS bucket name */\n bucket: string;\n /** Human-friendly display name for the UI */\n displayName?: string;\n /** Icon identifier for the UI (defaults to 'gcs') */\n icon?: FilesystemIcon;\n /** Description shown in tooltips */\n description?: string;\n /**\n * GCS project ID.\n * Required when using service account credentials.\n */\n projectId?: string;\n /**\n * Service account key JSON object or path to key file.\n * If not provided, uses Application Default Credentials (ADC).\n */\n credentials?: object | string;\n /** Optional prefix for all keys (acts like a subdirectory) */\n prefix?: string;\n /** Mount as read-only (blocks write operations, mounts read-only in sandboxes) */\n readOnly?: boolean;\n /**\n * Custom API endpoint URL.\n * Used for local development with emulators like fake-gcs-server.\n */\n endpoint?: string;\n}\n\n/**\n * GCS filesystem implementation.\n *\n * Stores files in a Google Cloud Storage bucket.\n * Supports mounting into E2B sandboxes via gcsfuse.\n *\n * @example Using Application Default Credentials\n * ```typescript\n * import { GCSFilesystem } from '@mastra/gcs';\n *\n * // Uses ADC (gcloud auth application-default login)\n * const fs = new GCSFilesystem({\n * bucket: 'my-bucket',\n * projectId: 'my-project',\n * });\n * ```\n *\n * @example Using Service Account Key\n * ```typescript\n * import { GCSFilesystem } from '@mastra/gcs';\n *\n * const fs = new GCSFilesystem({\n * bucket: 'my-bucket',\n * projectId: 'my-project',\n * credentials: {\n * type: 'service_account',\n * project_id: 'my-project',\n * private_key_id: '...',\n * private_key: '-----BEGIN PRIVATE KEY-----\\n...',\n * client_email: '...@...iam.gserviceaccount.com',\n * // ... rest of service account key\n * },\n * });\n * ```\n *\n * @example Using Key File Path\n * ```typescript\n * import { GCSFilesystem } from '@mastra/gcs';\n *\n * const fs = new GCSFilesystem({\n * bucket: 'my-bucket',\n * projectId: 'my-project',\n * credentials: '/path/to/service-account-key.json',\n * });\n * ```\n */\n\n/** Trim leading and trailing slashes without regex (avoids polynomial regex on user input). */\nfunction trimSlashes(s: string): string {\n let start = 0;\n let end = s.length;\n while (start < end && s[start] === '/') start++;\n while (end > start && s[end - 1] === '/') end--;\n return s.slice(start, end);\n}\n\nexport class GCSFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'GCSFilesystem';\n readonly provider = 'gcs';\n readonly readOnly?: boolean;\n\n status: ProviderStatus = 'pending';\n\n // Display metadata for UI\n readonly displayName?: string;\n readonly icon: FilesystemIcon = 'gcs';\n readonly description?: string;\n\n private readonly bucketName: string;\n private readonly projectId?: string;\n private readonly credentials?: object | string;\n private readonly prefix: string;\n private readonly endpoint?: string;\n\n private _storage: Storage | null = null;\n private _bucket: Bucket | null = null;\n\n constructor(options: GCSFilesystemOptions) {\n super({ ...options, name: 'GCSFilesystem' });\n this.id = options.id ?? `gcs-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n this.bucketName = options.bucket;\n this.projectId = options.projectId;\n this.credentials = options.credentials;\n // Trim leading/trailing slashes from prefix using iterative approach (avoids polynomial regex)\n this.prefix = options.prefix ? trimSlashes(options.prefix) + '/' : '';\n this.endpoint = options.endpoint;\n\n // Display metadata\n this.displayName = options.displayName ?? 'Google Cloud Storage';\n this.icon = options.icon ?? 'gcs';\n this.description = options.description;\n this.readOnly = options.readOnly;\n }\n\n /**\n * Get the underlying Google Cloud Storage instance for direct access to GCS APIs.\n *\n * Use this when you need to access GCS features not exposed through the\n * WorkspaceFilesystem interface (e.g., signed URLs, IAM, custom metadata, etc.).\n *\n * @example Access other buckets\n * ```typescript\n * const storage = fs.storage;\n * const [buckets] = await storage.getBuckets();\n * ```\n */\n get storage(): Storage {\n return this.getStorage();\n }\n\n /**\n * Get the underlying GCS Bucket instance for direct access to bucket operations.\n *\n * Use this when you need to access bucket features not exposed through the\n * WorkspaceFilesystem interface (e.g., signed URLs, lifecycle rules, etc.).\n *\n * @example Generate a signed URL\n * ```typescript\n * const bucket = fs.bucket;\n * const [url] = await bucket.file('my-file.txt').getSignedUrl({\n * action: 'read',\n * expires: Date.now() + 15 * 60 * 1000,\n * });\n * ```\n */\n get bucket(): Bucket {\n return this.getBucket();\n }\n\n /**\n * Get mount configuration for E2B sandbox.\n * Returns GCS-compatible config that works with gcsfuse.\n */\n getMountConfig(): GCSMountConfig {\n const config: GCSMountConfig = {\n type: 'gcs',\n bucket: this.bucketName,\n };\n\n // Include service account key if credentials are an object\n if (this.credentials && typeof this.credentials === 'object') {\n config.serviceAccountKey = JSON.stringify(this.credentials);\n }\n\n return config;\n }\n\n /**\n * Get filesystem info for status reporting.\n */\n getInfo(): FilesystemInfo<{\n bucket: string;\n endpoint?: string;\n prefix?: string;\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 bucket: this.bucketName,\n ...(this.endpoint && { endpoint: this.endpoint }),\n ...(this.prefix && { prefix: this.prefix }),\n },\n };\n }\n\n /**\n * Get instructions describing this GCS filesystem.\n * Used by agents to understand storage semantics.\n */\n getInstructions(): string {\n const access = this.readOnly ? 'Read-only' : 'Persistent';\n return `Google Cloud Storage in bucket \"${this.bucketName}\". ${access} storage - files are retained across sessions.`;\n }\n\n private getStorage(): Storage {\n if (this._storage) return this._storage;\n\n const options: { projectId?: string; credentials?: object; keyFilename?: string; apiEndpoint?: string } = {};\n\n if (this.projectId) {\n options.projectId = this.projectId;\n }\n\n if (this.credentials) {\n if (typeof this.credentials === 'string') {\n // Path to key file\n options.keyFilename = this.credentials;\n } else {\n // Credentials object\n options.credentials = this.credentials;\n }\n }\n\n if (this.endpoint) {\n options.apiEndpoint = this.endpoint;\n }\n\n this._storage = new Storage(options);\n return this._storage;\n }\n\n private getBucket(): Bucket {\n if (this._bucket) return this._bucket;\n\n const storage = this.getStorage();\n this._bucket = storage.bucket(this.bucketName);\n return this._bucket;\n }\n\n /**\n * Ensure the filesystem is initialized and return the bucket.\n * Uses base class ensureReady() for status management, then returns bucket.\n */\n private async getReadyBucket(): Promise<Bucket> {\n await this.ensureReady();\n return this.getBucket();\n }\n\n private toKey(path: string): string {\n // Remove leading slash and add prefix\n const cleanPath = path.replace(/^\\/+/, '');\n return this.prefix + cleanPath;\n }\n\n // ---------------------------------------------------------------------------\n // File Operations\n // ---------------------------------------------------------------------------\n\n async readFile(path: string, options?: ReadOptions): Promise<string | Buffer> {\n const bucket = await this.getReadyBucket();\n const file = bucket.file(this.toKey(path));\n\n try {\n const [content] = await file.download();\n\n if (options?.encoding) {\n return content.toString(options.encoding);\n }\n return content;\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 404) {\n throw new FileNotFoundError(path);\n }\n throw error;\n }\n }\n\n async writeFile(path: string, content: FileContent, options?: WriteOptions): Promise<void> {\n const bucket = await this.getReadyBucket();\n const file = bucket.file(this.toKey(path));\n\n if (options?.overwrite === false && (await this.exists(path))) {\n throw new FileExistsError(path);\n }\n\n const body = typeof content === 'string' ? Buffer.from(content, 'utf-8') : Buffer.from(content);\n const contentType = getMimeType(path);\n\n await file.save(body, {\n contentType,\n resumable: false,\n });\n }\n\n async appendFile(path: string, content: FileContent): Promise<void> {\n // GCS doesn't support append, so read + write\n let existing = '';\n try {\n existing = (await this.readFile(path, { encoding: 'utf-8' })) as string;\n } catch (error) {\n if (error instanceof FileNotFoundError) {\n // File doesn't exist, start fresh\n } else {\n throw error;\n }\n }\n\n const appendContent = typeof content === 'string' ? content : Buffer.from(content).toString('utf-8');\n await this.writeFile(path, existing + appendContent);\n }\n\n async deleteFile(path: string, options?: RemoveOptions): Promise<void> {\n // Check if this is a directory - if so, use rmdir instead\n const isDir = await this.isDirectory(path);\n if (isDir) {\n await this.rmdir(path, { recursive: true, force: options?.force });\n return;\n }\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(this.toKey(path));\n\n try {\n await file.delete();\n } catch (error: unknown) {\n if (!options?.force) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 404) {\n throw new FileNotFoundError(path);\n }\n throw error;\n }\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n const bucket = await this.getReadyBucket();\n const srcFile = bucket.file(this.toKey(src));\n const destFile = bucket.file(this.toKey(dest));\n\n if (options?.overwrite === false && (await this.exists(dest))) {\n throw new FileExistsError(dest);\n }\n\n try {\n await srcFile.copy(destFile);\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 404) {\n throw new FileNotFoundError(src);\n }\n throw error;\n }\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.copyFile(src, dest, options);\n await this.deleteFile(src, { force: true });\n }\n\n // ---------------------------------------------------------------------------\n // Directory Operations\n // ---------------------------------------------------------------------------\n\n async mkdir(_path: string, _options?: { recursive?: boolean }): Promise<void> {\n // GCS doesn't have real directories - they're just key prefixes\n // No-op, directories are created implicitly when files are written\n }\n\n async rmdir(path: string, options?: RemoveOptions): Promise<void> {\n if (!options?.recursive) {\n // Quick emptiness check — only fetch one object instead of full readdir\n const bucket = await this.getReadyBucket();\n const prefix = this.toKey(path).replace(/\\/$/, '') + '/';\n const [files] = await bucket.getFiles({ prefix, maxResults: 1 });\n if (files.length > 0) {\n throw new Error(`Directory not empty: ${path}`);\n }\n return;\n }\n\n // Delete all objects with this prefix\n const bucket = await this.getReadyBucket();\n const prefix = this.toKey(path).replace(/\\/$/, '') + '/';\n\n await bucket.deleteFiles({ prefix });\n }\n\n async readdir(path: string, options?: ListOptions): Promise<FileEntry[]> {\n const bucket = await this.getReadyBucket();\n\n const prefix = this.toKey(path).replace(/\\/$/, '');\n const searchPrefix = prefix ? prefix + '/' : '';\n\n const entries: FileEntry[] = [];\n const seenDirs = new Set<string>();\n\n const [files] = await bucket.getFiles({\n prefix: searchPrefix,\n autoPaginate: true,\n });\n\n for (const file of files) {\n const key = file.name;\n if (!key || key === searchPrefix) continue;\n\n const relativePath = key.slice(searchPrefix.length);\n if (!relativePath) continue;\n\n // Skip if this looks like a directory marker\n if (relativePath.endsWith('/')) {\n const dirName = relativePath.slice(0, -1);\n if (!seenDirs.has(dirName)) {\n seenDirs.add(dirName);\n entries.push({ name: dirName, type: 'directory' });\n }\n continue;\n }\n\n const name = options?.recursive ? relativePath : relativePath.split('/')[0];\n\n // Skip if name is undefined or empty\n if (!name) continue;\n\n // For non-recursive listing, if there's a slash, it's a directory\n if (!options?.recursive && relativePath.includes('/')) {\n if (!seenDirs.has(name)) {\n seenDirs.add(name);\n entries.push({ name, type: 'directory' });\n }\n continue;\n }\n\n // Filter by extension if specified\n if (options?.extension) {\n const extensions = Array.isArray(options.extension) ? options.extension : [options.extension];\n if (!extensions.some(ext => name.endsWith(ext))) {\n continue;\n }\n }\n\n entries.push({\n name,\n type: 'file',\n size: file.metadata.size != null ? Number(file.metadata.size) : undefined,\n });\n }\n\n return entries;\n }\n\n // ---------------------------------------------------------------------------\n // Path Operations\n // ---------------------------------------------------------------------------\n\n async exists(path: string): Promise<boolean> {\n const key = this.toKey(path);\n\n // Root path always exists (it's the bucket itself)\n if (!key) return true;\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(key);\n\n // Check if it's a file\n const [exists] = await file.exists();\n if (exists) return true;\n\n // Check if it's a \"directory\" (has objects with this prefix)\n const [files] = await bucket.getFiles({\n prefix: key.replace(/\\/$/, '') + '/',\n maxResults: 1,\n });\n\n return files.length > 0;\n }\n\n async stat(path: string): Promise<FileStat> {\n const key = this.toKey(path);\n\n // Root path is always a directory\n if (!key) {\n return {\n name: '',\n path,\n type: 'directory',\n size: 0,\n createdAt: new Date(),\n modifiedAt: new Date(),\n };\n }\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(key);\n\n const [exists] = await file.exists();\n if (exists) {\n const [metadata] = await file.getMetadata();\n const name = path.split('/').pop() ?? '';\n\n return {\n name,\n path,\n type: 'file',\n size: Number(metadata.size) || 0,\n createdAt: metadata.timeCreated ? new Date(metadata.timeCreated) : new Date(),\n modifiedAt: metadata.updated ? new Date(metadata.updated) : new Date(),\n };\n }\n\n // Check if it's a directory\n const isDir = await this.isDirectory(path);\n if (isDir) {\n const name = path.split('/').filter(Boolean).pop() ?? '';\n return {\n name,\n path,\n type: 'directory',\n size: 0,\n createdAt: new Date(),\n modifiedAt: new Date(),\n };\n }\n\n throw new FileNotFoundError(path);\n }\n\n async isFile(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return false; // Root is a directory, not a file\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(key);\n\n const [exists] = await file.exists();\n return exists;\n }\n\n async isDirectory(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return true; // Root is always a directory\n\n const bucket = await this.getReadyBucket();\n\n const [files] = await bucket.getFiles({\n prefix: key.replace(/\\/$/, '') + '/',\n maxResults: 1,\n });\n\n return files.length > 0;\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle (overrides base class protected methods)\n // ---------------------------------------------------------------------------\n\n /**\n * Initialize the GCS client.\n * Status management is handled by the base class.\n */\n async init(): Promise<void> {\n // Verify we can access the bucket\n const bucket = this.getBucket();\n try {\n const [exists] = await bucket.exists();\n if (!exists) {\n const err = new Error(`Bucket \"${this.bucketName}\" does not exist`) as Error & { status?: number };\n err.status = 404;\n throw err;\n }\n } catch (error) {\n // Check if error already has status (from our 404 throw above)\n if ((error as { status?: number }).status) {\n throw error;\n }\n // Extract status code from GCS errors and add to error for proper HTTP response\n const code = (error as { code?: number }).code;\n if (typeof code === 'number') {\n const message = error instanceof Error ? error.message : String(error);\n const err = new Error(\n message,\n // code === 403\n // ? `Access denied to bucket \"${this.bucketName}\" - check credentials and permissions`\n // : message,\n ) as Error & { status?: number };\n err.status = code;\n throw err;\n }\n throw error;\n }\n }\n\n /**\n * Clean up the GCS client.\n * Status management is handled by the base class.\n */\n async destroy(): Promise<void> {\n this._storage = null;\n this._bucket = null;\n }\n}\n","/**\n * GCS filesystem provider descriptor for MastraEditor.\n *\n * @example\n * ```typescript\n * import { gcsFilesystemProvider } from '@mastra/gcs';\n *\n * const editor = new MastraEditor({\n * filesystems: [gcsFilesystemProvider],\n * });\n * ```\n */\nimport type { FilesystemProvider } from '@mastra/core/editor';\nimport { GCSFilesystem } from './filesystem';\nimport type { GCSFilesystemOptions } from './filesystem';\n\nexport const gcsFilesystemProvider: FilesystemProvider<GCSFilesystemOptions> = {\n id: 'gcs',\n name: 'Google Cloud Storage',\n description: 'Google Cloud Storage bucket',\n configSchema: {\n type: 'object',\n required: ['bucket'],\n properties: {\n bucket: { type: 'string', description: 'GCS bucket name' },\n projectId: { type: 'string', description: 'GCS project ID' },\n credentials: {\n description: 'Service account key JSON object or path to key file',\n oneOf: [{ type: 'object' }, { type: 'string' }],\n },\n prefix: { type: 'string', description: 'Key prefix (acts like a subdirectory)' },\n readOnly: { type: 'boolean', description: 'Mount as read-only', default: false },\n endpoint: { type: 'string', description: 'Custom API endpoint URL (for local emulators)' },\n },\n },\n createFilesystem: config => new GCSFilesystem(config),\n};\n"]}
|
package/dist/index.js
CHANGED
|
@@ -81,6 +81,39 @@ var GCSFilesystem = class extends MastraFilesystem {
|
|
|
81
81
|
this.description = options.description;
|
|
82
82
|
this.readOnly = options.readOnly;
|
|
83
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Get the underlying Google Cloud Storage instance for direct access to GCS APIs.
|
|
86
|
+
*
|
|
87
|
+
* Use this when you need to access GCS features not exposed through the
|
|
88
|
+
* WorkspaceFilesystem interface (e.g., signed URLs, IAM, custom metadata, etc.).
|
|
89
|
+
*
|
|
90
|
+
* @example Access other buckets
|
|
91
|
+
* ```typescript
|
|
92
|
+
* const storage = fs.storage;
|
|
93
|
+
* const [buckets] = await storage.getBuckets();
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
get storage() {
|
|
97
|
+
return this.getStorage();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get the underlying GCS Bucket instance for direct access to bucket operations.
|
|
101
|
+
*
|
|
102
|
+
* Use this when you need to access bucket features not exposed through the
|
|
103
|
+
* WorkspaceFilesystem interface (e.g., signed URLs, lifecycle rules, etc.).
|
|
104
|
+
*
|
|
105
|
+
* @example Generate a signed URL
|
|
106
|
+
* ```typescript
|
|
107
|
+
* const bucket = fs.bucket;
|
|
108
|
+
* const [url] = await bucket.file('my-file.txt').getSignedUrl({
|
|
109
|
+
* action: 'read',
|
|
110
|
+
* expires: Date.now() + 15 * 60 * 1000,
|
|
111
|
+
* });
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
get bucket() {
|
|
115
|
+
return this.getBucket();
|
|
116
|
+
}
|
|
84
117
|
/**
|
|
85
118
|
* Get mount configuration for E2B sandbox.
|
|
86
119
|
* Returns GCS-compatible config that works with gcsfuse.
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/filesystem/index.ts","../src/provider.ts"],"names":["bucket","prefix"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * GCS Filesystem Provider\n *\n * A filesystem implementation backed by Google Cloud Storage.\n */\n\nimport { Storage } from '@google-cloud/storage';\nimport type { Bucket } from '@google-cloud/storage';\n\nimport type {\n FileContent,\n FileStat,\n FileEntry,\n ReadOptions,\n WriteOptions,\n ListOptions,\n RemoveOptions,\n CopyOptions,\n FilesystemInfo,\n FilesystemMountConfig,\n FilesystemIcon,\n ProviderStatus,\n MastraFilesystemOptions,\n} from '@mastra/core/workspace';\nimport { MastraFilesystem, FileNotFoundError, FileExistsError } from '@mastra/core/workspace';\n\n/**\n * GCS mount configuration.\n * Returned by GCSFilesystem.getMountConfig() for FUSE mounting in sandboxes.\n */\nexport interface GCSMountConfig extends FilesystemMountConfig {\n type: 'gcs';\n /** GCS bucket name */\n bucket: string;\n /** Service account key JSON (optional - omit for public buckets or ADC) */\n serviceAccountKey?: string;\n}\n\n/**\n * Common MIME types by file extension.\n */\nconst MIME_TYPES: Record<string, string> = {\n // Text\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.markdown': 'text/markdown',\n '.html': 'text/html',\n '.htm': 'text/html',\n '.css': 'text/css',\n '.csv': 'text/csv',\n '.xml': 'text/xml',\n // Code\n '.js': 'text/javascript',\n '.mjs': 'text/javascript',\n '.ts': 'text/typescript',\n '.tsx': 'text/typescript',\n '.jsx': 'text/javascript',\n '.json': 'application/json',\n '.yaml': 'text/yaml',\n '.yml': 'text/yaml',\n '.py': 'text/x-python',\n '.rb': 'text/x-ruby',\n '.sh': 'text/x-shellscript',\n '.bash': 'text/x-shellscript',\n // Images\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.ico': 'image/x-icon',\n // Documents\n '.pdf': 'application/pdf',\n // Archives\n '.zip': 'application/zip',\n '.gz': 'application/gzip',\n '.tar': 'application/x-tar',\n};\n\n/**\n * Get MIME type from file path extension.\n */\nfunction getMimeType(path: string): string {\n const ext = path.toLowerCase().match(/\\.[^.]+$/)?.[0];\n return ext ? (MIME_TYPES[ext] ?? 'application/octet-stream') : 'application/octet-stream';\n}\n\n/**\n * GCS filesystem provider configuration.\n */\nexport interface GCSFilesystemOptions extends MastraFilesystemOptions {\n /** Unique identifier for this filesystem instance */\n id?: string;\n /** GCS bucket name */\n bucket: string;\n /** Human-friendly display name for the UI */\n displayName?: string;\n /** Icon identifier for the UI (defaults to 'gcs') */\n icon?: FilesystemIcon;\n /** Description shown in tooltips */\n description?: string;\n /**\n * GCS project ID.\n * Required when using service account credentials.\n */\n projectId?: string;\n /**\n * Service account key JSON object or path to key file.\n * If not provided, uses Application Default Credentials (ADC).\n */\n credentials?: object | string;\n /** Optional prefix for all keys (acts like a subdirectory) */\n prefix?: string;\n /** Mount as read-only (blocks write operations, mounts read-only in sandboxes) */\n readOnly?: boolean;\n /**\n * Custom API endpoint URL.\n * Used for local development with emulators like fake-gcs-server.\n */\n endpoint?: string;\n}\n\n/**\n * GCS filesystem implementation.\n *\n * Stores files in a Google Cloud Storage bucket.\n * Supports mounting into E2B sandboxes via gcsfuse.\n *\n * @example Using Application Default Credentials\n * ```typescript\n * import { GCSFilesystem } from '@mastra/gcs';\n *\n * // Uses ADC (gcloud auth application-default login)\n * const fs = new GCSFilesystem({\n * bucket: 'my-bucket',\n * projectId: 'my-project',\n * });\n * ```\n *\n * @example Using Service Account Key\n * ```typescript\n * import { GCSFilesystem } from '@mastra/gcs';\n *\n * const fs = new GCSFilesystem({\n * bucket: 'my-bucket',\n * projectId: 'my-project',\n * credentials: {\n * type: 'service_account',\n * project_id: 'my-project',\n * private_key_id: '...',\n * private_key: '-----BEGIN PRIVATE KEY-----\\n...',\n * client_email: '...@...iam.gserviceaccount.com',\n * // ... rest of service account key\n * },\n * });\n * ```\n *\n * @example Using Key File Path\n * ```typescript\n * import { GCSFilesystem } from '@mastra/gcs';\n *\n * const fs = new GCSFilesystem({\n * bucket: 'my-bucket',\n * projectId: 'my-project',\n * credentials: '/path/to/service-account-key.json',\n * });\n * ```\n */\n\n/** Trim leading and trailing slashes without regex (avoids polynomial regex on user input). */\nfunction trimSlashes(s: string): string {\n let start = 0;\n let end = s.length;\n while (start < end && s[start] === '/') start++;\n while (end > start && s[end - 1] === '/') end--;\n return s.slice(start, end);\n}\n\nexport class GCSFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'GCSFilesystem';\n readonly provider = 'gcs';\n readonly readOnly?: boolean;\n\n status: ProviderStatus = 'pending';\n\n // Display metadata for UI\n readonly displayName?: string;\n readonly icon: FilesystemIcon = 'gcs';\n readonly description?: string;\n\n private readonly bucketName: string;\n private readonly projectId?: string;\n private readonly credentials?: object | string;\n private readonly prefix: string;\n private readonly endpoint?: string;\n\n private _storage: Storage | null = null;\n private _bucket: Bucket | null = null;\n\n constructor(options: GCSFilesystemOptions) {\n super({ ...options, name: 'GCSFilesystem' });\n this.id = options.id ?? `gcs-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n this.bucketName = options.bucket;\n this.projectId = options.projectId;\n this.credentials = options.credentials;\n // Trim leading/trailing slashes from prefix using iterative approach (avoids polynomial regex)\n this.prefix = options.prefix ? trimSlashes(options.prefix) + '/' : '';\n this.endpoint = options.endpoint;\n\n // Display metadata\n this.displayName = options.displayName ?? 'Google Cloud Storage';\n this.icon = options.icon ?? 'gcs';\n this.description = options.description;\n this.readOnly = options.readOnly;\n }\n\n /**\n * Get mount configuration for E2B sandbox.\n * Returns GCS-compatible config that works with gcsfuse.\n */\n getMountConfig(): GCSMountConfig {\n const config: GCSMountConfig = {\n type: 'gcs',\n bucket: this.bucketName,\n };\n\n // Include service account key if credentials are an object\n if (this.credentials && typeof this.credentials === 'object') {\n config.serviceAccountKey = JSON.stringify(this.credentials);\n }\n\n return config;\n }\n\n /**\n * Get filesystem info for status reporting.\n */\n getInfo(): FilesystemInfo<{\n bucket: string;\n endpoint?: string;\n prefix?: string;\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 bucket: this.bucketName,\n ...(this.endpoint && { endpoint: this.endpoint }),\n ...(this.prefix && { prefix: this.prefix }),\n },\n };\n }\n\n /**\n * Get instructions describing this GCS filesystem.\n * Used by agents to understand storage semantics.\n */\n getInstructions(): string {\n const access = this.readOnly ? 'Read-only' : 'Persistent';\n return `Google Cloud Storage in bucket \"${this.bucketName}\". ${access} storage - files are retained across sessions.`;\n }\n\n private getStorage(): Storage {\n if (this._storage) return this._storage;\n\n const options: { projectId?: string; credentials?: object; keyFilename?: string; apiEndpoint?: string } = {};\n\n if (this.projectId) {\n options.projectId = this.projectId;\n }\n\n if (this.credentials) {\n if (typeof this.credentials === 'string') {\n // Path to key file\n options.keyFilename = this.credentials;\n } else {\n // Credentials object\n options.credentials = this.credentials;\n }\n }\n\n if (this.endpoint) {\n options.apiEndpoint = this.endpoint;\n }\n\n this._storage = new Storage(options);\n return this._storage;\n }\n\n private getBucket(): Bucket {\n if (this._bucket) return this._bucket;\n\n const storage = this.getStorage();\n this._bucket = storage.bucket(this.bucketName);\n return this._bucket;\n }\n\n /**\n * Ensure the filesystem is initialized and return the bucket.\n * Uses base class ensureReady() for status management, then returns bucket.\n */\n private async getReadyBucket(): Promise<Bucket> {\n await this.ensureReady();\n return this.getBucket();\n }\n\n private toKey(path: string): string {\n // Remove leading slash and add prefix\n const cleanPath = path.replace(/^\\/+/, '');\n return this.prefix + cleanPath;\n }\n\n // ---------------------------------------------------------------------------\n // File Operations\n // ---------------------------------------------------------------------------\n\n async readFile(path: string, options?: ReadOptions): Promise<string | Buffer> {\n const bucket = await this.getReadyBucket();\n const file = bucket.file(this.toKey(path));\n\n try {\n const [content] = await file.download();\n\n if (options?.encoding) {\n return content.toString(options.encoding);\n }\n return content;\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 404) {\n throw new FileNotFoundError(path);\n }\n throw error;\n }\n }\n\n async writeFile(path: string, content: FileContent, options?: WriteOptions): Promise<void> {\n const bucket = await this.getReadyBucket();\n const file = bucket.file(this.toKey(path));\n\n if (options?.overwrite === false && (await this.exists(path))) {\n throw new FileExistsError(path);\n }\n\n const body = typeof content === 'string' ? Buffer.from(content, 'utf-8') : Buffer.from(content);\n const contentType = getMimeType(path);\n\n await file.save(body, {\n contentType,\n resumable: false,\n });\n }\n\n async appendFile(path: string, content: FileContent): Promise<void> {\n // GCS doesn't support append, so read + write\n let existing = '';\n try {\n existing = (await this.readFile(path, { encoding: 'utf-8' })) as string;\n } catch (error) {\n if (error instanceof FileNotFoundError) {\n // File doesn't exist, start fresh\n } else {\n throw error;\n }\n }\n\n const appendContent = typeof content === 'string' ? content : Buffer.from(content).toString('utf-8');\n await this.writeFile(path, existing + appendContent);\n }\n\n async deleteFile(path: string, options?: RemoveOptions): Promise<void> {\n // Check if this is a directory - if so, use rmdir instead\n const isDir = await this.isDirectory(path);\n if (isDir) {\n await this.rmdir(path, { recursive: true, force: options?.force });\n return;\n }\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(this.toKey(path));\n\n try {\n await file.delete();\n } catch (error: unknown) {\n if (!options?.force) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 404) {\n throw new FileNotFoundError(path);\n }\n throw error;\n }\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n const bucket = await this.getReadyBucket();\n const srcFile = bucket.file(this.toKey(src));\n const destFile = bucket.file(this.toKey(dest));\n\n if (options?.overwrite === false && (await this.exists(dest))) {\n throw new FileExistsError(dest);\n }\n\n try {\n await srcFile.copy(destFile);\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 404) {\n throw new FileNotFoundError(src);\n }\n throw error;\n }\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.copyFile(src, dest, options);\n await this.deleteFile(src, { force: true });\n }\n\n // ---------------------------------------------------------------------------\n // Directory Operations\n // ---------------------------------------------------------------------------\n\n async mkdir(_path: string, _options?: { recursive?: boolean }): Promise<void> {\n // GCS doesn't have real directories - they're just key prefixes\n // No-op, directories are created implicitly when files are written\n }\n\n async rmdir(path: string, options?: RemoveOptions): Promise<void> {\n if (!options?.recursive) {\n // Quick emptiness check — only fetch one object instead of full readdir\n const bucket = await this.getReadyBucket();\n const prefix = this.toKey(path).replace(/\\/$/, '') + '/';\n const [files] = await bucket.getFiles({ prefix, maxResults: 1 });\n if (files.length > 0) {\n throw new Error(`Directory not empty: ${path}`);\n }\n return;\n }\n\n // Delete all objects with this prefix\n const bucket = await this.getReadyBucket();\n const prefix = this.toKey(path).replace(/\\/$/, '') + '/';\n\n await bucket.deleteFiles({ prefix });\n }\n\n async readdir(path: string, options?: ListOptions): Promise<FileEntry[]> {\n const bucket = await this.getReadyBucket();\n\n const prefix = this.toKey(path).replace(/\\/$/, '');\n const searchPrefix = prefix ? prefix + '/' : '';\n\n const entries: FileEntry[] = [];\n const seenDirs = new Set<string>();\n\n const [files] = await bucket.getFiles({\n prefix: searchPrefix,\n autoPaginate: true,\n });\n\n for (const file of files) {\n const key = file.name;\n if (!key || key === searchPrefix) continue;\n\n const relativePath = key.slice(searchPrefix.length);\n if (!relativePath) continue;\n\n // Skip if this looks like a directory marker\n if (relativePath.endsWith('/')) {\n const dirName = relativePath.slice(0, -1);\n if (!seenDirs.has(dirName)) {\n seenDirs.add(dirName);\n entries.push({ name: dirName, type: 'directory' });\n }\n continue;\n }\n\n const name = options?.recursive ? relativePath : relativePath.split('/')[0];\n\n // Skip if name is undefined or empty\n if (!name) continue;\n\n // For non-recursive listing, if there's a slash, it's a directory\n if (!options?.recursive && relativePath.includes('/')) {\n if (!seenDirs.has(name)) {\n seenDirs.add(name);\n entries.push({ name, type: 'directory' });\n }\n continue;\n }\n\n // Filter by extension if specified\n if (options?.extension) {\n const extensions = Array.isArray(options.extension) ? options.extension : [options.extension];\n if (!extensions.some(ext => name.endsWith(ext))) {\n continue;\n }\n }\n\n entries.push({\n name,\n type: 'file',\n size: file.metadata.size != null ? Number(file.metadata.size) : undefined,\n });\n }\n\n return entries;\n }\n\n // ---------------------------------------------------------------------------\n // Path Operations\n // ---------------------------------------------------------------------------\n\n async exists(path: string): Promise<boolean> {\n const key = this.toKey(path);\n\n // Root path always exists (it's the bucket itself)\n if (!key) return true;\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(key);\n\n // Check if it's a file\n const [exists] = await file.exists();\n if (exists) return true;\n\n // Check if it's a \"directory\" (has objects with this prefix)\n const [files] = await bucket.getFiles({\n prefix: key.replace(/\\/$/, '') + '/',\n maxResults: 1,\n });\n\n return files.length > 0;\n }\n\n async stat(path: string): Promise<FileStat> {\n const key = this.toKey(path);\n\n // Root path is always a directory\n if (!key) {\n return {\n name: '',\n path,\n type: 'directory',\n size: 0,\n createdAt: new Date(),\n modifiedAt: new Date(),\n };\n }\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(key);\n\n const [exists] = await file.exists();\n if (exists) {\n const [metadata] = await file.getMetadata();\n const name = path.split('/').pop() ?? '';\n\n return {\n name,\n path,\n type: 'file',\n size: Number(metadata.size) || 0,\n createdAt: metadata.timeCreated ? new Date(metadata.timeCreated) : new Date(),\n modifiedAt: metadata.updated ? new Date(metadata.updated) : new Date(),\n };\n }\n\n // Check if it's a directory\n const isDir = await this.isDirectory(path);\n if (isDir) {\n const name = path.split('/').filter(Boolean).pop() ?? '';\n return {\n name,\n path,\n type: 'directory',\n size: 0,\n createdAt: new Date(),\n modifiedAt: new Date(),\n };\n }\n\n throw new FileNotFoundError(path);\n }\n\n async isFile(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return false; // Root is a directory, not a file\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(key);\n\n const [exists] = await file.exists();\n return exists;\n }\n\n async isDirectory(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return true; // Root is always a directory\n\n const bucket = await this.getReadyBucket();\n\n const [files] = await bucket.getFiles({\n prefix: key.replace(/\\/$/, '') + '/',\n maxResults: 1,\n });\n\n return files.length > 0;\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle (overrides base class protected methods)\n // ---------------------------------------------------------------------------\n\n /**\n * Initialize the GCS client.\n * Status management is handled by the base class.\n */\n async init(): Promise<void> {\n // Verify we can access the bucket\n const bucket = this.getBucket();\n try {\n const [exists] = await bucket.exists();\n if (!exists) {\n const err = new Error(`Bucket \"${this.bucketName}\" does not exist`) as Error & { status?: number };\n err.status = 404;\n throw err;\n }\n } catch (error) {\n // Check if error already has status (from our 404 throw above)\n if ((error as { status?: number }).status) {\n throw error;\n }\n // Extract status code from GCS errors and add to error for proper HTTP response\n const code = (error as { code?: number }).code;\n if (typeof code === 'number') {\n const message = error instanceof Error ? error.message : String(error);\n const err = new Error(\n message,\n // code === 403\n // ? `Access denied to bucket \"${this.bucketName}\" - check credentials and permissions`\n // : message,\n ) as Error & { status?: number };\n err.status = code;\n throw err;\n }\n throw error;\n }\n }\n\n /**\n * Clean up the GCS client.\n * Status management is handled by the base class.\n */\n async destroy(): Promise<void> {\n this._storage = null;\n this._bucket = null;\n }\n}\n","/**\n * GCS filesystem provider descriptor for MastraEditor.\n *\n * @example\n * ```typescript\n * import { gcsFilesystemProvider } from '@mastra/gcs';\n *\n * const editor = new MastraEditor({\n * filesystems: [gcsFilesystemProvider],\n * });\n * ```\n */\nimport type { FilesystemProvider } from '@mastra/core/editor';\nimport { GCSFilesystem } from './filesystem';\nimport type { GCSFilesystemOptions } from './filesystem';\n\nexport const gcsFilesystemProvider: FilesystemProvider<GCSFilesystemOptions> = {\n id: 'gcs',\n name: 'Google Cloud Storage',\n description: 'Google Cloud Storage bucket',\n configSchema: {\n type: 'object',\n required: ['bucket'],\n properties: {\n bucket: { type: 'string', description: 'GCS bucket name' },\n projectId: { type: 'string', description: 'GCS project ID' },\n credentials: {\n description: 'Service account key JSON object or path to key file',\n oneOf: [{ type: 'object' }, { type: 'string' }],\n },\n prefix: { type: 'string', description: 'Key prefix (acts like a subdirectory)' },\n readOnly: { type: 'boolean', description: 'Mount as read-only', default: false },\n endpoint: { type: 'string', description: 'Custom API endpoint URL (for local emulators)' },\n },\n },\n createFilesystem: config => new GCSFilesystem(config),\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/filesystem/index.ts","../src/provider.ts"],"names":["bucket","prefix"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * GCS Filesystem Provider\n *\n * A filesystem implementation backed by Google Cloud Storage.\n */\n\nimport { Storage } from '@google-cloud/storage';\nimport type { Bucket } from '@google-cloud/storage';\n\nimport type {\n FileContent,\n FileStat,\n FileEntry,\n ReadOptions,\n WriteOptions,\n ListOptions,\n RemoveOptions,\n CopyOptions,\n FilesystemInfo,\n FilesystemMountConfig,\n FilesystemIcon,\n ProviderStatus,\n MastraFilesystemOptions,\n} from '@mastra/core/workspace';\nimport { MastraFilesystem, FileNotFoundError, FileExistsError } from '@mastra/core/workspace';\n\n/**\n * GCS mount configuration.\n * Returned by GCSFilesystem.getMountConfig() for FUSE mounting in sandboxes.\n */\nexport interface GCSMountConfig extends FilesystemMountConfig {\n type: 'gcs';\n /** GCS bucket name */\n bucket: string;\n /** Service account key JSON (optional - omit for public buckets or ADC) */\n serviceAccountKey?: string;\n}\n\n/**\n * Common MIME types by file extension.\n */\nconst MIME_TYPES: Record<string, string> = {\n // Text\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.markdown': 'text/markdown',\n '.html': 'text/html',\n '.htm': 'text/html',\n '.css': 'text/css',\n '.csv': 'text/csv',\n '.xml': 'text/xml',\n // Code\n '.js': 'text/javascript',\n '.mjs': 'text/javascript',\n '.ts': 'text/typescript',\n '.tsx': 'text/typescript',\n '.jsx': 'text/javascript',\n '.json': 'application/json',\n '.yaml': 'text/yaml',\n '.yml': 'text/yaml',\n '.py': 'text/x-python',\n '.rb': 'text/x-ruby',\n '.sh': 'text/x-shellscript',\n '.bash': 'text/x-shellscript',\n // Images\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.ico': 'image/x-icon',\n // Documents\n '.pdf': 'application/pdf',\n // Archives\n '.zip': 'application/zip',\n '.gz': 'application/gzip',\n '.tar': 'application/x-tar',\n};\n\n/**\n * Get MIME type from file path extension.\n */\nfunction getMimeType(path: string): string {\n const ext = path.toLowerCase().match(/\\.[^.]+$/)?.[0];\n return ext ? (MIME_TYPES[ext] ?? 'application/octet-stream') : 'application/octet-stream';\n}\n\n/**\n * GCS filesystem provider configuration.\n */\nexport interface GCSFilesystemOptions extends MastraFilesystemOptions {\n /** Unique identifier for this filesystem instance */\n id?: string;\n /** GCS bucket name */\n bucket: string;\n /** Human-friendly display name for the UI */\n displayName?: string;\n /** Icon identifier for the UI (defaults to 'gcs') */\n icon?: FilesystemIcon;\n /** Description shown in tooltips */\n description?: string;\n /**\n * GCS project ID.\n * Required when using service account credentials.\n */\n projectId?: string;\n /**\n * Service account key JSON object or path to key file.\n * If not provided, uses Application Default Credentials (ADC).\n */\n credentials?: object | string;\n /** Optional prefix for all keys (acts like a subdirectory) */\n prefix?: string;\n /** Mount as read-only (blocks write operations, mounts read-only in sandboxes) */\n readOnly?: boolean;\n /**\n * Custom API endpoint URL.\n * Used for local development with emulators like fake-gcs-server.\n */\n endpoint?: string;\n}\n\n/**\n * GCS filesystem implementation.\n *\n * Stores files in a Google Cloud Storage bucket.\n * Supports mounting into E2B sandboxes via gcsfuse.\n *\n * @example Using Application Default Credentials\n * ```typescript\n * import { GCSFilesystem } from '@mastra/gcs';\n *\n * // Uses ADC (gcloud auth application-default login)\n * const fs = new GCSFilesystem({\n * bucket: 'my-bucket',\n * projectId: 'my-project',\n * });\n * ```\n *\n * @example Using Service Account Key\n * ```typescript\n * import { GCSFilesystem } from '@mastra/gcs';\n *\n * const fs = new GCSFilesystem({\n * bucket: 'my-bucket',\n * projectId: 'my-project',\n * credentials: {\n * type: 'service_account',\n * project_id: 'my-project',\n * private_key_id: '...',\n * private_key: '-----BEGIN PRIVATE KEY-----\\n...',\n * client_email: '...@...iam.gserviceaccount.com',\n * // ... rest of service account key\n * },\n * });\n * ```\n *\n * @example Using Key File Path\n * ```typescript\n * import { GCSFilesystem } from '@mastra/gcs';\n *\n * const fs = new GCSFilesystem({\n * bucket: 'my-bucket',\n * projectId: 'my-project',\n * credentials: '/path/to/service-account-key.json',\n * });\n * ```\n */\n\n/** Trim leading and trailing slashes without regex (avoids polynomial regex on user input). */\nfunction trimSlashes(s: string): string {\n let start = 0;\n let end = s.length;\n while (start < end && s[start] === '/') start++;\n while (end > start && s[end - 1] === '/') end--;\n return s.slice(start, end);\n}\n\nexport class GCSFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'GCSFilesystem';\n readonly provider = 'gcs';\n readonly readOnly?: boolean;\n\n status: ProviderStatus = 'pending';\n\n // Display metadata for UI\n readonly displayName?: string;\n readonly icon: FilesystemIcon = 'gcs';\n readonly description?: string;\n\n private readonly bucketName: string;\n private readonly projectId?: string;\n private readonly credentials?: object | string;\n private readonly prefix: string;\n private readonly endpoint?: string;\n\n private _storage: Storage | null = null;\n private _bucket: Bucket | null = null;\n\n constructor(options: GCSFilesystemOptions) {\n super({ ...options, name: 'GCSFilesystem' });\n this.id = options.id ?? `gcs-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n this.bucketName = options.bucket;\n this.projectId = options.projectId;\n this.credentials = options.credentials;\n // Trim leading/trailing slashes from prefix using iterative approach (avoids polynomial regex)\n this.prefix = options.prefix ? trimSlashes(options.prefix) + '/' : '';\n this.endpoint = options.endpoint;\n\n // Display metadata\n this.displayName = options.displayName ?? 'Google Cloud Storage';\n this.icon = options.icon ?? 'gcs';\n this.description = options.description;\n this.readOnly = options.readOnly;\n }\n\n /**\n * Get the underlying Google Cloud Storage instance for direct access to GCS APIs.\n *\n * Use this when you need to access GCS features not exposed through the\n * WorkspaceFilesystem interface (e.g., signed URLs, IAM, custom metadata, etc.).\n *\n * @example Access other buckets\n * ```typescript\n * const storage = fs.storage;\n * const [buckets] = await storage.getBuckets();\n * ```\n */\n get storage(): Storage {\n return this.getStorage();\n }\n\n /**\n * Get the underlying GCS Bucket instance for direct access to bucket operations.\n *\n * Use this when you need to access bucket features not exposed through the\n * WorkspaceFilesystem interface (e.g., signed URLs, lifecycle rules, etc.).\n *\n * @example Generate a signed URL\n * ```typescript\n * const bucket = fs.bucket;\n * const [url] = await bucket.file('my-file.txt').getSignedUrl({\n * action: 'read',\n * expires: Date.now() + 15 * 60 * 1000,\n * });\n * ```\n */\n get bucket(): Bucket {\n return this.getBucket();\n }\n\n /**\n * Get mount configuration for E2B sandbox.\n * Returns GCS-compatible config that works with gcsfuse.\n */\n getMountConfig(): GCSMountConfig {\n const config: GCSMountConfig = {\n type: 'gcs',\n bucket: this.bucketName,\n };\n\n // Include service account key if credentials are an object\n if (this.credentials && typeof this.credentials === 'object') {\n config.serviceAccountKey = JSON.stringify(this.credentials);\n }\n\n return config;\n }\n\n /**\n * Get filesystem info for status reporting.\n */\n getInfo(): FilesystemInfo<{\n bucket: string;\n endpoint?: string;\n prefix?: string;\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 bucket: this.bucketName,\n ...(this.endpoint && { endpoint: this.endpoint }),\n ...(this.prefix && { prefix: this.prefix }),\n },\n };\n }\n\n /**\n * Get instructions describing this GCS filesystem.\n * Used by agents to understand storage semantics.\n */\n getInstructions(): string {\n const access = this.readOnly ? 'Read-only' : 'Persistent';\n return `Google Cloud Storage in bucket \"${this.bucketName}\". ${access} storage - files are retained across sessions.`;\n }\n\n private getStorage(): Storage {\n if (this._storage) return this._storage;\n\n const options: { projectId?: string; credentials?: object; keyFilename?: string; apiEndpoint?: string } = {};\n\n if (this.projectId) {\n options.projectId = this.projectId;\n }\n\n if (this.credentials) {\n if (typeof this.credentials === 'string') {\n // Path to key file\n options.keyFilename = this.credentials;\n } else {\n // Credentials object\n options.credentials = this.credentials;\n }\n }\n\n if (this.endpoint) {\n options.apiEndpoint = this.endpoint;\n }\n\n this._storage = new Storage(options);\n return this._storage;\n }\n\n private getBucket(): Bucket {\n if (this._bucket) return this._bucket;\n\n const storage = this.getStorage();\n this._bucket = storage.bucket(this.bucketName);\n return this._bucket;\n }\n\n /**\n * Ensure the filesystem is initialized and return the bucket.\n * Uses base class ensureReady() for status management, then returns bucket.\n */\n private async getReadyBucket(): Promise<Bucket> {\n await this.ensureReady();\n return this.getBucket();\n }\n\n private toKey(path: string): string {\n // Remove leading slash and add prefix\n const cleanPath = path.replace(/^\\/+/, '');\n return this.prefix + cleanPath;\n }\n\n // ---------------------------------------------------------------------------\n // File Operations\n // ---------------------------------------------------------------------------\n\n async readFile(path: string, options?: ReadOptions): Promise<string | Buffer> {\n const bucket = await this.getReadyBucket();\n const file = bucket.file(this.toKey(path));\n\n try {\n const [content] = await file.download();\n\n if (options?.encoding) {\n return content.toString(options.encoding);\n }\n return content;\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 404) {\n throw new FileNotFoundError(path);\n }\n throw error;\n }\n }\n\n async writeFile(path: string, content: FileContent, options?: WriteOptions): Promise<void> {\n const bucket = await this.getReadyBucket();\n const file = bucket.file(this.toKey(path));\n\n if (options?.overwrite === false && (await this.exists(path))) {\n throw new FileExistsError(path);\n }\n\n const body = typeof content === 'string' ? Buffer.from(content, 'utf-8') : Buffer.from(content);\n const contentType = getMimeType(path);\n\n await file.save(body, {\n contentType,\n resumable: false,\n });\n }\n\n async appendFile(path: string, content: FileContent): Promise<void> {\n // GCS doesn't support append, so read + write\n let existing = '';\n try {\n existing = (await this.readFile(path, { encoding: 'utf-8' })) as string;\n } catch (error) {\n if (error instanceof FileNotFoundError) {\n // File doesn't exist, start fresh\n } else {\n throw error;\n }\n }\n\n const appendContent = typeof content === 'string' ? content : Buffer.from(content).toString('utf-8');\n await this.writeFile(path, existing + appendContent);\n }\n\n async deleteFile(path: string, options?: RemoveOptions): Promise<void> {\n // Check if this is a directory - if so, use rmdir instead\n const isDir = await this.isDirectory(path);\n if (isDir) {\n await this.rmdir(path, { recursive: true, force: options?.force });\n return;\n }\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(this.toKey(path));\n\n try {\n await file.delete();\n } catch (error: unknown) {\n if (!options?.force) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 404) {\n throw new FileNotFoundError(path);\n }\n throw error;\n }\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n const bucket = await this.getReadyBucket();\n const srcFile = bucket.file(this.toKey(src));\n const destFile = bucket.file(this.toKey(dest));\n\n if (options?.overwrite === false && (await this.exists(dest))) {\n throw new FileExistsError(dest);\n }\n\n try {\n await srcFile.copy(destFile);\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 404) {\n throw new FileNotFoundError(src);\n }\n throw error;\n }\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n await this.copyFile(src, dest, options);\n await this.deleteFile(src, { force: true });\n }\n\n // ---------------------------------------------------------------------------\n // Directory Operations\n // ---------------------------------------------------------------------------\n\n async mkdir(_path: string, _options?: { recursive?: boolean }): Promise<void> {\n // GCS doesn't have real directories - they're just key prefixes\n // No-op, directories are created implicitly when files are written\n }\n\n async rmdir(path: string, options?: RemoveOptions): Promise<void> {\n if (!options?.recursive) {\n // Quick emptiness check — only fetch one object instead of full readdir\n const bucket = await this.getReadyBucket();\n const prefix = this.toKey(path).replace(/\\/$/, '') + '/';\n const [files] = await bucket.getFiles({ prefix, maxResults: 1 });\n if (files.length > 0) {\n throw new Error(`Directory not empty: ${path}`);\n }\n return;\n }\n\n // Delete all objects with this prefix\n const bucket = await this.getReadyBucket();\n const prefix = this.toKey(path).replace(/\\/$/, '') + '/';\n\n await bucket.deleteFiles({ prefix });\n }\n\n async readdir(path: string, options?: ListOptions): Promise<FileEntry[]> {\n const bucket = await this.getReadyBucket();\n\n const prefix = this.toKey(path).replace(/\\/$/, '');\n const searchPrefix = prefix ? prefix + '/' : '';\n\n const entries: FileEntry[] = [];\n const seenDirs = new Set<string>();\n\n const [files] = await bucket.getFiles({\n prefix: searchPrefix,\n autoPaginate: true,\n });\n\n for (const file of files) {\n const key = file.name;\n if (!key || key === searchPrefix) continue;\n\n const relativePath = key.slice(searchPrefix.length);\n if (!relativePath) continue;\n\n // Skip if this looks like a directory marker\n if (relativePath.endsWith('/')) {\n const dirName = relativePath.slice(0, -1);\n if (!seenDirs.has(dirName)) {\n seenDirs.add(dirName);\n entries.push({ name: dirName, type: 'directory' });\n }\n continue;\n }\n\n const name = options?.recursive ? relativePath : relativePath.split('/')[0];\n\n // Skip if name is undefined or empty\n if (!name) continue;\n\n // For non-recursive listing, if there's a slash, it's a directory\n if (!options?.recursive && relativePath.includes('/')) {\n if (!seenDirs.has(name)) {\n seenDirs.add(name);\n entries.push({ name, type: 'directory' });\n }\n continue;\n }\n\n // Filter by extension if specified\n if (options?.extension) {\n const extensions = Array.isArray(options.extension) ? options.extension : [options.extension];\n if (!extensions.some(ext => name.endsWith(ext))) {\n continue;\n }\n }\n\n entries.push({\n name,\n type: 'file',\n size: file.metadata.size != null ? Number(file.metadata.size) : undefined,\n });\n }\n\n return entries;\n }\n\n // ---------------------------------------------------------------------------\n // Path Operations\n // ---------------------------------------------------------------------------\n\n async exists(path: string): Promise<boolean> {\n const key = this.toKey(path);\n\n // Root path always exists (it's the bucket itself)\n if (!key) return true;\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(key);\n\n // Check if it's a file\n const [exists] = await file.exists();\n if (exists) return true;\n\n // Check if it's a \"directory\" (has objects with this prefix)\n const [files] = await bucket.getFiles({\n prefix: key.replace(/\\/$/, '') + '/',\n maxResults: 1,\n });\n\n return files.length > 0;\n }\n\n async stat(path: string): Promise<FileStat> {\n const key = this.toKey(path);\n\n // Root path is always a directory\n if (!key) {\n return {\n name: '',\n path,\n type: 'directory',\n size: 0,\n createdAt: new Date(),\n modifiedAt: new Date(),\n };\n }\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(key);\n\n const [exists] = await file.exists();\n if (exists) {\n const [metadata] = await file.getMetadata();\n const name = path.split('/').pop() ?? '';\n\n return {\n name,\n path,\n type: 'file',\n size: Number(metadata.size) || 0,\n createdAt: metadata.timeCreated ? new Date(metadata.timeCreated) : new Date(),\n modifiedAt: metadata.updated ? new Date(metadata.updated) : new Date(),\n };\n }\n\n // Check if it's a directory\n const isDir = await this.isDirectory(path);\n if (isDir) {\n const name = path.split('/').filter(Boolean).pop() ?? '';\n return {\n name,\n path,\n type: 'directory',\n size: 0,\n createdAt: new Date(),\n modifiedAt: new Date(),\n };\n }\n\n throw new FileNotFoundError(path);\n }\n\n async isFile(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return false; // Root is a directory, not a file\n\n const bucket = await this.getReadyBucket();\n const file = bucket.file(key);\n\n const [exists] = await file.exists();\n return exists;\n }\n\n async isDirectory(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return true; // Root is always a directory\n\n const bucket = await this.getReadyBucket();\n\n const [files] = await bucket.getFiles({\n prefix: key.replace(/\\/$/, '') + '/',\n maxResults: 1,\n });\n\n return files.length > 0;\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle (overrides base class protected methods)\n // ---------------------------------------------------------------------------\n\n /**\n * Initialize the GCS client.\n * Status management is handled by the base class.\n */\n async init(): Promise<void> {\n // Verify we can access the bucket\n const bucket = this.getBucket();\n try {\n const [exists] = await bucket.exists();\n if (!exists) {\n const err = new Error(`Bucket \"${this.bucketName}\" does not exist`) as Error & { status?: number };\n err.status = 404;\n throw err;\n }\n } catch (error) {\n // Check if error already has status (from our 404 throw above)\n if ((error as { status?: number }).status) {\n throw error;\n }\n // Extract status code from GCS errors and add to error for proper HTTP response\n const code = (error as { code?: number }).code;\n if (typeof code === 'number') {\n const message = error instanceof Error ? error.message : String(error);\n const err = new Error(\n message,\n // code === 403\n // ? `Access denied to bucket \"${this.bucketName}\" - check credentials and permissions`\n // : message,\n ) as Error & { status?: number };\n err.status = code;\n throw err;\n }\n throw error;\n }\n }\n\n /**\n * Clean up the GCS client.\n * Status management is handled by the base class.\n */\n async destroy(): Promise<void> {\n this._storage = null;\n this._bucket = null;\n }\n}\n","/**\n * GCS filesystem provider descriptor for MastraEditor.\n *\n * @example\n * ```typescript\n * import { gcsFilesystemProvider } from '@mastra/gcs';\n *\n * const editor = new MastraEditor({\n * filesystems: [gcsFilesystemProvider],\n * });\n * ```\n */\nimport type { FilesystemProvider } from '@mastra/core/editor';\nimport { GCSFilesystem } from './filesystem';\nimport type { GCSFilesystemOptions } from './filesystem';\n\nexport const gcsFilesystemProvider: FilesystemProvider<GCSFilesystemOptions> = {\n id: 'gcs',\n name: 'Google Cloud Storage',\n description: 'Google Cloud Storage bucket',\n configSchema: {\n type: 'object',\n required: ['bucket'],\n properties: {\n bucket: { type: 'string', description: 'GCS bucket name' },\n projectId: { type: 'string', description: 'GCS project ID' },\n credentials: {\n description: 'Service account key JSON object or path to key file',\n oneOf: [{ type: 'object' }, { type: 'string' }],\n },\n prefix: { type: 'string', description: 'Key prefix (acts like a subdirectory)' },\n readOnly: { type: 'boolean', description: 'Mount as read-only', default: false },\n endpoint: { type: 'string', description: 'Custom API endpoint URL (for local emulators)' },\n },\n },\n createFilesystem: config => new GCSFilesystem(config),\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/gcs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0-alpha.0",
|
|
4
4
|
"description": "Google Cloud Storage filesystem provider for Mastra workspaces",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,18 +23,18 @@
|
|
|
23
23
|
"@google-cloud/storage": "^7.19.0"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@types/node": "22.19.
|
|
27
|
-
"dotenv": "^17.
|
|
28
|
-
"@vitest/coverage-v8": "4.0.
|
|
29
|
-
"@vitest/ui": "4.0.
|
|
30
|
-
"eslint": "^9.
|
|
26
|
+
"@types/node": "22.19.13",
|
|
27
|
+
"dotenv": "^17.3.1",
|
|
28
|
+
"@vitest/coverage-v8": "4.0.18",
|
|
29
|
+
"@vitest/ui": "4.0.18",
|
|
30
|
+
"eslint": "^9.39.4",
|
|
31
31
|
"tsup": "^8.5.1",
|
|
32
32
|
"typescript": "^5.9.3",
|
|
33
|
-
"vitest": "4.0.
|
|
34
|
-
"@internal/lint": "0.0.
|
|
35
|
-
"@internal/types-builder": "0.0.
|
|
36
|
-
"@internal/workspace-test-utils": "0.0.
|
|
37
|
-
"@mastra/core": "1.
|
|
33
|
+
"vitest": "4.0.18",
|
|
34
|
+
"@internal/lint": "0.0.67",
|
|
35
|
+
"@internal/types-builder": "0.0.42",
|
|
36
|
+
"@internal/workspace-test-utils": "0.0.11",
|
|
37
|
+
"@mastra/core": "1.12.0-alpha.1"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"@mastra/core": ">=1.4.0-0 <2.0.0-0"
|