@unisource/sdk 0.3.2 → 0.4.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/dist/index.d.mts CHANGED
@@ -57,6 +57,7 @@ declare const uploadAppwriteInitResponseSchema: z.ZodObject<{
57
57
  appwrite_bucket_id: z.ZodString;
58
58
  file_id: z.ZodString;
59
59
  expires_at: z.ZodNumber;
60
+ jwt: z.ZodOptional<z.ZodString>;
60
61
  }, z.core.$strip>;
61
62
  type UploadAppwriteInitResponse = z.infer<typeof uploadAppwriteInitResponseSchema>;
62
63
  declare const uploadLifecycleRequestSchema: z.ZodObject<{
@@ -76,6 +77,79 @@ declare const uploadFailResponseSchema: z.ZodObject<{
76
77
  status: z.ZodLiteral<"failed">;
77
78
  }, z.core.$strip>;
78
79
  type UploadFailResponse = z.infer<typeof uploadFailResponseSchema>;
80
+ declare const multipartCreateRequestSchema: z.ZodObject<{
81
+ filename: z.ZodString;
82
+ size: z.ZodNumber;
83
+ mime_type: z.ZodString;
84
+ folder_id: z.ZodOptional<z.ZodString>;
85
+ is_main_storage: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
86
+ }, z.core.$strip>;
87
+ type MultipartCreateRequest = z.input<typeof multipartCreateRequestSchema>;
88
+ declare const multipartCreateResponseSchema: z.ZodObject<{
89
+ upload_id: z.ZodString;
90
+ r2_upload_id: z.ZodString;
91
+ key: z.ZodString;
92
+ bucket: z.ZodString;
93
+ expires_at: z.ZodNumber;
94
+ }, z.core.$strip>;
95
+ type MultipartCreateResponse = z.infer<typeof multipartCreateResponseSchema>;
96
+ declare const multipartSignPartQuerySchema: z.ZodObject<{
97
+ upload_id: z.ZodString;
98
+ part_number: z.ZodCoercedNumber<unknown>;
99
+ }, z.core.$strip>;
100
+ type MultipartSignPartQuery = z.input<typeof multipartSignPartQuerySchema>;
101
+ declare const multipartSignPartResponseSchema: z.ZodObject<{
102
+ url: z.ZodString;
103
+ expires_at: z.ZodNumber;
104
+ }, z.core.$strip>;
105
+ type MultipartSignPartResponse = z.infer<typeof multipartSignPartResponseSchema>;
106
+ declare const multipartListPartsQuerySchema: z.ZodObject<{
107
+ upload_id: z.ZodString;
108
+ }, z.core.$strip>;
109
+ type MultipartListPartsQuery = z.input<typeof multipartListPartsQuerySchema>;
110
+ declare const multipartPartSchema: z.ZodObject<{
111
+ PartNumber: z.ZodNumber;
112
+ ETag: z.ZodString;
113
+ Size: z.ZodNumber;
114
+ }, z.core.$strip>;
115
+ type MultipartPart = z.infer<typeof multipartPartSchema>;
116
+ declare const multipartListPartsResponseSchema: z.ZodObject<{
117
+ parts: z.ZodArray<z.ZodObject<{
118
+ PartNumber: z.ZodNumber;
119
+ ETag: z.ZodString;
120
+ Size: z.ZodNumber;
121
+ }, z.core.$strip>>;
122
+ }, z.core.$strip>;
123
+ type MultipartListPartsResponse = z.infer<typeof multipartListPartsResponseSchema>;
124
+ declare const multipartCompleteRequestSchema: z.ZodObject<{
125
+ upload_id: z.ZodString;
126
+ parts: z.ZodArray<z.ZodObject<{
127
+ PartNumber: z.ZodNumber;
128
+ ETag: z.ZodString;
129
+ }, z.core.$strip>>;
130
+ }, z.core.$strip>;
131
+ type MultipartCompleteRequest = z.input<typeof multipartCompleteRequestSchema>;
132
+ declare const multipartCompleteResponseSchema: z.ZodObject<{
133
+ success: z.ZodLiteral<true>;
134
+ upload_id: z.ZodString;
135
+ status: z.ZodLiteral<"completed">;
136
+ }, z.core.$strip>;
137
+ type MultipartCompleteResponse = z.infer<typeof multipartCompleteResponseSchema>;
138
+ declare const multipartAbortRequestSchema: z.ZodObject<{
139
+ upload_id: z.ZodString;
140
+ }, z.core.$strip>;
141
+ type MultipartAbortRequest = z.input<typeof multipartAbortRequestSchema>;
142
+ declare const multipartAbortResponseSchema: z.ZodObject<{
143
+ success: z.ZodLiteral<true>;
144
+ upload_id: z.ZodString;
145
+ status: z.ZodLiteral<"failed">;
146
+ }, z.core.$strip>;
147
+ type MultipartAbortResponse = z.infer<typeof multipartAbortResponseSchema>;
148
+ declare const uploadTypeSchema: z.ZodEnum<{
149
+ multipart: "multipart";
150
+ single: "single";
151
+ }>;
152
+ type UploadType = z.infer<typeof uploadTypeSchema>;
79
153
  /** Raw upload record — returned by admin `/files` endpoints. */
80
154
  declare const uploadRecordSchema: z.ZodObject<{
81
155
  id: z.ZodString;
@@ -93,6 +167,10 @@ declare const uploadRecordSchema: z.ZodObject<{
93
167
  failed: "failed";
94
168
  pending: "pending";
95
169
  }>;
170
+ upload_type: z.ZodOptional<z.ZodEnum<{
171
+ multipart: "multipart";
172
+ single: "single";
173
+ }>>;
96
174
  expires_at: z.ZodNumber;
97
175
  created_at: z.ZodNumber;
98
176
  updated_at: z.ZodNumber;
@@ -115,6 +193,10 @@ declare const uploadsListResponseSchema: z.ZodObject<{
115
193
  failed: "failed";
116
194
  pending: "pending";
117
195
  }>;
196
+ upload_type: z.ZodOptional<z.ZodEnum<{
197
+ multipart: "multipart";
198
+ single: "single";
199
+ }>>;
118
200
  expires_at: z.ZodNumber;
119
201
  created_at: z.ZodNumber;
120
202
  updated_at: z.ZodNumber;
@@ -140,6 +222,10 @@ declare const uploadRecordDetailResponseSchema: z.ZodObject<{
140
222
  failed: "failed";
141
223
  pending: "pending";
142
224
  }>;
225
+ upload_type: z.ZodOptional<z.ZodEnum<{
226
+ multipart: "multipart";
227
+ single: "single";
228
+ }>>;
143
229
  expires_at: z.ZodNumber;
144
230
  created_at: z.ZodNumber;
145
231
  updated_at: z.ZodNumber;
@@ -389,6 +475,10 @@ declare const serviceSchema: z.ZodObject<{
389
475
  max_storage_bytes: z.ZodNumber;
390
476
  current_used_bytes: z.ZodNumber;
391
477
  max_file_size_bytes: z.ZodNumber;
478
+ recommended_upload_destination: z.ZodOptional<z.ZodEnum<{
479
+ appwrite: "appwrite";
480
+ r2: "r2";
481
+ }>>;
392
482
  created_at: z.ZodNumber;
393
483
  }, z.core.$strip>;
394
484
  type Service = z.infer<typeof serviceSchema>;
@@ -399,6 +489,10 @@ declare const serviceDetailResponseSchema: z.ZodObject<{
399
489
  max_storage_bytes: z.ZodNumber;
400
490
  current_used_bytes: z.ZodNumber;
401
491
  max_file_size_bytes: z.ZodNumber;
492
+ recommended_upload_destination: z.ZodOptional<z.ZodEnum<{
493
+ appwrite: "appwrite";
494
+ r2: "r2";
495
+ }>>;
402
496
  created_at: z.ZodNumber;
403
497
  }, z.core.$strip>;
404
498
  }, z.core.$strip>;
@@ -415,10 +509,41 @@ declare const adminServiceUpdateResponseSchema: z.ZodObject<{
415
509
  max_storage_bytes: z.ZodNumber;
416
510
  current_used_bytes: z.ZodNumber;
417
511
  max_file_size_bytes: z.ZodNumber;
512
+ recommended_upload_destination: z.ZodOptional<z.ZodEnum<{
513
+ appwrite: "appwrite";
514
+ r2: "r2";
515
+ }>>;
418
516
  created_at: z.ZodNumber;
419
517
  }, z.core.$strip>;
420
518
  }, z.core.$strip>;
