@fusebase/fusebase-gate-sdk 2.2.9 → 2.2.10-sdk.1

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.
@@ -23,7 +23,7 @@ export declare class FilesApi {
23
23
  }): Promise<CompleteMultipartFileUploadResponseContract>;
24
24
  /**
25
25
  * Delete file
26
- * Deletes an org-scoped Azure Blob by the previously returned fileId.
26
+ * Deletes an org-scoped Azure Blob by the previously returned fileId. Public assets must resend their stored visibility so Gate can resolve the correct container without a DB record.
27
27
  */
28
28
  deleteFile(params: {
29
29
  path: {
@@ -33,8 +33,8 @@ export declare class FilesApi {
33
33
  body: DeleteFileRequestContract;
34
34
  }): Promise<DeleteFileResponseContract>;
35
35
  /**
36
- * Get file download URL
37
- * Creates a short-lived Azure Blob download URL for a previously uploaded org-scoped file. Gate never handles the file bytes.
36
+ * Get file read URL
37
+ * Creates either a short-lived Azure Blob read URL or a stable public URL for a previously uploaded org-scoped file, depending on the requested access mode. Gate never handles the file bytes.
38
38
  */
39
39
  getFileDownloadUrl(params: {
40
40
  path: {
@@ -45,7 +45,7 @@ export declare class FilesApi {
45
45
  }): Promise<GetFileDownloadUrlResponseContract>;
46
46
  /**
47
47
  * Prepare direct file upload
48
- * Creates a short-lived Azure Blob upload URL for the organization. Gate never handles the file bytes.
48
+ * Creates a short-lived Azure Blob upload URL for the organization. Uploads default to private storage, but callers may request public visibility when the service is configured with a public container. Gate never handles the file bytes.
49
49
  */
50
50
  prepareFileUpload(params: {
51
51
  path: {
@@ -56,7 +56,7 @@ export declare class FilesApi {
56
56
  }): Promise<PrepareFileUploadResponseContract>;
57
57
  /**
58
58
  * Start multipart file upload
59
- * Creates a short-lived Azure Blob upload URL for block staging and returns a signed, short-lived uploadId for later completion.
59
+ * Creates a short-lived Azure Blob upload URL for block staging and returns a signed, short-lived uploadId for later completion. Multipart uploads also support optional public visibility when the service is configured for public assets.
60
60
  */
61
61
  startMultipartFileUpload(params: {
62
62
  path: {
@@ -28,7 +28,7 @@ class FilesApi {
28
28
  }
29
29
  /**
30
30
  * Delete file
31
- * Deletes an org-scoped Azure Blob by the previously returned fileId.
31
+ * Deletes an org-scoped Azure Blob by the previously returned fileId. Public assets must resend their stored visibility so Gate can resolve the correct container without a DB record.
32
32
  */
33
33
  async deleteFile(params) {
34
34
  return this.client.request({
@@ -42,8 +42,8 @@ class FilesApi {
42
42
  });
43
43
  }
44
44
  /**
45
- * Get file download URL
46
- * Creates a short-lived Azure Blob download URL for a previously uploaded org-scoped file. Gate never handles the file bytes.
45
+ * Get file read URL
46
+ * Creates either a short-lived Azure Blob read URL or a stable public URL for a previously uploaded org-scoped file, depending on the requested access mode. Gate never handles the file bytes.
47
47
  */
48
48
  async getFileDownloadUrl(params) {
49
49
  return this.client.request({
@@ -58,7 +58,7 @@ class FilesApi {
58
58
  }
59
59
  /**
60
60
  * Prepare direct file upload
61
- * Creates a short-lived Azure Blob upload URL for the organization. Gate never handles the file bytes.
61
+ * Creates a short-lived Azure Blob upload URL for the organization. Uploads default to private storage, but callers may request public visibility when the service is configured with a public container. Gate never handles the file bytes.
62
62
  */
63
63
  async prepareFileUpload(params) {
64
64
  return this.client.request({
@@ -73,7 +73,7 @@ class FilesApi {
73
73
  }
74
74
  /**
75
75
  * Start multipart file upload
76
- * Creates a short-lived Azure Blob upload URL for block staging and returns a signed, short-lived uploadId for later completion.
76
+ * Creates a short-lived Azure Blob upload URL for block staging and returns a signed, short-lived uploadId for later completion. Multipart uploads also support optional public visibility when the service is configured for public assets.
77
77
  */
78
78
  async startMultipartFileUpload(params) {
79
79
  return this.client.request({
@@ -5,7 +5,7 @@
5
5
  * Domain: isolated-stores
6
6
  */
7
7
  import type { Client } from "../runtime/transport";
8
- import type { AdoptIsolatedStoreSqlMigrationBaselineRequestContract, AdoptIsolatedStoreSqlMigrationBaselineResponseContract, ApplyIsolatedStoreSqlMigrationsRequestContract, ApplyIsolatedStoreSqlMigrationsResponseContract, CreateIsolatedStoreCheckpointRequestContract, CreateIsolatedStoreCheckpointResponseContract, CreateIsolatedStoreRequestContract, CreateIsolatedStoreResponseContract, DeleteIsolatedStoreResponseContract, DeleteIsolatedStoreStageResponseContract, GetIsolatedStoreSqlMigrationStatusRequestContract, InitIsolatedStoreStageRequestContract, InitIsolatedStoreStageResponseContract, IsolatedStoreIdInPathRequired, IsolatedStoreListResponseContract, IsolatedStoreResponseContract, IsolatedStoreRevisionIdInPathRequired, IsolatedStoreRevisionListResponseContract, IsolatedStoreSqlBatchInsertRequestContract, IsolatedStoreSqlBatchInsertResponseContract, IsolatedStoreSqlCountRequestContract, IsolatedStoreSqlCountResponseContract, IsolatedStoreSqlDeleteRequestContract, IsolatedStoreSqlDeleteResponseContract, IsolatedStoreSqlDescribeTableResponseContract, IsolatedStoreSqlExecuteRequestContract, IsolatedStoreSqlExecuteResponseContract, IsolatedStoreSqlImportRequestContract, IsolatedStoreSqlImportResponseContract, IsolatedStoreSqlInsertRequestContract, IsolatedStoreSqlInsertResponseContract, IsolatedStoreSqlListTablesResponseContract, IsolatedStoreSqlMigrationStatusContract, IsolatedStoreSqlQueryRequestContract, IsolatedStoreSqlQueryResponseContract, IsolatedStoreSqlSchemaNameInQueryOptional, IsolatedStoreSqlSelectRequestContract, IsolatedStoreSqlSelectResponseContract, IsolatedStoreSqlStatsResponseContract, IsolatedStoreSqlTableNameInPathRequired, IsolatedStoreSqlUpdateRequestContract, IsolatedStoreSqlUpdateResponseContract, IsolatedStoreStageInPathRequired, IsolatedStoreStageListResponseContract, ListIsolatedStoresClientIdInQueryOptional, orgIdInPathRequired, RestoreIsolatedStoreRevisionResponseContract } from "../types";
8
+ import type { AdoptIsolatedStoreSqlMigrationBaselineRequestContract, AdoptIsolatedStoreSqlMigrationBaselineResponseContract, ApplyIsolatedStoreSqlMigrationsRequestContract, ApplyIsolatedStoreSqlMigrationsResponseContract, CreateIsolatedStoreCheckpointRequestContract, CreateIsolatedStoreCheckpointResponseContract, CreateIsolatedStoreRequestContract, CreateIsolatedStoreResponseContract, DeleteIsolatedStoreResponseContract, DeleteIsolatedStoreStageResponseContract, GetIsolatedStoreSqlMigrationStatusRequestContract, GetOrIsolatedStoreRequestContract, GetOrIsolatedStoreResponseContract, InitIsolatedStoreStageRequestContract, InitIsolatedStoreStageResponseContract, IsolatedStoreIdInPathRequired, IsolatedStoreListResponseContract, IsolatedStoreResponseContract, IsolatedStoreRevisionIdInPathRequired, IsolatedStoreRevisionListResponseContract, IsolatedStoreSqlBatchInsertRequestContract, IsolatedStoreSqlBatchInsertResponseContract, IsolatedStoreSqlCountRequestContract, IsolatedStoreSqlCountResponseContract, IsolatedStoreSqlDeleteRequestContract, IsolatedStoreSqlDeleteResponseContract, IsolatedStoreSqlDescribeTableResponseContract, IsolatedStoreSqlExecuteRequestContract, IsolatedStoreSqlExecuteResponseContract, IsolatedStoreSqlImportRequestContract, IsolatedStoreSqlImportResponseContract, IsolatedStoreSqlInsertRequestContract, IsolatedStoreSqlInsertResponseContract, IsolatedStoreSqlListTablesResponseContract, IsolatedStoreSqlMigrationStatusContract, IsolatedStoreSqlQueryRequestContract, IsolatedStoreSqlQueryResponseContract, IsolatedStoreSqlSchemaNameInQueryOptional, IsolatedStoreSqlSelectRequestContract, IsolatedStoreSqlSelectResponseContract, IsolatedStoreSqlStatsResponseContract, IsolatedStoreSqlTableNameInPathRequired, IsolatedStoreSqlUpdateRequestContract, IsolatedStoreSqlUpdateResponseContract, IsolatedStoreStageInPathRequired, IsolatedStoreStageListResponseContract, ListIsolatedStoresAliasLikeInQueryOptional, ListIsolatedStoresClientIdInQueryOptional, orgIdInPathRequired, RestoreIsolatedStoreRevisionResponseContract } from "../types";
9
9
  export declare class IsolatedStoresApi {
10
10
  private client;
11
11
  constructor(client: Client);
@@ -186,6 +186,17 @@ export declare class IsolatedStoresApi {
186
186
  };
187
187
  headers?: Record<string, string>;
188
188
  }): Promise<IsolatedStoreSqlStatsResponseContract>;
189
+ /**
190
+ * Get or create isolated store
191
+ * Idempotent control-plane operation for app-owned stores. Resolves an existing store by org/client/alias or creates it. Optionally bootstraps target stage from a source org store/stage using checkpoint/restore.
192
+ */
193
+ getOrIsolatedStore(params: {
194
+ path: {
195
+ orgId: orgIdInPathRequired;
196
+ };
197
+ headers?: Record<string, string>;
198
+ body: GetOrIsolatedStoreRequestContract;
199
+ }): Promise<GetOrIsolatedStoreResponseContract>;
189
200
  /**
190
201
  * Import CSV or TSV rows
191
202
  * Imports CSV or TSV payloads into a postgres table using server-side COPY FROM STDIN. Use this bulk path for large seeds or migrations instead of repeated row inserts. Max UTF-8 payload size defaults to 64MiB (override ISOLATED_SQL_IMPORT_MAX_PAYLOAD_BYTES; hard cap 256MiB); split larger files across multiple calls.
@@ -238,7 +249,7 @@ export declare class IsolatedStoresApi {
238
249
  }): Promise<IsolatedStoreRevisionListResponseContract>;
239
250
  /**
240
251
  * List isolated stores
241
- * Returns the isolated store registry for the organization. Optional query `clientId` limits results to stores whose `app` source scope `sourceId` matches (same identifier as the token `client` scope for app-owned stores). Omit or leave empty to list all org stores. This is a control-plane endpoint behind FEATURE_FLAGS=isolated_stores.
252
+ * Returns the isolated store registry for the organization. Optional query `clientId` limits results to stores whose `app` source scope `sourceId` matches (same identifier as the token `client` scope for app-owned stores). Optional query `aliasLike` supports either an exact alias or a glob pattern (`*`, `?`) against store alias. Omit or leave empty to list all org stores. This is a control-plane endpoint behind FEATURE_FLAGS=isolated_stores.
242
253
  */
243
254
  listIsolatedStores(params: {
244
255
  path: {
@@ -246,6 +257,7 @@ export declare class IsolatedStoresApi {
246
257
  };
247
258
  query?: {
248
259
  clientId?: ListIsolatedStoresClientIdInQueryOptional;
260
+ aliasLike?: ListIsolatedStoresAliasLikeInQueryOptional;
249
261
  };
250
262
  headers?: Record<string, string>;
251
263
  }): Promise<IsolatedStoreListResponseContract>;
@@ -217,6 +217,21 @@ class IsolatedStoresApi {
217
217
  expectedContentType: "application/json",
218
218
  });
219
219
  }
220
+ /**
221
+ * Get or create isolated store
222
+ * Idempotent control-plane operation for app-owned stores. Resolves an existing store by org/client/alias or creates it. Optionally bootstraps target stage from a source org store/stage using checkpoint/restore.
223
+ */
224
+ async getOrIsolatedStore(params) {
225
+ return this.client.request({
226
+ method: "POST",
227
+ path: "/:orgId/isolated-stores/get-or",
228
+ pathParams: params.path,
229
+ headers: params.headers,
230
+ body: params.body,
231
+ opId: "getOrIsolatedStore",
232
+ expectedContentType: "application/json",
233
+ });
234
+ }
220
235
  /**
221
236
  * Import CSV or TSV rows
222
237
  * Imports CSV or TSV payloads into a postgres table using server-side COPY FROM STDIN. Use this bulk path for large seeds or migrations instead of repeated row inserts. Max UTF-8 payload size defaults to 64MiB (override ISOLATED_SQL_IMPORT_MAX_PAYLOAD_BYTES; hard cap 256MiB); split larger files across multiple calls.
@@ -278,7 +293,7 @@ class IsolatedStoresApi {
278
293
  }
279
294
  /**
280
295
  * List isolated stores
281
- * Returns the isolated store registry for the organization. Optional query `clientId` limits results to stores whose `app` source scope `sourceId` matches (same identifier as the token `client` scope for app-owned stores). Omit or leave empty to list all org stores. This is a control-plane endpoint behind FEATURE_FLAGS=isolated_stores.
296
+ * Returns the isolated store registry for the organization. Optional query `clientId` limits results to stores whose `app` source scope `sourceId` matches (same identifier as the token `client` scope for app-owned stores). Optional query `aliasLike` supports either an exact alias or a glob pattern (`*`, `?`) against store alias. Omit or leave empty to list all org stores. This is a control-plane endpoint behind FEATURE_FLAGS=isolated_stores.
282
297
  */
283
298
  async listIsolatedStores(params) {
284
299
  return this.client.request({
@@ -2,16 +2,24 @@ export type FileIdInPathRequired = string;
2
2
  export type MultipartUploadIdInPathRequired = string;
3
3
  export type FileUploadMethodContract = "PUT";
4
4
  export type FileDownloadMethodContract = "GET";
5
+ export type FileVisibilityContract = "private" | "public";
6
+ export type FileReadAccessContract = "temporary" | "public";
7
+ export type FileReadDispositionContract = "inline" | "attachment";
5
8
  export interface PrepareFileUploadRequestContract {
6
9
  filename: string;
7
10
  contentType?: string | null;
8
11
  folder?: string | null;
12
+ visibility?: FileVisibilityContract | null;
9
13
  }
10
14
  export interface DeleteFileRequestContract {
11
15
  fileId: string;
16
+ visibility?: FileVisibilityContract | null;
12
17
  }
13
18
  export interface GetFileDownloadUrlRequestContract {
14
19
  fileId: string;
20
+ visibility?: FileVisibilityContract | null;
21
+ access?: FileReadAccessContract | null;
22
+ disposition?: FileReadDispositionContract | null;
15
23
  }
16
24
  export interface FileUploadHeadersContract {
17
25
  "x-ms-blob-type": "BlockBlob";
@@ -19,9 +27,15 @@ export interface FileUploadHeadersContract {
19
27
  }
20
28
  export interface PrepareFileUploadResponseContract {
21
29
  /**
22
- * Blob path in Azure Storage. Use this exact value as `fileId` for deletion.
30
+ * Opaque file identifier to persist for later read and deletion calls.
23
31
  */
24
32
  fileId: string;
33
+ visibility: FileVisibilityContract;
34
+ /**
35
+ * Stable public URL when `visibility` is `public`; otherwise `null`.
36
+ * @format uri
37
+ */
38
+ publicUrl: string | null;
25
39
  /**
26
40
  * @format uri
27
41
  */
@@ -35,10 +49,13 @@ export interface PrepareFileUploadResponseContract {
35
49
  }
36
50
  export interface DeleteFileResponseContract {
37
51
  fileId: string;
52
+ visibility: FileVisibilityContract;
38
53
  deleted: boolean;
39
54
  }
40
55
  export interface GetFileDownloadUrlResponseContract {
41
56
  fileId: string;
57
+ visibility: FileVisibilityContract;
58
+ access: FileReadAccessContract;
42
59
  /**
43
60
  * @format uri
44
61
  */
@@ -47,7 +64,7 @@ export interface GetFileDownloadUrlResponseContract {
47
64
  /**
48
65
  * @format date-time
49
66
  */
50
- expiresAt: string;
67
+ expiresAt: string | null;
51
68
  }
52
69
  export interface StartMultipartFileUploadResponseContract {
53
70
  /**
@@ -55,6 +72,12 @@ export interface StartMultipartFileUploadResponseContract {
55
72
  */
56
73
  uploadId: string;
57
74
  fileId: string;
75
+ visibility: FileVisibilityContract;
76
+ /**
77
+ * Stable public URL when `visibility` is `public`; otherwise `null`.
78
+ * @format uri
79
+ */
80
+ publicUrl: string | null;
58
81
  /**
59
82
  * @format uri
60
83
  */
@@ -73,6 +96,12 @@ export interface CompleteMultipartFileUploadRequestContract {
73
96
  }
74
97
  export interface CompleteMultipartFileUploadResponseContract {
75
98
  fileId: string;
99
+ visibility: FileVisibilityContract;
100
+ /**
101
+ * Stable public URL when `visibility` is `public`; otherwise `null`.
102
+ * @format uri
103
+ */
104
+ publicUrl: string | null;
76
105
  committed: boolean;
77
106
  blockCount: number;
78
107
  }
@@ -82,3 +111,15 @@ export declare const FileUploadMethodContract: {
82
111
  export declare const FileDownloadMethodContract: {
83
112
  readonly Get: "GET";
84
113
  };
114
+ export declare const FileVisibilityContract: {
115
+ readonly Private: "private";
116
+ readonly Public: "public";
117
+ };
118
+ export declare const FileReadAccessContract: {
119
+ readonly Temporary: "temporary";
120
+ readonly Public: "public";
121
+ };
122
+ export declare const FileReadDispositionContract: {
123
+ readonly Inline: "inline";
124
+ readonly Attachment: "attachment";
125
+ };
@@ -1,9 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FileDownloadMethodContract = exports.FileUploadMethodContract = void 0;
3
+ exports.FileReadDispositionContract = exports.FileReadAccessContract = exports.FileVisibilityContract = exports.FileDownloadMethodContract = exports.FileUploadMethodContract = void 0;
4
4
  exports.FileUploadMethodContract = {
5
5
  Put: "PUT"
6
6
  };
7
7
  exports.FileDownloadMethodContract = {
8
8
  Get: "GET"
9
9
  };
10
+ exports.FileVisibilityContract = {
11
+ Private: "private",
12
+ Public: "public"
13
+ };
14
+ exports.FileReadAccessContract = {
15
+ Temporary: "temporary",
16
+ Public: "public"
17
+ };
18
+ exports.FileReadDispositionContract = {
19
+ Inline: "inline",
20
+ Attachment: "attachment"
21
+ };
@@ -365,6 +365,37 @@ export interface IsolatedStoreListResponseContract {
365
365
  }
366
366
  /** Optional `clientId` query for `listIsolatedStores`; matches `app` source scope `sourceId`. */
367
367
  export type ListIsolatedStoresClientIdInQueryOptional = string | null;
368
+ /** Optional `aliasLike` query for `listIsolatedStores`; exact alias or glob (`*`, `?`). */
369
+ export type ListIsolatedStoresAliasLikeInQueryOptional = string | null;
370
+ export interface GetOrIsolatedStoreSourceContract {
371
+ orgId: string;
372
+ storeId?: string | null;
373
+ alias?: string | null;
374
+ stage: IsolatedStoreStageInPathRequired;
375
+ copyStrategy?: "checkpoint_restore" | null;
376
+ }
377
+ export interface GetOrIsolatedStoreRequestContract {
378
+ clientId: string;
379
+ alias: string;
380
+ storeType: IsolatedStoreTypeContract;
381
+ engine: IsolatedStoreEngineContract;
382
+ targetStage: IsolatedStoreStageInPathRequired;
383
+ source?: GetOrIsolatedStoreSourceContract | null;
384
+ }
385
+ export interface GetOrIsolatedStoreResponseContract {
386
+ created: boolean;
387
+ cloned: boolean;
388
+ store: IsolatedStoreContract;
389
+ stageInstance: IsolatedStoreStageInstanceContract;
390
+ source?: {
391
+ orgId: string;
392
+ storeId: string;
393
+ alias: string;
394
+ stage: IsolatedStoreStageInPathRequired;
395
+ } | null;
396
+ copiedFromRevision?: IsolatedStoreRevisionContract | null;
397
+ lineageMetadata?: Record<string, unknown> | null;
398
+ }
368
399
  export interface IsolatedStoreResponseContract {
369
400
  store: IsolatedStoreContract;
370
401
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusebase/fusebase-gate-sdk",
3
- "version": "2.2.9",
3
+ "version": "2.2.10-sdk.1",
4
4
  "description": "TypeScript SDK for Fusebase Gate APIs - Generated from contract introspection",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -0,0 +1,9 @@
1
+ # Release Notes 2.2.10-sdk.1
2
+
3
+ - Current ref: `HEAD`
4
+ - Previous tag: `v2.2.10-sdk.1`
5
+ - Generated at: 2026-04-22T10:51:11.436Z
6
+
7
+ ## Included Drafts
8
+
9
+ - None
@@ -1,8 +1,8 @@
1
- # Release Notes 2.2.9
1
+ # Release Notes 2.2.10-sdk.1
2
2
 
3
3
  - Current ref: `HEAD`
4
- - Previous tag: `v2.2.9`
5
- - Generated at: 2026-04-21T08:52:18.461Z
4
+ - Previous tag: `v2.2.10-sdk.1`
5
+ - Generated at: 2026-04-22T10:51:11.436Z
6
6
 
7
7
  ## Included Drafts
8
8
 
@@ -1,63 +0,0 @@
1
- # Release Notes 2.2.6-sdk.4
2
-
3
- - Current ref: `HEAD`
4
- - Previous tag: `v2.2.6-sdk.4`
5
- - Generated at: 2026-04-21T08:19:38.558Z
6
-
7
- ## Included Drafts
8
-
9
- - `docs/release-notes/2026-04-20-azure-file-upload-api.md` - 2026-04-20-azure-file-upload-api
10
-
11
- ## Summary
12
-
13
- ### 2026-04-20-azure-file-upload-api
14
-
15
- Added org-scoped file upload, download-url, and deletion endpoints for Azure Blob Storage direct transfers, then hardened the multipart token flow and moved container creation out of per-request runtime handling.
16
-
17
-
18
- ## API / SDK Changes
19
-
20
- ### 2026-04-20-azure-file-upload-api
21
-
22
- - Added `POST /:orgId/files/prepare-upload` to generate a short-lived SAS upload URL, blob `fileId`, required upload headers, and expiration time.
23
- - Added `POST /:orgId/files/uploads/start` to start an explicit Azure block-blob multipart upload and return an opaque `uploadId`.
24
- - Added `POST /:orgId/files/uploads/:uploadId/complete` to commit the staged Azure block ids for a multipart upload.
25
- - Added `POST /:orgId/files/download-url` to generate a short-lived read-only SAS URL for a previously uploaded org-scoped blob.
26
- - Added `DELETE /:orgId/files` to delete a previously prepared org-scoped blob by `fileId` in the request body.
27
- - Added the generated `FilesApi` SDK surface for these operations.
28
- - Hardened multipart `uploadId` values so they are signed and expiring instead of plain base64 payloads.
29
- - Removed container creation from the request path; upload preparation now performs only blob-level work.
30
- - Added optional startup-time container initialization through `AZURE_STORAGE_CREATE_CONTAINER_ON_STARTUP`.
31
- - Added Gate MCP guidance for file-upload flows and new `files.write` and `files.read` permissions.
32
-
33
-
34
- ## Consumer Impact
35
-
36
- ### 2026-04-20-azure-file-upload-api
37
-
38
- - Clients should upload file bytes directly to Azure Blob Storage using the returned `uploadUrl`, `method`, and `headers`; Gate does not proxy file bytes.
39
- - Clients should download file bytes directly from Azure Blob Storage using the returned `downloadUrl`; Gate does not proxy file bytes for reads either.
40
- - Multipart clients should stage blocks directly against the returned `uploadUrl`, keep the base64 block ids they used, and send those ids to `completeMultipartFileUpload`.
41
- - Treat multipart `uploadId` values as opaque short-lived server tokens. Clients must not decode, modify, or synthesize them.
42
- - Persist the returned `fileId` exactly as-is if the app needs to delete the blob later.
43
- - Runtime configuration now expects `AZURE_STORAGE_ACCOUNT_NAME` and can optionally use `AZURE_STORAGE_CONTAINER`, `AZURE_STORAGE_ACCOUNT_KEY`, `AZURE_STORAGE_UPLOAD_URL_TTL_SECONDS`, `AZURE_STORAGE_UPLOAD_ID_SECRET`, and `AZURE_STORAGE_CREATE_CONTAINER_ON_STARTUP`.
44
- - Preferred deployment model is a pre-created container from infrastructure. Startup-time container creation is opt-in for environments that intentionally grant container-management permissions.
45
-
46
-
47
- ## Verification
48
-
49
- ### 2026-04-20-azure-file-upload-api
50
-
51
- - `npm run build:sdk`
52
- - `npm run mcp:skills:generate`
53
- - `npm run mcp:skills:validate`
54
- - `npm test`
55
- - `npm run lint`
56
-
57
-
58
- ## Follow-ups
59
-
60
- ### 2026-04-20-azure-file-upload-api
61
-
62
- - Wire the new Azure storage env vars into the active Fusebase Gate Helm chart values and secrets once the deployment chart path and environment-specific account values are confirmed.
63
- - If the production environment supports Microsoft Entra or managed identity, prefer user delegation SAS over account-key SAS.
@@ -1,9 +0,0 @@
1
- # Release Notes 2.2.9
2
-
3
- - Current ref: `HEAD`
4
- - Previous tag: `v2.2.9`
5
- - Generated at: 2026-04-21T08:52:18.461Z
6
-
7
- ## Included Drafts
8
-
9
- - None