@mastra/azure 0.2.0-alpha.1 → 0.2.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # @mastra/azure
2
2
 
3
+ ## 0.2.1-alpha.0
4
+
5
+ ### Patch Changes
6
+
7
+ - @mastra/azure: Fixed AzureBlobFilesystem mount configs to include configured prefixes so mounts use the configured prefix instead of the entire container. ([#15874](https://github.com/mastra-ai/mastra/pull/15874))
8
+
9
+ - Updated dependencies [[`512a013`](https://github.com/mastra-ai/mastra/commit/512a013f285aa9c0aa8f08a35b2ce09f9938b017), [`e9becde`](https://github.com/mastra-ai/mastra/commit/e9becdeed9176b9f8392e557bde12b933f99cf7a)]:
10
+ - @mastra/core@1.29.1-alpha.2
11
+
12
+ ## 0.2.0
13
+
14
+ ### Minor Changes
15
+
16
+ - Add `@mastra/azure`, exporting an Azure Blob Storage `WorkspaceFilesystem` provider via `@mastra/azure/blob` with support for connection string, account key, SAS token, `DefaultAzureCredential`, and anonymous auth, plus prefix namespacing and read-only mode. ([#15217](https://github.com/mastra-ai/mastra/pull/15217))
17
+
18
+ - Added `AzureBlobStore`, a content-addressable blob store backed by Azure Blob Storage for skill versioning. Available alongside the existing `AzureBlobFilesystem` from `@mastra/azure/blob`. ([#15853](https://github.com/mastra-ai/mastra/pull/15853))
19
+
20
+ ```typescript
21
+ import { AzureBlobStore } from '@mastra/azure/blob';
22
+
23
+ const blobs = new AzureBlobStore({
24
+ container: 'my-skill-blobs',
25
+ connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING,
26
+ });
27
+ ```
28
+
29
+ Supports the same authentication methods as `AzureBlobFilesystem`: connection string, account key, SAS token, `DefaultAzureCredential`, and anonymous access. A matching `azureBlobStoreProvider` descriptor is also exported for MastraEditor.
30
+
31
+ ### Patch Changes
32
+
33
+ - Updated dependencies [[`28caa5b`](https://github.com/mastra-ai/mastra/commit/28caa5b032358545af2589ed90636eccb4dd9d2f), [`c1ae974`](https://github.com/mastra-ai/mastra/commit/c1ae97491f6e57378ce880c3a397778c42adcdf1), [`b510d36`](https://github.com/mastra-ai/mastra/commit/b510d368f73dab6be2e2c2bc99035aaef1fb7d7a), [`13b4d7c`](https://github.com/mastra-ai/mastra/commit/13b4d7c16de34dff9095d1cd80f22f544b6cfe75), [`7a7b313`](https://github.com/mastra-ai/mastra/commit/7a7b3138fb3bcf0b0c740eaea07971e43d330ef3), [`c04417b`](https://github.com/mastra-ai/mastra/commit/c04417ba0a2e4ded66da4352331ef29cd4bd1d79), [`cf25a03`](https://github.com/mastra-ai/mastra/commit/cf25a03132164b9dc1e5dccf7394824e33007c51), [`8a71261`](https://github.com/mastra-ai/mastra/commit/8a71261e3954ae617c6f8e25767b951f99438ab2), [`9e973b0`](https://github.com/mastra-ai/mastra/commit/9e973b010dacfa15ac82b0072897319f5234b90a), [`dd934a0`](https://github.com/mastra-ai/mastra/commit/dd934a0982ce0f78712fbd559e4f2410bf594b39), [`ba6b0c5`](https://github.com/mastra-ai/mastra/commit/ba6b0c51bfce358554fd33c7f2bcd5593633f2ff), [`a6dac0a`](https://github.com/mastra-ai/mastra/commit/a6dac0a40c7181161b1add4e8534f962bcbc9aa7), [`5a4b1ee`](https://github.com/mastra-ai/mastra/commit/5a4b1ee80212969621228104995589c0fa59e575), [`5a4b1ee`](https://github.com/mastra-ai/mastra/commit/5a4b1ee80212969621228104995589c0fa59e575), [`5a4b1ee`](https://github.com/mastra-ai/mastra/commit/5a4b1ee80212969621228104995589c0fa59e575), [`6c8c6c7`](https://github.com/mastra-ai/mastra/commit/6c8c6c71518394321a4692614aa4b11f3bb0a343), [`5a4b1ee`](https://github.com/mastra-ai/mastra/commit/5a4b1ee80212969621228104995589c0fa59e575), [`7d056b6`](https://github.com/mastra-ai/mastra/commit/7d056b6ecf603cacaa0f663ff1df025ed885b6c1), [`9cef83b`](https://github.com/mastra-ai/mastra/commit/9cef83b8a642b8098747772921e3523b492bafbc), [`d30e215`](https://github.com/mastra-ai/mastra/commit/d30e2156c746bc9fd791745cec1cc24377b66789), [`021a60f`](https://github.com/mastra-ai/mastra/commit/021a60f1f3e0135a70ef23c58be7a9b3aaffe6b4), [`73f2809`](https://github.com/mastra-ai/mastra/commit/73f2809721db24e98cdf122539652a455211b450), [`aedeea4`](https://github.com/mastra-ai/mastra/commit/aedeea48a94f728323f040478775076b9574be50), [`26f1f94`](https://github.com/mastra-ai/mastra/commit/26f1f9490574b864ba1ecedf2c9632e0767a23bd), [`8126d86`](https://github.com/mastra-ai/mastra/commit/8126d8638411eacfafdc29036ac998e8757ea66f), [`73b45fa`](https://github.com/mastra-ai/mastra/commit/73b45facdef4fbcb8af710c50f0646f18619dbaa), [`ae97520`](https://github.com/mastra-ai/mastra/commit/ae975206fdb0f6ef03c4d5bf94f7dc7c3f706c02), [`7a7b313`](https://github.com/mastra-ai/mastra/commit/7a7b3138fb3bcf0b0c740eaea07971e43d330ef3), [`441670a`](https://github.com/mastra-ai/mastra/commit/441670a02c9dc7731c52674f55481e7848a84523)]:
34
+ - @mastra/core@1.29.0
35
+
3
36
  ## 0.2.0-alpha.1
4
37
 
5
38
  ### Minor Changes
@@ -19,6 +19,7 @@ export interface AzureBlobMountConfig extends FilesystemMountConfig {
19
19
  connectionString?: string;
20
20
  useDefaultCredential?: boolean;
21
21
  endpoint?: string;
22
+ prefix?: string;
22
23
  readOnly?: boolean;
23
24
  }
24
25
  export interface AzureBlobFilesystemOptions extends MastraFilesystemOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blob/filesystem/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blob/filesystem/index.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,24 @@
1
1
  'use strict';
2
2
 
3
- var chunkJLBSGA65_cjs = require('../chunk-JLBSGA65.cjs');
3
+ var chunk74CBJSIM_cjs = require('../chunk-74CBJSIM.cjs');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "AzureBlobFilesystem", {
8
8
  enumerable: true,
9
- get: function () { return chunkJLBSGA65_cjs.AzureBlobFilesystem; }
9
+ get: function () { return chunk74CBJSIM_cjs.AzureBlobFilesystem; }
10
10
  });
11
11
  Object.defineProperty(exports, "AzureBlobStore", {
12
12
  enumerable: true,
13
- get: function () { return chunkJLBSGA65_cjs.AzureBlobStore; }
13
+ get: function () { return chunk74CBJSIM_cjs.AzureBlobStore; }
14
14
  });
15
15
  Object.defineProperty(exports, "azureBlobFilesystemProvider", {
16
16
  enumerable: true,
17
- get: function () { return chunkJLBSGA65_cjs.azureBlobFilesystemProvider; }
17
+ get: function () { return chunk74CBJSIM_cjs.azureBlobFilesystemProvider; }
18
18
  });
19
19
  Object.defineProperty(exports, "azureBlobStoreProvider", {
20
20
  enumerable: true,
21
- get: function () { return chunkJLBSGA65_cjs.azureBlobStoreProvider; }
21
+ get: function () { return chunk74CBJSIM_cjs.azureBlobStoreProvider; }
22
22
  });
23
23
  //# sourceMappingURL=index.cjs.map
24
24
  //# sourceMappingURL=index.cjs.map
@@ -1,3 +1,3 @@
1
- export { AzureBlobFilesystem, AzureBlobStore, azureBlobFilesystemProvider, azureBlobStoreProvider } from '../chunk-DBBJ2YM7.js';
1
+ export { AzureBlobFilesystem, AzureBlobStore, azureBlobFilesystemProvider, azureBlobStoreProvider } from '../chunk-T7WJTVIJ.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
@@ -141,6 +141,9 @@ var AzureBlobFilesystem = class extends workspace.MastraFilesystem {
141
141
  if (this.endpoint) {
142
142
  config.endpoint = this.endpoint;
143
143
  }
144
+ if (this.prefix) {
145
+ config.prefix = this.prefix;
146
+ }
144
147
  if (this.readOnly) {
145
148
  config.readOnly = true;
146
149
  }
@@ -757,5 +760,5 @@ exports.AzureBlobFilesystem = AzureBlobFilesystem;
757
760
  exports.AzureBlobStore = AzureBlobStore;
758
761
  exports.azureBlobFilesystemProvider = azureBlobFilesystemProvider;
759
762
  exports.azureBlobStoreProvider = azureBlobStoreProvider;
760
- //# sourceMappingURL=chunk-JLBSGA65.cjs.map
761
- //# sourceMappingURL=chunk-JLBSGA65.cjs.map
763
+ //# sourceMappingURL=chunk-74CBJSIM.cjs.map
764
+ //# sourceMappingURL=chunk-74CBJSIM.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/blob/filesystem/index.ts","../src/blob/blob-store/index.ts","../src/blob/provider.ts"],"names":["MastraFilesystem","BlobServiceClient","StorageSharedKeyCredential","PermissionError","FileNotFoundError","FileExistsError","BlobSASPermissions","trimSlashes","isNotFoundError","BlobStore"],"mappings":";;;;;;;AA2CA,IAAM,UAAA,GAAqC;AAAA,EACzC,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,EACR,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,EACT,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,EACR,MAAA,EAAQ,iBAAA;AAAA,EACR,MAAA,EAAQ,iBAAA;AAAA,EACR,KAAA,EAAO,kBAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAEA,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;AAEA,SAAS,gBAAgB,KAAA,EAAyB;AAChD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,OAAA,GAAU,KAAA;AAChB,EAAA,OAAO,QAAQ,UAAA,KAAe,GAAA;AAChC;AAEA,SAAS,oBAAoB,KAAA,EAAyB;AACpD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,OAAA,GAAU,KAAA;AAChB,EAAA,OAAO,QAAQ,UAAA,KAAe,GAAA;AAChC;AAGA,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;AAEA,eAAe,eAAe,MAAA,EAA4D;AACxF,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAClC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,IAAA,MAAA,CAAO,KAAK,OAAO,KAAA,KAAU,QAAA,GAAW,MAAA,CAAO,KAAK,KAAK,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EAClH;AACA,EAAA,OAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAC7B;AAEA,SAAS,SAAS,OAAA,EAA8B;AAC9C,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,OAAA;AACrC,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,SAAS,OAAO,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAC1F;AAsCO,IAAM,mBAAA,GAAN,cAAkCA,0BAAA,CAAiB;AAAA,EAC/C,EAAA;AAAA,EACA,IAAA,GAAO,qBAAA;AAAA,EACP,QAAA,GAAW,YAAA;AAAA,EACX,QAAA;AAAA,EAET,MAAA,GAAyB,SAAA;AAAA,EAEhB,WAAA;AAAA,EACA,IAAA,GAAuB,YAAA;AAAA,EACvB,WAAA;AAAA,EAEQ,aAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EAET,gBAAA,GAA2C,IAAA;AAAA,EAEnD,YAAY,OAAA,EAAqC;AAC/C,IAAA,KAAA,CAAM,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,uBAAuB,CAAA;AACjD,IAAA,IAAA,CAAK,EAAA,GAAK,QAAQ,EAAA,IAAM,CAAA,SAAA,EAAY,KAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,IAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACrG,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,SAAA;AAC7B,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,mBAAmB,OAAA,CAAQ,gBAAA;AAChC,IAAA,IAAA,CAAK,oBAAA,GAAuB,QAAQ,oBAAA,IAAwB,KAAA;AAC5D,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA,GAAS,YAAY,OAAA,CAAQ,MAAM,IAAI,GAAA,GAAM,EAAA;AACnE,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAExB,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,WAAA,IAAe,oBAAA;AAC1C,IAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,IAAA,IAAQ,YAAA;AAC5B,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,YAAA,GAAyC;AACvC,IAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,EACjC;AAAA,EAEA,cAAA,GAAuC;AACrC,IAAA,MAAM,MAAA,GAA+B;AAAA,MACnC,IAAA,EAAM,YAAA;AAAA,MACN,WAAW,IAAA,CAAK;AAAA,KAClB;AAEA,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,MAAA,CAAO,mBAAmB,IAAA,CAAK,gBAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,MAAA,CAAO,cAAc,IAAA,CAAK,WAAA;AAAA,MAC5B;AACA,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,MAAA,CAAO,aAAa,IAAA,CAAK,UAAA;AAAA,MAC3B;AACA,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,MAAA,CAAO,WAAW,IAAA,CAAK,QAAA;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,MAAA,MAAA,CAAO,oBAAA,GAAuB,IAAA;AAAA,IAChC;AAEA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAA,CAAO,WAAW,IAAA,CAAK,QAAA;AAAA,IACzB;AAEA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAA,CAAO,SAAS,IAAA,CAAK,MAAA;AAAA,IACvB;AAEA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAAA,IACpB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,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,WAAW,IAAA,CAAK,aAAA;AAAA,QAChB,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,EAEA,eAAA,GAA0B;AACxB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,GAAW,WAAA,GAAc,YAAA;AAC7C,IAAA,OAAO,CAAA,iCAAA,EAAoC,IAAA,CAAK,aAAa,CAAA,GAAA,EAAM,MAAM,CAAA,8CAAA,CAAA;AAAA,EAC3E;AAAA,EAEA,MAAc,kBAAA,GAA+C;AAC3D,IAAA,IAAI,IAAA,CAAK,gBAAA,EAAkB,OAAO,IAAA,CAAK,gBAAA;AAEvC,IAAA,IAAI,aAAA;AAEJ,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,aAAA,GAAgBC,6BAAA,CAAkB,oBAAA,CAAqB,IAAA,CAAK,gBAAgB,CAAA;AAAA,IAC9E,CAAA,MAAO;AACL,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,CAAC,KAAK,WAAA,EAAa;AACvC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SAEF;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,IAAY,CAAA,QAAA,EAAW,KAAK,WAAW,CAAA,sBAAA,CAAA;AAE5D,MAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,UAAA,EAAY;AACvC,QAAA,MAAM,aAAa,IAAIC,sCAAA,CAA2B,IAAA,CAAK,WAAA,EAAa,KAAK,UAAU,CAAA;AACnF,QAAA,aAAA,GAAgB,IAAID,6BAAA,CAAkB,OAAA,EAAS,UAAU,CAAA;AAAA,MAC3D,CAAA,MAAA,IAAW,KAAK,QAAA,EAAU;AACxB,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC5C,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AAChD,QAAA,aAAA,GAAgB,IAAIA,8BAAkB,CAAA,EAAG,OAAO,GAAG,SAAS,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA;AAAA,MACtE,CAAA,MAAA,IAAW,KAAK,oBAAA,EAAsB;AAGpC,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,MAAM,OAAO,iBAAiB,CAAA;AAC/C,UAAA,MAAM,UAAA,GAAa,IAAI,QAAA,CAAS,sBAAA,EAAuB;AACvD,UAAA,aAAA,GAAgB,IAAIA,6BAAA,CAAkB,OAAA,EAAS,UAAU,CAAA;AAAA,QAC3D,CAAA,CAAA,MAAQ;AACN,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WAEF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,aAAA,GAAgB,IAAIA,8BAAkB,OAAO,CAAA;AAAA,MAC/C;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,gBAAA,GAAmB,aAAA,CAAc,kBAAA,CAAmB,IAAA,CAAK,aAAa,CAAA;AAC3E,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA,EAEA,MAAc,iBAAA,GAA8C;AAC1D,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,EACjC;AAAA,EAEQ,MAAM,IAAA,EAAsB;AAClC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACzC,IAAA,OAAO,KAAK,MAAA,GAAS,SAAA;AAAA,EACvB;AAAA,EAEQ,YAAY,KAAA,EAAyB;AAC3C,IAAA,IAAI,mBAAA,CAAoB,KAAK,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,MAAA,IAAA,CAAK,KAAA,GAAQ,6DAAA;AAAA,IACf;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,cAAA,CAAe,MAAc,SAAA,EAAyB;AAC5D,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAIE,yBAAA,CAAgB,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA,0BAAA,CAA4B,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAA,CAAS,IAAA,EAAc,OAAA,EAAiD;AAC5E,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,aAAa,eAAA,CAAgB,kBAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEtE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,QAAA,CAAS,CAAC,CAAA;AAC5C,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,QAAA,CAAS,kBAAkB,CAAA;AAE/D,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,OAAO,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAAA,MACzC;AACA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAIC,4BAAkB,IAAI,CAAA;AAAA,MAClC;AACA,MAAA,MAAM,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CAAU,IAAA,EAAc,OAAA,EAAsB,OAAA,EAAuC;AACzF,IAAA,IAAA,CAAK,cAAA,CAAe,MAAM,OAAO,CAAA;AACjC,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAErD,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,SAAS,OAAO,CAAA;AAC7B,IAAA,MAAM,WAAA,GAAc,YAAY,IAAI,CAAA;AACpC,IAAA,MAAM,aAAa,eAAA,CAAgB,kBAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEtE,IAAA,MAAM,UAAA,CAAW,MAAA,CAAO,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ;AAAA,MACzC,eAAA,EAAiB,EAAE,eAAA,EAAiB,WAAA;AAAY,KACjD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,UAAA,CAAW,IAAA,EAAc,OAAA,EAAqC;AAClE,IAAA,IAAA,CAAK,cAAA,CAAe,MAAM,QAAQ,CAAA;AAClC,IAAA,IAAI,QAAA,GAAmB,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AACrC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AACrC,MAAA,QAAA,GAAW,OAAO,QAAA,CAAS,IAAI,IAAI,IAAA,GAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAC5D,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiBD,2BAAA,EAAmB,CAExC,MAAO;AACL,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,SAAS,OAAO,CAAA;AACrC,IAAA,MAAM,IAAA,CAAK,UAAU,IAAA,EAAM,MAAA,CAAO,OAAO,CAAC,QAAA,EAAU,YAAY,CAAC,CAAC,CAAA;AAAA,EACpE;AAAA,EAEA,MAAM,UAAA,CAAW,IAAA,EAAc,OAAA,EAAwC;AACrE,IAAA,IAAA,CAAK,cAAA,CAAe,MAAM,QAAQ,CAAA;AAClC,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,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,aAAa,eAAA,CAAgB,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEjE,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAA,EAAO;AAAA,IAC1B,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC1B,QAAA,IAAI,SAAS,KAAA,EAAO;AACpB,QAAA,MAAM,IAAIA,4BAAkB,IAAI,CAAA;AAAA,MAClC;AACA,MAAA,MAAM,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,CAAS,GAAA,EAAa,IAAA,EAAc,OAAA,EAAsC;AAC9E,IAAA,IAAA,CAAK,cAAA,CAAe,MAAM,MAAM,CAAA;AAChC,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,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,UAAU,eAAA,CAAgB,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAC7D,IAAA,MAAM,WAAW,eAAA,CAAgB,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAE/D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,cAAA,CAAe;AAAA,QAC1C,WAAA,EAAaC,8BAAA,CAAmB,KAAA,CAAM,GAAG,CAAA;AAAA,QACzC,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,KAAI,GAAI,CAAA,GAAI,KAAK,GAAI;AAAA,OAC/C,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,aAAA,EAAc;AAE/C,MAAA,IAAI,UAAA,CAAW,kBAAkB,CAAA,EAAG;AAElC,QAAA,MAAM,QAAA,CAAS,oBAAmB,CAAE,MAAA,CAAO,OAAO,KAAA,CAAM,CAAC,GAAG,CAAC,CAAA;AAC7D,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,kBAAA,GAAqB,MAAM,IAAA,GAAO,IAAA;AACxC,MAAA,IAAA,CAAK,UAAA,CAAW,aAAA,IAAiB,CAAA,KAAM,kBAAA,EAAoB;AACzD,QAAA,MAAM,QAAA,CAAS,gBAAgB,MAAM,CAAA;AAAA,MACvC,CAAA,MAAO;AACL,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,gBAAA,CAAiB,MAAM,CAAA;AACrD,QAAA,MAAM,OAAO,aAAA,EAAc;AAAA,MAC7B;AAAA,IACF,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAIF,4BAAkB,GAAG,CAAA;AAAA,MACjC;AAIA,MAAA,IACE,iBAAiB,KAAA,KAChB,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,gBAAgB,CAAA,IACrC,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,uBAAuB,CAAA,CAAA,EAClF;AACA,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AACvC,QAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,OAAO,CAAA;AAClC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,CAAS,GAAA,EAAa,IAAA,EAAc,OAAA,EAAsC;AAC9E,IAAA,IAAA,CAAK,cAAA,CAAe,MAAM,MAAM,CAAA;AAChC,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,IAAA,CAAK,cAAA,CAAe,MAAM,OAAO,CAAA;AACjC,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,IAAI,EAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,GAAA;AAErD,IAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,MAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,aAAA,CAAc,EAAE,QAAQ,CAAA;AACrD,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,EAAK;AAC9B,MAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACf,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAE,CAAA;AAAA,MAChD;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,YAAsB,EAAC;AAC3B,IAAA,WAAA,MAAiB,QAAQ,eAAA,CAAgB,aAAA,CAAc,EAAE,MAAA,EAAQ,CAAA,EAAG;AAClE,MAAA,SAAA,CAAU,IAAA,CAAK,KAAK,IAAI,CAAA;AAExB,MAAA,IAAI,SAAA,CAAU,UAAU,GAAA,EAAK;AAC3B,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,eAAA,EAAiB,SAAS,CAAA;AACrD,QAAA,SAAA,GAAY,EAAC;AAAA,MACf;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,eAAA,EAAiB,SAAS,CAAA;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAc,eAAA,CAAgB,eAAA,EAAkC,SAAA,EAAoC;AAClG,IAAA,MAAM,cAAc,SAAA,CAAU,GAAA,CAAI,UAAQ,eAAA,CAAgB,aAAA,CAAc,IAAI,CAAC,CAAA;AAC7E,IAAA,MAAM,eAAA,CAAgB,kBAAA,EAAmB,CAAE,WAAA,CAAY,WAAW,CAAA;AAAA,EACpE;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAc,OAAA,EAA6C;AACvE,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAErD,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,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,WAAA,MAAiB,QAAQ,eAAA,CAAgB,aAAA,CAAc,EAAE,MAAA,EAAQ,YAAA,EAAc,CAAA,EAAG;AAChF,QAAA,MAAM,MAAM,IAAA,CAAK,IAAA;AACjB,QAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,YAAA,EAAc;AAElC,QAAA,MAAM,YAAA,GAAe,GAAA,CAAI,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA;AAClD,QAAA,IAAI,CAAC,YAAA,EAAc;AAEnB,QAAA,IAAI,YAAA,CAAa,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9B,UAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACxC,UAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1B,YAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AACpB,YAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,aAAa,CAAA;AAAA,UACnD;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,SAAS,SAAA,EAAW;AACtB,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,IAAI,OAAA,CAAQ,SAAA,GAAY,CAAC,OAAA,CAAQ,SAAS,CAAA;AAC5F,UAAA,IAAI,CAAC,WAAW,IAAA,CAAK,CAAA,GAAA,KAAO,aAAa,QAAA,CAAS,GAAG,CAAC,CAAA,EAAG;AACvD,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,IAAA,EAAM,YAAA;AAAA,UACN,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,KAAK,UAAA,CAAW;AAAA,SACvB,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MAAO;AACL,MAAA,WAAA,MAAiB,IAAA,IAAQ,gBAAgB,oBAAA,CAAqB,GAAA,EAAK,EAAE,MAAA,EAAQ,YAAA,EAAc,CAAA,EAAG;AAC5F,QAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,UAAA,MAAM,OAAA,GAAU,KAAK,IAAA,CAAK,KAAA,CAAM,aAAa,MAAM,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACtE,UAAA,IAAI,OAAA,IAAW,CAAC,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AACrC,YAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AACpB,YAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,aAAa,CAAA;AAAA,UACnD;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,MAAM,IAAA,CAAK,IAAA;AACjB,UAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,YAAA,EAAc;AAElC,UAAA,MAAM,YAAA,GAAe,GAAA,CAAI,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA;AAClD,UAAA,IAAI,CAAC,YAAA,EAAc;AAEnB,UAAA,IAAI,YAAA,CAAa,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9B,YAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACxC,YAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1B,cAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AACpB,cAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,aAAa,CAAA;AAAA,YACnD;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,SAAS,SAAA,EAAW;AACtB,YAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,IAAI,OAAA,CAAQ,SAAA,GAAY,CAAC,OAAA,CAAQ,SAAS,CAAA;AAC5F,YAAA,IAAI,CAAC,WAAW,IAAA,CAAK,CAAA,GAAA,KAAO,aAAa,QAAA,CAAS,GAAG,CAAC,CAAA,EAAG;AACvD,cAAA;AAAA,YACF;AAAA,UACF;AAEA,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,IAAA,EAAM,YAAA;AAAA,YACN,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,KAAK,UAAA,CAAW;AAAA,WACvB,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;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;AAC3B,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,aAAA,CAAc,GAAG,CAAA;AAEpD,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,MAAA,EAAO;AACvC,IAAA,IAAI,QAAQ,OAAO,IAAA;AAGnB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,GAAA;AACxC,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,aAAA,CAAc,EAAE,QAAQ,CAAA;AACrD,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,EAAK;AAC9B,IAAA,OAAO,CAAC,KAAA,CAAM,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,IAAA,EAAiC;AAC1C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE3B,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,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,aAAA,CAAc,GAAG,CAAA;AAEpD,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,aAAA,EAAc;AAClD,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,WAAW,aAAA,IAAiB,CAAA;AAAA,QAClC,SAAA,EAAW,UAAA,CAAW,SAAA,oBAAa,IAAI,IAAA,EAAK;AAAA,QAC5C,UAAA,EAAY,UAAA,CAAW,YAAA,oBAAgB,IAAI,IAAA;AAAK,OAClD;AAAA,IACF,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,CAAC,eAAA,CAAgB,KAAK,GAAG,MAAM,IAAA,CAAK,YAAY,KAAK,CAAA;AAEzD,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACzC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA;AACtD,QAAA,OAAO;AAAA,UACL,IAAA;AAAA,UACA,IAAA;AAAA,UACA,IAAA,EAAM,WAAA;AAAA,UACN,IAAA,EAAM,CAAA;AAAA,UACN,SAAA,sBAAe,IAAA,EAAK;AAAA,UACpB,UAAA,sBAAgB,IAAA;AAAK,SACvB;AAAA,MACF;AAEA,MAAA,MAAM,IAAIA,4BAAkB,IAAI,CAAA;AAAA,IAClC;AAAA,EACF;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,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,aAAA,CAAc,GAAG,CAAA;AACpD,IAAA,OAAO,WAAW,MAAA,EAAO;AAAA,EAC3B;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,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,GAAA;AACxC,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,aAAA,CAAc,EAAE,QAAQ,CAAA;AACrD,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,EAAK;AAC9B,IAAA,OAAO,CAAC,KAAA,CAAM,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAA,GAAsB;AAC1B,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AACtD,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,MAAM,OAAO,eAAA,CAAgB,aAAA,CAAc,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAClE,QAAA,MAAM,KAAK,IAAA,EAAK;AAChB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,MAAA,EAAO;AAC5C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,IAAA,CAAK,aAAa,CAAA,gBAAA,CAAkB,CAAA;AACxE,QAAA,GAAA,CAAI,MAAA,GAAS,GAAA;AACb,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAK,MAA8B,MAAA,EAAQ;AACzC,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,MAAM,aAAc,KAAA,CAAoB,UAAA;AACxC,MAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,QAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,QAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,OAAO,CAAA;AAC7B,QAAA,GAAA,CAAI,MAAA,GAAS,UAAA;AACb,QAAA,MAAM,GAAA;AAAA,MACR;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,EAC1B;AACF;AC5rBA,SAASG,aAAY,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;AAEA,SAASC,iBAAgB,KAAA,EAAyB;AAChD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,OAAQ,MAAkC,UAAA,KAAe,GAAA;AAC3D;AAGA,IAAM,iBAAA,GAAoB,GAAA;AAiCnB,IAAM,cAAA,GAAN,cAA6BC,iBAAA,CAAU;AAAA,EAC3B,aAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EAET,gBAAA,GAA2C,IAAA;AAAA,EAEnD,YAAY,OAAA,EAAgC;AAC1C,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,SAAA;AAC7B,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,mBAAmB,OAAA,CAAQ,gBAAA;AAChC,IAAA,IAAA,CAAK,oBAAA,GAAuB,QAAQ,oBAAA,IAAwB,KAAA;AAC5D,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA,GAASF,aAAY,OAAA,CAAQ,MAAM,IAAI,GAAA,GAAM,qBAAA;AAAA,EACrE;AAAA,EAEA,MAAc,kBAAA,GAA+C;AAC3D,IAAA,IAAI,IAAA,CAAK,gBAAA,EAAkB,OAAO,IAAA,CAAK,gBAAA;AAEvC,IAAA,IAAI,aAAA;AAEJ,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,aAAA,GAAgBN,6BAAAA,CAAkB,oBAAA,CAAqB,IAAA,CAAK,gBAAgB,CAAA;AAAA,IAC9E,CAAA,MAAO;AACL,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,CAAC,KAAK,WAAA,EAAa;AACvC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SAEF;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,IAAY,CAAA,QAAA,EAAW,KAAK,WAAW,CAAA,sBAAA,CAAA;AAE5D,MAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,UAAA,EAAY;AACvC,QAAA,MAAM,aAAa,IAAIC,sCAAAA,CAA2B,IAAA,CAAK,WAAA,EAAa,KAAK,UAAU,CAAA;AACnF,QAAA,aAAA,GAAgB,IAAID,6BAAAA,CAAkB,OAAA,EAAS,UAAU,CAAA;AAAA,MAC3D,CAAA,MAAA,IAAW,KAAK,QAAA,EAAU;AACxB,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC5C,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AAChD,QAAA,aAAA,GAAgB,IAAIA,8BAAkB,CAAA,EAAG,OAAO,GAAG,SAAS,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA;AAAA,MACtE,CAAA,MAAA,IAAW,KAAK,oBAAA,EAAsB;AAGpC,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,MAAM,OAAO,iBAAiB,CAAA;AAC/C,UAAA,MAAM,UAAA,GAAa,IAAI,QAAA,CAAS,sBAAA,EAAuB;AACvD,UAAA,aAAA,GAAgB,IAAIA,6BAAAA,CAAkB,OAAA,EAAS,UAAU,CAAA;AAAA,QAC3D,CAAA,CAAA,MAAQ;AACN,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WAEF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,aAAA,GAAgB,IAAIA,8BAAkB,OAAO,CAAA;AAAA,MAC/C;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,gBAAA,GAAmB,aAAA,CAAc,kBAAA,CAAmB,IAAA,CAAK,aAAa,CAAA;AAC3E,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA,EAEQ,MAAM,IAAA,EAAsB;AAClC,IAAA,OAAO,KAAK,MAAA,GAAS,IAAA;AAAA,EACvB;AAAA,EAEA,MAAM,IAAA,GAAsB;AAAA,EAE5B;AAAA,EAEA,MAAM,IAAI,KAAA,EAAwC;AAChD,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AACtD,IAAA,MAAM,aAAa,eAAA,CAAgB,kBAAA,CAAmB,KAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,CAAA;AAC5E,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,SAAA,oBAAa,IAAI,IAAA,EAAK;AACxC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,SAAS,OAAO,CAAA;AAEjD,IAAA,MAAM,UAAA,CAAW,WAAW,MAAA,EAAQ;AAAA,MAClC,eAAA,EAAiB;AAAA,QACf,eAAA,EAAiB,MAAM,QAAA,IAAY;AAAA,OACrC;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAAA,QACvB,SAAA,EAAW,IAAI,WAAA,EAAY;AAAA,QAC3B,GAAI,MAAM,QAAA,GAAW,EAAE,UAAU,KAAA,CAAM,QAAA,KAAa;AAAC;AACvD,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,IAAA,EAAgD;AACxD,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AACtD,IAAA,MAAM,aAAa,eAAA,CAAgB,kBAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEtE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,gBAAA,EAAiB;AACjD,MAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,aAAA,EAAc;AAClD,MAAA,MAAM,QAAA,GAAW,UAAA,CAAW,QAAA,IAAY,EAAC;AACzC,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA;AAEvC,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA,EAAM,QAAA,CAAS,IAAA,IAAQ,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,OAAO,CAAA;AAAA,QACxF,QAAA,EAAU,QAAA,CAAS,QAAA,IAAY,UAAA,CAAW,WAAA,IAAe,MAAA;AAAA,QACzD,SAAA,EAAW,SAAS,SAAA,GAAY,IAAI,KAAK,QAAA,CAAS,SAAS,CAAA,mBAAI,IAAI,IAAA;AAAK,OAC1E;AAAA,IACF,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAIO,gBAAAA,CAAgB,KAAK,CAAA,EAAG,OAAO,IAAA;AACnC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,IAAA,EAAgC;AACxC,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AACtD,IAAA,MAAM,aAAa,eAAA,CAAgB,kBAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEtE,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,aAAA,EAAc;AAC/B,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAIA,gBAAAA,CAAgB,KAAK,CAAA,EAAG,OAAO,KAAA;AACnC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,IAAA,EAAgC;AAC3C,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AACtD,IAAA,MAAM,aAAa,eAAA,CAAgB,kBAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AACtE,IAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,cAAA,EAAe;AACjD,IAAA,OAAO,QAAA,CAAS,SAAA;AAAA,EAClB;AAAA,EAEA,MAAM,QAAQ,OAAA,EAA4C;AACxD,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAG1B,IAAA,MAAM,OAAA,CAAQ,IAAI,OAAA,CAAQ,GAAA,CAAI,WAAS,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAC,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,QAAQ,MAAA,EAA0D;AACtE,IAAA,MAAM,MAAA,uBAAa,GAAA,EAA8B;AACjD,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAEhC,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAC,CAAC,CAAA;AACpE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,MAC9B;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,mBAAA,GAAqC;AACzC,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AACtD,IAAA,IAAI,QAAkB,EAAC;AAEvB,IAAA,WAAA,MAAiB,IAAA,IAAQ,gBAAgB,aAAA,CAAc,EAAE,QAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG;AAC/E,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AACpB,MAAA,IAAI,KAAA,CAAM,UAAU,iBAAA,EAAmB;AACrC,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,eAAA,EAAiB,KAAK,CAAA;AACjD,QAAA,KAAA,GAAQ,EAAC;AAAA,MACX;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,eAAA,EAAiB,KAAK,CAAA;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,MAAc,eAAA,CAAgB,eAAA,EAAkC,SAAA,EAAoC;AAClG,IAAA,MAAM,cAAc,SAAA,CAAU,GAAA,CAAI,UAAQ,eAAA,CAAgB,aAAA,CAAc,IAAI,CAAC,CAAA;AAC7E,IAAA,MAAM,eAAA,CAAgB,kBAAA,EAAmB,CAAE,WAAA,CAAY,WAAW,CAAA;AAAA,EACpE;AACF;;;AChQO,IAAM,2BAAA,GAA8E;AAAA,EACzF,EAAA,EAAI,YAAA;AAAA,EACJ,IAAA,EAAM,oBAAA;AAAA,EACN,WAAA,EAAa,8BAAA;AAAA,EACb,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,IACtB,UAAA,EAAY;AAAA,MACV,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,2BAAA,EAA4B;AAAA,MACtE,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,sBAAA,EAAuB;AAAA,MACnE,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,qBAAA,EAAsB;AAAA,MACjE,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+BAAA,EAAgC;AAAA,MACzE,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uDAAA,EAAwD;AAAA,MACzG,oBAAA,EAAsB;AAAA,QACpB,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,uDAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;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,4CAAA;AAA6C;AACxF,GACF;AAAA,EACA,gBAAA,EAAkB,CAAA,MAAA,KAAU,IAAI,mBAAA,CAAoB,MAAM;AAC5D;AAEO,IAAM,sBAAA,GAAmE;AAAA,EAC9E,EAAA,EAAI,YAAA;AAAA,EACJ,IAAA,EAAM,kBAAA;AAAA,EACN,WAAA,EAAa,+DAAA;AAAA,EACb,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,IACtB,UAAA,EAAY;AAAA,MACV,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,2BAAA,EAA4B;AAAA,MACtE,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,sBAAA,EAAuB;AAAA,MACnE,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,qBAAA,EAAsB;AAAA,MACjE,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+BAAA,EAAgC;AAAA,MACzE,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uDAAA,EAAwD;AAAA,MACzG,oBAAA,EAAsB;AAAA,QACpB,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,uDAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,MACA,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,4DAAA,EAA6D;AAAA,MACpG,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,4CAAA;AAA6C;AACxF,GACF;AAAA,EACA,eAAA,EAAiB,CAAA,MAAA,KAAU,IAAI,cAAA,CAAe,MAAM;AACtD","file":"chunk-74CBJSIM.cjs","sourcesContent":["/**\n * Azure Blob Storage Filesystem Provider\n *\n * A filesystem implementation backed by Azure Blob Storage.\n */\n\nimport { BlobSASPermissions, BlobServiceClient, StorageSharedKeyCredential } from '@azure/storage-blob';\nimport type { ContainerClient, RestError } from '@azure/storage-blob';\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, PermissionError } from '@mastra/core/workspace';\n\n/**\n * Azure Blob mount configuration.\n * Returned by AzureBlobFilesystem.getMountConfig() for FUSE mounting in sandboxes.\n */\nexport interface AzureBlobMountConfig extends FilesystemMountConfig {\n type: 'azure-blob';\n container: string;\n accountName?: string;\n accountKey?: string;\n sasToken?: string;\n connectionString?: string;\n useDefaultCredential?: boolean;\n endpoint?: string;\n prefix?: string;\n readOnly?: boolean;\n}\n\nconst MIME_TYPES: Record<string, string> = {\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 '.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 '.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 '.pdf': 'application/pdf',\n '.zip': 'application/zip',\n '.gz': 'application/gzip',\n '.tar': 'application/x-tar',\n};\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\nfunction isNotFoundError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n const restErr = error as { statusCode?: number };\n return restErr.statusCode === 404;\n}\n\nfunction isAccessDeniedError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n const restErr = error as { statusCode?: number };\n return restErr.statusCode === 403;\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\nasync function streamToBuffer(stream: NodeJS.ReadableStream | undefined): Promise<Buffer> {\n if (!stream) return Buffer.alloc(0);\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks);\n}\n\nfunction toBuffer(content: FileContent): Buffer {\n if (Buffer.isBuffer(content)) return content;\n return typeof content === 'string' ? Buffer.from(content, 'utf-8') : Buffer.from(content);\n}\n\nexport interface AzureBlobFilesystemOptions extends MastraFilesystemOptions {\n /** Unique identifier for this filesystem instance */\n id?: string;\n /** Azure Blob container name */\n container: string;\n /** Human-friendly display name for the UI */\n displayName?: string;\n /** Icon identifier for the UI (defaults to 'azure-blob') */\n icon?: FilesystemIcon;\n /** Description shown in tooltips */\n description?: string;\n /** Storage account name (required unless using connectionString) */\n accountName?: string;\n /** Storage account key */\n accountKey?: string;\n /** SAS token for authentication */\n sasToken?: string;\n /** Full connection string (takes priority over accountName/accountKey) */\n connectionString?: string;\n /**\n * Use DefaultAzureCredential from @azure/identity for authentication.\n * Supports Managed Identity, Azure CLI, environment variables, etc.\n * Requires @azure/identity to be installed as a peer dependency.\n */\n useDefaultCredential?: boolean;\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 endpoint URL.\n * Used for local development with Azurite emulator.\n */\n endpoint?: string;\n}\n\nexport class AzureBlobFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'AzureBlobFilesystem';\n readonly provider = 'azure-blob';\n readonly readOnly?: boolean;\n\n status: ProviderStatus = 'pending';\n\n readonly displayName?: string;\n readonly icon: FilesystemIcon = 'azure-blob';\n readonly description?: string;\n\n private readonly containerName: string;\n private readonly accountName?: string;\n private readonly accountKey?: string;\n private readonly sasToken?: string;\n private readonly connectionString?: string;\n private readonly useDefaultCredential: boolean;\n private readonly prefix: string;\n private readonly endpoint?: string;\n\n private _containerClient: ContainerClient | null = null;\n\n constructor(options: AzureBlobFilesystemOptions) {\n super({ ...options, name: 'AzureBlobFilesystem' });\n this.id = options.id ?? `azure-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n this.containerName = options.container;\n this.accountName = options.accountName;\n this.accountKey = options.accountKey;\n this.sasToken = options.sasToken;\n this.connectionString = options.connectionString;\n this.useDefaultCredential = options.useDefaultCredential ?? false;\n this.prefix = options.prefix ? trimSlashes(options.prefix) + '/' : '';\n this.endpoint = options.endpoint;\n\n this.displayName = options.displayName ?? 'Azure Blob Storage';\n this.icon = options.icon ?? 'azure-blob';\n this.description = options.description;\n this.readOnly = options.readOnly;\n }\n\n /**\n * Get the underlying ContainerClient for direct access to Azure Blob APIs.\n *\n * Use this when you need features not exposed through the WorkspaceFilesystem\n * interface (e.g., SAS URL generation, lease management, etc.).\n *\n * This is async because DefaultAzureCredential requires a dynamic import.\n * For non-DefaultAzureCredential auth methods, the promise resolves immediately.\n */\n getContainer(): Promise<ContainerClient> {\n return this.getContainerClient();\n }\n\n getMountConfig(): AzureBlobMountConfig {\n const config: AzureBlobMountConfig = {\n type: 'azure-blob',\n container: this.containerName,\n };\n\n if (this.connectionString) {\n config.connectionString = this.connectionString;\n } else {\n if (this.accountName) {\n config.accountName = this.accountName;\n }\n if (this.accountKey) {\n config.accountKey = this.accountKey;\n }\n if (this.sasToken) {\n config.sasToken = this.sasToken;\n }\n }\n\n if (this.useDefaultCredential) {\n config.useDefaultCredential = true;\n }\n\n if (this.endpoint) {\n config.endpoint = this.endpoint;\n }\n\n if (this.prefix) {\n config.prefix = this.prefix;\n }\n\n if (this.readOnly) {\n config.readOnly = true;\n }\n\n return config;\n }\n\n getInfo(): FilesystemInfo<{\n container: 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 container: this.containerName,\n ...(this.endpoint && { endpoint: this.endpoint }),\n ...(this.prefix && { prefix: this.prefix }),\n },\n };\n }\n\n getInstructions(): string {\n const access = this.readOnly ? 'Read-only' : 'Persistent';\n return `Azure Blob Storage in container \"${this.containerName}\". ${access} storage - files are retained across sessions.`;\n }\n\n private async getContainerClient(): Promise<ContainerClient> {\n if (this._containerClient) return this._containerClient;\n\n let serviceClient: BlobServiceClient;\n\n if (this.connectionString) {\n serviceClient = BlobServiceClient.fromConnectionString(this.connectionString);\n } else {\n if (!this.endpoint && !this.accountName) {\n throw new Error(\n 'Azure Blob Storage requires either a connectionString, or an accountName/endpoint. ' +\n 'Provide at least one of: connectionString, accountName, or endpoint.',\n );\n }\n const baseUrl = this.endpoint ?? `https://${this.accountName}.blob.core.windows.net`;\n\n if (this.accountName && this.accountKey) {\n const credential = new StorageSharedKeyCredential(this.accountName, this.accountKey);\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } else if (this.sasToken) {\n const sas = this.sasToken.replace(/^\\?+/, '');\n const separator = baseUrl.includes('?') ? '&' : '?';\n serviceClient = new BlobServiceClient(`${baseUrl}${separator}${sas}`);\n } else if (this.useDefaultCredential) {\n // Dynamically import @azure/identity to avoid requiring it when not used.\n // Must use import() (not require()) because this package is ESM-first.\n try {\n const identity = await import('@azure/identity');\n const credential = new identity.DefaultAzureCredential();\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } catch {\n throw new Error(\n 'DefaultAzureCredential requires @azure/identity to be installed. ' +\n 'Install it with: npm install @azure/identity',\n );\n }\n } else {\n // Anonymous access\n serviceClient = new BlobServiceClient(baseUrl);\n }\n }\n\n this._containerClient = serviceClient.getContainerClient(this.containerName);\n return this._containerClient;\n }\n\n private async getReadyContainer(): Promise<ContainerClient> {\n await this.ensureReady();\n return this.getContainerClient();\n }\n\n private toKey(path: string): string {\n const cleanPath = path.replace(/^\\/+/, '');\n return this.prefix + cleanPath;\n }\n\n private handleError(error: unknown): unknown {\n if (isAccessDeniedError(error)) {\n this.status = 'error';\n this.error = 'Access denied - check credentials and container permissions';\n }\n return error;\n }\n\n private assertWritable(path: string, operation: string): void {\n if (this.readOnly) {\n throw new PermissionError(path, `${operation} (filesystem is read-only)`);\n }\n }\n\n // ---------------------------------------------------------------------------\n // File Operations\n // ---------------------------------------------------------------------------\n\n async readFile(path: string, options?: ReadOptions): Promise<string | Buffer> {\n const containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(path));\n\n try {\n const response = await blobClient.download(0);\n const buffer = await streamToBuffer(response.readableStreamBody);\n\n if (options?.encoding) {\n return buffer.toString(options.encoding);\n }\n return buffer;\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n throw new FileNotFoundError(path);\n }\n throw this.handleError(error);\n }\n }\n\n async writeFile(path: string, content: FileContent, options?: WriteOptions): Promise<void> {\n this.assertWritable(path, 'write');\n const containerClient = await this.getReadyContainer();\n\n if (options?.overwrite === false && (await this.exists(path))) {\n throw new FileExistsError(path);\n }\n\n const body = toBuffer(content);\n const contentType = getMimeType(path);\n const blobClient = containerClient.getBlockBlobClient(this.toKey(path));\n\n await blobClient.upload(body, body.length, {\n blobHTTPHeaders: { blobContentType: contentType },\n });\n }\n\n async appendFile(path: string, content: FileContent): Promise<void> {\n this.assertWritable(path, 'append');\n let existing: Buffer = Buffer.alloc(0);\n try {\n const read = await this.readFile(path);\n existing = Buffer.isBuffer(read) ? read : Buffer.from(read);\n } catch (error) {\n if (error instanceof FileNotFoundError) {\n // File doesn't exist, start fresh with empty buffer\n } else {\n throw error;\n }\n }\n\n const appendBuffer = toBuffer(content);\n await this.writeFile(path, Buffer.concat([existing, appendBuffer]));\n }\n\n async deleteFile(path: string, options?: RemoveOptions): Promise<void> {\n this.assertWritable(path, 'delete');\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 containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(this.toKey(path));\n\n try {\n await blobClient.delete();\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n if (options?.force) return;\n throw new FileNotFoundError(path);\n }\n throw this.handleError(error);\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n this.assertWritable(dest, 'copy');\n if (options?.overwrite === false && (await this.exists(dest))) {\n throw new FileExistsError(dest);\n }\n\n const containerClient = await this.getReadyContainer();\n const srcBlob = containerClient.getBlobClient(this.toKey(src));\n const destBlob = containerClient.getBlobClient(this.toKey(dest));\n\n try {\n const sasUrl = await srcBlob.generateSasUrl({\n permissions: BlobSASPermissions.parse('r'),\n expiresOn: new Date(Date.now() + 5 * 60 * 1000),\n });\n\n const properties = await srcBlob.getProperties();\n\n if (properties.contentLength === 0) {\n // Azure bug: syncCopyFromURL fails on zero-length blobs with CannotVerifyCopySource\n await destBlob.getBlockBlobClient().upload(Buffer.alloc(0), 0);\n return;\n }\n\n const MAX_SYNC_COPY_SIZE = 256 * 1024 * 1024;\n if ((properties.contentLength ?? 0) <= MAX_SYNC_COPY_SIZE) {\n await destBlob.syncCopyFromURL(sasUrl);\n } else {\n const poller = await destBlob.beginCopyFromURL(sasUrl);\n await poller.pollUntilDone();\n }\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n throw new FileNotFoundError(src);\n }\n\n // SAS generation fails without StorageSharedKeyCredential (e.g. DefaultAzureCredential).\n // Fall back to download+reupload.\n if (\n error instanceof Error &&\n (error.message.includes('generateSasUrl') ||\n (error.message.includes('SAS') && error.message.includes('shared key credential')))\n ) {\n const content = await this.readFile(src);\n await this.writeFile(dest, content);\n return;\n }\n\n throw this.handleError(error);\n }\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n this.assertWritable(dest, 'move');\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 // Azure Blob Storage 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 this.assertWritable(path, 'rmdir');\n const containerClient = await this.getReadyContainer();\n const prefix = this.toKey(path).replace(/\\/$/, '') + '/';\n\n if (!options?.recursive) {\n const iter = containerClient.listBlobsFlat({ prefix });\n const first = await iter.next();\n if (!first.done) {\n throw new Error(`Directory not empty: ${path}`);\n }\n return;\n }\n\n // Delete all blobs with this prefix in batches\n let blobNames: string[] = [];\n for await (const blob of containerClient.listBlobsFlat({ prefix })) {\n blobNames.push(blob.name);\n\n if (blobNames.length >= 256) {\n await this.deleteBlobBatch(containerClient, blobNames);\n blobNames = [];\n }\n }\n\n if (blobNames.length > 0) {\n await this.deleteBlobBatch(containerClient, blobNames);\n }\n }\n\n private async deleteBlobBatch(containerClient: ContainerClient, blobNames: string[]): Promise<void> {\n const blobClients = blobNames.map(name => containerClient.getBlobClient(name));\n await containerClient.getBlobBatchClient().deleteBlobs(blobClients);\n }\n\n async readdir(path: string, options?: ListOptions): Promise<FileEntry[]> {\n const containerClient = await this.getReadyContainer();\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 if (options?.recursive) {\n for await (const blob of containerClient.listBlobsFlat({ prefix: searchPrefix })) {\n const key = blob.name;\n if (!key || key === searchPrefix) continue;\n\n const relativePath = key.slice(searchPrefix.length);\n if (!relativePath) continue;\n\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 if (options?.extension) {\n const extensions = Array.isArray(options.extension) ? options.extension : [options.extension];\n if (!extensions.some(ext => relativePath.endsWith(ext))) {\n continue;\n }\n }\n\n entries.push({\n name: relativePath,\n type: 'file',\n size: blob.properties.contentLength,\n });\n }\n } else {\n for await (const item of containerClient.listBlobsByHierarchy('/', { prefix: searchPrefix })) {\n if (item.kind === 'prefix') {\n const dirName = item.name.slice(searchPrefix.length).replace(/\\/$/, '');\n if (dirName && !seenDirs.has(dirName)) {\n seenDirs.add(dirName);\n entries.push({ name: dirName, type: 'directory' });\n }\n } else {\n const key = item.name;\n if (!key || key === searchPrefix) continue;\n\n const relativePath = key.slice(searchPrefix.length);\n if (!relativePath) continue;\n\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 if (options?.extension) {\n const extensions = Array.isArray(options.extension) ? options.extension : [options.extension];\n if (!extensions.some(ext => relativePath.endsWith(ext))) {\n continue;\n }\n }\n\n entries.push({\n name: relativePath,\n type: 'file',\n size: item.properties.contentLength,\n });\n }\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 if (!key) return true;\n\n const containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(key);\n\n const exists = await blobClient.exists();\n if (exists) return true;\n\n // Check if it's a \"directory\" (has blobs with this prefix)\n const prefix = key.replace(/\\/$/, '') + '/';\n const iter = containerClient.listBlobsFlat({ prefix });\n const first = await iter.next();\n return !first.done;\n }\n\n async stat(path: string): Promise<FileStat> {\n const key = this.toKey(path);\n\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 containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(key);\n\n try {\n const properties = await blobClient.getProperties();\n const name = path.split('/').pop() ?? '';\n\n return {\n name,\n path,\n type: 'file',\n size: properties.contentLength ?? 0,\n createdAt: properties.createdOn ?? new Date(),\n modifiedAt: properties.lastModified ?? new Date(),\n };\n } catch (error: unknown) {\n if (!isNotFoundError(error)) throw this.handleError(error);\n\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\n async isFile(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return false;\n\n const containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(key);\n return blobClient.exists();\n }\n\n async isDirectory(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return true;\n\n const containerClient = await this.getReadyContainer();\n const prefix = key.replace(/\\/$/, '') + '/';\n const iter = containerClient.listBlobsFlat({ prefix });\n const first = await iter.next();\n return !first.done;\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n async init(): Promise<void> {\n const containerClient = await this.getContainerClient();\n try {\n if (this.sasToken) {\n const iter = containerClient.listBlobsFlat({ prefix: this.prefix });\n await iter.next();\n return;\n }\n\n const exists = await containerClient.exists();\n if (!exists) {\n const err = new Error(`Container \"${this.containerName}\" does not exist`) as Error & { status?: number };\n err.status = 404;\n throw err;\n }\n } catch (error) {\n if ((error as { status?: number }).status) {\n throw error;\n }\n\n const statusCode = (error as RestError).statusCode;\n if (typeof statusCode === 'number') {\n const message = error instanceof Error ? error.message : String(error);\n const err = new Error(message) as Error & { status?: number };\n err.status = statusCode;\n throw err;\n }\n throw error;\n }\n }\n\n async destroy(): Promise<void> {\n this._containerClient = null;\n }\n}\n","import { BlobServiceClient, StorageSharedKeyCredential } from '@azure/storage-blob';\nimport type { ContainerClient } from '@azure/storage-blob';\n\nimport { BlobStore } from '@mastra/core/storage';\nimport type { StorageBlobEntry } from '@mastra/core/storage';\n\n/**\n * Configuration for AzureBlobStore.\n */\nexport interface AzureBlobStoreOptions {\n /** Azure Blob container name */\n container: string;\n /** Storage account name (required unless using connectionString) */\n accountName?: string;\n /** Storage account key */\n accountKey?: string;\n /** SAS token for authentication */\n sasToken?: string;\n /** Full connection string (takes priority over accountName/accountKey) */\n connectionString?: string;\n /**\n * Use DefaultAzureCredential from @azure/identity for authentication.\n * Requires @azure/identity to be installed as a peer dependency.\n */\n useDefaultCredential?: boolean;\n /** Custom endpoint URL (e.g. for the Azurite emulator) */\n endpoint?: string;\n /**\n * Key prefix for all blob objects.\n * Defaults to 'mastra_skill_blobs/'.\n */\n prefix?: string;\n}\n\n/** Trim leading and trailing slashes. */\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\nfunction isNotFoundError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n return (error as { statusCode?: number }).statusCode === 404;\n}\n\n/** Azure metadata batch limit per request. */\nconst BATCH_DELETE_SIZE = 256;\n\n/**\n * Azure Blob Storage-backed content-addressable blob store for skill versioning.\n *\n * Each blob is stored as a block blob keyed by its SHA-256 hash. Metadata\n * (size, mimeType, createdAt) is stored as Azure blob metadata.\n *\n * Since blobs are content-addressable, writes are idempotent — the same hash\n * always maps to the same content, so overwrites are safe and equivalent to\n * a no-op.\n *\n * @example Connection string\n * ```typescript\n * import { AzureBlobStore } from '@mastra/azure/blob';\n *\n * const blobs = new AzureBlobStore({\n * container: 'my-skill-blobs',\n * connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING!,\n * });\n * ```\n *\n * @example Account key\n * ```typescript\n * import { AzureBlobStore } from '@mastra/azure/blob';\n *\n * const blobs = new AzureBlobStore({\n * container: 'my-skill-blobs',\n * accountName: process.env.AZURE_STORAGE_ACCOUNT_NAME!,\n * accountKey: process.env.AZURE_STORAGE_ACCOUNT_KEY!,\n * });\n * ```\n */\nexport class AzureBlobStore extends BlobStore {\n private readonly containerName: string;\n private readonly accountName?: string;\n private readonly accountKey?: string;\n private readonly sasToken?: string;\n private readonly connectionString?: string;\n private readonly useDefaultCredential: boolean;\n private readonly endpoint?: string;\n private readonly prefix: string;\n\n private _containerClient: ContainerClient | null = null;\n\n constructor(options: AzureBlobStoreOptions) {\n super();\n this.containerName = options.container;\n this.accountName = options.accountName;\n this.accountKey = options.accountKey;\n this.sasToken = options.sasToken;\n this.connectionString = options.connectionString;\n this.useDefaultCredential = options.useDefaultCredential ?? false;\n this.endpoint = options.endpoint;\n this.prefix = options.prefix ? trimSlashes(options.prefix) + '/' : 'mastra_skill_blobs/';\n }\n\n private async getContainerClient(): Promise<ContainerClient> {\n if (this._containerClient) return this._containerClient;\n\n let serviceClient: BlobServiceClient;\n\n if (this.connectionString) {\n serviceClient = BlobServiceClient.fromConnectionString(this.connectionString);\n } else {\n if (!this.endpoint && !this.accountName) {\n throw new Error(\n 'Azure Blob Storage requires either a connectionString, or an accountName/endpoint. ' +\n 'Provide at least one of: connectionString, accountName, or endpoint.',\n );\n }\n const baseUrl = this.endpoint ?? `https://${this.accountName}.blob.core.windows.net`;\n\n if (this.accountName && this.accountKey) {\n const credential = new StorageSharedKeyCredential(this.accountName, this.accountKey);\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } else if (this.sasToken) {\n const sas = this.sasToken.replace(/^\\?+/, '');\n const separator = baseUrl.includes('?') ? '&' : '?';\n serviceClient = new BlobServiceClient(`${baseUrl}${separator}${sas}`);\n } else if (this.useDefaultCredential) {\n // Dynamically import @azure/identity to avoid requiring it when not used.\n // Must use import() (not require()) because this package is ESM-first.\n try {\n const identity = await import('@azure/identity');\n const credential = new identity.DefaultAzureCredential();\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } catch {\n throw new Error(\n 'DefaultAzureCredential requires @azure/identity to be installed. ' +\n 'Install it with: npm install @azure/identity',\n );\n }\n } else {\n // Anonymous access\n serviceClient = new BlobServiceClient(baseUrl);\n }\n }\n\n this._containerClient = serviceClient.getContainerClient(this.containerName);\n return this._containerClient;\n }\n\n private toKey(hash: string): string {\n return this.prefix + hash;\n }\n\n async init(): Promise<void> {\n // Azure does not require table creation — the container is expected to exist.\n }\n\n async put(entry: StorageBlobEntry): Promise<void> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(entry.hash));\n const now = entry.createdAt ?? new Date();\n const buffer = Buffer.from(entry.content, 'utf-8');\n\n await blobClient.uploadData(buffer, {\n blobHTTPHeaders: {\n blobContentType: entry.mimeType ?? 'application/octet-stream',\n },\n metadata: {\n size: String(entry.size),\n createdat: now.toISOString(),\n ...(entry.mimeType ? { mimetype: entry.mimeType } : {}),\n },\n });\n }\n\n async get(hash: string): Promise<StorageBlobEntry | null> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(hash));\n\n try {\n const buffer = await blobClient.downloadToBuffer();\n const properties = await blobClient.getProperties();\n const metadata = properties.metadata ?? {};\n const content = buffer.toString('utf-8');\n\n return {\n hash,\n content,\n size: metadata.size != null ? Number(metadata.size) : Buffer.byteLength(content, 'utf-8'),\n mimeType: metadata.mimetype || properties.contentType || undefined,\n createdAt: metadata.createdat ? new Date(metadata.createdat) : new Date(),\n };\n } catch (error: unknown) {\n if (isNotFoundError(error)) return null;\n throw error;\n }\n }\n\n async has(hash: string): Promise<boolean> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(hash));\n\n try {\n await blobClient.getProperties();\n return true;\n } catch (error: unknown) {\n if (isNotFoundError(error)) return false;\n throw error;\n }\n }\n\n async delete(hash: string): Promise<boolean> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(hash));\n const response = await blobClient.deleteIfExists();\n return response.succeeded;\n }\n\n async putMany(entries: StorageBlobEntry[]): Promise<void> {\n if (entries.length === 0) return;\n // Azure does not have a batch PUT, so we parallelize individual puts.\n // Content-addressable means duplicate writes are idempotent.\n await Promise.all(entries.map(entry => this.put(entry)));\n }\n\n async getMany(hashes: string[]): Promise<Map<string, StorageBlobEntry>> {\n const result = new Map<string, StorageBlobEntry>();\n if (hashes.length === 0) return result;\n\n const entries = await Promise.all(hashes.map(hash => this.get(hash)));\n for (const entry of entries) {\n if (entry) {\n result.set(entry.hash, entry);\n }\n }\n return result;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n const containerClient = await this.getContainerClient();\n let batch: string[] = [];\n\n for await (const blob of containerClient.listBlobsFlat({ prefix: this.prefix })) {\n batch.push(blob.name);\n if (batch.length >= BATCH_DELETE_SIZE) {\n await this.deleteBlobBatch(containerClient, batch);\n batch = [];\n }\n }\n\n if (batch.length > 0) {\n await this.deleteBlobBatch(containerClient, batch);\n }\n }\n\n private async deleteBlobBatch(containerClient: ContainerClient, blobNames: string[]): Promise<void> {\n const blobClients = blobNames.map(name => containerClient.getBlobClient(name));\n await containerClient.getBlobBatchClient().deleteBlobs(blobClients);\n }\n}\n","import type { BlobStoreProvider, FilesystemProvider } from '@mastra/core/editor';\nimport { AzureBlobStore } from './blob-store';\nimport type { AzureBlobStoreOptions } from './blob-store';\nimport { AzureBlobFilesystem } from './filesystem';\nimport type { AzureBlobFilesystemOptions } from './filesystem';\n\nexport const azureBlobFilesystemProvider: FilesystemProvider<AzureBlobFilesystemOptions> = {\n id: 'azure-blob',\n name: 'Azure Blob Storage',\n description: 'Azure Blob Storage container',\n configSchema: {\n type: 'object',\n required: ['container'],\n properties: {\n container: { type: 'string', description: 'Azure Blob container name' },\n accountName: { type: 'string', description: 'Storage account name' },\n accountKey: { type: 'string', description: 'Storage account key' },\n sasToken: { type: 'string', description: 'Shared Access Signature token' },\n connectionString: { type: 'string', description: 'Full connection string (overrides other auth options)' },\n useDefaultCredential: {\n type: 'boolean',\n description: 'Use DefaultAzureCredential (requires @azure/identity)',\n default: false,\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 endpoint URL (for Azurite emulator)' },\n },\n },\n createFilesystem: config => new AzureBlobFilesystem(config),\n};\n\nexport const azureBlobStoreProvider: BlobStoreProvider<AzureBlobStoreOptions> = {\n id: 'azure-blob',\n name: 'Azure Blob Store',\n description: 'Content-addressable blob storage backed by Azure Blob Storage',\n configSchema: {\n type: 'object',\n required: ['container'],\n properties: {\n container: { type: 'string', description: 'Azure Blob container name' },\n accountName: { type: 'string', description: 'Storage account name' },\n accountKey: { type: 'string', description: 'Storage account key' },\n sasToken: { type: 'string', description: 'Shared Access Signature token' },\n connectionString: { type: 'string', description: 'Full connection string (overrides other auth options)' },\n useDefaultCredential: {\n type: 'boolean',\n description: 'Use DefaultAzureCredential (requires @azure/identity)',\n default: false,\n },\n prefix: { type: 'string', description: 'Key prefix for blob objects (default: mastra_skill_blobs/)' },\n endpoint: { type: 'string', description: 'Custom endpoint URL (for Azurite emulator)' },\n },\n },\n createBlobStore: config => new AzureBlobStore(config),\n};\n"]}
@@ -139,6 +139,9 @@ var AzureBlobFilesystem = class extends MastraFilesystem {
139
139
  if (this.endpoint) {
140
140
  config.endpoint = this.endpoint;
141
141
  }
142
+ if (this.prefix) {
143
+ config.prefix = this.prefix;
144
+ }
142
145
  if (this.readOnly) {
143
146
  config.readOnly = true;
144
147
  }
@@ -752,5 +755,5 @@ var azureBlobStoreProvider = {
752
755
  };
753
756
 
754
757
  export { AzureBlobFilesystem, AzureBlobStore, azureBlobFilesystemProvider, azureBlobStoreProvider };
755
- //# sourceMappingURL=chunk-DBBJ2YM7.js.map
756
- //# sourceMappingURL=chunk-DBBJ2YM7.js.map
758
+ //# sourceMappingURL=chunk-T7WJTVIJ.js.map
759
+ //# sourceMappingURL=chunk-T7WJTVIJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/blob/filesystem/index.ts","../src/blob/blob-store/index.ts","../src/blob/provider.ts"],"names":["trimSlashes","isNotFoundError","BlobServiceClient","StorageSharedKeyCredential"],"mappings":";;;;;AA2CA,IAAM,UAAA,GAAqC;AAAA,EACzC,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,EACR,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,EACT,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,EACR,MAAA,EAAQ,iBAAA;AAAA,EACR,MAAA,EAAQ,iBAAA;AAAA,EACR,KAAA,EAAO,kBAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAEA,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;AAEA,SAAS,gBAAgB,KAAA,EAAyB;AAChD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,OAAA,GAAU,KAAA;AAChB,EAAA,OAAO,QAAQ,UAAA,KAAe,GAAA;AAChC;AAEA,SAAS,oBAAoB,KAAA,EAAyB;AACpD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,OAAA,GAAU,KAAA;AAChB,EAAA,OAAO,QAAQ,UAAA,KAAe,GAAA;AAChC;AAGA,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;AAEA,eAAe,eAAe,MAAA,EAA4D;AACxF,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAClC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,IAAA,MAAA,CAAO,KAAK,OAAO,KAAA,KAAU,QAAA,GAAW,MAAA,CAAO,KAAK,KAAK,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EAClH;AACA,EAAA,OAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAC7B;AAEA,SAAS,SAAS,OAAA,EAA8B;AAC9C,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,OAAA;AACrC,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,SAAS,OAAO,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAC1F;AAsCO,IAAM,mBAAA,GAAN,cAAkC,gBAAA,CAAiB;AAAA,EAC/C,EAAA;AAAA,EACA,IAAA,GAAO,qBAAA;AAAA,EACP,QAAA,GAAW,YAAA;AAAA,EACX,QAAA;AAAA,EAET,MAAA,GAAyB,SAAA;AAAA,EAEhB,WAAA;AAAA,EACA,IAAA,GAAuB,YAAA;AAAA,EACvB,WAAA;AAAA,EAEQ,aAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EAET,gBAAA,GAA2C,IAAA;AAAA,EAEnD,YAAY,OAAA,EAAqC;AAC/C,IAAA,KAAA,CAAM,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,uBAAuB,CAAA;AACjD,IAAA,IAAA,CAAK,EAAA,GAAK,QAAQ,EAAA,IAAM,CAAA,SAAA,EAAY,KAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,IAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACrG,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,SAAA;AAC7B,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,mBAAmB,OAAA,CAAQ,gBAAA;AAChC,IAAA,IAAA,CAAK,oBAAA,GAAuB,QAAQ,oBAAA,IAAwB,KAAA;AAC5D,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA,GAAS,YAAY,OAAA,CAAQ,MAAM,IAAI,GAAA,GAAM,EAAA;AACnE,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAExB,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,WAAA,IAAe,oBAAA;AAC1C,IAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,IAAA,IAAQ,YAAA;AAC5B,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,YAAA,GAAyC;AACvC,IAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,EACjC;AAAA,EAEA,cAAA,GAAuC;AACrC,IAAA,MAAM,MAAA,GAA+B;AAAA,MACnC,IAAA,EAAM,YAAA;AAAA,MACN,WAAW,IAAA,CAAK;AAAA,KAClB;AAEA,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,MAAA,CAAO,mBAAmB,IAAA,CAAK,gBAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,MAAA,CAAO,cAAc,IAAA,CAAK,WAAA;AAAA,MAC5B;AACA,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,MAAA,CAAO,aAAa,IAAA,CAAK,UAAA;AAAA,MAC3B;AACA,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,MAAA,CAAO,WAAW,IAAA,CAAK,QAAA;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,MAAA,MAAA,CAAO,oBAAA,GAAuB,IAAA;AAAA,IAChC;AAEA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAA,CAAO,WAAW,IAAA,CAAK,QAAA;AAAA,IACzB;AAEA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAA,CAAO,SAAS,IAAA,CAAK,MAAA;AAAA,IACvB;AAEA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAAA,IACpB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,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,WAAW,IAAA,CAAK,aAAA;AAAA,QAChB,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,EAEA,eAAA,GAA0B;AACxB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,GAAW,WAAA,GAAc,YAAA;AAC7C,IAAA,OAAO,CAAA,iCAAA,EAAoC,IAAA,CAAK,aAAa,CAAA,GAAA,EAAM,MAAM,CAAA,8CAAA,CAAA;AAAA,EAC3E;AAAA,EAEA,MAAc,kBAAA,GAA+C;AAC3D,IAAA,IAAI,IAAA,CAAK,gBAAA,EAAkB,OAAO,IAAA,CAAK,gBAAA;AAEvC,IAAA,IAAI,aAAA;AAEJ,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,aAAA,GAAgB,iBAAA,CAAkB,oBAAA,CAAqB,IAAA,CAAK,gBAAgB,CAAA;AAAA,IAC9E,CAAA,MAAO;AACL,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,CAAC,KAAK,WAAA,EAAa;AACvC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SAEF;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,IAAY,CAAA,QAAA,EAAW,KAAK,WAAW,CAAA,sBAAA,CAAA;AAE5D,MAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,UAAA,EAAY;AACvC,QAAA,MAAM,aAAa,IAAI,0BAAA,CAA2B,IAAA,CAAK,WAAA,EAAa,KAAK,UAAU,CAAA;AACnF,QAAA,aAAA,GAAgB,IAAI,iBAAA,CAAkB,OAAA,EAAS,UAAU,CAAA;AAAA,MAC3D,CAAA,MAAA,IAAW,KAAK,QAAA,EAAU;AACxB,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC5C,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AAChD,QAAA,aAAA,GAAgB,IAAI,kBAAkB,CAAA,EAAG,OAAO,GAAG,SAAS,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA;AAAA,MACtE,CAAA,MAAA,IAAW,KAAK,oBAAA,EAAsB;AAGpC,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,MAAM,OAAO,iBAAiB,CAAA;AAC/C,UAAA,MAAM,UAAA,GAAa,IAAI,QAAA,CAAS,sBAAA,EAAuB;AACvD,UAAA,aAAA,GAAgB,IAAI,iBAAA,CAAkB,OAAA,EAAS,UAAU,CAAA;AAAA,QAC3D,CAAA,CAAA,MAAQ;AACN,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WAEF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,aAAA,GAAgB,IAAI,kBAAkB,OAAO,CAAA;AAAA,MAC/C;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,gBAAA,GAAmB,aAAA,CAAc,kBAAA,CAAmB,IAAA,CAAK,aAAa,CAAA;AAC3E,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA,EAEA,MAAc,iBAAA,GAA8C;AAC1D,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,EACjC;AAAA,EAEQ,MAAM,IAAA,EAAsB;AAClC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACzC,IAAA,OAAO,KAAK,MAAA,GAAS,SAAA;AAAA,EACvB;AAAA,EAEQ,YAAY,KAAA,EAAyB;AAC3C,IAAA,IAAI,mBAAA,CAAoB,KAAK,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,MAAA,IAAA,CAAK,KAAA,GAAQ,6DAAA;AAAA,IACf;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,cAAA,CAAe,MAAc,SAAA,EAAyB;AAC5D,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAI,eAAA,CAAgB,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA,0BAAA,CAA4B,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAA,CAAS,IAAA,EAAc,OAAA,EAAiD;AAC5E,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,aAAa,eAAA,CAAgB,kBAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEtE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,QAAA,CAAS,CAAC,CAAA;AAC5C,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,QAAA,CAAS,kBAAkB,CAAA;AAE/D,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,OAAO,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAAA,MACzC;AACA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAI,kBAAkB,IAAI,CAAA;AAAA,MAClC;AACA,MAAA,MAAM,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CAAU,IAAA,EAAc,OAAA,EAAsB,OAAA,EAAuC;AACzF,IAAA,IAAA,CAAK,cAAA,CAAe,MAAM,OAAO,CAAA;AACjC,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAErD,IAAA,IAAI,SAAS,SAAA,KAAc,KAAA,IAAU,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAI;AAC7D,MAAA,MAAM,IAAI,gBAAgB,IAAI,CAAA;AAAA,IAChC;AAEA,IAAA,MAAM,IAAA,GAAO,SAAS,OAAO,CAAA;AAC7B,IAAA,MAAM,WAAA,GAAc,YAAY,IAAI,CAAA;AACpC,IAAA,MAAM,aAAa,eAAA,CAAgB,kBAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEtE,IAAA,MAAM,UAAA,CAAW,MAAA,CAAO,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ;AAAA,MACzC,eAAA,EAAiB,EAAE,eAAA,EAAiB,WAAA;AAAY,KACjD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,UAAA,CAAW,IAAA,EAAc,OAAA,EAAqC;AAClE,IAAA,IAAA,CAAK,cAAA,CAAe,MAAM,QAAQ,CAAA;AAClC,IAAA,IAAI,QAAA,GAAmB,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AACrC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AACrC,MAAA,QAAA,GAAW,OAAO,QAAA,CAAS,IAAI,IAAI,IAAA,GAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAC5D,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,iBAAA,EAAmB,CAExC,MAAO;AACL,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,SAAS,OAAO,CAAA;AACrC,IAAA,MAAM,IAAA,CAAK,UAAU,IAAA,EAAM,MAAA,CAAO,OAAO,CAAC,QAAA,EAAU,YAAY,CAAC,CAAC,CAAA;AAAA,EACpE;AAAA,EAEA,MAAM,UAAA,CAAW,IAAA,EAAc,OAAA,EAAwC;AACrE,IAAA,IAAA,CAAK,cAAA,CAAe,MAAM,QAAQ,CAAA;AAClC,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,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,aAAa,eAAA,CAAgB,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEjE,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAA,EAAO;AAAA,IAC1B,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC1B,QAAA,IAAI,SAAS,KAAA,EAAO;AACpB,QAAA,MAAM,IAAI,kBAAkB,IAAI,CAAA;AAAA,MAClC;AACA,MAAA,MAAM,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,CAAS,GAAA,EAAa,IAAA,EAAc,OAAA,EAAsC;AAC9E,IAAA,IAAA,CAAK,cAAA,CAAe,MAAM,MAAM,CAAA;AAChC,IAAA,IAAI,SAAS,SAAA,KAAc,KAAA,IAAU,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAI;AAC7D,MAAA,MAAM,IAAI,gBAAgB,IAAI,CAAA;AAAA,IAChC;AAEA,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,UAAU,eAAA,CAAgB,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAC7D,IAAA,MAAM,WAAW,eAAA,CAAgB,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAE/D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,cAAA,CAAe;AAAA,QAC1C,WAAA,EAAa,kBAAA,CAAmB,KAAA,CAAM,GAAG,CAAA;AAAA,QACzC,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,KAAI,GAAI,CAAA,GAAI,KAAK,GAAI;AAAA,OAC/C,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,aAAA,EAAc;AAE/C,MAAA,IAAI,UAAA,CAAW,kBAAkB,CAAA,EAAG;AAElC,QAAA,MAAM,QAAA,CAAS,oBAAmB,CAAE,MAAA,CAAO,OAAO,KAAA,CAAM,CAAC,GAAG,CAAC,CAAA;AAC7D,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,kBAAA,GAAqB,MAAM,IAAA,GAAO,IAAA;AACxC,MAAA,IAAA,CAAK,UAAA,CAAW,aAAA,IAAiB,CAAA,KAAM,kBAAA,EAAoB;AACzD,QAAA,MAAM,QAAA,CAAS,gBAAgB,MAAM,CAAA;AAAA,MACvC,CAAA,MAAO;AACL,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,gBAAA,CAAiB,MAAM,CAAA;AACrD,QAAA,MAAM,OAAO,aAAA,EAAc;AAAA,MAC7B;AAAA,IACF,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAI,kBAAkB,GAAG,CAAA;AAAA,MACjC;AAIA,MAAA,IACE,iBAAiB,KAAA,KAChB,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,gBAAgB,CAAA,IACrC,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,uBAAuB,CAAA,CAAA,EAClF;AACA,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AACvC,QAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,OAAO,CAAA;AAClC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,CAAS,GAAA,EAAa,IAAA,EAAc,OAAA,EAAsC;AAC9E,IAAA,IAAA,CAAK,cAAA,CAAe,MAAM,MAAM,CAAA;AAChC,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,IAAA,CAAK,cAAA,CAAe,MAAM,OAAO,CAAA;AACjC,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,IAAI,EAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,GAAA;AAErD,IAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,MAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,aAAA,CAAc,EAAE,QAAQ,CAAA;AACrD,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,EAAK;AAC9B,MAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACf,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAE,CAAA;AAAA,MAChD;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,YAAsB,EAAC;AAC3B,IAAA,WAAA,MAAiB,QAAQ,eAAA,CAAgB,aAAA,CAAc,EAAE,MAAA,EAAQ,CAAA,EAAG;AAClE,MAAA,SAAA,CAAU,IAAA,CAAK,KAAK,IAAI,CAAA;AAExB,MAAA,IAAI,SAAA,CAAU,UAAU,GAAA,EAAK;AAC3B,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,eAAA,EAAiB,SAAS,CAAA;AACrD,QAAA,SAAA,GAAY,EAAC;AAAA,MACf;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,eAAA,EAAiB,SAAS,CAAA;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAc,eAAA,CAAgB,eAAA,EAAkC,SAAA,EAAoC;AAClG,IAAA,MAAM,cAAc,SAAA,CAAU,GAAA,CAAI,UAAQ,eAAA,CAAgB,aAAA,CAAc,IAAI,CAAC,CAAA;AAC7E,IAAA,MAAM,eAAA,CAAgB,kBAAA,EAAmB,CAAE,WAAA,CAAY,WAAW,CAAA;AAAA,EACpE;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAc,OAAA,EAA6C;AACvE,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAErD,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,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,WAAA,MAAiB,QAAQ,eAAA,CAAgB,aAAA,CAAc,EAAE,MAAA,EAAQ,YAAA,EAAc,CAAA,EAAG;AAChF,QAAA,MAAM,MAAM,IAAA,CAAK,IAAA;AACjB,QAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,YAAA,EAAc;AAElC,QAAA,MAAM,YAAA,GAAe,GAAA,CAAI,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA;AAClD,QAAA,IAAI,CAAC,YAAA,EAAc;AAEnB,QAAA,IAAI,YAAA,CAAa,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9B,UAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACxC,UAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1B,YAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AACpB,YAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,aAAa,CAAA;AAAA,UACnD;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,SAAS,SAAA,EAAW;AACtB,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,IAAI,OAAA,CAAQ,SAAA,GAAY,CAAC,OAAA,CAAQ,SAAS,CAAA;AAC5F,UAAA,IAAI,CAAC,WAAW,IAAA,CAAK,CAAA,GAAA,KAAO,aAAa,QAAA,CAAS,GAAG,CAAC,CAAA,EAAG;AACvD,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,IAAA,EAAM,YAAA;AAAA,UACN,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,KAAK,UAAA,CAAW;AAAA,SACvB,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MAAO;AACL,MAAA,WAAA,MAAiB,IAAA,IAAQ,gBAAgB,oBAAA,CAAqB,GAAA,EAAK,EAAE,MAAA,EAAQ,YAAA,EAAc,CAAA,EAAG;AAC5F,QAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,UAAA,MAAM,OAAA,GAAU,KAAK,IAAA,CAAK,KAAA,CAAM,aAAa,MAAM,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACtE,UAAA,IAAI,OAAA,IAAW,CAAC,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AACrC,YAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AACpB,YAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,aAAa,CAAA;AAAA,UACnD;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,MAAM,IAAA,CAAK,IAAA;AACjB,UAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,YAAA,EAAc;AAElC,UAAA,MAAM,YAAA,GAAe,GAAA,CAAI,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA;AAClD,UAAA,IAAI,CAAC,YAAA,EAAc;AAEnB,UAAA,IAAI,YAAA,CAAa,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9B,YAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACxC,YAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1B,cAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AACpB,cAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,aAAa,CAAA;AAAA,YACnD;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,SAAS,SAAA,EAAW;AACtB,YAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,IAAI,OAAA,CAAQ,SAAA,GAAY,CAAC,OAAA,CAAQ,SAAS,CAAA;AAC5F,YAAA,IAAI,CAAC,WAAW,IAAA,CAAK,CAAA,GAAA,KAAO,aAAa,QAAA,CAAS,GAAG,CAAC,CAAA,EAAG;AACvD,cAAA;AAAA,YACF;AAAA,UACF;AAEA,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,IAAA,EAAM,YAAA;AAAA,YACN,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,KAAK,UAAA,CAAW;AAAA,WACvB,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;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;AAC3B,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,aAAA,CAAc,GAAG,CAAA;AAEpD,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,MAAA,EAAO;AACvC,IAAA,IAAI,QAAQ,OAAO,IAAA;AAGnB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,GAAA;AACxC,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,aAAA,CAAc,EAAE,QAAQ,CAAA;AACrD,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,EAAK;AAC9B,IAAA,OAAO,CAAC,KAAA,CAAM,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,IAAA,EAAiC;AAC1C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE3B,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,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,aAAA,CAAc,GAAG,CAAA;AAEpD,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,aAAA,EAAc;AAClD,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,WAAW,aAAA,IAAiB,CAAA;AAAA,QAClC,SAAA,EAAW,UAAA,CAAW,SAAA,oBAAa,IAAI,IAAA,EAAK;AAAA,QAC5C,UAAA,EAAY,UAAA,CAAW,YAAA,oBAAgB,IAAI,IAAA;AAAK,OAClD;AAAA,IACF,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,CAAC,eAAA,CAAgB,KAAK,GAAG,MAAM,IAAA,CAAK,YAAY,KAAK,CAAA;AAEzD,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACzC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA;AACtD,QAAA,OAAO;AAAA,UACL,IAAA;AAAA,UACA,IAAA;AAAA,UACA,IAAA,EAAM,WAAA;AAAA,UACN,IAAA,EAAM,CAAA;AAAA,UACN,SAAA,sBAAe,IAAA,EAAK;AAAA,UACpB,UAAA,sBAAgB,IAAA;AAAK,SACvB;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,kBAAkB,IAAI,CAAA;AAAA,IAClC;AAAA,EACF;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,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,aAAA,CAAc,GAAG,CAAA;AACpD,IAAA,OAAO,WAAW,MAAA,EAAO;AAAA,EAC3B;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,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACrD,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,GAAA;AACxC,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,aAAA,CAAc,EAAE,QAAQ,CAAA;AACrD,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,EAAK;AAC9B,IAAA,OAAO,CAAC,KAAA,CAAM,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAA,GAAsB;AAC1B,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AACtD,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,MAAM,OAAO,eAAA,CAAgB,aAAA,CAAc,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAClE,QAAA,MAAM,KAAK,IAAA,EAAK;AAChB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,MAAA,EAAO;AAC5C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,IAAA,CAAK,aAAa,CAAA,gBAAA,CAAkB,CAAA;AACxE,QAAA,GAAA,CAAI,MAAA,GAAS,GAAA;AACb,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAK,MAA8B,MAAA,EAAQ;AACzC,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,MAAM,aAAc,KAAA,CAAoB,UAAA;AACxC,MAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,QAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,QAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,OAAO,CAAA;AAC7B,QAAA,GAAA,CAAI,MAAA,GAAS,UAAA;AACb,QAAA,MAAM,GAAA;AAAA,MACR;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,EAC1B;AACF;AC5rBA,SAASA,aAAY,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;AAEA,SAASC,iBAAgB,KAAA,EAAyB;AAChD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,OAAQ,MAAkC,UAAA,KAAe,GAAA;AAC3D;AAGA,IAAM,iBAAA,GAAoB,GAAA;AAiCnB,IAAM,cAAA,GAAN,cAA6B,SAAA,CAAU;AAAA,EAC3B,aAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EAET,gBAAA,GAA2C,IAAA;AAAA,EAEnD,YAAY,OAAA,EAAgC;AAC1C,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,SAAA;AAC7B,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,mBAAmB,OAAA,CAAQ,gBAAA;AAChC,IAAA,IAAA,CAAK,oBAAA,GAAuB,QAAQ,oBAAA,IAAwB,KAAA;AAC5D,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA,GAASD,aAAY,OAAA,CAAQ,MAAM,IAAI,GAAA,GAAM,qBAAA;AAAA,EACrE;AAAA,EAEA,MAAc,kBAAA,GAA+C;AAC3D,IAAA,IAAI,IAAA,CAAK,gBAAA,EAAkB,OAAO,IAAA,CAAK,gBAAA;AAEvC,IAAA,IAAI,aAAA;AAEJ,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,aAAA,GAAgBE,iBAAAA,CAAkB,oBAAA,CAAqB,IAAA,CAAK,gBAAgB,CAAA;AAAA,IAC9E,CAAA,MAAO;AACL,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,CAAC,KAAK,WAAA,EAAa;AACvC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SAEF;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,IAAY,CAAA,QAAA,EAAW,KAAK,WAAW,CAAA,sBAAA,CAAA;AAE5D,MAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,UAAA,EAAY;AACvC,QAAA,MAAM,aAAa,IAAIC,0BAAAA,CAA2B,IAAA,CAAK,WAAA,EAAa,KAAK,UAAU,CAAA;AACnF,QAAA,aAAA,GAAgB,IAAID,iBAAAA,CAAkB,OAAA,EAAS,UAAU,CAAA;AAAA,MAC3D,CAAA,MAAA,IAAW,KAAK,QAAA,EAAU;AACxB,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC5C,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AAChD,QAAA,aAAA,GAAgB,IAAIA,kBAAkB,CAAA,EAAG,OAAO,GAAG,SAAS,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA;AAAA,MACtE,CAAA,MAAA,IAAW,KAAK,oBAAA,EAAsB;AAGpC,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,MAAM,OAAO,iBAAiB,CAAA;AAC/C,UAAA,MAAM,UAAA,GAAa,IAAI,QAAA,CAAS,sBAAA,EAAuB;AACvD,UAAA,aAAA,GAAgB,IAAIA,iBAAAA,CAAkB,OAAA,EAAS,UAAU,CAAA;AAAA,QAC3D,CAAA,CAAA,MAAQ;AACN,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WAEF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,aAAA,GAAgB,IAAIA,kBAAkB,OAAO,CAAA;AAAA,MAC/C;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,gBAAA,GAAmB,aAAA,CAAc,kBAAA,CAAmB,IAAA,CAAK,aAAa,CAAA;AAC3E,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA,EAEQ,MAAM,IAAA,EAAsB;AAClC,IAAA,OAAO,KAAK,MAAA,GAAS,IAAA;AAAA,EACvB;AAAA,EAEA,MAAM,IAAA,GAAsB;AAAA,EAE5B;AAAA,EAEA,MAAM,IAAI,KAAA,EAAwC;AAChD,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AACtD,IAAA,MAAM,aAAa,eAAA,CAAgB,kBAAA,CAAmB,KAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,CAAA;AAC5E,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,SAAA,oBAAa,IAAI,IAAA,EAAK;AACxC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,SAAS,OAAO,CAAA;AAEjD,IAAA,MAAM,UAAA,CAAW,WAAW,MAAA,EAAQ;AAAA,MAClC,eAAA,EAAiB;AAAA,QACf,eAAA,EAAiB,MAAM,QAAA,IAAY;AAAA,OACrC;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAAA,QACvB,SAAA,EAAW,IAAI,WAAA,EAAY;AAAA,QAC3B,GAAI,MAAM,QAAA,GAAW,EAAE,UAAU,KAAA,CAAM,QAAA,KAAa;AAAC;AACvD,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,IAAA,EAAgD;AACxD,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AACtD,IAAA,MAAM,aAAa,eAAA,CAAgB,kBAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEtE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,gBAAA,EAAiB;AACjD,MAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,aAAA,EAAc;AAClD,MAAA,MAAM,QAAA,GAAW,UAAA,CAAW,QAAA,IAAY,EAAC;AACzC,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA;AAEvC,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA,EAAM,QAAA,CAAS,IAAA,IAAQ,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,OAAO,CAAA;AAAA,QACxF,QAAA,EAAU,QAAA,CAAS,QAAA,IAAY,UAAA,CAAW,WAAA,IAAe,MAAA;AAAA,QACzD,SAAA,EAAW,SAAS,SAAA,GAAY,IAAI,KAAK,QAAA,CAAS,SAAS,CAAA,mBAAI,IAAI,IAAA;AAAK,OAC1E;AAAA,IACF,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAID,gBAAAA,CAAgB,KAAK,CAAA,EAAG,OAAO,IAAA;AACnC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,IAAA,EAAgC;AACxC,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AACtD,IAAA,MAAM,aAAa,eAAA,CAAgB,kBAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEtE,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,aAAA,EAAc;AAC/B,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAIA,gBAAAA,CAAgB,KAAK,CAAA,EAAG,OAAO,KAAA;AACnC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,IAAA,EAAgC;AAC3C,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AACtD,IAAA,MAAM,aAAa,eAAA,CAAgB,kBAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AACtE,IAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,cAAA,EAAe;AACjD,IAAA,OAAO,QAAA,CAAS,SAAA;AAAA,EAClB;AAAA,EAEA,MAAM,QAAQ,OAAA,EAA4C;AACxD,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAG1B,IAAA,MAAM,OAAA,CAAQ,IAAI,OAAA,CAAQ,GAAA,CAAI,WAAS,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAC,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,QAAQ,MAAA,EAA0D;AACtE,IAAA,MAAM,MAAA,uBAAa,GAAA,EAA8B;AACjD,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAEhC,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAC,CAAC,CAAA;AACpE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,MAC9B;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,mBAAA,GAAqC;AACzC,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AACtD,IAAA,IAAI,QAAkB,EAAC;AAEvB,IAAA,WAAA,MAAiB,IAAA,IAAQ,gBAAgB,aAAA,CAAc,EAAE,QAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG;AAC/E,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AACpB,MAAA,IAAI,KAAA,CAAM,UAAU,iBAAA,EAAmB;AACrC,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,eAAA,EAAiB,KAAK,CAAA;AACjD,QAAA,KAAA,GAAQ,EAAC;AAAA,MACX;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,eAAA,EAAiB,KAAK,CAAA;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,MAAc,eAAA,CAAgB,eAAA,EAAkC,SAAA,EAAoC;AAClG,IAAA,MAAM,cAAc,SAAA,CAAU,GAAA,CAAI,UAAQ,eAAA,CAAgB,aAAA,CAAc,IAAI,CAAC,CAAA;AAC7E,IAAA,MAAM,eAAA,CAAgB,kBAAA,EAAmB,CAAE,WAAA,CAAY,WAAW,CAAA;AAAA,EACpE;AACF;;;AChQO,IAAM,2BAAA,GAA8E;AAAA,EACzF,EAAA,EAAI,YAAA;AAAA,EACJ,IAAA,EAAM,oBAAA;AAAA,EACN,WAAA,EAAa,8BAAA;AAAA,EACb,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,IACtB,UAAA,EAAY;AAAA,MACV,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,2BAAA,EAA4B;AAAA,MACtE,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,sBAAA,EAAuB;AAAA,MACnE,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,qBAAA,EAAsB;AAAA,MACjE,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+BAAA,EAAgC;AAAA,MACzE,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uDAAA,EAAwD;AAAA,MACzG,oBAAA,EAAsB;AAAA,QACpB,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,uDAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;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,4CAAA;AAA6C;AACxF,GACF;AAAA,EACA,gBAAA,EAAkB,CAAA,MAAA,KAAU,IAAI,mBAAA,CAAoB,MAAM;AAC5D;AAEO,IAAM,sBAAA,GAAmE;AAAA,EAC9E,EAAA,EAAI,YAAA;AAAA,EACJ,IAAA,EAAM,kBAAA;AAAA,EACN,WAAA,EAAa,+DAAA;AAAA,EACb,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,IACtB,UAAA,EAAY;AAAA,MACV,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,2BAAA,EAA4B;AAAA,MACtE,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,sBAAA,EAAuB;AAAA,MACnE,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,qBAAA,EAAsB;AAAA,MACjE,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+BAAA,EAAgC;AAAA,MACzE,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uDAAA,EAAwD;AAAA,MACzG,oBAAA,EAAsB;AAAA,QACpB,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,uDAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,MACA,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,4DAAA,EAA6D;AAAA,MACpG,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,4CAAA;AAA6C;AACxF,GACF;AAAA,EACA,eAAA,EAAiB,CAAA,MAAA,KAAU,IAAI,cAAA,CAAe,MAAM;AACtD","file":"chunk-T7WJTVIJ.js","sourcesContent":["/**\n * Azure Blob Storage Filesystem Provider\n *\n * A filesystem implementation backed by Azure Blob Storage.\n */\n\nimport { BlobSASPermissions, BlobServiceClient, StorageSharedKeyCredential } from '@azure/storage-blob';\nimport type { ContainerClient, RestError } from '@azure/storage-blob';\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, PermissionError } from '@mastra/core/workspace';\n\n/**\n * Azure Blob mount configuration.\n * Returned by AzureBlobFilesystem.getMountConfig() for FUSE mounting in sandboxes.\n */\nexport interface AzureBlobMountConfig extends FilesystemMountConfig {\n type: 'azure-blob';\n container: string;\n accountName?: string;\n accountKey?: string;\n sasToken?: string;\n connectionString?: string;\n useDefaultCredential?: boolean;\n endpoint?: string;\n prefix?: string;\n readOnly?: boolean;\n}\n\nconst MIME_TYPES: Record<string, string> = {\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 '.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 '.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 '.pdf': 'application/pdf',\n '.zip': 'application/zip',\n '.gz': 'application/gzip',\n '.tar': 'application/x-tar',\n};\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\nfunction isNotFoundError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n const restErr = error as { statusCode?: number };\n return restErr.statusCode === 404;\n}\n\nfunction isAccessDeniedError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n const restErr = error as { statusCode?: number };\n return restErr.statusCode === 403;\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\nasync function streamToBuffer(stream: NodeJS.ReadableStream | undefined): Promise<Buffer> {\n if (!stream) return Buffer.alloc(0);\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks);\n}\n\nfunction toBuffer(content: FileContent): Buffer {\n if (Buffer.isBuffer(content)) return content;\n return typeof content === 'string' ? Buffer.from(content, 'utf-8') : Buffer.from(content);\n}\n\nexport interface AzureBlobFilesystemOptions extends MastraFilesystemOptions {\n /** Unique identifier for this filesystem instance */\n id?: string;\n /** Azure Blob container name */\n container: string;\n /** Human-friendly display name for the UI */\n displayName?: string;\n /** Icon identifier for the UI (defaults to 'azure-blob') */\n icon?: FilesystemIcon;\n /** Description shown in tooltips */\n description?: string;\n /** Storage account name (required unless using connectionString) */\n accountName?: string;\n /** Storage account key */\n accountKey?: string;\n /** SAS token for authentication */\n sasToken?: string;\n /** Full connection string (takes priority over accountName/accountKey) */\n connectionString?: string;\n /**\n * Use DefaultAzureCredential from @azure/identity for authentication.\n * Supports Managed Identity, Azure CLI, environment variables, etc.\n * Requires @azure/identity to be installed as a peer dependency.\n */\n useDefaultCredential?: boolean;\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 endpoint URL.\n * Used for local development with Azurite emulator.\n */\n endpoint?: string;\n}\n\nexport class AzureBlobFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'AzureBlobFilesystem';\n readonly provider = 'azure-blob';\n readonly readOnly?: boolean;\n\n status: ProviderStatus = 'pending';\n\n readonly displayName?: string;\n readonly icon: FilesystemIcon = 'azure-blob';\n readonly description?: string;\n\n private readonly containerName: string;\n private readonly accountName?: string;\n private readonly accountKey?: string;\n private readonly sasToken?: string;\n private readonly connectionString?: string;\n private readonly useDefaultCredential: boolean;\n private readonly prefix: string;\n private readonly endpoint?: string;\n\n private _containerClient: ContainerClient | null = null;\n\n constructor(options: AzureBlobFilesystemOptions) {\n super({ ...options, name: 'AzureBlobFilesystem' });\n this.id = options.id ?? `azure-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n this.containerName = options.container;\n this.accountName = options.accountName;\n this.accountKey = options.accountKey;\n this.sasToken = options.sasToken;\n this.connectionString = options.connectionString;\n this.useDefaultCredential = options.useDefaultCredential ?? false;\n this.prefix = options.prefix ? trimSlashes(options.prefix) + '/' : '';\n this.endpoint = options.endpoint;\n\n this.displayName = options.displayName ?? 'Azure Blob Storage';\n this.icon = options.icon ?? 'azure-blob';\n this.description = options.description;\n this.readOnly = options.readOnly;\n }\n\n /**\n * Get the underlying ContainerClient for direct access to Azure Blob APIs.\n *\n * Use this when you need features not exposed through the WorkspaceFilesystem\n * interface (e.g., SAS URL generation, lease management, etc.).\n *\n * This is async because DefaultAzureCredential requires a dynamic import.\n * For non-DefaultAzureCredential auth methods, the promise resolves immediately.\n */\n getContainer(): Promise<ContainerClient> {\n return this.getContainerClient();\n }\n\n getMountConfig(): AzureBlobMountConfig {\n const config: AzureBlobMountConfig = {\n type: 'azure-blob',\n container: this.containerName,\n };\n\n if (this.connectionString) {\n config.connectionString = this.connectionString;\n } else {\n if (this.accountName) {\n config.accountName = this.accountName;\n }\n if (this.accountKey) {\n config.accountKey = this.accountKey;\n }\n if (this.sasToken) {\n config.sasToken = this.sasToken;\n }\n }\n\n if (this.useDefaultCredential) {\n config.useDefaultCredential = true;\n }\n\n if (this.endpoint) {\n config.endpoint = this.endpoint;\n }\n\n if (this.prefix) {\n config.prefix = this.prefix;\n }\n\n if (this.readOnly) {\n config.readOnly = true;\n }\n\n return config;\n }\n\n getInfo(): FilesystemInfo<{\n container: 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 container: this.containerName,\n ...(this.endpoint && { endpoint: this.endpoint }),\n ...(this.prefix && { prefix: this.prefix }),\n },\n };\n }\n\n getInstructions(): string {\n const access = this.readOnly ? 'Read-only' : 'Persistent';\n return `Azure Blob Storage in container \"${this.containerName}\". ${access} storage - files are retained across sessions.`;\n }\n\n private async getContainerClient(): Promise<ContainerClient> {\n if (this._containerClient) return this._containerClient;\n\n let serviceClient: BlobServiceClient;\n\n if (this.connectionString) {\n serviceClient = BlobServiceClient.fromConnectionString(this.connectionString);\n } else {\n if (!this.endpoint && !this.accountName) {\n throw new Error(\n 'Azure Blob Storage requires either a connectionString, or an accountName/endpoint. ' +\n 'Provide at least one of: connectionString, accountName, or endpoint.',\n );\n }\n const baseUrl = this.endpoint ?? `https://${this.accountName}.blob.core.windows.net`;\n\n if (this.accountName && this.accountKey) {\n const credential = new StorageSharedKeyCredential(this.accountName, this.accountKey);\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } else if (this.sasToken) {\n const sas = this.sasToken.replace(/^\\?+/, '');\n const separator = baseUrl.includes('?') ? '&' : '?';\n serviceClient = new BlobServiceClient(`${baseUrl}${separator}${sas}`);\n } else if (this.useDefaultCredential) {\n // Dynamically import @azure/identity to avoid requiring it when not used.\n // Must use import() (not require()) because this package is ESM-first.\n try {\n const identity = await import('@azure/identity');\n const credential = new identity.DefaultAzureCredential();\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } catch {\n throw new Error(\n 'DefaultAzureCredential requires @azure/identity to be installed. ' +\n 'Install it with: npm install @azure/identity',\n );\n }\n } else {\n // Anonymous access\n serviceClient = new BlobServiceClient(baseUrl);\n }\n }\n\n this._containerClient = serviceClient.getContainerClient(this.containerName);\n return this._containerClient;\n }\n\n private async getReadyContainer(): Promise<ContainerClient> {\n await this.ensureReady();\n return this.getContainerClient();\n }\n\n private toKey(path: string): string {\n const cleanPath = path.replace(/^\\/+/, '');\n return this.prefix + cleanPath;\n }\n\n private handleError(error: unknown): unknown {\n if (isAccessDeniedError(error)) {\n this.status = 'error';\n this.error = 'Access denied - check credentials and container permissions';\n }\n return error;\n }\n\n private assertWritable(path: string, operation: string): void {\n if (this.readOnly) {\n throw new PermissionError(path, `${operation} (filesystem is read-only)`);\n }\n }\n\n // ---------------------------------------------------------------------------\n // File Operations\n // ---------------------------------------------------------------------------\n\n async readFile(path: string, options?: ReadOptions): Promise<string | Buffer> {\n const containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(path));\n\n try {\n const response = await blobClient.download(0);\n const buffer = await streamToBuffer(response.readableStreamBody);\n\n if (options?.encoding) {\n return buffer.toString(options.encoding);\n }\n return buffer;\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n throw new FileNotFoundError(path);\n }\n throw this.handleError(error);\n }\n }\n\n async writeFile(path: string, content: FileContent, options?: WriteOptions): Promise<void> {\n this.assertWritable(path, 'write');\n const containerClient = await this.getReadyContainer();\n\n if (options?.overwrite === false && (await this.exists(path))) {\n throw new FileExistsError(path);\n }\n\n const body = toBuffer(content);\n const contentType = getMimeType(path);\n const blobClient = containerClient.getBlockBlobClient(this.toKey(path));\n\n await blobClient.upload(body, body.length, {\n blobHTTPHeaders: { blobContentType: contentType },\n });\n }\n\n async appendFile(path: string, content: FileContent): Promise<void> {\n this.assertWritable(path, 'append');\n let existing: Buffer = Buffer.alloc(0);\n try {\n const read = await this.readFile(path);\n existing = Buffer.isBuffer(read) ? read : Buffer.from(read);\n } catch (error) {\n if (error instanceof FileNotFoundError) {\n // File doesn't exist, start fresh with empty buffer\n } else {\n throw error;\n }\n }\n\n const appendBuffer = toBuffer(content);\n await this.writeFile(path, Buffer.concat([existing, appendBuffer]));\n }\n\n async deleteFile(path: string, options?: RemoveOptions): Promise<void> {\n this.assertWritable(path, 'delete');\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 containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(this.toKey(path));\n\n try {\n await blobClient.delete();\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n if (options?.force) return;\n throw new FileNotFoundError(path);\n }\n throw this.handleError(error);\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n this.assertWritable(dest, 'copy');\n if (options?.overwrite === false && (await this.exists(dest))) {\n throw new FileExistsError(dest);\n }\n\n const containerClient = await this.getReadyContainer();\n const srcBlob = containerClient.getBlobClient(this.toKey(src));\n const destBlob = containerClient.getBlobClient(this.toKey(dest));\n\n try {\n const sasUrl = await srcBlob.generateSasUrl({\n permissions: BlobSASPermissions.parse('r'),\n expiresOn: new Date(Date.now() + 5 * 60 * 1000),\n });\n\n const properties = await srcBlob.getProperties();\n\n if (properties.contentLength === 0) {\n // Azure bug: syncCopyFromURL fails on zero-length blobs with CannotVerifyCopySource\n await destBlob.getBlockBlobClient().upload(Buffer.alloc(0), 0);\n return;\n }\n\n const MAX_SYNC_COPY_SIZE = 256 * 1024 * 1024;\n if ((properties.contentLength ?? 0) <= MAX_SYNC_COPY_SIZE) {\n await destBlob.syncCopyFromURL(sasUrl);\n } else {\n const poller = await destBlob.beginCopyFromURL(sasUrl);\n await poller.pollUntilDone();\n }\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n throw new FileNotFoundError(src);\n }\n\n // SAS generation fails without StorageSharedKeyCredential (e.g. DefaultAzureCredential).\n // Fall back to download+reupload.\n if (\n error instanceof Error &&\n (error.message.includes('generateSasUrl') ||\n (error.message.includes('SAS') && error.message.includes('shared key credential')))\n ) {\n const content = await this.readFile(src);\n await this.writeFile(dest, content);\n return;\n }\n\n throw this.handleError(error);\n }\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n this.assertWritable(dest, 'move');\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 // Azure Blob Storage 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 this.assertWritable(path, 'rmdir');\n const containerClient = await this.getReadyContainer();\n const prefix = this.toKey(path).replace(/\\/$/, '') + '/';\n\n if (!options?.recursive) {\n const iter = containerClient.listBlobsFlat({ prefix });\n const first = await iter.next();\n if (!first.done) {\n throw new Error(`Directory not empty: ${path}`);\n }\n return;\n }\n\n // Delete all blobs with this prefix in batches\n let blobNames: string[] = [];\n for await (const blob of containerClient.listBlobsFlat({ prefix })) {\n blobNames.push(blob.name);\n\n if (blobNames.length >= 256) {\n await this.deleteBlobBatch(containerClient, blobNames);\n blobNames = [];\n }\n }\n\n if (blobNames.length > 0) {\n await this.deleteBlobBatch(containerClient, blobNames);\n }\n }\n\n private async deleteBlobBatch(containerClient: ContainerClient, blobNames: string[]): Promise<void> {\n const blobClients = blobNames.map(name => containerClient.getBlobClient(name));\n await containerClient.getBlobBatchClient().deleteBlobs(blobClients);\n }\n\n async readdir(path: string, options?: ListOptions): Promise<FileEntry[]> {\n const containerClient = await this.getReadyContainer();\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 if (options?.recursive) {\n for await (const blob of containerClient.listBlobsFlat({ prefix: searchPrefix })) {\n const key = blob.name;\n if (!key || key === searchPrefix) continue;\n\n const relativePath = key.slice(searchPrefix.length);\n if (!relativePath) continue;\n\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 if (options?.extension) {\n const extensions = Array.isArray(options.extension) ? options.extension : [options.extension];\n if (!extensions.some(ext => relativePath.endsWith(ext))) {\n continue;\n }\n }\n\n entries.push({\n name: relativePath,\n type: 'file',\n size: blob.properties.contentLength,\n });\n }\n } else {\n for await (const item of containerClient.listBlobsByHierarchy('/', { prefix: searchPrefix })) {\n if (item.kind === 'prefix') {\n const dirName = item.name.slice(searchPrefix.length).replace(/\\/$/, '');\n if (dirName && !seenDirs.has(dirName)) {\n seenDirs.add(dirName);\n entries.push({ name: dirName, type: 'directory' });\n }\n } else {\n const key = item.name;\n if (!key || key === searchPrefix) continue;\n\n const relativePath = key.slice(searchPrefix.length);\n if (!relativePath) continue;\n\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 if (options?.extension) {\n const extensions = Array.isArray(options.extension) ? options.extension : [options.extension];\n if (!extensions.some(ext => relativePath.endsWith(ext))) {\n continue;\n }\n }\n\n entries.push({\n name: relativePath,\n type: 'file',\n size: item.properties.contentLength,\n });\n }\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 if (!key) return true;\n\n const containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(key);\n\n const exists = await blobClient.exists();\n if (exists) return true;\n\n // Check if it's a \"directory\" (has blobs with this prefix)\n const prefix = key.replace(/\\/$/, '') + '/';\n const iter = containerClient.listBlobsFlat({ prefix });\n const first = await iter.next();\n return !first.done;\n }\n\n async stat(path: string): Promise<FileStat> {\n const key = this.toKey(path);\n\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 containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(key);\n\n try {\n const properties = await blobClient.getProperties();\n const name = path.split('/').pop() ?? '';\n\n return {\n name,\n path,\n type: 'file',\n size: properties.contentLength ?? 0,\n createdAt: properties.createdOn ?? new Date(),\n modifiedAt: properties.lastModified ?? new Date(),\n };\n } catch (error: unknown) {\n if (!isNotFoundError(error)) throw this.handleError(error);\n\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\n async isFile(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return false;\n\n const containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(key);\n return blobClient.exists();\n }\n\n async isDirectory(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return true;\n\n const containerClient = await this.getReadyContainer();\n const prefix = key.replace(/\\/$/, '') + '/';\n const iter = containerClient.listBlobsFlat({ prefix });\n const first = await iter.next();\n return !first.done;\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n async init(): Promise<void> {\n const containerClient = await this.getContainerClient();\n try {\n if (this.sasToken) {\n const iter = containerClient.listBlobsFlat({ prefix: this.prefix });\n await iter.next();\n return;\n }\n\n const exists = await containerClient.exists();\n if (!exists) {\n const err = new Error(`Container \"${this.containerName}\" does not exist`) as Error & { status?: number };\n err.status = 404;\n throw err;\n }\n } catch (error) {\n if ((error as { status?: number }).status) {\n throw error;\n }\n\n const statusCode = (error as RestError).statusCode;\n if (typeof statusCode === 'number') {\n const message = error instanceof Error ? error.message : String(error);\n const err = new Error(message) as Error & { status?: number };\n err.status = statusCode;\n throw err;\n }\n throw error;\n }\n }\n\n async destroy(): Promise<void> {\n this._containerClient = null;\n }\n}\n","import { BlobServiceClient, StorageSharedKeyCredential } from '@azure/storage-blob';\nimport type { ContainerClient } from '@azure/storage-blob';\n\nimport { BlobStore } from '@mastra/core/storage';\nimport type { StorageBlobEntry } from '@mastra/core/storage';\n\n/**\n * Configuration for AzureBlobStore.\n */\nexport interface AzureBlobStoreOptions {\n /** Azure Blob container name */\n container: string;\n /** Storage account name (required unless using connectionString) */\n accountName?: string;\n /** Storage account key */\n accountKey?: string;\n /** SAS token for authentication */\n sasToken?: string;\n /** Full connection string (takes priority over accountName/accountKey) */\n connectionString?: string;\n /**\n * Use DefaultAzureCredential from @azure/identity for authentication.\n * Requires @azure/identity to be installed as a peer dependency.\n */\n useDefaultCredential?: boolean;\n /** Custom endpoint URL (e.g. for the Azurite emulator) */\n endpoint?: string;\n /**\n * Key prefix for all blob objects.\n * Defaults to 'mastra_skill_blobs/'.\n */\n prefix?: string;\n}\n\n/** Trim leading and trailing slashes. */\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\nfunction isNotFoundError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n return (error as { statusCode?: number }).statusCode === 404;\n}\n\n/** Azure metadata batch limit per request. */\nconst BATCH_DELETE_SIZE = 256;\n\n/**\n * Azure Blob Storage-backed content-addressable blob store for skill versioning.\n *\n * Each blob is stored as a block blob keyed by its SHA-256 hash. Metadata\n * (size, mimeType, createdAt) is stored as Azure blob metadata.\n *\n * Since blobs are content-addressable, writes are idempotent — the same hash\n * always maps to the same content, so overwrites are safe and equivalent to\n * a no-op.\n *\n * @example Connection string\n * ```typescript\n * import { AzureBlobStore } from '@mastra/azure/blob';\n *\n * const blobs = new AzureBlobStore({\n * container: 'my-skill-blobs',\n * connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING!,\n * });\n * ```\n *\n * @example Account key\n * ```typescript\n * import { AzureBlobStore } from '@mastra/azure/blob';\n *\n * const blobs = new AzureBlobStore({\n * container: 'my-skill-blobs',\n * accountName: process.env.AZURE_STORAGE_ACCOUNT_NAME!,\n * accountKey: process.env.AZURE_STORAGE_ACCOUNT_KEY!,\n * });\n * ```\n */\nexport class AzureBlobStore extends BlobStore {\n private readonly containerName: string;\n private readonly accountName?: string;\n private readonly accountKey?: string;\n private readonly sasToken?: string;\n private readonly connectionString?: string;\n private readonly useDefaultCredential: boolean;\n private readonly endpoint?: string;\n private readonly prefix: string;\n\n private _containerClient: ContainerClient | null = null;\n\n constructor(options: AzureBlobStoreOptions) {\n super();\n this.containerName = options.container;\n this.accountName = options.accountName;\n this.accountKey = options.accountKey;\n this.sasToken = options.sasToken;\n this.connectionString = options.connectionString;\n this.useDefaultCredential = options.useDefaultCredential ?? false;\n this.endpoint = options.endpoint;\n this.prefix = options.prefix ? trimSlashes(options.prefix) + '/' : 'mastra_skill_blobs/';\n }\n\n private async getContainerClient(): Promise<ContainerClient> {\n if (this._containerClient) return this._containerClient;\n\n let serviceClient: BlobServiceClient;\n\n if (this.connectionString) {\n serviceClient = BlobServiceClient.fromConnectionString(this.connectionString);\n } else {\n if (!this.endpoint && !this.accountName) {\n throw new Error(\n 'Azure Blob Storage requires either a connectionString, or an accountName/endpoint. ' +\n 'Provide at least one of: connectionString, accountName, or endpoint.',\n );\n }\n const baseUrl = this.endpoint ?? `https://${this.accountName}.blob.core.windows.net`;\n\n if (this.accountName && this.accountKey) {\n const credential = new StorageSharedKeyCredential(this.accountName, this.accountKey);\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } else if (this.sasToken) {\n const sas = this.sasToken.replace(/^\\?+/, '');\n const separator = baseUrl.includes('?') ? '&' : '?';\n serviceClient = new BlobServiceClient(`${baseUrl}${separator}${sas}`);\n } else if (this.useDefaultCredential) {\n // Dynamically import @azure/identity to avoid requiring it when not used.\n // Must use import() (not require()) because this package is ESM-first.\n try {\n const identity = await import('@azure/identity');\n const credential = new identity.DefaultAzureCredential();\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } catch {\n throw new Error(\n 'DefaultAzureCredential requires @azure/identity to be installed. ' +\n 'Install it with: npm install @azure/identity',\n );\n }\n } else {\n // Anonymous access\n serviceClient = new BlobServiceClient(baseUrl);\n }\n }\n\n this._containerClient = serviceClient.getContainerClient(this.containerName);\n return this._containerClient;\n }\n\n private toKey(hash: string): string {\n return this.prefix + hash;\n }\n\n async init(): Promise<void> {\n // Azure does not require table creation — the container is expected to exist.\n }\n\n async put(entry: StorageBlobEntry): Promise<void> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(entry.hash));\n const now = entry.createdAt ?? new Date();\n const buffer = Buffer.from(entry.content, 'utf-8');\n\n await blobClient.uploadData(buffer, {\n blobHTTPHeaders: {\n blobContentType: entry.mimeType ?? 'application/octet-stream',\n },\n metadata: {\n size: String(entry.size),\n createdat: now.toISOString(),\n ...(entry.mimeType ? { mimetype: entry.mimeType } : {}),\n },\n });\n }\n\n async get(hash: string): Promise<StorageBlobEntry | null> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(hash));\n\n try {\n const buffer = await blobClient.downloadToBuffer();\n const properties = await blobClient.getProperties();\n const metadata = properties.metadata ?? {};\n const content = buffer.toString('utf-8');\n\n return {\n hash,\n content,\n size: metadata.size != null ? Number(metadata.size) : Buffer.byteLength(content, 'utf-8'),\n mimeType: metadata.mimetype || properties.contentType || undefined,\n createdAt: metadata.createdat ? new Date(metadata.createdat) : new Date(),\n };\n } catch (error: unknown) {\n if (isNotFoundError(error)) return null;\n throw error;\n }\n }\n\n async has(hash: string): Promise<boolean> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(hash));\n\n try {\n await blobClient.getProperties();\n return true;\n } catch (error: unknown) {\n if (isNotFoundError(error)) return false;\n throw error;\n }\n }\n\n async delete(hash: string): Promise<boolean> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(hash));\n const response = await blobClient.deleteIfExists();\n return response.succeeded;\n }\n\n async putMany(entries: StorageBlobEntry[]): Promise<void> {\n if (entries.length === 0) return;\n // Azure does not have a batch PUT, so we parallelize individual puts.\n // Content-addressable means duplicate writes are idempotent.\n await Promise.all(entries.map(entry => this.put(entry)));\n }\n\n async getMany(hashes: string[]): Promise<Map<string, StorageBlobEntry>> {\n const result = new Map<string, StorageBlobEntry>();\n if (hashes.length === 0) return result;\n\n const entries = await Promise.all(hashes.map(hash => this.get(hash)));\n for (const entry of entries) {\n if (entry) {\n result.set(entry.hash, entry);\n }\n }\n return result;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n const containerClient = await this.getContainerClient();\n let batch: string[] = [];\n\n for await (const blob of containerClient.listBlobsFlat({ prefix: this.prefix })) {\n batch.push(blob.name);\n if (batch.length >= BATCH_DELETE_SIZE) {\n await this.deleteBlobBatch(containerClient, batch);\n batch = [];\n }\n }\n\n if (batch.length > 0) {\n await this.deleteBlobBatch(containerClient, batch);\n }\n }\n\n private async deleteBlobBatch(containerClient: ContainerClient, blobNames: string[]): Promise<void> {\n const blobClients = blobNames.map(name => containerClient.getBlobClient(name));\n await containerClient.getBlobBatchClient().deleteBlobs(blobClients);\n }\n}\n","import type { BlobStoreProvider, FilesystemProvider } from '@mastra/core/editor';\nimport { AzureBlobStore } from './blob-store';\nimport type { AzureBlobStoreOptions } from './blob-store';\nimport { AzureBlobFilesystem } from './filesystem';\nimport type { AzureBlobFilesystemOptions } from './filesystem';\n\nexport const azureBlobFilesystemProvider: FilesystemProvider<AzureBlobFilesystemOptions> = {\n id: 'azure-blob',\n name: 'Azure Blob Storage',\n description: 'Azure Blob Storage container',\n configSchema: {\n type: 'object',\n required: ['container'],\n properties: {\n container: { type: 'string', description: 'Azure Blob container name' },\n accountName: { type: 'string', description: 'Storage account name' },\n accountKey: { type: 'string', description: 'Storage account key' },\n sasToken: { type: 'string', description: 'Shared Access Signature token' },\n connectionString: { type: 'string', description: 'Full connection string (overrides other auth options)' },\n useDefaultCredential: {\n type: 'boolean',\n description: 'Use DefaultAzureCredential (requires @azure/identity)',\n default: false,\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 endpoint URL (for Azurite emulator)' },\n },\n },\n createFilesystem: config => new AzureBlobFilesystem(config),\n};\n\nexport const azureBlobStoreProvider: BlobStoreProvider<AzureBlobStoreOptions> = {\n id: 'azure-blob',\n name: 'Azure Blob Store',\n description: 'Content-addressable blob storage backed by Azure Blob Storage',\n configSchema: {\n type: 'object',\n required: ['container'],\n properties: {\n container: { type: 'string', description: 'Azure Blob container name' },\n accountName: { type: 'string', description: 'Storage account name' },\n accountKey: { type: 'string', description: 'Storage account key' },\n sasToken: { type: 'string', description: 'Shared Access Signature token' },\n connectionString: { type: 'string', description: 'Full connection string (overrides other auth options)' },\n useDefaultCredential: {\n type: 'boolean',\n description: 'Use DefaultAzureCredential (requires @azure/identity)',\n default: false,\n },\n prefix: { type: 'string', description: 'Key prefix for blob objects (default: mastra_skill_blobs/)' },\n endpoint: { type: 'string', description: 'Custom endpoint URL (for Azurite emulator)' },\n },\n },\n createBlobStore: config => new AzureBlobStore(config),\n};\n"]}
package/dist/index.cjs CHANGED
@@ -1,24 +1,24 @@
1
1
  'use strict';
2
2
 
3
- var chunkJLBSGA65_cjs = require('./chunk-JLBSGA65.cjs');
3
+ var chunk74CBJSIM_cjs = require('./chunk-74CBJSIM.cjs');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "AzureBlobFilesystem", {
8
8
  enumerable: true,
9
- get: function () { return chunkJLBSGA65_cjs.AzureBlobFilesystem; }
9
+ get: function () { return chunk74CBJSIM_cjs.AzureBlobFilesystem; }
10
10
  });
11
11
  Object.defineProperty(exports, "AzureBlobStore", {
12
12
  enumerable: true,
13
- get: function () { return chunkJLBSGA65_cjs.AzureBlobStore; }
13
+ get: function () { return chunk74CBJSIM_cjs.AzureBlobStore; }
14
14
  });
15
15
  Object.defineProperty(exports, "azureBlobFilesystemProvider", {
16
16
  enumerable: true,
17
- get: function () { return chunkJLBSGA65_cjs.azureBlobFilesystemProvider; }
17
+ get: function () { return chunk74CBJSIM_cjs.azureBlobFilesystemProvider; }
18
18
  });
19
19
  Object.defineProperty(exports, "azureBlobStoreProvider", {
20
20
  enumerable: true,
21
- get: function () { return chunkJLBSGA65_cjs.azureBlobStoreProvider; }
21
+ get: function () { return chunk74CBJSIM_cjs.azureBlobStoreProvider; }
22
22
  });
23
23
  //# sourceMappingURL=index.cjs.map
24
24
  //# sourceMappingURL=index.cjs.map
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { AzureBlobFilesystem, AzureBlobStore, azureBlobFilesystemProvider, azureBlobStoreProvider } from './chunk-DBBJ2YM7.js';
1
+ export { AzureBlobFilesystem, AzureBlobStore, azureBlobFilesystemProvider, azureBlobStoreProvider } from './chunk-T7WJTVIJ.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/azure",
3
- "version": "0.2.0-alpha.1",
3
+ "version": "0.2.1-alpha.0",
4
4
  "description": "Azure provider for Mastra - includes Blob Storage workspace filesystem",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -39,12 +39,12 @@
39
39
  "dotenv": "^17.3.1",
40
40
  "eslint": "^9.39.4",
41
41
  "tsup": "^8.5.1",
42
- "typescript": "^5.9.3",
42
+ "typescript": "^6.0.3",
43
43
  "vitest": "4.1.5",
44
- "@internal/lint": "0.0.86",
45
- "@internal/types-builder": "0.0.61",
46
- "@internal/workspace-test-utils": "0.0.30",
47
- "@mastra/core": "1.29.0-alpha.5"
44
+ "@internal/lint": "0.0.87",
45
+ "@internal/workspace-test-utils": "0.0.31",
46
+ "@mastra/core": "1.29.1-alpha.2",
47
+ "@internal/types-builder": "0.0.62"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "@mastra/core": ">=1.4.0-0 <2.0.0-0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/blob/filesystem/index.ts","../src/blob/blob-store/index.ts","../src/blob/provider.ts"],"names":["trimSlashes","isNotFoundError","BlobServiceClient","StorageSharedKeyCredential"],"mappings":"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","file":"chunk-DBBJ2YM7.js","sourcesContent":["/**\n * Azure Blob Storage Filesystem Provider\n *\n * A filesystem implementation backed by Azure Blob Storage.\n */\n\nimport { BlobSASPermissions, BlobServiceClient, StorageSharedKeyCredential } from '@azure/storage-blob';\nimport type { ContainerClient, RestError } from '@azure/storage-blob';\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, PermissionError } from '@mastra/core/workspace';\n\n/**\n * Azure Blob mount configuration.\n * Returned by AzureBlobFilesystem.getMountConfig() for FUSE mounting in sandboxes.\n */\nexport interface AzureBlobMountConfig extends FilesystemMountConfig {\n type: 'azure-blob';\n container: string;\n accountName?: string;\n accountKey?: string;\n sasToken?: string;\n connectionString?: string;\n useDefaultCredential?: boolean;\n endpoint?: string;\n readOnly?: boolean;\n}\n\nconst MIME_TYPES: Record<string, string> = {\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 '.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 '.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 '.pdf': 'application/pdf',\n '.zip': 'application/zip',\n '.gz': 'application/gzip',\n '.tar': 'application/x-tar',\n};\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\nfunction isNotFoundError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n const restErr = error as { statusCode?: number };\n return restErr.statusCode === 404;\n}\n\nfunction isAccessDeniedError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n const restErr = error as { statusCode?: number };\n return restErr.statusCode === 403;\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\nasync function streamToBuffer(stream: NodeJS.ReadableStream | undefined): Promise<Buffer> {\n if (!stream) return Buffer.alloc(0);\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks);\n}\n\nfunction toBuffer(content: FileContent): Buffer {\n if (Buffer.isBuffer(content)) return content;\n return typeof content === 'string' ? Buffer.from(content, 'utf-8') : Buffer.from(content);\n}\n\nexport interface AzureBlobFilesystemOptions extends MastraFilesystemOptions {\n /** Unique identifier for this filesystem instance */\n id?: string;\n /** Azure Blob container name */\n container: string;\n /** Human-friendly display name for the UI */\n displayName?: string;\n /** Icon identifier for the UI (defaults to 'azure-blob') */\n icon?: FilesystemIcon;\n /** Description shown in tooltips */\n description?: string;\n /** Storage account name (required unless using connectionString) */\n accountName?: string;\n /** Storage account key */\n accountKey?: string;\n /** SAS token for authentication */\n sasToken?: string;\n /** Full connection string (takes priority over accountName/accountKey) */\n connectionString?: string;\n /**\n * Use DefaultAzureCredential from @azure/identity for authentication.\n * Supports Managed Identity, Azure CLI, environment variables, etc.\n * Requires @azure/identity to be installed as a peer dependency.\n */\n useDefaultCredential?: boolean;\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 endpoint URL.\n * Used for local development with Azurite emulator.\n */\n endpoint?: string;\n}\n\nexport class AzureBlobFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'AzureBlobFilesystem';\n readonly provider = 'azure-blob';\n readonly readOnly?: boolean;\n\n status: ProviderStatus = 'pending';\n\n readonly displayName?: string;\n readonly icon: FilesystemIcon = 'azure-blob';\n readonly description?: string;\n\n private readonly containerName: string;\n private readonly accountName?: string;\n private readonly accountKey?: string;\n private readonly sasToken?: string;\n private readonly connectionString?: string;\n private readonly useDefaultCredential: boolean;\n private readonly prefix: string;\n private readonly endpoint?: string;\n\n private _containerClient: ContainerClient | null = null;\n\n constructor(options: AzureBlobFilesystemOptions) {\n super({ ...options, name: 'AzureBlobFilesystem' });\n this.id = options.id ?? `azure-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n this.containerName = options.container;\n this.accountName = options.accountName;\n this.accountKey = options.accountKey;\n this.sasToken = options.sasToken;\n this.connectionString = options.connectionString;\n this.useDefaultCredential = options.useDefaultCredential ?? false;\n this.prefix = options.prefix ? trimSlashes(options.prefix) + '/' : '';\n this.endpoint = options.endpoint;\n\n this.displayName = options.displayName ?? 'Azure Blob Storage';\n this.icon = options.icon ?? 'azure-blob';\n this.description = options.description;\n this.readOnly = options.readOnly;\n }\n\n /**\n * Get the underlying ContainerClient for direct access to Azure Blob APIs.\n *\n * Use this when you need features not exposed through the WorkspaceFilesystem\n * interface (e.g., SAS URL generation, lease management, etc.).\n *\n * This is async because DefaultAzureCredential requires a dynamic import.\n * For non-DefaultAzureCredential auth methods, the promise resolves immediately.\n */\n getContainer(): Promise<ContainerClient> {\n return this.getContainerClient();\n }\n\n getMountConfig(): AzureBlobMountConfig {\n const config: AzureBlobMountConfig = {\n type: 'azure-blob',\n container: this.containerName,\n };\n\n if (this.connectionString) {\n config.connectionString = this.connectionString;\n } else {\n if (this.accountName) {\n config.accountName = this.accountName;\n }\n if (this.accountKey) {\n config.accountKey = this.accountKey;\n }\n if (this.sasToken) {\n config.sasToken = this.sasToken;\n }\n }\n\n if (this.useDefaultCredential) {\n config.useDefaultCredential = true;\n }\n\n if (this.endpoint) {\n config.endpoint = this.endpoint;\n }\n\n if (this.readOnly) {\n config.readOnly = true;\n }\n\n return config;\n }\n\n getInfo(): FilesystemInfo<{\n container: 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 container: this.containerName,\n ...(this.endpoint && { endpoint: this.endpoint }),\n ...(this.prefix && { prefix: this.prefix }),\n },\n };\n }\n\n getInstructions(): string {\n const access = this.readOnly ? 'Read-only' : 'Persistent';\n return `Azure Blob Storage in container \"${this.containerName}\". ${access} storage - files are retained across sessions.`;\n }\n\n private async getContainerClient(): Promise<ContainerClient> {\n if (this._containerClient) return this._containerClient;\n\n let serviceClient: BlobServiceClient;\n\n if (this.connectionString) {\n serviceClient = BlobServiceClient.fromConnectionString(this.connectionString);\n } else {\n if (!this.endpoint && !this.accountName) {\n throw new Error(\n 'Azure Blob Storage requires either a connectionString, or an accountName/endpoint. ' +\n 'Provide at least one of: connectionString, accountName, or endpoint.',\n );\n }\n const baseUrl = this.endpoint ?? `https://${this.accountName}.blob.core.windows.net`;\n\n if (this.accountName && this.accountKey) {\n const credential = new StorageSharedKeyCredential(this.accountName, this.accountKey);\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } else if (this.sasToken) {\n const sas = this.sasToken.replace(/^\\?+/, '');\n const separator = baseUrl.includes('?') ? '&' : '?';\n serviceClient = new BlobServiceClient(`${baseUrl}${separator}${sas}`);\n } else if (this.useDefaultCredential) {\n // Dynamically import @azure/identity to avoid requiring it when not used.\n // Must use import() (not require()) because this package is ESM-first.\n try {\n const identity = await import('@azure/identity');\n const credential = new identity.DefaultAzureCredential();\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } catch {\n throw new Error(\n 'DefaultAzureCredential requires @azure/identity to be installed. ' +\n 'Install it with: npm install @azure/identity',\n );\n }\n } else {\n // Anonymous access\n serviceClient = new BlobServiceClient(baseUrl);\n }\n }\n\n this._containerClient = serviceClient.getContainerClient(this.containerName);\n return this._containerClient;\n }\n\n private async getReadyContainer(): Promise<ContainerClient> {\n await this.ensureReady();\n return this.getContainerClient();\n }\n\n private toKey(path: string): string {\n const cleanPath = path.replace(/^\\/+/, '');\n return this.prefix + cleanPath;\n }\n\n private handleError(error: unknown): unknown {\n if (isAccessDeniedError(error)) {\n this.status = 'error';\n this.error = 'Access denied - check credentials and container permissions';\n }\n return error;\n }\n\n private assertWritable(path: string, operation: string): void {\n if (this.readOnly) {\n throw new PermissionError(path, `${operation} (filesystem is read-only)`);\n }\n }\n\n // ---------------------------------------------------------------------------\n // File Operations\n // ---------------------------------------------------------------------------\n\n async readFile(path: string, options?: ReadOptions): Promise<string | Buffer> {\n const containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(path));\n\n try {\n const response = await blobClient.download(0);\n const buffer = await streamToBuffer(response.readableStreamBody);\n\n if (options?.encoding) {\n return buffer.toString(options.encoding);\n }\n return buffer;\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n throw new FileNotFoundError(path);\n }\n throw this.handleError(error);\n }\n }\n\n async writeFile(path: string, content: FileContent, options?: WriteOptions): Promise<void> {\n this.assertWritable(path, 'write');\n const containerClient = await this.getReadyContainer();\n\n if (options?.overwrite === false && (await this.exists(path))) {\n throw new FileExistsError(path);\n }\n\n const body = toBuffer(content);\n const contentType = getMimeType(path);\n const blobClient = containerClient.getBlockBlobClient(this.toKey(path));\n\n await blobClient.upload(body, body.length, {\n blobHTTPHeaders: { blobContentType: contentType },\n });\n }\n\n async appendFile(path: string, content: FileContent): Promise<void> {\n this.assertWritable(path, 'append');\n let existing: Buffer = Buffer.alloc(0);\n try {\n const read = await this.readFile(path);\n existing = Buffer.isBuffer(read) ? read : Buffer.from(read);\n } catch (error) {\n if (error instanceof FileNotFoundError) {\n // File doesn't exist, start fresh with empty buffer\n } else {\n throw error;\n }\n }\n\n const appendBuffer = toBuffer(content);\n await this.writeFile(path, Buffer.concat([existing, appendBuffer]));\n }\n\n async deleteFile(path: string, options?: RemoveOptions): Promise<void> {\n this.assertWritable(path, 'delete');\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 containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(this.toKey(path));\n\n try {\n await blobClient.delete();\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n if (options?.force) return;\n throw new FileNotFoundError(path);\n }\n throw this.handleError(error);\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n this.assertWritable(dest, 'copy');\n if (options?.overwrite === false && (await this.exists(dest))) {\n throw new FileExistsError(dest);\n }\n\n const containerClient = await this.getReadyContainer();\n const srcBlob = containerClient.getBlobClient(this.toKey(src));\n const destBlob = containerClient.getBlobClient(this.toKey(dest));\n\n try {\n const sasUrl = await srcBlob.generateSasUrl({\n permissions: BlobSASPermissions.parse('r'),\n expiresOn: new Date(Date.now() + 5 * 60 * 1000),\n });\n\n const properties = await srcBlob.getProperties();\n\n if (properties.contentLength === 0) {\n // Azure bug: syncCopyFromURL fails on zero-length blobs with CannotVerifyCopySource\n await destBlob.getBlockBlobClient().upload(Buffer.alloc(0), 0);\n return;\n }\n\n const MAX_SYNC_COPY_SIZE = 256 * 1024 * 1024;\n if ((properties.contentLength ?? 0) <= MAX_SYNC_COPY_SIZE) {\n await destBlob.syncCopyFromURL(sasUrl);\n } else {\n const poller = await destBlob.beginCopyFromURL(sasUrl);\n await poller.pollUntilDone();\n }\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n throw new FileNotFoundError(src);\n }\n\n // SAS generation fails without StorageSharedKeyCredential (e.g. DefaultAzureCredential).\n // Fall back to download+reupload.\n if (\n error instanceof Error &&\n (error.message.includes('generateSasUrl') ||\n (error.message.includes('SAS') && error.message.includes('shared key credential')))\n ) {\n const content = await this.readFile(src);\n await this.writeFile(dest, content);\n return;\n }\n\n throw this.handleError(error);\n }\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n this.assertWritable(dest, 'move');\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 // Azure Blob Storage 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 this.assertWritable(path, 'rmdir');\n const containerClient = await this.getReadyContainer();\n const prefix = this.toKey(path).replace(/\\/$/, '') + '/';\n\n if (!options?.recursive) {\n const iter = containerClient.listBlobsFlat({ prefix });\n const first = await iter.next();\n if (!first.done) {\n throw new Error(`Directory not empty: ${path}`);\n }\n return;\n }\n\n // Delete all blobs with this prefix in batches\n let blobNames: string[] = [];\n for await (const blob of containerClient.listBlobsFlat({ prefix })) {\n blobNames.push(blob.name);\n\n if (blobNames.length >= 256) {\n await this.deleteBlobBatch(containerClient, blobNames);\n blobNames = [];\n }\n }\n\n if (blobNames.length > 0) {\n await this.deleteBlobBatch(containerClient, blobNames);\n }\n }\n\n private async deleteBlobBatch(containerClient: ContainerClient, blobNames: string[]): Promise<void> {\n const blobClients = blobNames.map(name => containerClient.getBlobClient(name));\n await containerClient.getBlobBatchClient().deleteBlobs(blobClients);\n }\n\n async readdir(path: string, options?: ListOptions): Promise<FileEntry[]> {\n const containerClient = await this.getReadyContainer();\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 if (options?.recursive) {\n for await (const blob of containerClient.listBlobsFlat({ prefix: searchPrefix })) {\n const key = blob.name;\n if (!key || key === searchPrefix) continue;\n\n const relativePath = key.slice(searchPrefix.length);\n if (!relativePath) continue;\n\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 if (options?.extension) {\n const extensions = Array.isArray(options.extension) ? options.extension : [options.extension];\n if (!extensions.some(ext => relativePath.endsWith(ext))) {\n continue;\n }\n }\n\n entries.push({\n name: relativePath,\n type: 'file',\n size: blob.properties.contentLength,\n });\n }\n } else {\n for await (const item of containerClient.listBlobsByHierarchy('/', { prefix: searchPrefix })) {\n if (item.kind === 'prefix') {\n const dirName = item.name.slice(searchPrefix.length).replace(/\\/$/, '');\n if (dirName && !seenDirs.has(dirName)) {\n seenDirs.add(dirName);\n entries.push({ name: dirName, type: 'directory' });\n }\n } else {\n const key = item.name;\n if (!key || key === searchPrefix) continue;\n\n const relativePath = key.slice(searchPrefix.length);\n if (!relativePath) continue;\n\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 if (options?.extension) {\n const extensions = Array.isArray(options.extension) ? options.extension : [options.extension];\n if (!extensions.some(ext => relativePath.endsWith(ext))) {\n continue;\n }\n }\n\n entries.push({\n name: relativePath,\n type: 'file',\n size: item.properties.contentLength,\n });\n }\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 if (!key) return true;\n\n const containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(key);\n\n const exists = await blobClient.exists();\n if (exists) return true;\n\n // Check if it's a \"directory\" (has blobs with this prefix)\n const prefix = key.replace(/\\/$/, '') + '/';\n const iter = containerClient.listBlobsFlat({ prefix });\n const first = await iter.next();\n return !first.done;\n }\n\n async stat(path: string): Promise<FileStat> {\n const key = this.toKey(path);\n\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 containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(key);\n\n try {\n const properties = await blobClient.getProperties();\n const name = path.split('/').pop() ?? '';\n\n return {\n name,\n path,\n type: 'file',\n size: properties.contentLength ?? 0,\n createdAt: properties.createdOn ?? new Date(),\n modifiedAt: properties.lastModified ?? new Date(),\n };\n } catch (error: unknown) {\n if (!isNotFoundError(error)) throw this.handleError(error);\n\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\n async isFile(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return false;\n\n const containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(key);\n return blobClient.exists();\n }\n\n async isDirectory(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return true;\n\n const containerClient = await this.getReadyContainer();\n const prefix = key.replace(/\\/$/, '') + '/';\n const iter = containerClient.listBlobsFlat({ prefix });\n const first = await iter.next();\n return !first.done;\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n async init(): Promise<void> {\n const containerClient = await this.getContainerClient();\n try {\n if (this.sasToken) {\n const iter = containerClient.listBlobsFlat({ prefix: this.prefix });\n await iter.next();\n return;\n }\n\n const exists = await containerClient.exists();\n if (!exists) {\n const err = new Error(`Container \"${this.containerName}\" does not exist`) as Error & { status?: number };\n err.status = 404;\n throw err;\n }\n } catch (error) {\n if ((error as { status?: number }).status) {\n throw error;\n }\n\n const statusCode = (error as RestError).statusCode;\n if (typeof statusCode === 'number') {\n const message = error instanceof Error ? error.message : String(error);\n const err = new Error(message) as Error & { status?: number };\n err.status = statusCode;\n throw err;\n }\n throw error;\n }\n }\n\n async destroy(): Promise<void> {\n this._containerClient = null;\n }\n}\n","import { BlobServiceClient, StorageSharedKeyCredential } from '@azure/storage-blob';\nimport type { ContainerClient } from '@azure/storage-blob';\n\nimport { BlobStore } from '@mastra/core/storage';\nimport type { StorageBlobEntry } from '@mastra/core/storage';\n\n/**\n * Configuration for AzureBlobStore.\n */\nexport interface AzureBlobStoreOptions {\n /** Azure Blob container name */\n container: string;\n /** Storage account name (required unless using connectionString) */\n accountName?: string;\n /** Storage account key */\n accountKey?: string;\n /** SAS token for authentication */\n sasToken?: string;\n /** Full connection string (takes priority over accountName/accountKey) */\n connectionString?: string;\n /**\n * Use DefaultAzureCredential from @azure/identity for authentication.\n * Requires @azure/identity to be installed as a peer dependency.\n */\n useDefaultCredential?: boolean;\n /** Custom endpoint URL (e.g. for the Azurite emulator) */\n endpoint?: string;\n /**\n * Key prefix for all blob objects.\n * Defaults to 'mastra_skill_blobs/'.\n */\n prefix?: string;\n}\n\n/** Trim leading and trailing slashes. */\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\nfunction isNotFoundError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n return (error as { statusCode?: number }).statusCode === 404;\n}\n\n/** Azure metadata batch limit per request. */\nconst BATCH_DELETE_SIZE = 256;\n\n/**\n * Azure Blob Storage-backed content-addressable blob store for skill versioning.\n *\n * Each blob is stored as a block blob keyed by its SHA-256 hash. Metadata\n * (size, mimeType, createdAt) is stored as Azure blob metadata.\n *\n * Since blobs are content-addressable, writes are idempotent — the same hash\n * always maps to the same content, so overwrites are safe and equivalent to\n * a no-op.\n *\n * @example Connection string\n * ```typescript\n * import { AzureBlobStore } from '@mastra/azure/blob';\n *\n * const blobs = new AzureBlobStore({\n * container: 'my-skill-blobs',\n * connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING!,\n * });\n * ```\n *\n * @example Account key\n * ```typescript\n * import { AzureBlobStore } from '@mastra/azure/blob';\n *\n * const blobs = new AzureBlobStore({\n * container: 'my-skill-blobs',\n * accountName: process.env.AZURE_STORAGE_ACCOUNT_NAME!,\n * accountKey: process.env.AZURE_STORAGE_ACCOUNT_KEY!,\n * });\n * ```\n */\nexport class AzureBlobStore extends BlobStore {\n private readonly containerName: string;\n private readonly accountName?: string;\n private readonly accountKey?: string;\n private readonly sasToken?: string;\n private readonly connectionString?: string;\n private readonly useDefaultCredential: boolean;\n private readonly endpoint?: string;\n private readonly prefix: string;\n\n private _containerClient: ContainerClient | null = null;\n\n constructor(options: AzureBlobStoreOptions) {\n super();\n this.containerName = options.container;\n this.accountName = options.accountName;\n this.accountKey = options.accountKey;\n this.sasToken = options.sasToken;\n this.connectionString = options.connectionString;\n this.useDefaultCredential = options.useDefaultCredential ?? false;\n this.endpoint = options.endpoint;\n this.prefix = options.prefix ? trimSlashes(options.prefix) + '/' : 'mastra_skill_blobs/';\n }\n\n private async getContainerClient(): Promise<ContainerClient> {\n if (this._containerClient) return this._containerClient;\n\n let serviceClient: BlobServiceClient;\n\n if (this.connectionString) {\n serviceClient = BlobServiceClient.fromConnectionString(this.connectionString);\n } else {\n if (!this.endpoint && !this.accountName) {\n throw new Error(\n 'Azure Blob Storage requires either a connectionString, or an accountName/endpoint. ' +\n 'Provide at least one of: connectionString, accountName, or endpoint.',\n );\n }\n const baseUrl = this.endpoint ?? `https://${this.accountName}.blob.core.windows.net`;\n\n if (this.accountName && this.accountKey) {\n const credential = new StorageSharedKeyCredential(this.accountName, this.accountKey);\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } else if (this.sasToken) {\n const sas = this.sasToken.replace(/^\\?+/, '');\n const separator = baseUrl.includes('?') ? '&' : '?';\n serviceClient = new BlobServiceClient(`${baseUrl}${separator}${sas}`);\n } else if (this.useDefaultCredential) {\n // Dynamically import @azure/identity to avoid requiring it when not used.\n // Must use import() (not require()) because this package is ESM-first.\n try {\n const identity = await import('@azure/identity');\n const credential = new identity.DefaultAzureCredential();\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } catch {\n throw new Error(\n 'DefaultAzureCredential requires @azure/identity to be installed. ' +\n 'Install it with: npm install @azure/identity',\n );\n }\n } else {\n // Anonymous access\n serviceClient = new BlobServiceClient(baseUrl);\n }\n }\n\n this._containerClient = serviceClient.getContainerClient(this.containerName);\n return this._containerClient;\n }\n\n private toKey(hash: string): string {\n return this.prefix + hash;\n }\n\n async init(): Promise<void> {\n // Azure does not require table creation — the container is expected to exist.\n }\n\n async put(entry: StorageBlobEntry): Promise<void> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(entry.hash));\n const now = entry.createdAt ?? new Date();\n const buffer = Buffer.from(entry.content, 'utf-8');\n\n await blobClient.uploadData(buffer, {\n blobHTTPHeaders: {\n blobContentType: entry.mimeType ?? 'application/octet-stream',\n },\n metadata: {\n size: String(entry.size),\n createdat: now.toISOString(),\n ...(entry.mimeType ? { mimetype: entry.mimeType } : {}),\n },\n });\n }\n\n async get(hash: string): Promise<StorageBlobEntry | null> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(hash));\n\n try {\n const buffer = await blobClient.downloadToBuffer();\n const properties = await blobClient.getProperties();\n const metadata = properties.metadata ?? {};\n const content = buffer.toString('utf-8');\n\n return {\n hash,\n content,\n size: metadata.size != null ? Number(metadata.size) : Buffer.byteLength(content, 'utf-8'),\n mimeType: metadata.mimetype || properties.contentType || undefined,\n createdAt: metadata.createdat ? new Date(metadata.createdat) : new Date(),\n };\n } catch (error: unknown) {\n if (isNotFoundError(error)) return null;\n throw error;\n }\n }\n\n async has(hash: string): Promise<boolean> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(hash));\n\n try {\n await blobClient.getProperties();\n return true;\n } catch (error: unknown) {\n if (isNotFoundError(error)) return false;\n throw error;\n }\n }\n\n async delete(hash: string): Promise<boolean> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(hash));\n const response = await blobClient.deleteIfExists();\n return response.succeeded;\n }\n\n async putMany(entries: StorageBlobEntry[]): Promise<void> {\n if (entries.length === 0) return;\n // Azure does not have a batch PUT, so we parallelize individual puts.\n // Content-addressable means duplicate writes are idempotent.\n await Promise.all(entries.map(entry => this.put(entry)));\n }\n\n async getMany(hashes: string[]): Promise<Map<string, StorageBlobEntry>> {\n const result = new Map<string, StorageBlobEntry>();\n if (hashes.length === 0) return result;\n\n const entries = await Promise.all(hashes.map(hash => this.get(hash)));\n for (const entry of entries) {\n if (entry) {\n result.set(entry.hash, entry);\n }\n }\n return result;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n const containerClient = await this.getContainerClient();\n let batch: string[] = [];\n\n for await (const blob of containerClient.listBlobsFlat({ prefix: this.prefix })) {\n batch.push(blob.name);\n if (batch.length >= BATCH_DELETE_SIZE) {\n await this.deleteBlobBatch(containerClient, batch);\n batch = [];\n }\n }\n\n if (batch.length > 0) {\n await this.deleteBlobBatch(containerClient, batch);\n }\n }\n\n private async deleteBlobBatch(containerClient: ContainerClient, blobNames: string[]): Promise<void> {\n const blobClients = blobNames.map(name => containerClient.getBlobClient(name));\n await containerClient.getBlobBatchClient().deleteBlobs(blobClients);\n }\n}\n","import type { BlobStoreProvider, FilesystemProvider } from '@mastra/core/editor';\nimport { AzureBlobStore } from './blob-store';\nimport type { AzureBlobStoreOptions } from './blob-store';\nimport { AzureBlobFilesystem } from './filesystem';\nimport type { AzureBlobFilesystemOptions } from './filesystem';\n\nexport const azureBlobFilesystemProvider: FilesystemProvider<AzureBlobFilesystemOptions> = {\n id: 'azure-blob',\n name: 'Azure Blob Storage',\n description: 'Azure Blob Storage container',\n configSchema: {\n type: 'object',\n required: ['container'],\n properties: {\n container: { type: 'string', description: 'Azure Blob container name' },\n accountName: { type: 'string', description: 'Storage account name' },\n accountKey: { type: 'string', description: 'Storage account key' },\n sasToken: { type: 'string', description: 'Shared Access Signature token' },\n connectionString: { type: 'string', description: 'Full connection string (overrides other auth options)' },\n useDefaultCredential: {\n type: 'boolean',\n description: 'Use DefaultAzureCredential (requires @azure/identity)',\n default: false,\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 endpoint URL (for Azurite emulator)' },\n },\n },\n createFilesystem: config => new AzureBlobFilesystem(config),\n};\n\nexport const azureBlobStoreProvider: BlobStoreProvider<AzureBlobStoreOptions> = {\n id: 'azure-blob',\n name: 'Azure Blob Store',\n description: 'Content-addressable blob storage backed by Azure Blob Storage',\n configSchema: {\n type: 'object',\n required: ['container'],\n properties: {\n container: { type: 'string', description: 'Azure Blob container name' },\n accountName: { type: 'string', description: 'Storage account name' },\n accountKey: { type: 'string', description: 'Storage account key' },\n sasToken: { type: 'string', description: 'Shared Access Signature token' },\n connectionString: { type: 'string', description: 'Full connection string (overrides other auth options)' },\n useDefaultCredential: {\n type: 'boolean',\n description: 'Use DefaultAzureCredential (requires @azure/identity)',\n default: false,\n },\n prefix: { type: 'string', description: 'Key prefix for blob objects (default: mastra_skill_blobs/)' },\n endpoint: { type: 'string', description: 'Custom endpoint URL (for Azurite emulator)' },\n },\n },\n createBlobStore: config => new AzureBlobStore(config),\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/blob/filesystem/index.ts","../src/blob/blob-store/index.ts","../src/blob/provider.ts"],"names":["MastraFilesystem","BlobServiceClient","StorageSharedKeyCredential","PermissionError","FileNotFoundError","FileExistsError","BlobSASPermissions","trimSlashes","isNotFoundError","BlobStore"],"mappings":"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","file":"chunk-JLBSGA65.cjs","sourcesContent":["/**\n * Azure Blob Storage Filesystem Provider\n *\n * A filesystem implementation backed by Azure Blob Storage.\n */\n\nimport { BlobSASPermissions, BlobServiceClient, StorageSharedKeyCredential } from '@azure/storage-blob';\nimport type { ContainerClient, RestError } from '@azure/storage-blob';\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, PermissionError } from '@mastra/core/workspace';\n\n/**\n * Azure Blob mount configuration.\n * Returned by AzureBlobFilesystem.getMountConfig() for FUSE mounting in sandboxes.\n */\nexport interface AzureBlobMountConfig extends FilesystemMountConfig {\n type: 'azure-blob';\n container: string;\n accountName?: string;\n accountKey?: string;\n sasToken?: string;\n connectionString?: string;\n useDefaultCredential?: boolean;\n endpoint?: string;\n readOnly?: boolean;\n}\n\nconst MIME_TYPES: Record<string, string> = {\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 '.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 '.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 '.pdf': 'application/pdf',\n '.zip': 'application/zip',\n '.gz': 'application/gzip',\n '.tar': 'application/x-tar',\n};\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\nfunction isNotFoundError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n const restErr = error as { statusCode?: number };\n return restErr.statusCode === 404;\n}\n\nfunction isAccessDeniedError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n const restErr = error as { statusCode?: number };\n return restErr.statusCode === 403;\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\nasync function streamToBuffer(stream: NodeJS.ReadableStream | undefined): Promise<Buffer> {\n if (!stream) return Buffer.alloc(0);\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks);\n}\n\nfunction toBuffer(content: FileContent): Buffer {\n if (Buffer.isBuffer(content)) return content;\n return typeof content === 'string' ? Buffer.from(content, 'utf-8') : Buffer.from(content);\n}\n\nexport interface AzureBlobFilesystemOptions extends MastraFilesystemOptions {\n /** Unique identifier for this filesystem instance */\n id?: string;\n /** Azure Blob container name */\n container: string;\n /** Human-friendly display name for the UI */\n displayName?: string;\n /** Icon identifier for the UI (defaults to 'azure-blob') */\n icon?: FilesystemIcon;\n /** Description shown in tooltips */\n description?: string;\n /** Storage account name (required unless using connectionString) */\n accountName?: string;\n /** Storage account key */\n accountKey?: string;\n /** SAS token for authentication */\n sasToken?: string;\n /** Full connection string (takes priority over accountName/accountKey) */\n connectionString?: string;\n /**\n * Use DefaultAzureCredential from @azure/identity for authentication.\n * Supports Managed Identity, Azure CLI, environment variables, etc.\n * Requires @azure/identity to be installed as a peer dependency.\n */\n useDefaultCredential?: boolean;\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 endpoint URL.\n * Used for local development with Azurite emulator.\n */\n endpoint?: string;\n}\n\nexport class AzureBlobFilesystem extends MastraFilesystem {\n readonly id: string;\n readonly name = 'AzureBlobFilesystem';\n readonly provider = 'azure-blob';\n readonly readOnly?: boolean;\n\n status: ProviderStatus = 'pending';\n\n readonly displayName?: string;\n readonly icon: FilesystemIcon = 'azure-blob';\n readonly description?: string;\n\n private readonly containerName: string;\n private readonly accountName?: string;\n private readonly accountKey?: string;\n private readonly sasToken?: string;\n private readonly connectionString?: string;\n private readonly useDefaultCredential: boolean;\n private readonly prefix: string;\n private readonly endpoint?: string;\n\n private _containerClient: ContainerClient | null = null;\n\n constructor(options: AzureBlobFilesystemOptions) {\n super({ ...options, name: 'AzureBlobFilesystem' });\n this.id = options.id ?? `azure-fs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n this.containerName = options.container;\n this.accountName = options.accountName;\n this.accountKey = options.accountKey;\n this.sasToken = options.sasToken;\n this.connectionString = options.connectionString;\n this.useDefaultCredential = options.useDefaultCredential ?? false;\n this.prefix = options.prefix ? trimSlashes(options.prefix) + '/' : '';\n this.endpoint = options.endpoint;\n\n this.displayName = options.displayName ?? 'Azure Blob Storage';\n this.icon = options.icon ?? 'azure-blob';\n this.description = options.description;\n this.readOnly = options.readOnly;\n }\n\n /**\n * Get the underlying ContainerClient for direct access to Azure Blob APIs.\n *\n * Use this when you need features not exposed through the WorkspaceFilesystem\n * interface (e.g., SAS URL generation, lease management, etc.).\n *\n * This is async because DefaultAzureCredential requires a dynamic import.\n * For non-DefaultAzureCredential auth methods, the promise resolves immediately.\n */\n getContainer(): Promise<ContainerClient> {\n return this.getContainerClient();\n }\n\n getMountConfig(): AzureBlobMountConfig {\n const config: AzureBlobMountConfig = {\n type: 'azure-blob',\n container: this.containerName,\n };\n\n if (this.connectionString) {\n config.connectionString = this.connectionString;\n } else {\n if (this.accountName) {\n config.accountName = this.accountName;\n }\n if (this.accountKey) {\n config.accountKey = this.accountKey;\n }\n if (this.sasToken) {\n config.sasToken = this.sasToken;\n }\n }\n\n if (this.useDefaultCredential) {\n config.useDefaultCredential = true;\n }\n\n if (this.endpoint) {\n config.endpoint = this.endpoint;\n }\n\n if (this.readOnly) {\n config.readOnly = true;\n }\n\n return config;\n }\n\n getInfo(): FilesystemInfo<{\n container: 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 container: this.containerName,\n ...(this.endpoint && { endpoint: this.endpoint }),\n ...(this.prefix && { prefix: this.prefix }),\n },\n };\n }\n\n getInstructions(): string {\n const access = this.readOnly ? 'Read-only' : 'Persistent';\n return `Azure Blob Storage in container \"${this.containerName}\". ${access} storage - files are retained across sessions.`;\n }\n\n private async getContainerClient(): Promise<ContainerClient> {\n if (this._containerClient) return this._containerClient;\n\n let serviceClient: BlobServiceClient;\n\n if (this.connectionString) {\n serviceClient = BlobServiceClient.fromConnectionString(this.connectionString);\n } else {\n if (!this.endpoint && !this.accountName) {\n throw new Error(\n 'Azure Blob Storage requires either a connectionString, or an accountName/endpoint. ' +\n 'Provide at least one of: connectionString, accountName, or endpoint.',\n );\n }\n const baseUrl = this.endpoint ?? `https://${this.accountName}.blob.core.windows.net`;\n\n if (this.accountName && this.accountKey) {\n const credential = new StorageSharedKeyCredential(this.accountName, this.accountKey);\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } else if (this.sasToken) {\n const sas = this.sasToken.replace(/^\\?+/, '');\n const separator = baseUrl.includes('?') ? '&' : '?';\n serviceClient = new BlobServiceClient(`${baseUrl}${separator}${sas}`);\n } else if (this.useDefaultCredential) {\n // Dynamically import @azure/identity to avoid requiring it when not used.\n // Must use import() (not require()) because this package is ESM-first.\n try {\n const identity = await import('@azure/identity');\n const credential = new identity.DefaultAzureCredential();\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } catch {\n throw new Error(\n 'DefaultAzureCredential requires @azure/identity to be installed. ' +\n 'Install it with: npm install @azure/identity',\n );\n }\n } else {\n // Anonymous access\n serviceClient = new BlobServiceClient(baseUrl);\n }\n }\n\n this._containerClient = serviceClient.getContainerClient(this.containerName);\n return this._containerClient;\n }\n\n private async getReadyContainer(): Promise<ContainerClient> {\n await this.ensureReady();\n return this.getContainerClient();\n }\n\n private toKey(path: string): string {\n const cleanPath = path.replace(/^\\/+/, '');\n return this.prefix + cleanPath;\n }\n\n private handleError(error: unknown): unknown {\n if (isAccessDeniedError(error)) {\n this.status = 'error';\n this.error = 'Access denied - check credentials and container permissions';\n }\n return error;\n }\n\n private assertWritable(path: string, operation: string): void {\n if (this.readOnly) {\n throw new PermissionError(path, `${operation} (filesystem is read-only)`);\n }\n }\n\n // ---------------------------------------------------------------------------\n // File Operations\n // ---------------------------------------------------------------------------\n\n async readFile(path: string, options?: ReadOptions): Promise<string | Buffer> {\n const containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(path));\n\n try {\n const response = await blobClient.download(0);\n const buffer = await streamToBuffer(response.readableStreamBody);\n\n if (options?.encoding) {\n return buffer.toString(options.encoding);\n }\n return buffer;\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n throw new FileNotFoundError(path);\n }\n throw this.handleError(error);\n }\n }\n\n async writeFile(path: string, content: FileContent, options?: WriteOptions): Promise<void> {\n this.assertWritable(path, 'write');\n const containerClient = await this.getReadyContainer();\n\n if (options?.overwrite === false && (await this.exists(path))) {\n throw new FileExistsError(path);\n }\n\n const body = toBuffer(content);\n const contentType = getMimeType(path);\n const blobClient = containerClient.getBlockBlobClient(this.toKey(path));\n\n await blobClient.upload(body, body.length, {\n blobHTTPHeaders: { blobContentType: contentType },\n });\n }\n\n async appendFile(path: string, content: FileContent): Promise<void> {\n this.assertWritable(path, 'append');\n let existing: Buffer = Buffer.alloc(0);\n try {\n const read = await this.readFile(path);\n existing = Buffer.isBuffer(read) ? read : Buffer.from(read);\n } catch (error) {\n if (error instanceof FileNotFoundError) {\n // File doesn't exist, start fresh with empty buffer\n } else {\n throw error;\n }\n }\n\n const appendBuffer = toBuffer(content);\n await this.writeFile(path, Buffer.concat([existing, appendBuffer]));\n }\n\n async deleteFile(path: string, options?: RemoveOptions): Promise<void> {\n this.assertWritable(path, 'delete');\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 containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(this.toKey(path));\n\n try {\n await blobClient.delete();\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n if (options?.force) return;\n throw new FileNotFoundError(path);\n }\n throw this.handleError(error);\n }\n }\n\n async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n this.assertWritable(dest, 'copy');\n if (options?.overwrite === false && (await this.exists(dest))) {\n throw new FileExistsError(dest);\n }\n\n const containerClient = await this.getReadyContainer();\n const srcBlob = containerClient.getBlobClient(this.toKey(src));\n const destBlob = containerClient.getBlobClient(this.toKey(dest));\n\n try {\n const sasUrl = await srcBlob.generateSasUrl({\n permissions: BlobSASPermissions.parse('r'),\n expiresOn: new Date(Date.now() + 5 * 60 * 1000),\n });\n\n const properties = await srcBlob.getProperties();\n\n if (properties.contentLength === 0) {\n // Azure bug: syncCopyFromURL fails on zero-length blobs with CannotVerifyCopySource\n await destBlob.getBlockBlobClient().upload(Buffer.alloc(0), 0);\n return;\n }\n\n const MAX_SYNC_COPY_SIZE = 256 * 1024 * 1024;\n if ((properties.contentLength ?? 0) <= MAX_SYNC_COPY_SIZE) {\n await destBlob.syncCopyFromURL(sasUrl);\n } else {\n const poller = await destBlob.beginCopyFromURL(sasUrl);\n await poller.pollUntilDone();\n }\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n throw new FileNotFoundError(src);\n }\n\n // SAS generation fails without StorageSharedKeyCredential (e.g. DefaultAzureCredential).\n // Fall back to download+reupload.\n if (\n error instanceof Error &&\n (error.message.includes('generateSasUrl') ||\n (error.message.includes('SAS') && error.message.includes('shared key credential')))\n ) {\n const content = await this.readFile(src);\n await this.writeFile(dest, content);\n return;\n }\n\n throw this.handleError(error);\n }\n }\n\n async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {\n this.assertWritable(dest, 'move');\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 // Azure Blob Storage 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 this.assertWritable(path, 'rmdir');\n const containerClient = await this.getReadyContainer();\n const prefix = this.toKey(path).replace(/\\/$/, '') + '/';\n\n if (!options?.recursive) {\n const iter = containerClient.listBlobsFlat({ prefix });\n const first = await iter.next();\n if (!first.done) {\n throw new Error(`Directory not empty: ${path}`);\n }\n return;\n }\n\n // Delete all blobs with this prefix in batches\n let blobNames: string[] = [];\n for await (const blob of containerClient.listBlobsFlat({ prefix })) {\n blobNames.push(blob.name);\n\n if (blobNames.length >= 256) {\n await this.deleteBlobBatch(containerClient, blobNames);\n blobNames = [];\n }\n }\n\n if (blobNames.length > 0) {\n await this.deleteBlobBatch(containerClient, blobNames);\n }\n }\n\n private async deleteBlobBatch(containerClient: ContainerClient, blobNames: string[]): Promise<void> {\n const blobClients = blobNames.map(name => containerClient.getBlobClient(name));\n await containerClient.getBlobBatchClient().deleteBlobs(blobClients);\n }\n\n async readdir(path: string, options?: ListOptions): Promise<FileEntry[]> {\n const containerClient = await this.getReadyContainer();\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 if (options?.recursive) {\n for await (const blob of containerClient.listBlobsFlat({ prefix: searchPrefix })) {\n const key = blob.name;\n if (!key || key === searchPrefix) continue;\n\n const relativePath = key.slice(searchPrefix.length);\n if (!relativePath) continue;\n\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 if (options?.extension) {\n const extensions = Array.isArray(options.extension) ? options.extension : [options.extension];\n if (!extensions.some(ext => relativePath.endsWith(ext))) {\n continue;\n }\n }\n\n entries.push({\n name: relativePath,\n type: 'file',\n size: blob.properties.contentLength,\n });\n }\n } else {\n for await (const item of containerClient.listBlobsByHierarchy('/', { prefix: searchPrefix })) {\n if (item.kind === 'prefix') {\n const dirName = item.name.slice(searchPrefix.length).replace(/\\/$/, '');\n if (dirName && !seenDirs.has(dirName)) {\n seenDirs.add(dirName);\n entries.push({ name: dirName, type: 'directory' });\n }\n } else {\n const key = item.name;\n if (!key || key === searchPrefix) continue;\n\n const relativePath = key.slice(searchPrefix.length);\n if (!relativePath) continue;\n\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 if (options?.extension) {\n const extensions = Array.isArray(options.extension) ? options.extension : [options.extension];\n if (!extensions.some(ext => relativePath.endsWith(ext))) {\n continue;\n }\n }\n\n entries.push({\n name: relativePath,\n type: 'file',\n size: item.properties.contentLength,\n });\n }\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 if (!key) return true;\n\n const containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(key);\n\n const exists = await blobClient.exists();\n if (exists) return true;\n\n // Check if it's a \"directory\" (has blobs with this prefix)\n const prefix = key.replace(/\\/$/, '') + '/';\n const iter = containerClient.listBlobsFlat({ prefix });\n const first = await iter.next();\n return !first.done;\n }\n\n async stat(path: string): Promise<FileStat> {\n const key = this.toKey(path);\n\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 containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(key);\n\n try {\n const properties = await blobClient.getProperties();\n const name = path.split('/').pop() ?? '';\n\n return {\n name,\n path,\n type: 'file',\n size: properties.contentLength ?? 0,\n createdAt: properties.createdOn ?? new Date(),\n modifiedAt: properties.lastModified ?? new Date(),\n };\n } catch (error: unknown) {\n if (!isNotFoundError(error)) throw this.handleError(error);\n\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\n async isFile(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return false;\n\n const containerClient = await this.getReadyContainer();\n const blobClient = containerClient.getBlobClient(key);\n return blobClient.exists();\n }\n\n async isDirectory(path: string): Promise<boolean> {\n const key = this.toKey(path);\n if (!key) return true;\n\n const containerClient = await this.getReadyContainer();\n const prefix = key.replace(/\\/$/, '') + '/';\n const iter = containerClient.listBlobsFlat({ prefix });\n const first = await iter.next();\n return !first.done;\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n async init(): Promise<void> {\n const containerClient = await this.getContainerClient();\n try {\n if (this.sasToken) {\n const iter = containerClient.listBlobsFlat({ prefix: this.prefix });\n await iter.next();\n return;\n }\n\n const exists = await containerClient.exists();\n if (!exists) {\n const err = new Error(`Container \"${this.containerName}\" does not exist`) as Error & { status?: number };\n err.status = 404;\n throw err;\n }\n } catch (error) {\n if ((error as { status?: number }).status) {\n throw error;\n }\n\n const statusCode = (error as RestError).statusCode;\n if (typeof statusCode === 'number') {\n const message = error instanceof Error ? error.message : String(error);\n const err = new Error(message) as Error & { status?: number };\n err.status = statusCode;\n throw err;\n }\n throw error;\n }\n }\n\n async destroy(): Promise<void> {\n this._containerClient = null;\n }\n}\n","import { BlobServiceClient, StorageSharedKeyCredential } from '@azure/storage-blob';\nimport type { ContainerClient } from '@azure/storage-blob';\n\nimport { BlobStore } from '@mastra/core/storage';\nimport type { StorageBlobEntry } from '@mastra/core/storage';\n\n/**\n * Configuration for AzureBlobStore.\n */\nexport interface AzureBlobStoreOptions {\n /** Azure Blob container name */\n container: string;\n /** Storage account name (required unless using connectionString) */\n accountName?: string;\n /** Storage account key */\n accountKey?: string;\n /** SAS token for authentication */\n sasToken?: string;\n /** Full connection string (takes priority over accountName/accountKey) */\n connectionString?: string;\n /**\n * Use DefaultAzureCredential from @azure/identity for authentication.\n * Requires @azure/identity to be installed as a peer dependency.\n */\n useDefaultCredential?: boolean;\n /** Custom endpoint URL (e.g. for the Azurite emulator) */\n endpoint?: string;\n /**\n * Key prefix for all blob objects.\n * Defaults to 'mastra_skill_blobs/'.\n */\n prefix?: string;\n}\n\n/** Trim leading and trailing slashes. */\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\nfunction isNotFoundError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n return (error as { statusCode?: number }).statusCode === 404;\n}\n\n/** Azure metadata batch limit per request. */\nconst BATCH_DELETE_SIZE = 256;\n\n/**\n * Azure Blob Storage-backed content-addressable blob store for skill versioning.\n *\n * Each blob is stored as a block blob keyed by its SHA-256 hash. Metadata\n * (size, mimeType, createdAt) is stored as Azure blob metadata.\n *\n * Since blobs are content-addressable, writes are idempotent — the same hash\n * always maps to the same content, so overwrites are safe and equivalent to\n * a no-op.\n *\n * @example Connection string\n * ```typescript\n * import { AzureBlobStore } from '@mastra/azure/blob';\n *\n * const blobs = new AzureBlobStore({\n * container: 'my-skill-blobs',\n * connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING!,\n * });\n * ```\n *\n * @example Account key\n * ```typescript\n * import { AzureBlobStore } from '@mastra/azure/blob';\n *\n * const blobs = new AzureBlobStore({\n * container: 'my-skill-blobs',\n * accountName: process.env.AZURE_STORAGE_ACCOUNT_NAME!,\n * accountKey: process.env.AZURE_STORAGE_ACCOUNT_KEY!,\n * });\n * ```\n */\nexport class AzureBlobStore extends BlobStore {\n private readonly containerName: string;\n private readonly accountName?: string;\n private readonly accountKey?: string;\n private readonly sasToken?: string;\n private readonly connectionString?: string;\n private readonly useDefaultCredential: boolean;\n private readonly endpoint?: string;\n private readonly prefix: string;\n\n private _containerClient: ContainerClient | null = null;\n\n constructor(options: AzureBlobStoreOptions) {\n super();\n this.containerName = options.container;\n this.accountName = options.accountName;\n this.accountKey = options.accountKey;\n this.sasToken = options.sasToken;\n this.connectionString = options.connectionString;\n this.useDefaultCredential = options.useDefaultCredential ?? false;\n this.endpoint = options.endpoint;\n this.prefix = options.prefix ? trimSlashes(options.prefix) + '/' : 'mastra_skill_blobs/';\n }\n\n private async getContainerClient(): Promise<ContainerClient> {\n if (this._containerClient) return this._containerClient;\n\n let serviceClient: BlobServiceClient;\n\n if (this.connectionString) {\n serviceClient = BlobServiceClient.fromConnectionString(this.connectionString);\n } else {\n if (!this.endpoint && !this.accountName) {\n throw new Error(\n 'Azure Blob Storage requires either a connectionString, or an accountName/endpoint. ' +\n 'Provide at least one of: connectionString, accountName, or endpoint.',\n );\n }\n const baseUrl = this.endpoint ?? `https://${this.accountName}.blob.core.windows.net`;\n\n if (this.accountName && this.accountKey) {\n const credential = new StorageSharedKeyCredential(this.accountName, this.accountKey);\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } else if (this.sasToken) {\n const sas = this.sasToken.replace(/^\\?+/, '');\n const separator = baseUrl.includes('?') ? '&' : '?';\n serviceClient = new BlobServiceClient(`${baseUrl}${separator}${sas}`);\n } else if (this.useDefaultCredential) {\n // Dynamically import @azure/identity to avoid requiring it when not used.\n // Must use import() (not require()) because this package is ESM-first.\n try {\n const identity = await import('@azure/identity');\n const credential = new identity.DefaultAzureCredential();\n serviceClient = new BlobServiceClient(baseUrl, credential);\n } catch {\n throw new Error(\n 'DefaultAzureCredential requires @azure/identity to be installed. ' +\n 'Install it with: npm install @azure/identity',\n );\n }\n } else {\n // Anonymous access\n serviceClient = new BlobServiceClient(baseUrl);\n }\n }\n\n this._containerClient = serviceClient.getContainerClient(this.containerName);\n return this._containerClient;\n }\n\n private toKey(hash: string): string {\n return this.prefix + hash;\n }\n\n async init(): Promise<void> {\n // Azure does not require table creation — the container is expected to exist.\n }\n\n async put(entry: StorageBlobEntry): Promise<void> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(entry.hash));\n const now = entry.createdAt ?? new Date();\n const buffer = Buffer.from(entry.content, 'utf-8');\n\n await blobClient.uploadData(buffer, {\n blobHTTPHeaders: {\n blobContentType: entry.mimeType ?? 'application/octet-stream',\n },\n metadata: {\n size: String(entry.size),\n createdat: now.toISOString(),\n ...(entry.mimeType ? { mimetype: entry.mimeType } : {}),\n },\n });\n }\n\n async get(hash: string): Promise<StorageBlobEntry | null> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(hash));\n\n try {\n const buffer = await blobClient.downloadToBuffer();\n const properties = await blobClient.getProperties();\n const metadata = properties.metadata ?? {};\n const content = buffer.toString('utf-8');\n\n return {\n hash,\n content,\n size: metadata.size != null ? Number(metadata.size) : Buffer.byteLength(content, 'utf-8'),\n mimeType: metadata.mimetype || properties.contentType || undefined,\n createdAt: metadata.createdat ? new Date(metadata.createdat) : new Date(),\n };\n } catch (error: unknown) {\n if (isNotFoundError(error)) return null;\n throw error;\n }\n }\n\n async has(hash: string): Promise<boolean> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(hash));\n\n try {\n await blobClient.getProperties();\n return true;\n } catch (error: unknown) {\n if (isNotFoundError(error)) return false;\n throw error;\n }\n }\n\n async delete(hash: string): Promise<boolean> {\n const containerClient = await this.getContainerClient();\n const blobClient = containerClient.getBlockBlobClient(this.toKey(hash));\n const response = await blobClient.deleteIfExists();\n return response.succeeded;\n }\n\n async putMany(entries: StorageBlobEntry[]): Promise<void> {\n if (entries.length === 0) return;\n // Azure does not have a batch PUT, so we parallelize individual puts.\n // Content-addressable means duplicate writes are idempotent.\n await Promise.all(entries.map(entry => this.put(entry)));\n }\n\n async getMany(hashes: string[]): Promise<Map<string, StorageBlobEntry>> {\n const result = new Map<string, StorageBlobEntry>();\n if (hashes.length === 0) return result;\n\n const entries = await Promise.all(hashes.map(hash => this.get(hash)));\n for (const entry of entries) {\n if (entry) {\n result.set(entry.hash, entry);\n }\n }\n return result;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n const containerClient = await this.getContainerClient();\n let batch: string[] = [];\n\n for await (const blob of containerClient.listBlobsFlat({ prefix: this.prefix })) {\n batch.push(blob.name);\n if (batch.length >= BATCH_DELETE_SIZE) {\n await this.deleteBlobBatch(containerClient, batch);\n batch = [];\n }\n }\n\n if (batch.length > 0) {\n await this.deleteBlobBatch(containerClient, batch);\n }\n }\n\n private async deleteBlobBatch(containerClient: ContainerClient, blobNames: string[]): Promise<void> {\n const blobClients = blobNames.map(name => containerClient.getBlobClient(name));\n await containerClient.getBlobBatchClient().deleteBlobs(blobClients);\n }\n}\n","import type { BlobStoreProvider, FilesystemProvider } from '@mastra/core/editor';\nimport { AzureBlobStore } from './blob-store';\nimport type { AzureBlobStoreOptions } from './blob-store';\nimport { AzureBlobFilesystem } from './filesystem';\nimport type { AzureBlobFilesystemOptions } from './filesystem';\n\nexport const azureBlobFilesystemProvider: FilesystemProvider<AzureBlobFilesystemOptions> = {\n id: 'azure-blob',\n name: 'Azure Blob Storage',\n description: 'Azure Blob Storage container',\n configSchema: {\n type: 'object',\n required: ['container'],\n properties: {\n container: { type: 'string', description: 'Azure Blob container name' },\n accountName: { type: 'string', description: 'Storage account name' },\n accountKey: { type: 'string', description: 'Storage account key' },\n sasToken: { type: 'string', description: 'Shared Access Signature token' },\n connectionString: { type: 'string', description: 'Full connection string (overrides other auth options)' },\n useDefaultCredential: {\n type: 'boolean',\n description: 'Use DefaultAzureCredential (requires @azure/identity)',\n default: false,\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 endpoint URL (for Azurite emulator)' },\n },\n },\n createFilesystem: config => new AzureBlobFilesystem(config),\n};\n\nexport const azureBlobStoreProvider: BlobStoreProvider<AzureBlobStoreOptions> = {\n id: 'azure-blob',\n name: 'Azure Blob Store',\n description: 'Content-addressable blob storage backed by Azure Blob Storage',\n configSchema: {\n type: 'object',\n required: ['container'],\n properties: {\n container: { type: 'string', description: 'Azure Blob container name' },\n accountName: { type: 'string', description: 'Storage account name' },\n accountKey: { type: 'string', description: 'Storage account key' },\n sasToken: { type: 'string', description: 'Shared Access Signature token' },\n connectionString: { type: 'string', description: 'Full connection string (overrides other auth options)' },\n useDefaultCredential: {\n type: 'boolean',\n description: 'Use DefaultAzureCredential (requires @azure/identity)',\n default: false,\n },\n prefix: { type: 'string', description: 'Key prefix for blob objects (default: mastra_skill_blobs/)' },\n endpoint: { type: 'string', description: 'Custom endpoint URL (for Azurite emulator)' },\n },\n },\n createBlobStore: config => new AzureBlobStore(config),\n};\n"]}