421
519
  type AdminServiceUpdateResponse = z.infer<typeof adminServiceUpdateResponseSchema>;
520
+ /**
521
+ * Separate settings endpoint driven by the Split-Button upload UI. Clients
522
+ * can flip the recommended default upload destination per service without
523
+ * disturbing quota-related fields.
524
+ */
525
+ declare const adminServiceSettingsRequestSchema: z.ZodObject<{
526
+ recommended_upload_destination: z.ZodOptional<z.ZodEnum<{
527
+ appwrite: "appwrite";
528
+ r2: "r2";
529
+ }>>;
530
+ }, z.core.$strip>;
531
+ type AdminServiceSettingsRequest = z.infer<typeof adminServiceSettingsRequestSchema>;
532
+ declare const adminServiceSettingsResponseSchema: z.ZodObject<{
533
+ service: z.ZodObject<{
534
+ id: z.ZodString;
535
+ name: z.ZodString;
536
+ max_storage_bytes: z.ZodNumber;
537
+ current_used_bytes: z.ZodNumber;
538
+ max_file_size_bytes: z.ZodNumber;
539
+ recommended_upload_destination: z.ZodOptional<z.ZodEnum<{
540
+ appwrite: "appwrite";
541
+ r2: "r2";
542
+ }>>;
543
+ created_at: z.ZodNumber;
544
+ }, z.core.$strip>;
545
+ }, z.core.$strip>;
546
+ type AdminServiceSettingsResponse = z.infer<typeof adminServiceSettingsResponseSchema>;
422
547
  declare const serviceUsageResponseSchema: z.ZodObject<{
423
548
  service_id: z.ZodString;
424
549
  max_storage_bytes: z.ZodNumber;
@@ -1003,7 +1128,14 @@ declare class UnisourceClient {
1003
1128
  /** Initiate an R2 upload — returns a presigned PUT URL */r2Init: (body: UploadR2InitRequest, signal?: AbortSignal) => Promise<UploadR2InitResponse>; /** Initiate an Appwrite upload — returns credentials for direct SDK upload */
1004
1129
  appwriteInit: (body: UploadAppwriteInitRequest, signal?: AbortSignal) => Promise<UploadAppwriteInitResponse>; /** Confirm that the file was successfully uploaded to storage */
1005
1130
  complete: (body: UploadLifecycleRequest, signal?: AbortSignal) => Promise<UploadCompleteResponse>; /** Mark an upload as failed and release reserved quota */
1006
- fail: (body: UploadLifecycleRequest, signal?: AbortSignal) => Promise<UploadFailResponse>;
1131
+ fail: (body: UploadLifecycleRequest, signal?: AbortSignal) => Promise<UploadFailResponse>; /** Multipart upload helpers — direct browser → R2 via S3 presigned URLs */
1132
+ multipart: {
1133
+ /** Create a multipart upload — returns UploadId + storage key */create: (body: MultipartCreateRequest, signal?: AbortSignal) => Promise<MultipartCreateResponse>; /** Short-lived presigned PUT URL for a single part */
1134
+ signPart: (uploadId: string, partNumber: number, signal?: AbortSignal) => Promise<MultipartSignPartResponse>; /** List parts already uploaded — feeds Golden Retriever's resume logic */
1135
+ listParts: (uploadId: string, signal?: AbortSignal) => Promise<MultipartListPartsResponse>; /** Finalize the multipart upload. Parts must include PartNumber + ETag. */
1136
+ complete: (body: MultipartCompleteRequest, signal?: AbortSignal) => Promise<MultipartCompleteResponse>; /** Abort the multipart upload and release reserved quota */
1137
+ abort: (uploadId: string, signal?: AbortSignal) => Promise<MultipartAbortResponse>;
1138
+ };
1007
1139
  };
1008
1140
  readonly myFiles: {
1009
1141
  /** List files owned by the authenticated user */list: (query?: FileRecordsListQuery, signal?: AbortSignal, options?: {
@@ -1088,7 +1220,8 @@ declare class UnisourceClient {
1088
1220
  };
1089
1221
  readonly admin: {
1090
1222
  /** Get service info and quota limits */serviceDetail: (signal?: AbortSignal) => Promise<ServiceDetailResponse>; /** Update custom service-wide limits */
1091
- updateService: (body: AdminServiceUpdateRequest, signal?: AbortSignal) => Promise<AdminServiceUpdateResponse>; /** Get real-time storage usage for the service */
1223
+ updateService: (body: AdminServiceUpdateRequest, signal?: AbortSignal) => Promise<AdminServiceUpdateResponse>; /** Update service-wide settings (e.g. recommended upload destination) */
1224
+ updateServiceSettings: (body: AdminServiceSettingsRequest, signal?: AbortSignal) => Promise<AdminServiceSettingsResponse>; /** Get real-time storage usage for the service */
1092
1225
  usage: (signal?: AbortSignal) => Promise<ServiceUsageResponse>; /** List all uploads (pending/completed/failed) for this service */
1093
1226
  listUploads: (query?: {
1094
1227
  status?: UploadStatus;
@@ -1142,4 +1275,4 @@ declare class UnisourceClient {
1142
1275
  };
1143
1276
  }
1144
1277
  //#endregion
1145
- export { type AdminServiceUpdateRequest, type AdminServiceUpdateResponse, type AdminUser, type AdminUserListResponse, type AdminUserPasswordResetRequest, type AdminUserPasswordResetResponse, type AdminUserRoleUpdateRequest, type AdminUserStorageLimitUpdateRequest, type AdminUserUpdateRequest, type AdminUserUpdateResponse, type ApiError, type AuditEvent, type AuditEventAction, type AuditLogListQuery, type AuditLogListResponse, FILES_DEFAULT_LIMIT, FILES_MAX_LIMIT, type FileDeleteResponse, type FileDownloadUrlResponse, type FileMoveRequest, type FileRecord, type FileRecordDetailResponse, type FileRecordsListQuery, type FileRecordsListResponse, type FileRestoreResponse, type FileUpdateRequest, type FileUpdateResponse, type Folder, type FolderCreateRequest, type FolderCreateResponse, type FolderDeleteResponse, type FolderDetailResponse, type FolderListQuery, type FolderListResponse, type FolderRestoreResponse, type FolderUpdateRequest, type FolderUpdateResponse, MainStorageDeleteResponse, MainStorageDetailResponse, MainStorageFile, MainStorageListQuery, MainStorageListResponse, MainStorageRenameRequest, MainStorageRenameResponse, MainStorageRestoreResponse, type PublicFileAccessResponse, type PublicFileLockedResponse, type ReleaseDTO, type ReleaseDeleteResponse, type ReleaseSyncManifest, type ReleaseSyncRequest, type ReleaseSyncResponse, type ReleaseSyncResult, type ReleaseUpdateRequest, type ReleaseUploadCompleteRequest, type ReleaseUploadCompleteResponse, type ReleaseUploadFailResponse, type ReleaseUploadInitRequest, type ReleaseUploadInitResponse, type ReleasesListQuery, type ReleasesListResponse, type Service, type ServiceDetailResponse, type ServiceUsageResponse, type ShareLink, type ShareLinkCreateRequest, type ShareLinkCreateResponse, type ShareLinkDeleteResponse, type ShareLinkDetailResponse, type ShareLinkListResponse, type ShareLinkUpdateRequest, type ShareLinkUpdateResponse, type SharesCreateRequest, UnisourceClient, type UnisourceClientConfig, UnisourceError, UnisourceNetworkError, type UploadAppwriteInitRequest, type UploadAppwriteInitResponse, type UploadCompleteResponse, type UploadDestination, type UploadFailResponse, type UploadLifecycleRequest, type UploadR2InitRequest, type UploadR2InitResponse, type UploadRecord, type UploadRecordDetailResponse, type UploadStatus, type UploadsListResponse, adminServiceUpdateRequestSchema, adminServiceUpdateResponseSchema, adminUserListResponseSchema, adminUserPasswordResetRequestSchema, adminUserPasswordResetResponseSchema, adminUserRoleUpdateRequestSchema, adminUserSchema, adminUserStorageLimitUpdateRequestSchema, adminUserUpdateRequestSchema, adminUserUpdateResponseSchema, apiErrorSchema, auditEventActionSchema, auditEventSchema, auditLogListQuerySchema, auditLogListResponseSchema, fileDeleteResponseSchema, fileDownloadUrlResponseSchema, fileMoveRequestSchema, fileRecordDetailResponseSchema, fileRecordSchema, fileRecordsListQuerySchema, fileRecordsListResponseSchema, fileRestoreResponseSchema, fileUpdateRequestSchema, fileUpdateResponseSchema, folderCreateRequestSchema, folderCreateResponseSchema, folderDeleteResponseSchema, folderDetailResponseSchema, folderListQuerySchema, folderListResponseSchema, folderRestoreResponseSchema, folderSchema, folderUpdateRequestSchema, folderUpdateResponseSchema, getPublicFileInfo, mainStorageDeleteResponseSchema, mainStorageDetailResponseSchema, mainStorageFileSchema, mainStorageListQuerySchema, mainStorageListResponseSchema, mainStorageRenameRequestSchema, mainStorageRenameResponseSchema, mainStorageRestoreResponseSchema, nonEmptyString, positiveInt, publicFileAccessResponseSchema, publicFileLockedResponseSchema, releaseDTOSchema, releaseDeleteResponseSchema, releaseSyncManifestSchema, releaseSyncRequestSchema, releaseSyncResponseSchema, releaseSyncResultSchema, releaseUpdateRequestSchema, releaseUploadCompleteRequestSchema, releaseUploadCompleteResponseSchema, releaseUploadFailResponseSchema, releaseUploadInitRequestSchema, releaseUploadInitResponseSchema, releasesListQuerySchema, releasesListResponseSchema, serviceDetailResponseSchema, serviceSchema, serviceUsageResponseSchema, shareLinkCreateRequestSchema, shareLinkCreateResponseSchema, shareLinkDeleteResponseSchema, shareLinkDetailResponseSchema, shareLinkListResponseSchema, shareLinkSchema, shareLinkUpdateRequestSchema, shareLinkUpdateResponseSchema, sharesCreateRequestSchema, unixTimestamp, unlockPublicFile, uploadAppwriteInitRequestSchema, uploadAppwriteInitResponseSchema, uploadCompleteResponseSchema, uploadDestinationSchema, uploadFailResponseSchema, uploadLifecycleRequestSchema, uploadR2InitRequestSchema, uploadR2InitResponseSchema, uploadRecordDetailResponseSchema, uploadRecordSchema, uploadStatusSchema, uploadsListResponseSchema };
1278
+ export { type AdminServiceSettingsRequest, type AdminServiceSettingsResponse, type AdminServiceUpdateRequest, type AdminServiceUpdateResponse, type AdminUser, type AdminUserListResponse, type AdminUserPasswordResetRequest, type AdminUserPasswordResetResponse, type AdminUserRoleUpdateRequest, type AdminUserStorageLimitUpdateRequest, type AdminUserUpdateRequest, type AdminUserUpdateResponse, type ApiError, type AuditEvent, type AuditEventAction, type AuditLogListQuery, type AuditLogListResponse, FILES_DEFAULT_LIMIT, FILES_MAX_LIMIT, type FileDeleteResponse, type FileDownloadUrlResponse, type FileMoveRequest, type FileRecord, type FileRecordDetailResponse, type FileRecordsListQuery, type FileRecordsListResponse, type FileRestoreResponse, type FileUpdateRequest, type FileUpdateResponse, type Folder, type FolderCreateRequest, type FolderCreateResponse, type FolderDeleteResponse, type FolderDetailResponse, type FolderListQuery, type FolderListResponse, type FolderRestoreResponse, type FolderUpdateRequest, type FolderUpdateResponse, MainStorageDeleteResponse, MainStorageDetailResponse, MainStorageFile, MainStorageListQuery, MainStorageListResponse, MainStorageRenameRequest, MainStorageRenameResponse, MainStorageRestoreResponse, type MultipartAbortRequest, type MultipartAbortResponse, type MultipartCompleteRequest, type MultipartCompleteResponse, type MultipartCreateRequest, type MultipartCreateResponse, type MultipartListPartsQuery, type MultipartListPartsResponse, type MultipartPart, type MultipartSignPartQuery, type MultipartSignPartResponse, type PublicFileAccessResponse, type PublicFileLockedResponse, type ReleaseDTO, type ReleaseDeleteResponse, type ReleaseSyncManifest, type ReleaseSyncRequest, type ReleaseSyncResponse, type ReleaseSyncResult, type ReleaseUpdateRequest, type ReleaseUploadCompleteRequest, type ReleaseUploadCompleteResponse, type ReleaseUploadFailResponse, type ReleaseUploadInitRequest, type ReleaseUploadInitResponse, type ReleasesListQuery, type ReleasesListResponse, type Service, type ServiceDetailResponse, type ServiceUsageResponse, type ShareLink, type ShareLinkCreateRequest, type ShareLinkCreateResponse, type ShareLinkDeleteResponse, type ShareLinkDetailResponse, type ShareLinkListResponse, type ShareLinkUpdateRequest, type ShareLinkUpdateResponse, type SharesCreateRequest, UnisourceClient, type UnisourceClientConfig, UnisourceError, UnisourceNetworkError, type UploadAppwriteInitRequest, type UploadAppwriteInitResponse, type UploadCompleteResponse, type UploadDestination, type UploadFailResponse, type UploadLifecycleRequest, type UploadR2InitRequest, type UploadR2InitResponse, type UploadRecord, type UploadRecordDetailResponse, type UploadStatus, type UploadType, type UploadsListResponse, adminServiceSettingsRequestSchema, adminServiceSettingsResponseSchema, adminServiceUpdateRequestSchema, adminServiceUpdateResponseSchema, adminUserListResponseSchema, adminUserPasswordResetRequestSchema, adminUserPasswordResetResponseSchema, adminUserRoleUpdateRequestSchema, adminUserSchema, adminUserStorageLimitUpdateRequestSchema, adminUserUpdateRequestSchema, adminUserUpdateResponseSchema, apiErrorSchema, auditEventActionSchema, auditEventSchema, auditLogListQuerySchema, auditLogListResponseSchema, fileDeleteResponseSchema, fileDownloadUrlResponseSchema, fileMoveRequestSchema, fileRecordDetailResponseSchema, fileRecordSchema, fileRecordsListQuerySchema, fileRecordsListResponseSchema, fileRestoreResponseSchema, fileUpdateRequestSchema, fileUpdateResponseSchema, folderCreateRequestSchema, folderCreateResponseSchema, folderDeleteResponseSchema, folderDetailResponseSchema, folderListQuerySchema, folderListResponseSchema, folderRestoreResponseSchema, folderSchema, folderUpdateRequestSchema, folderUpdateResponseSchema, getPublicFileInfo, mainStorageDeleteResponseSchema, mainStorageDetailResponseSchema, mainStorageFileSchema, mainStorageListQuerySchema, mainStorageListResponseSchema, mainStorageRenameRequestSchema, mainStorageRenameResponseSchema, mainStorageRestoreResponseSchema, multipartAbortRequestSchema, multipartAbortResponseSchema, multipartCompleteRequestSchema, multipartCompleteResponseSchema, multipartCreateRequestSchema, multipartCreateResponseSchema, multipartListPartsQuerySchema, multipartListPartsResponseSchema, multipartPartSchema, multipartSignPartQuerySchema, multipartSignPartResponseSchema, nonEmptyString, positiveInt, publicFileAccessResponseSchema, publicFileLockedResponseSchema, releaseDTOSchema, releaseDeleteResponseSchema, releaseSyncManifestSchema, releaseSyncRequestSchema, releaseSyncResponseSchema, releaseSyncResultSchema, releaseUpdateRequestSchema, releaseUploadCompleteRequestSchema, releaseUploadCompleteResponseSchema, releaseUploadFailResponseSchema, releaseUploadInitRequestSchema, releaseUploadInitResponseSchema, releasesListQuerySchema, releasesListResponseSchema, serviceDetailResponseSchema, serviceSchema, serviceUsageResponseSchema, shareLinkCreateRequestSchema, shareLinkCreateResponseSchema, shareLinkDeleteResponseSchema, shareLinkDetailResponseSchema, shareLinkListResponseSchema, shareLinkSchema, shareLinkUpdateRequestSchema, shareLinkUpdateResponseSchema, sharesCreateRequestSchema, unixTimestamp, unlockPublicFile, uploadAppwriteInitRequestSchema, uploadAppwriteInitResponseSchema, uploadCompleteResponseSchema, uploadDestinationSchema, uploadFailResponseSchema, uploadLifecycleRequestSchema, uploadR2InitRequestSchema, uploadR2InitResponseSchema, uploadRecordDetailResponseSchema, uploadRecordSchema, uploadStatusSchema, uploadTypeSchema, uploadsListResponseSchema };
package/dist/index.mjs CHANGED
@@ -46,7 +46,8 @@ const uploadAppwriteInitResponseSchema = z.object({
46
46
  appwrite_project_id: nonEmptyString,
47
47
  appwrite_bucket_id: nonEmptyString,
48
48
  file_id: nonEmptyString,
49
- expires_at: positiveInt
49
+ expires_at: positiveInt,
50
+ jwt: nonEmptyString.optional()
50
51
  });
51
52
  const uploadLifecycleRequestSchema = z.object({
52
53
  upload_id: nonEmptyString,
@@ -62,6 +63,46 @@ const uploadFailResponseSchema = z.object({
62
63
  upload_id: nonEmptyString,
63
64
  status: z.literal("failed")
64
65
  });
66
+ const multipartCreateRequestSchema = z.object({
67
+ filename: nonEmptyString,
68
+ size: positiveInt,
69
+ mime_type: nonEmptyString,
70
+ folder_id: nonEmptyString.optional(),
71
+ is_main_storage: z.boolean().optional().default(false)
72
+ });
73
+ const multipartCreateResponseSchema = z.object({
74
+ upload_id: nonEmptyString,
75
+ r2_upload_id: nonEmptyString,
76
+ key: nonEmptyString,
77
+ bucket: nonEmptyString,
78
+ expires_at: positiveInt
79
+ });
80
+ const multipartSignPartQuerySchema = z.object({
81
+ upload_id: nonEmptyString,
82
+ part_number: z.coerce.number().int().min(1).max(1e4)
83
+ });
84
+ const multipartSignPartResponseSchema = z.object({
85
+ url: z.string().url(),
86
+ expires_at: positiveInt
87
+ });
88
+ const multipartListPartsQuerySchema = z.object({ upload_id: nonEmptyString });
89
+ const multipartPartSchema = z.object({
90
+ PartNumber: z.number().int().min(1).max(1e4),
91
+ ETag: nonEmptyString,
92
+ Size: z.number().int().nonnegative()
93
+ });
94
+ const multipartListPartsResponseSchema = z.object({ parts: z.array(multipartPartSchema) });
95
+ const multipartCompleteRequestSchema = z.object({
96
+ upload_id: nonEmptyString,
97
+ parts: z.array(z.object({
98
+ PartNumber: z.number().int().min(1).max(1e4),
99
+ ETag: nonEmptyString
100
+ })).min(1)
101
+ });
102
+ const multipartCompleteResponseSchema = uploadCompleteResponseSchema;
103
+ const multipartAbortRequestSchema = z.object({ upload_id: nonEmptyString });
104
+ const multipartAbortResponseSchema = uploadFailResponseSchema;
105
+ const uploadTypeSchema = z.enum(["single", "multipart"]);
65
106
  /** Raw upload record — returned by admin `/files` endpoints. */
66
107
  const uploadRecordSchema = z.object({
67
108
  id: nonEmptyString,
@@ -72,6 +113,7 @@ const uploadRecordSchema = z.object({
72
113
  mime_type: nonEmptyString,
73
114
  destination: uploadDestinationSchema,
74
115
  status: uploadStatusSchema,
116
+ upload_type: uploadTypeSchema.optional(),
75
117
  expires_at: positiveInt,
76
118
  created_at: positiveInt,
77
119
  updated_at: positiveInt
@@ -190,6 +232,7 @@ const serviceSchema = z.object({
190
232
  max_storage_bytes: positiveInt,
191
233
  current_used_bytes: z.number().int().nonnegative(),
192
234
  max_file_size_bytes: positiveInt,
235
+ recommended_upload_destination: uploadDestinationSchema.optional(),
193
236
  created_at: unixTimestamp
194
237
  });
195
238
  const serviceDetailResponseSchema = z.object({ service: serviceSchema });
@@ -198,6 +241,13 @@ const adminServiceUpdateRequestSchema = z.object({
198
241
  max_file_size_bytes: positiveInt.optional()
199
242
  }).refine((v) => v.max_storage_bytes !== void 0 || v.max_file_size_bytes !== void 0, { message: "At least one of max_storage_bytes or max_file_size_bytes must be provided" });
200
243
  const adminServiceUpdateResponseSchema = serviceDetailResponseSchema;
244
+ /**
245
+ * Separate settings endpoint driven by the Split-Button upload UI. Clients
246
+ * can flip the recommended default upload destination per service without
247
+ * disturbing quota-related fields.
248
+ */
249
+ const adminServiceSettingsRequestSchema = z.object({ recommended_upload_destination: uploadDestinationSchema.optional() }).refine((v) => v.recommended_upload_destination !== void 0, { message: "At least one setting must be provided" });
250
+ const adminServiceSettingsResponseSchema = serviceDetailResponseSchema;
201
251
  const serviceUsageResponseSchema = z.object({
202
252
  service_id: nonEmptyString,
203
253
  max_storage_bytes: positiveInt,
@@ -557,7 +607,32 @@ var UnisourceClient = class {
557
607
  fail: (body, signal) => apiRequest(this.config, "POST", "/upload/fail", {
558
608
  body,
559
609
  signal
560
- })
610
+ }),
611
+ multipart: {
612
+ create: (body, signal) => apiRequest(this.config, "POST", "/upload/r2/multipart/create", {
613
+ body,
614
+ signal
615
+ }),
616
+ signPart: (uploadId, partNumber, signal) => apiRequest(this.config, "GET", "/upload/r2/multipart/sign-part", {
617
+ query: {
618
+ upload_id: uploadId,
619
+ part_number: partNumber
620
+ },
621
+ signal
622
+ }),
623
+ listParts: (uploadId, signal) => apiRequest(this.config, "GET", "/upload/r2/multipart/list-parts", {
624
+ query: { upload_id: uploadId },
625
+ signal
626
+ }),
627
+ complete: (body, signal) => apiRequest(this.config, "POST", "/upload/r2/multipart/complete", {
628
+ body,
629
+ signal
630
+ }),
631
+ abort: (uploadId, signal) => apiRequest(this.config, "DELETE", "/upload/r2/multipart/abort", {
632
+ body: { upload_id: uploadId },
633
+ signal
634
+ })
635
+ }
561
636
  };
562
637
  myFiles = {
563
638
  list: (query, signal, options) => apiRequest(this.config, "GET", "/my-files", {
@@ -687,6 +762,10 @@ var UnisourceClient = class {
687
762
  body,
688
763
  signal
689
764
  }),
765
+ updateServiceSettings: (body, signal) => apiRequest(this.config, "PATCH", "/admin/service/settings", {
766
+ body,
767
+ signal
768
+ }),
690
769
  usage: (signal) => apiRequest(this.config, "GET", "/admin/service/usage", { signal }),
691
770
  listUploads: (query, signal) => apiRequest(this.config, "GET", "/admin/files", {
692
771
  query,
@@ -767,4 +846,4 @@ var UnisourceClient = class {
767
846
  };
768
847
  };
769
848
  //#endregion
770
- export { FILES_DEFAULT_LIMIT, FILES_MAX_LIMIT, UnisourceClient, UnisourceError, UnisourceNetworkError, adminServiceUpdateRequestSchema, adminServiceUpdateResponseSchema, adminUserListResponseSchema, adminUserPasswordResetRequestSchema, adminUserPasswordResetResponseSchema, adminUserRoleUpdateRequestSchema, adminUserSchema, adminUserStorageLimitUpdateRequestSchema, adminUserUpdateRequestSchema, adminUserUpdateResponseSchema, apiErrorSchema, auditEventActionSchema, auditEventSchema, auditLogListQuerySchema, auditLogListResponseSchema, fileDeleteResponseSchema, fileDownloadUrlResponseSchema, fileMoveRequestSchema, fileRecordDetailResponseSchema, fileRecordSchema, fileRecordsListQuerySchema, fileRecordsListResponseSchema, fileRestoreResponseSchema, fileUpdateRequestSchema, fileUpdateResponseSchema, folderCreateRequestSchema, folderCreateResponseSchema, folderDeleteResponseSchema, folderDetailResponseSchema, folderListQuerySchema, folderListResponseSchema, folderRestoreResponseSchema, folderSchema, folderUpdateRequestSchema, folderUpdateResponseSchema, getPublicFileInfo, mainStorageDeleteResponseSchema, mainStorageDetailResponseSchema, mainStorageFileSchema, mainStorageListQuerySchema, mainStorageListResponseSchema, mainStorageRenameRequestSchema, mainStorageRenameResponseSchema, mainStorageRestoreResponseSchema, nonEmptyString, positiveInt, publicFileAccessResponseSchema, publicFileLockedResponseSchema, releaseDTOSchema, releaseDeleteResponseSchema, releaseSyncManifestSchema, releaseSyncRequestSchema, releaseSyncResponseSchema, releaseSyncResultSchema, releaseUpdateRequestSchema, releaseUploadCompleteRequestSchema, releaseUploadCompleteResponseSchema, releaseUploadFailResponseSchema, releaseUploadInitRequestSchema, releaseUploadInitResponseSchema, releasesListQuerySchema, releasesListResponseSchema, serviceDetailResponseSchema, serviceSchema, serviceUsageResponseSchema, shareLinkCreateRequestSchema, shareLinkCreateResponseSchema, shareLinkDeleteResponseSchema, shareLinkDetailResponseSchema, shareLinkListResponseSchema, shareLinkSchema, shareLinkUpdateRequestSchema, shareLinkUpdateResponseSchema, sharesCreateRequestSchema, unixTimestamp, unlockPublicFile, uploadAppwriteInitRequestSchema, uploadAppwriteInitResponseSchema, uploadCompleteResponseSchema, uploadDestinationSchema, uploadFailResponseSchema, uploadLifecycleRequestSchema, uploadR2InitRequestSchema, uploadR2InitResponseSchema, uploadRecordDetailResponseSchema, uploadRecordSchema, uploadStatusSchema, uploadsListResponseSchema };
849
+ export { FILES_DEFAULT_LIMIT, FILES_MAX_LIMIT, UnisourceClient, UnisourceError, UnisourceNetworkError, adminServiceSettingsRequestSchema, adminServiceSettingsResponseSchema, adminServiceUpdateRequestSchema, adminServiceUpdateResponseSchema, adminUserListResponseSchema, adminUserPasswordResetRequestSchema, adminUserPasswordResetResponseSchema, adminUserRoleUpdateRequestSchema, adminUserSchema, adminUserStorageLimitUpdateRequestSchema, adminUserUpdateRequestSchema, adminUserUpdateResponseSchema, apiErrorSchema, auditEventActionSchema, auditEventSchema, auditLogListQuerySchema, auditLogListResponseSchema, fileDeleteResponseSchema, fileDownloadUrlResponseSchema, fileMoveRequestSchema, fileRecordDetailResponseSchema, fileRecordSchema, fileRecordsListQuerySchema, fileRecordsListResponseSchema, fileRestoreResponseSchema, fileUpdateRequestSchema, fileUpdateResponseSchema, folderCreateRequestSchema, folderCreateResponseSchema, folderDeleteResponseSchema, folderDetailResponseSchema, folderListQuerySchema, folderListResponseSchema, folderRestoreResponseSchema, folderSchema, folderUpdateRequestSchema, folderUpdateResponseSchema, getPublicFileInfo, mainStorageDeleteResponseSchema, mainStorageDetailResponseSchema, mainStorageFileSchema, mainStorageListQuerySchema, mainStorageListResponseSchema, mainStorageRenameRequestSchema, mainStorageRenameResponseSchema, mainStorageRestoreResponseSchema, multipartAbortRequestSchema, multipartAbortResponseSchema, multipartCompleteRequestSchema, multipartCompleteResponseSchema, multipartCreateRequestSchema, multipartCreateResponseSchema, multipartListPartsQuerySchema, multipartListPartsResponseSchema, multipartPartSchema, multipartSignPartQuerySchema, multipartSignPartResponseSchema, nonEmptyString, positiveInt, publicFileAccessResponseSchema, publicFileLockedResponseSchema, releaseDTOSchema, releaseDeleteResponseSchema, releaseSyncManifestSchema, releaseSyncRequestSchema, releaseSyncResponseSchema, releaseSyncResultSchema, releaseUpdateRequestSchema, releaseUploadCompleteRequestSchema, releaseUploadCompleteResponseSchema, releaseUploadFailResponseSchema, releaseUploadInitRequestSchema, releaseUploadInitResponseSchema, releasesListQuerySchema, releasesListResponseSchema, serviceDetailResponseSchema, serviceSchema, serviceUsageResponseSchema, shareLinkCreateRequestSchema, shareLinkCreateResponseSchema, shareLinkDeleteResponseSchema, shareLinkDetailResponseSchema, shareLinkListResponseSchema, shareLinkSchema, shareLinkUpdateRequestSchema, shareLinkUpdateResponseSchema, sharesCreateRequestSchema, unixTimestamp, unlockPublicFile, uploadAppwriteInitRequestSchema, uploadAppwriteInitResponseSchema, uploadCompleteResponseSchema, uploadDestinationSchema, uploadFailResponseSchema, uploadLifecycleRequestSchema, uploadR2InitRequestSchema, uploadR2InitResponseSchema, uploadRecordDetailResponseSchema, uploadRecordSchema, uploadStatusSchema, uploadTypeSchema, uploadsListResponseSchema };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@unisource/sdk",
3
3
  "private": false,
4
4
  "type": "module",
5
- "version": "0.3.2",
5
+ "version": "0.4.0",
6
6
  "description": "Wspolne kontrakty danych dla backendu i frontendu UniSource.",
7
7
  "license": "MIT",
8
8
  "publishConfig": {
package/src/client.ts CHANGED
@@ -9,6 +9,13 @@ import type {
9
9
  UploadFailResponse,
10
10
  UploadsListResponse,
11
11
  UploadRecordDetailResponse,
12
+ MultipartCreateRequest,
13
+ MultipartCreateResponse,
14
+ MultipartSignPartResponse,
15
+ MultipartListPartsResponse,
16
+ MultipartCompleteRequest,
17
+ MultipartCompleteResponse,
18
+ MultipartAbortResponse,
12
19
  } from './uploads';
13
20
  import type {
14
21
  FileRecord,
@@ -38,6 +45,8 @@ import type {
38
45
  ServiceUsageResponse,
39
46
  AdminServiceUpdateRequest,
40
47
  AdminServiceUpdateResponse,
48
+ AdminServiceSettingsRequest,
49
+ AdminServiceSettingsResponse,
41
50
  AuditLogListQuery,
42
51
  AuditLogListResponse,
43
52
  AdminUserListResponse,
@@ -248,6 +257,38 @@ export class UnisourceClient {
248
257
  /** Mark an upload as failed and release reserved quota */
249
258
  fail: (body: UploadLifecycleRequest, signal?: AbortSignal): Promise<UploadFailResponse> =>
250
259
  apiRequest(this.config, 'POST', '/upload/fail', { body, signal }),
260
+
261
+ /** Multipart upload helpers — direct browser → R2 via S3 presigned URLs */
262
+ multipart: {
263
+ /** Create a multipart upload — returns UploadId + storage key */
264
+ create: (body: MultipartCreateRequest, signal?: AbortSignal): Promise<MultipartCreateResponse> =>
265
+ apiRequest(this.config, 'POST', '/upload/r2/multipart/create', { body, signal }),
266
+
267
+ /** Short-lived presigned PUT URL for a single part */
268
+ signPart: (uploadId: string, partNumber: number, signal?: AbortSignal): Promise<MultipartSignPartResponse> =>
269
+ apiRequest(this.config, 'GET', '/upload/r2/multipart/sign-part', {
270
+ query: { upload_id: uploadId, part_number: partNumber },
271
+ signal,
272
+ }),
273
+
274
+ /** List parts already uploaded — feeds Golden Retriever's resume logic */
275
+ listParts: (uploadId: string, signal?: AbortSignal): Promise<MultipartListPartsResponse> =>
276
+ apiRequest(this.config, 'GET', '/upload/r2/multipart/list-parts', {
277
+ query: { upload_id: uploadId },
278
+ signal,
279
+ }),
280
+
281
+ /** Finalize the multipart upload. Parts must include PartNumber + ETag. */
282
+ complete: (body: MultipartCompleteRequest, signal?: AbortSignal): Promise<MultipartCompleteResponse> =>
283
+ apiRequest(this.config, 'POST', '/upload/r2/multipart/complete', { body, signal }),
284
+
285
+ /** Abort the multipart upload and release reserved quota */
286
+ abort: (uploadId: string, signal?: AbortSignal): Promise<MultipartAbortResponse> =>
287
+ apiRequest(this.config, 'DELETE', '/upload/r2/multipart/abort', {
288
+ body: { upload_id: uploadId },
289
+ signal,
290
+ }),
291
+ },
251
292
  };
252
293
 
253
294
  // ─── My Files ─────────────────────────────────────────────────────────────
@@ -409,6 +450,13 @@ export class UnisourceClient {
409
450
  updateService: (body: AdminServiceUpdateRequest, signal?: AbortSignal): Promise<AdminServiceUpdateResponse> =>
410
451
  apiRequest(this.config, 'PATCH', '/admin/service', { body, signal }),
411
452
 
453
+ /** Update service-wide settings (e.g. recommended upload destination) */
454
+ updateServiceSettings: (
455
+ body: AdminServiceSettingsRequest,
456
+ signal?: AbortSignal
457
+ ): Promise<AdminServiceSettingsResponse> =>
458
+ apiRequest(this.config, 'PATCH', '/admin/service/settings', { body, signal }),
459
+
412
460
  /** Get real-time storage usage for the service */
413
461
  usage: (signal?: AbortSignal): Promise<ServiceUsageResponse> =>
414
462
  apiRequest(this.config, 'GET', '/admin/service/usage', { signal }),
package/src/index.ts CHANGED
@@ -24,6 +24,18 @@ export {
24
24
  uploadRecordSchema,
25
25
  uploadsListResponseSchema,
26
26
  uploadRecordDetailResponseSchema,
27
+ uploadTypeSchema,
28
+ multipartCreateRequestSchema,
29
+ multipartCreateResponseSchema,
30
+ multipartSignPartQuerySchema,
31
+ multipartSignPartResponseSchema,
32
+ multipartListPartsQuerySchema,
33
+ multipartListPartsResponseSchema,
34
+ multipartPartSchema,
35
+ multipartCompleteRequestSchema,
36
+ multipartCompleteResponseSchema,
37
+ multipartAbortRequestSchema,
38
+ multipartAbortResponseSchema,
27
39
  } from './uploads';
28
40
  export type {
29
41
  UploadR2InitRequest,
@@ -36,6 +48,18 @@ export type {
36
48
  UploadRecord,
37
49
  UploadsListResponse,
38
50
  UploadRecordDetailResponse,
51
+ UploadType,
52
+ MultipartCreateRequest,
53
+ MultipartCreateResponse,
54
+ MultipartSignPartQuery,
55
+ MultipartSignPartResponse,
56
+ MultipartListPartsQuery,
57
+ MultipartListPartsResponse,
58
+ MultipartPart,
59
+ MultipartCompleteRequest,
60
+ MultipartCompleteResponse,
61
+ MultipartAbortRequest,
62
+ MultipartAbortResponse,
39
63
  } from './uploads';
40
64
 
41
65
  // ─── File Records ─────────────────────────────────────────────────────────────
@@ -96,6 +120,8 @@ export {
96
120
  serviceDetailResponseSchema,
97
121
  adminServiceUpdateRequestSchema,
98
122
  adminServiceUpdateResponseSchema,
123
+ adminServiceSettingsRequestSchema,
124
+ adminServiceSettingsResponseSchema,
99
125
  serviceUsageResponseSchema,
100
126
  auditEventActionSchema,
101
127
  auditEventSchema,
@@ -115,6 +141,8 @@ export type {
115
141
  ServiceDetailResponse,
116
142
  AdminServiceUpdateRequest,
117
143
  AdminServiceUpdateResponse,
144
+ AdminServiceSettingsRequest,
145
+ AdminServiceSettingsResponse,
118
146
  ServiceUsageResponse,
119
147
  AuditEventAction,
120
148
  AuditEvent,
package/src/services.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { nonEmptyString, positiveInt, unixTimestamp } from './primitives';
2
+ import { nonEmptyString, positiveInt, unixTimestamp, uploadDestinationSchema } from './primitives';
3
3
 
4
4
  // ─── Service record ───────────────────────────────────────────────────────────
5
5
 
@@ -10,6 +10,7 @@ export const serviceSchema = z.object({
10
10
  max_storage_bytes: positiveInt,
11
11
  current_used_bytes: z.number().int().nonnegative(),
12
12
  max_file_size_bytes: positiveInt,
13
+ recommended_upload_destination: uploadDestinationSchema.optional(),
13
14
  created_at: unixTimestamp,
14
15
  });
15
16
  export type Service = z.infer<typeof serviceSchema>;
@@ -33,6 +34,25 @@ export type AdminServiceUpdateRequest = z.infer<typeof adminServiceUpdateRequest
33
34
  export const adminServiceUpdateResponseSchema = serviceDetailResponseSchema;
34
35
  export type AdminServiceUpdateResponse = z.infer<typeof adminServiceUpdateResponseSchema>;
35
36
 
37
+ // ─── Admin: Service Settings (split from limits) ──────────────────────────────
38
+
39
+ /**
40
+ * Separate settings endpoint driven by the Split-Button upload UI. Clients
41
+ * can flip the recommended default upload destination per service without
42
+ * disturbing quota-related fields.
43
+ */
44
+ export const adminServiceSettingsRequestSchema = z
45
+ .object({
46
+ recommended_upload_destination: uploadDestinationSchema.optional(),
47
+ })
48
+ .refine((v) => v.recommended_upload_destination !== undefined, {
49
+ message: 'At least one setting must be provided',
50
+ });
51
+ export type AdminServiceSettingsRequest = z.infer<typeof adminServiceSettingsRequestSchema>;
52
+
53
+ export const adminServiceSettingsResponseSchema = serviceDetailResponseSchema;
54
+ export type AdminServiceSettingsResponse = z.infer<typeof adminServiceSettingsResponseSchema>;
55
+
36
56
  // ─── Service usage summary ────────────────────────────────────────────────────
37
57
 
38
58
  export const serviceUsageResponseSchema = z.object({
package/src/uploads.ts CHANGED
@@ -41,6 +41,8 @@ export const uploadAppwriteInitResponseSchema = z.object({
41
41
  appwrite_bucket_id: nonEmptyString,
42
42
  file_id: nonEmptyString,
43
43
  expires_at: positiveInt,
44
+ /** Appwrite JWT to authenticate the client-side SDK upload. Only present for JWT-authenticated requests. */
45
+ jwt: nonEmptyString.optional(),
44
46
  });
45
47
  export type UploadAppwriteInitResponse = z.infer<typeof uploadAppwriteInitResponseSchema>;
46
48
 
@@ -66,10 +68,97 @@ export const uploadFailResponseSchema = z.object({
66
68
  });
67
69
  export type UploadFailResponse = z.infer<typeof uploadFailResponseSchema>;
68
70
 
71
+ // ─── Multipart: Create ────────────────────────────────────────────────────────
72
+
73
+ export const multipartCreateRequestSchema = z.object({
74
+ filename: nonEmptyString,
75
+ size: positiveInt,
76
+ mime_type: nonEmptyString,
77
+ folder_id: nonEmptyString.optional(),
78
+ is_main_storage: z.boolean().optional().default(false),
79
+ });
80
+ export type MultipartCreateRequest = z.input<typeof multipartCreateRequestSchema>;
81
+
82
+ export const multipartCreateResponseSchema = z.object({
83
+ /** Internal UniSource upload record id. */
84
+ upload_id: nonEmptyString,
85
+ /** S3 (R2) multipart UploadId — required for every sign/complete/abort call. */
86
+ r2_upload_id: nonEmptyString,
87
+ /** R2 object key that the parts are being uploaded to. */
88
+ key: nonEmptyString,
89
+ bucket: nonEmptyString,
90
+ expires_at: positiveInt,
91
+ });
92
+ export type MultipartCreateResponse = z.infer<typeof multipartCreateResponseSchema>;
93
+
94
+ // ─── Multipart: Sign Part ─────────────────────────────────────────────────────
95
+
96
+ export const multipartSignPartQuerySchema = z.object({
97
+ upload_id: nonEmptyString,
98
+ part_number: z.coerce.number().int().min(1).max(10_000),
99
+ });
100
+ export type MultipartSignPartQuery = z.input<typeof multipartSignPartQuerySchema>;
101
+
102
+ export const multipartSignPartResponseSchema = z.object({
103
+ url: z.string().url(),
104
+ expires_at: positiveInt,
105
+ });
106
+ export type MultipartSignPartResponse = z.infer<typeof multipartSignPartResponseSchema>;
107
+
108
+ // ─── Multipart: List Parts ────────────────────────────────────────────────────
109
+
110
+ export const multipartListPartsQuerySchema = z.object({
111
+ upload_id: nonEmptyString,
112
+ });
113
+ export type MultipartListPartsQuery = z.input<typeof multipartListPartsQuerySchema>;
114
+
115
+ export const multipartPartSchema = z.object({
116
+ PartNumber: z.number().int().min(1).max(10_000),
117
+ ETag: nonEmptyString,
118
+ Size: z.number().int().nonnegative(),
119
+ });
120
+ export type MultipartPart = z.infer<typeof multipartPartSchema>;
121
+
122
+ export const multipartListPartsResponseSchema = z.object({
123
+ parts: z.array(multipartPartSchema),
124
+ });
125
+ export type MultipartListPartsResponse = z.infer<typeof multipartListPartsResponseSchema>;
126
+
127
+ // ─── Multipart: Complete ──────────────────────────────────────────────────────
128
+
129
+ export const multipartCompleteRequestSchema = z.object({
130
+ upload_id: nonEmptyString,
131
+ parts: z
132
+ .array(
133
+ z.object({
134
+ PartNumber: z.number().int().min(1).max(10_000),
135
+ ETag: nonEmptyString,
136
+ })
137
+ )
138
+ .min(1),
139
+ });
140
+ export type MultipartCompleteRequest = z.input<typeof multipartCompleteRequestSchema>;
141
+
142
+ export const multipartCompleteResponseSchema = uploadCompleteResponseSchema;
143
+ export type MultipartCompleteResponse = z.infer<typeof multipartCompleteResponseSchema>;
144
+
145
+ // ─── Multipart: Abort ─────────────────────────────────────────────────────────
146
+
147
+ export const multipartAbortRequestSchema = z.object({
148
+ upload_id: nonEmptyString,
149
+ });
150
+ export type MultipartAbortRequest = z.input<typeof multipartAbortRequestSchema>;
151
+
152
+ export const multipartAbortResponseSchema = uploadFailResponseSchema;
153
+ export type MultipartAbortResponse = z.infer<typeof multipartAbortResponseSchema>;
154
+
69
155
  // ─── Admin: list uploads ──────────────────────────────────────────────────────
70
156
 
71
157
  export { FILES_DEFAULT_LIMIT, FILES_MAX_LIMIT };
72
158
 
159
+ export const uploadTypeSchema = z.enum(['single', 'multipart']);
160
+ export type UploadType = z.infer<typeof uploadTypeSchema>;
161
+
73
162
  /** Raw upload record — returned by admin `/files` endpoints. */
74
163
  export const uploadRecordSchema = z.object({
75
164
  id: nonEmptyString,
@@ -80,6 +169,7 @@ export const uploadRecordSchema = z.object({
80
169
  mime_type: nonEmptyString,
81
170
  destination: uploadDestinationSchema,
82
171
  status: uploadStatusSchema,
172
+ upload_type: uploadTypeSchema.optional(),
83
173
  expires_at: positiveInt,
84
174
  created_at: positiveInt,
85
175
  updated_at: positiveInt,