@shukka/sdk 0.0.0-stage → 0.1.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.
@@ -0,0 +1,1106 @@
1
+ type AuthToken = string | undefined;
2
+ interface Auth {
3
+ /**
4
+ * Which part of the request do we use to send the auth?
5
+ *
6
+ * @default 'header'
7
+ */
8
+ in?: 'header' | 'query' | 'cookie';
9
+ /**
10
+ * A unique identifier for the security scheme.
11
+ *
12
+ * Defined only when there are multiple security schemes whose `Auth`
13
+ * shape would otherwise be identical.
14
+ */
15
+ key?: string;
16
+ /**
17
+ * Header or query parameter name.
18
+ *
19
+ * @default 'Authorization'
20
+ */
21
+ name?: string;
22
+ scheme?: 'basic' | 'bearer';
23
+ type: 'apiKey' | 'http';
24
+ }
25
+
26
+ interface SerializerOptions<T> {
27
+ /**
28
+ * @default true
29
+ */
30
+ explode: boolean;
31
+ style: T;
32
+ }
33
+ type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited';
34
+ type ObjectStyle = 'form' | 'deepObject';
35
+
36
+ type QuerySerializer = (query: Record<string, unknown>) => string;
37
+ type BodySerializer = (body: unknown) => unknown;
38
+ type QuerySerializerOptionsObject = {
39
+ allowReserved?: boolean;
40
+ array?: Partial<SerializerOptions<ArrayStyle>>;
41
+ object?: Partial<SerializerOptions<ObjectStyle>>;
42
+ };
43
+ type QuerySerializerOptions = QuerySerializerOptionsObject & {
44
+ /**
45
+ * Per-parameter serialization overrides. When provided, these settings
46
+ * override the global array/object settings for specific parameter names.
47
+ */
48
+ parameters?: Record<string, QuerySerializerOptionsObject>;
49
+ };
50
+
51
+ type HttpMethod = 'connect' | 'delete' | 'get' | 'head' | 'options' | 'patch' | 'post' | 'put' | 'trace';
52
+ type Client$1<RequestFn = never, Config = unknown, MethodFn = never, BuildUrlFn = never, SseFn = never> = {
53
+ /**
54
+ * Returns the final request URL.
55
+ */
56
+ buildUrl: BuildUrlFn;
57
+ getConfig: () => Config;
58
+ request: RequestFn;
59
+ setConfig: (config: Config) => Config;
60
+ } & {
61
+ [K in HttpMethod]: MethodFn;
62
+ } & ([SseFn] extends [never] ? {
63
+ sse?: never;
64
+ } : {
65
+ sse: {
66
+ [K in HttpMethod]: SseFn;
67
+ };
68
+ });
69
+ interface Config$1 {
70
+ /**
71
+ * Auth token or a function returning auth token. The resolved value will be
72
+ * added to the request payload as defined by its `security` array.
73
+ */
74
+ auth?: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken;
75
+ /**
76
+ * A function for serializing request body parameter. By default,
77
+ * {@link JSON.stringify()} will be used.
78
+ */
79
+ bodySerializer?: BodySerializer | null;
80
+ /**
81
+ * An object containing any HTTP headers that you want to pre-populate your
82
+ * `Headers` object with.
83
+ *
84
+ * {@link https://developer.mozilla.org/docs/Web/API/Headers/Headers#init See more}
85
+ */
86
+ headers?: RequestInit['headers'] | Record<string, string | number | boolean | (string | number | boolean)[] | null | undefined | unknown>;
87
+ /**
88
+ * The request method.
89
+ *
90
+ * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more}
91
+ */
92
+ method?: Uppercase<HttpMethod>;
93
+ /**
94
+ * A function for serializing request query parameters. By default, arrays
95
+ * will be exploded in form style, objects will be exploded in deepObject
96
+ * style, and reserved characters are percent-encoded.
97
+ *
98
+ * This method will have no effect if the native `paramsSerializer()` Axios
99
+ * API function is used.
100
+ *
101
+ * {@link https://swagger.io/docs/specification/serialization/#query View examples}
102
+ */
103
+ querySerializer?: QuerySerializer | QuerySerializerOptions;
104
+ /**
105
+ * A function validating request data. This is useful if you want to ensure
106
+ * the request conforms to the desired shape, so it can be safely sent to
107
+ * the server.
108
+ */
109
+ requestValidator?: (data: unknown) => Promise<unknown>;
110
+ /**
111
+ * A function transforming response data before it's returned. This is useful
112
+ * for post-processing data, e.g., converting ISO strings into Date objects.
113
+ */
114
+ responseTransformer?: (data: unknown) => Promise<unknown>;
115
+ /**
116
+ * A function validating response data. This is useful if you want to ensure
117
+ * the response conforms to the desired shape, so it can be safely passed to
118
+ * the transformers and returned to the user.
119
+ */
120
+ responseValidator?: (data: unknown) => Promise<unknown>;
121
+ }
122
+ /**
123
+ * Arbitrary metadata passed through the `meta` request option.
124
+ */
125
+ interface ClientMeta {
126
+ }
127
+
128
+ type ServerSentEventsOptions<TData = unknown> = Omit<RequestInit, 'method'> & Pick<Config$1, 'method' | 'responseTransformer' | 'responseValidator'> & {
129
+ /**
130
+ * Fetch API implementation. You can use this option to provide a custom
131
+ * fetch instance.
132
+ *
133
+ * @default globalThis.fetch
134
+ */
135
+ fetch?: typeof fetch;
136
+ /**
137
+ * Implementing clients can call request interceptors inside this hook.
138
+ */
139
+ onRequest?: (url: string, init: RequestInit) => Promise<Request>;
140
+ /**
141
+ * Callback invoked when a network or parsing error occurs during streaming.
142
+ *
143
+ * This option applies only if the endpoint returns a stream of events.
144
+ *
145
+ * @param error The error that occurred.
146
+ */
147
+ onSseError?: (error: unknown) => void;
148
+ /**
149
+ * Callback invoked when an event is streamed from the server.
150
+ *
151
+ * This option applies only if the endpoint returns a stream of events.
152
+ *
153
+ * @param event Event streamed from the server.
154
+ * @returns Nothing (void).
155
+ */
156
+ onSseEvent?: (event: StreamEvent<TData>) => void;
157
+ serializedBody?: RequestInit['body'];
158
+ /**
159
+ * Default retry delay in milliseconds.
160
+ *
161
+ * This option applies only if the endpoint returns a stream of events.
162
+ *
163
+ * @default 3000
164
+ */
165
+ sseDefaultRetryDelay?: number;
166
+ /**
167
+ * Maximum number of retry attempts before giving up.
168
+ */
169
+ sseMaxRetryAttempts?: number;
170
+ /**
171
+ * Maximum retry delay in milliseconds.
172
+ *
173
+ * Applies only when exponential backoff is used.
174
+ *
175
+ * This option applies only if the endpoint returns a stream of events.
176
+ *
177
+ * @default 30000
178
+ */
179
+ sseMaxRetryDelay?: number;
180
+ /**
181
+ * Optional sleep function for retry backoff.
182
+ *
183
+ * Defaults to using `setTimeout`.
184
+ */
185
+ sseSleepFn?: (ms: number) => Promise<void>;
186
+ url: string;
187
+ };
188
+ interface StreamEvent<TData = unknown> {
189
+ data: TData;
190
+ event?: string;
191
+ id?: string;
192
+ retry?: number;
193
+ }
194
+ type ServerSentEventsResult<TData = unknown, TReturn = void, TNext = unknown> = {
195
+ stream: AsyncGenerator<TData extends Record<string, unknown> ? TData[keyof TData] : TData, TReturn, TNext>;
196
+ };
197
+
198
+ type ErrInterceptor<Err, Res, Req, Options> = (error: Err,
199
+ /** response may be undefined due to a network error where no response object is produced */
200
+ response: Res | undefined,
201
+ /** request may be undefined, because error may be from building the request object itself */
202
+ request: Req | undefined, options: Options) => Err | Promise<Err>;
203
+ type ReqInterceptor<Req, Options> = (request: Req, options: Options) => Req | Promise<Req>;
204
+ type ResInterceptor<Res, Req, Options> = (response: Res, request: Req, options: Options) => Res | Promise<Res>;
205
+ declare class Interceptors<Interceptor> {
206
+ fns: Array<Interceptor | null>;
207
+ clear(): void;
208
+ eject(id: number | Interceptor): void;
209
+ exists(id: number | Interceptor): boolean;
210
+ getInterceptorIndex(id: number | Interceptor): number;
211
+ update(id: number | Interceptor, fn: Interceptor): number | Interceptor | false;
212
+ use(fn: Interceptor): number;
213
+ }
214
+ interface Middleware<Req, Res, Err, Options> {
215
+ error: Interceptors<ErrInterceptor<Err, Res, Req, Options>>;
216
+ request: Interceptors<ReqInterceptor<Req, Options>>;
217
+ response: Interceptors<ResInterceptor<Res, Req, Options>>;
218
+ }
219
+
220
+ type ResponseStyle = 'data' | 'fields';
221
+ interface Config<T extends ClientOptions$1 = ClientOptions$1> extends Omit<RequestInit, 'body' | 'headers' | 'method'>, Config$1 {
222
+ /**
223
+ * Base URL for all requests made by this client.
224
+ */
225
+ baseUrl?: T['baseUrl'];
226
+ /**
227
+ * Fetch API implementation. You can use this option to provide a custom
228
+ * fetch instance.
229
+ *
230
+ * @default globalThis.fetch
231
+ */
232
+ fetch?: typeof fetch;
233
+ /**
234
+ * Please don't use the Fetch client for Next.js applications. The `next`
235
+ * options won't have any effect.
236
+ *
237
+ * Install {@link https://www.npmjs.com/package/@hey-api/client-next `@hey-api/client-next`} instead.
238
+ */
239
+ next?: never;
240
+ /**
241
+ * Return the response data parsed in a specified format. By default, `auto`
242
+ * will infer the appropriate method from the `Content-Type` response header.
243
+ * You can override this behavior with any of the {@link Body} methods.
244
+ * Select `stream` if you don't want to parse response data at all.
245
+ *
246
+ * @default 'auto'
247
+ */
248
+ parseAs?: 'arrayBuffer' | 'auto' | 'blob' | 'formData' | 'json' | 'stream' | 'text';
249
+ /**
250
+ * Should we return only data or multiple fields (data, error, response, etc.)?
251
+ *
252
+ * @default 'fields'
253
+ */
254
+ responseStyle?: ResponseStyle;
255
+ /**
256
+ * Throw an error instead of returning it in the response?
257
+ *
258
+ * @default false
259
+ */
260
+ throwOnError?: T['throwOnError'];
261
+ }
262
+ interface RequestOptions<TData = unknown, TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string> extends Config<{
263
+ responseStyle: TResponseStyle;
264
+ throwOnError: ThrowOnError;
265
+ }>, Pick<ServerSentEventsOptions<TData>, 'onRequest' | 'onSseError' | 'onSseEvent' | 'sseDefaultRetryDelay' | 'sseMaxRetryAttempts' | 'sseMaxRetryDelay'> {
266
+ /**
267
+ * Any body that you want to add to your request.
268
+ *
269
+ * {@link https://developer.mozilla.org/docs/Web/API/fetch#body}
270
+ */
271
+ body?: unknown;
272
+ path?: Record<string, unknown>;
273
+ query?: Record<string, unknown>;
274
+ /**
275
+ * Security mechanism(s) to use for the request.
276
+ */
277
+ security?: ReadonlyArray<Auth>;
278
+ url: Url;
279
+ }
280
+ interface ResolvedRequestOptions<TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string> extends RequestOptions<unknown, TResponseStyle, ThrowOnError, Url> {
281
+ headers: Headers;
282
+ serializedBody?: string;
283
+ }
284
+ type RequestResult<TData = unknown, TError = unknown, ThrowOnError extends boolean = boolean, TResponseStyle extends ResponseStyle = 'fields'> = ThrowOnError extends true ? Promise<TResponseStyle extends 'data' ? TData extends Record<string, unknown> ? TData[keyof TData] : TData : {
285
+ data: TData extends Record<string, unknown> ? TData[keyof TData] : TData;
286
+ request: Request;
287
+ response: Response;
288
+ }> : Promise<TResponseStyle extends 'data' ? (TData extends Record<string, unknown> ? TData[keyof TData] : TData) | undefined : ({
289
+ data: TData extends Record<string, unknown> ? TData[keyof TData] : TData;
290
+ error: undefined;
291
+ } | {
292
+ data: undefined;
293
+ error: TError extends Record<string, unknown> ? TError[keyof TError] : TError;
294
+ }) & {
295
+ /** request may be undefined, because error may be from building the request object itself */
296
+ request?: Request;
297
+ /** response may be undefined, because error may be from building the request object itself or from a network error */
298
+ response?: Response;
299
+ }>;
300
+ interface ClientOptions$1 {
301
+ baseUrl?: string;
302
+ responseStyle?: ResponseStyle;
303
+ throwOnError?: boolean;
304
+ }
305
+ type MethodFn = <TData = unknown, TError = unknown, ThrowOnError extends boolean = false, TResponseStyle extends ResponseStyle = 'fields'>(options: Omit<RequestOptions<TData, TResponseStyle, ThrowOnError>, 'method'>) => RequestResult<TData, TError, ThrowOnError, TResponseStyle>;
306
+ type SseFn = <TData = unknown, _TError = unknown, ThrowOnError extends boolean = false, TResponseStyle extends ResponseStyle = 'fields'>(options: Omit<RequestOptions<never, TResponseStyle, ThrowOnError>, 'method'>) => Promise<ServerSentEventsResult<TData>>;
307
+ type RequestFn = <TData = unknown, TError = unknown, ThrowOnError extends boolean = false, TResponseStyle extends ResponseStyle = 'fields'>(options: Omit<RequestOptions<TData, TResponseStyle, ThrowOnError>, 'method'> & Pick<Required<RequestOptions<TData, TResponseStyle, ThrowOnError>>, 'method'>) => RequestResult<TData, TError, ThrowOnError, TResponseStyle>;
308
+ type BuildUrlFn = <TData extends {
309
+ body?: unknown;
310
+ path?: Record<string, unknown>;
311
+ query?: Record<string, unknown>;
312
+ url: string;
313
+ }>(options: TData & Options$1<TData>) => string;
314
+ type Client = Client$1<RequestFn, Config, MethodFn, BuildUrlFn, SseFn> & {
315
+ interceptors: Middleware<Request, Response, unknown, ResolvedRequestOptions>;
316
+ };
317
+ interface TDataShape {
318
+ body?: unknown;
319
+ headers?: unknown;
320
+ path?: unknown;
321
+ query?: unknown;
322
+ url: string;
323
+ }
324
+ type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>;
325
+ type Options$1<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean, TResponse = unknown, TResponseStyle extends ResponseStyle = 'fields'> = OmitKeys<RequestOptions<TResponse, TResponseStyle, ThrowOnError>, 'body' | 'path' | 'query' | 'url'> & ([TData] extends [never] ? unknown : Omit<TData, 'url'>);
326
+
327
+ type ClientOptions = {
328
+ baseUrl: 'https://updates.example.com' | (string & {});
329
+ };
330
+ type Error = {
331
+ error: 'unauthorized' | 'forbidden' | 'not_found' | 'conflict' | 'invalid_request' | 'storage_error' | 'metadata_error' | 'rate_limited';
332
+ message: string;
333
+ details?: unknown;
334
+ };
335
+ type AppDetail = {
336
+ app: {
337
+ id: number;
338
+ slug: string;
339
+ name: string;
340
+ s3Endpoint: string | null;
341
+ s3Region: string;
342
+ s3Bucket: string;
343
+ s3Prefix: string;
344
+ s3AccessKeyId: string;
345
+ s3ForcePathStyle: boolean;
346
+ releaseLogEnabled: boolean;
347
+ releaseLogLocales: Array<string>;
348
+ releaseLogFallbackLocale: string;
349
+ updaterKind: 'electron' | 'tauri' | 'sparkle';
350
+ createdAt: number;
351
+ };
352
+ channels: Array<{
353
+ id: number;
354
+ name: string;
355
+ currentVersionId: number | null;
356
+ feedUrl: string;
357
+ versions: Array<{
358
+ id: number;
359
+ appId: number;
360
+ channelId: number;
361
+ version: string;
362
+ createdAt: number;
363
+ releasedAt: number | null;
364
+ metadataHits: number;
365
+ artifactHits: number;
366
+ isDraft: boolean;
367
+ isCurrent: boolean;
368
+ artifacts: Array<{
369
+ id: number;
370
+ versionId: number;
371
+ filename: string;
372
+ s3Key: string;
373
+ size: number;
374
+ kind: 'metadata' | 'artifact';
375
+ }>;
376
+ }>;
377
+ }>;
378
+ /**
379
+ * Present only for session actors; omitted when authenticated with an API key.
380
+ */
381
+ keys?: Array<{
382
+ id: number;
383
+ name: string;
384
+ hint: string;
385
+ createdAt: number;
386
+ lastUsedAt: number | null;
387
+ revokedAt: number | null;
388
+ }>;
389
+ };
390
+ type AppUpdated = {
391
+ app: {
392
+ id: number;
393
+ slug: string;
394
+ name: string;
395
+ s3Endpoint: string | null;
396
+ s3Region: string;
397
+ s3Bucket: string;
398
+ s3Prefix: string;
399
+ s3AccessKeyId: string;
400
+ s3ForcePathStyle: boolean;
401
+ releaseLogEnabled: boolean;
402
+ releaseLogLocales: Array<string>;
403
+ releaseLogFallbackLocale: string;
404
+ updaterKind: 'electron' | 'tauri' | 'sparkle';
405
+ createdAt: number;
406
+ };
407
+ };
408
+ type AppUpdateRequest = {
409
+ name: string;
410
+ slug: string;
411
+ s3Endpoint?: string | null;
412
+ s3Region: string;
413
+ s3Bucket: string;
414
+ s3Prefix?: string;
415
+ s3AccessKeyId: string;
416
+ s3SecretAccessKey?: string;
417
+ s3ForcePathStyle?: boolean;
418
+ updaterKind?: 'electron' | 'tauri' | 'sparkle';
419
+ };
420
+ type ChannelList = {
421
+ channels: Array<{
422
+ id: number;
423
+ appId: number;
424
+ name: string;
425
+ currentVersionId: number | null;
426
+ createdAt: number;
427
+ }>;
428
+ };
429
+ type ChannelCreated = {
430
+ channel: {
431
+ id: number;
432
+ appId: number;
433
+ name: string;
434
+ currentVersionId: number | null;
435
+ createdAt: number;
436
+ };
437
+ };
438
+ type CreateChannelRequest = {
439
+ name: string;
440
+ };
441
+ type SetCurrentVersionRequest = {
442
+ /**
443
+ * Version string, or null to clear current
444
+ */
445
+ currentVersion: string | null;
446
+ };
447
+ type ChannelTrend = {
448
+ granularity: 'hour' | 'day';
449
+ points: Array<{
450
+ t: number;
451
+ metadata: number;
452
+ artifact: number;
453
+ }>;
454
+ };
455
+ type VersionTrend = {
456
+ points: Array<{
457
+ t: number;
458
+ metadata: number;
459
+ artifact: number;
460
+ }>;
461
+ };
462
+ type EditorNotes = {
463
+ notes: Array<{
464
+ locale: string;
465
+ markdown: string;
466
+ html: string;
467
+ text: string;
468
+ id: number;
469
+ versionId: number;
470
+ }>;
471
+ };
472
+ type PublicNotes = {
473
+ notes: Array<{
474
+ locale: string;
475
+ markdown: string;
476
+ html: string;
477
+ text: string;
478
+ version: string;
479
+ releasedAt: number;
480
+ }>;
481
+ };
482
+ type SavedNote = {
483
+ note: {
484
+ locale: string;
485
+ markdown: string;
486
+ html: string;
487
+ text: string;
488
+ id: number;
489
+ versionId: number;
490
+ };
491
+ };
492
+ type UpsertNoteRequest = {
493
+ markdown: string;
494
+ };
495
+ type NotesConfigResponse = {
496
+ releaseLog: {
497
+ enabled: boolean;
498
+ locales: Array<string>;
499
+ fallbackLocale: string;
500
+ };
501
+ };
502
+ type SaveNotesConfigRequest = {
503
+ enabled: boolean;
504
+ locales: Array<string>;
505
+ fallbackLocale: string;
506
+ };
507
+ type ReleaseMetadata = {
508
+ /**
509
+ * Custom JSON object; at most 16 KiB of compact UTF-8 JSON. Public after release.
510
+ */
511
+ metadata: {
512
+ [key: string]: unknown;
513
+ };
514
+ version: string;
515
+ };
516
+ type ReplaceReleaseMetadataRequest = {
517
+ /**
518
+ * Custom JSON object; at most 16 KiB of compact UTF-8 JSON. Public after release.
519
+ */
520
+ metadata: {
521
+ [key: string]: unknown;
522
+ };
523
+ };
524
+ type UploadInitResponse = {
525
+ uploadId: string;
526
+ expiresAt: number;
527
+ files: Array<{
528
+ filename: string;
529
+ key: string;
530
+ uploadUrl: string;
531
+ }>;
532
+ };
533
+ type InitUploadRequest = {
534
+ app?: string;
535
+ channel: string;
536
+ version: string;
537
+ createChannel?: boolean;
538
+ files: Array<{
539
+ filename: string;
540
+ size?: number;
541
+ }>;
542
+ };
543
+ type UploadFinalizeResponse = {
544
+ versionId: number;
545
+ version: string;
546
+ channel: string;
547
+ artifacts: Array<{
548
+ filename: string;
549
+ size: number;
550
+ kind: 'metadata' | 'artifact';
551
+ }>;
552
+ };
553
+ type FinalizeUploadRequest = {
554
+ uploadId: string;
555
+ app?: string;
556
+ release?: boolean;
557
+ /**
558
+ * Custom JSON object; at most 16 KiB of compact UTF-8 JSON. Public after release.
559
+ */
560
+ metadata?: {
561
+ [key: string]: unknown;
562
+ };
563
+ };
564
+ type OkResponse = {
565
+ ok: true;
566
+ };
567
+ type TauriFeed = {
568
+ version: string;
569
+ pub_date: string;
570
+ platforms: {
571
+ [key: string]: {
572
+ url: string;
573
+ signature: string;
574
+ };
575
+ };
576
+ };
577
+ type GetAppData = {
578
+ body?: never;
579
+ path: {
580
+ appSlug: string;
581
+ };
582
+ query?: never;
583
+ url: '/api/v1/apps/{appSlug}';
584
+ };
585
+ type GetAppResponses = {
586
+ /**
587
+ * App detail
588
+ */
589
+ 200: AppDetail;
590
+ };
591
+ type GetAppResponse = GetAppResponses[keyof GetAppResponses];
592
+ type UpdateAppData = {
593
+ body: AppUpdateRequest;
594
+ path: {
595
+ appSlug: string;
596
+ };
597
+ query?: never;
598
+ url: '/api/v1/apps/{appSlug}';
599
+ };
600
+ type UpdateAppResponses = {
601
+ /**
602
+ * Updated app
603
+ */
604
+ 200: AppUpdated;
605
+ };
606
+ type UpdateAppResponse = UpdateAppResponses[keyof UpdateAppResponses];
607
+ type ListChannelsData = {
608
+ body?: never;
609
+ path: {
610
+ appSlug: string;
611
+ };
612
+ query?: never;
613
+ url: '/api/v1/apps/{appSlug}/channels';
614
+ };
615
+ type ListChannelsResponses = {
616
+ /**
617
+ * Channel list
618
+ */
619
+ 200: ChannelList;
620
+ };
621
+ type ListChannelsResponse = ListChannelsResponses[keyof ListChannelsResponses];
622
+ type CreateChannelData = {
623
+ body: CreateChannelRequest;
624
+ path: {
625
+ appSlug: string;
626
+ };
627
+ query?: never;
628
+ url: '/api/v1/apps/{appSlug}/channels';
629
+ };
630
+ type CreateChannelResponses = {
631
+ /**
632
+ * Created
633
+ */
634
+ 201: ChannelCreated;
635
+ };
636
+ type CreateChannelResponse = CreateChannelResponses[keyof CreateChannelResponses];
637
+ type DeleteChannelData = {
638
+ body?: never;
639
+ path: {
640
+ appSlug: string;
641
+ channel: string;
642
+ };
643
+ query?: never;
644
+ url: '/api/v1/apps/{appSlug}/channels/{channel}';
645
+ };
646
+ type DeleteChannelResponses = {
647
+ /**
648
+ * Deleted
649
+ */
650
+ 200: OkResponse;
651
+ };
652
+ type DeleteChannelResponse = DeleteChannelResponses[keyof DeleteChannelResponses];
653
+ type SetCurrentVersionData = {
654
+ body: SetCurrentVersionRequest;
655
+ path: {
656
+ appSlug: string;
657
+ channel: string;
658
+ };
659
+ query?: never;
660
+ url: '/api/v1/apps/{appSlug}/channels/{channel}';
661
+ };
662
+ type SetCurrentVersionResponses = {
663
+ /**
664
+ * Updated
665
+ */
666
+ 200: OkResponse;
667
+ };
668
+ type SetCurrentVersionResponse = SetCurrentVersionResponses[keyof SetCurrentVersionResponses];
669
+ type GetChannelTrendData = {
670
+ body?: never;
671
+ path: {
672
+ appSlug: string;
673
+ channel: string;
674
+ };
675
+ query?: {
676
+ range?: 7 | 30 | 90;
677
+ };
678
+ url: '/api/v1/apps/{appSlug}/channels/{channel}/trend';
679
+ };
680
+ type GetChannelTrendResponses = {
681
+ /**
682
+ * Trend series
683
+ */
684
+ 200: ChannelTrend;
685
+ };
686
+ type GetChannelTrendResponse = GetChannelTrendResponses[keyof GetChannelTrendResponses];
687
+ type DeleteVersionData = {
688
+ body?: never;
689
+ path: {
690
+ appSlug: string;
691
+ channel: string;
692
+ version: string;
693
+ };
694
+ query?: never;
695
+ url: '/api/v1/apps/{appSlug}/channels/{channel}/versions/{version}';
696
+ };
697
+ type DeleteVersionResponses = {
698
+ /**
699
+ * Deleted
700
+ */
701
+ 200: OkResponse;
702
+ };
703
+ type DeleteVersionResponse = DeleteVersionResponses[keyof DeleteVersionResponses];
704
+ type GetArtifactData = {
705
+ body?: never;
706
+ path: {
707
+ appSlug: string;
708
+ channel: string;
709
+ version: string;
710
+ filename: string;
711
+ };
712
+ query?: never;
713
+ url: '/api/v1/apps/{appSlug}/channels/{channel}/versions/{version}/artifacts/{filename}';
714
+ };
715
+ type GetArtifactErrors = {
716
+ /**
717
+ * Missing version or file
718
+ */
719
+ 404: Error;
720
+ };
721
+ type GetArtifactError = GetArtifactErrors[keyof GetArtifactErrors];
722
+ type GetReleaseMetadataData = {
723
+ body?: never;
724
+ path: {
725
+ appSlug: string;
726
+ channel: string;
727
+ version: string;
728
+ };
729
+ query?: never;
730
+ url: '/api/v1/apps/{appSlug}/channels/{channel}/versions/{version}/metadata';
731
+ };
732
+ type GetReleaseMetadataErrors = {
733
+ /**
734
+ * Missing or draft
735
+ */
736
+ 404: Error;
737
+ };
738
+ type GetReleaseMetadataError = GetReleaseMetadataErrors[keyof GetReleaseMetadataErrors];
739
+ type GetReleaseMetadataResponses = {
740
+ /**
741
+ * Version and custom metadata
742
+ */
743
+ 200: ReleaseMetadata;
744
+ };
745
+ type GetReleaseMetadataResponse = GetReleaseMetadataResponses[keyof GetReleaseMetadataResponses];
746
+ type ReplaceReleaseMetadataData = {
747
+ body: ReplaceReleaseMetadataRequest;
748
+ path: {
749
+ appSlug: string;
750
+ channel: string;
751
+ version: string;
752
+ };
753
+ query?: never;
754
+ url: '/api/v1/apps/{appSlug}/channels/{channel}/versions/{version}/metadata';
755
+ };
756
+ type ReplaceReleaseMetadataResponses = {
757
+ /**
758
+ * Version and custom metadata
759
+ */
760
+ 200: ReleaseMetadata;
761
+ };
762
+ type ReplaceReleaseMetadataResponse = ReplaceReleaseMetadataResponses[keyof ReplaceReleaseMetadataResponses];
763
+ type GetVersionTrendData = {
764
+ body?: never;
765
+ path: {
766
+ appSlug: string;
767
+ channel: string;
768
+ version: string;
769
+ };
770
+ query?: never;
771
+ url: '/api/v1/apps/{appSlug}/channels/{channel}/versions/{version}/trend';
772
+ };
773
+ type GetVersionTrendResponses = {
774
+ /**
775
+ * Trend series
776
+ */
777
+ 200: VersionTrend;
778
+ };
779
+ type GetVersionTrendResponse = GetVersionTrendResponses[keyof GetVersionTrendResponses];
780
+ type GetEditorNotesData = {
781
+ body?: never;
782
+ path: {
783
+ appSlug: string;
784
+ channel: string;
785
+ version: string;
786
+ };
787
+ query?: never;
788
+ url: '/api/v1/apps/{appSlug}/channels/{channel}/versions/{version}/notes';
789
+ };
790
+ type GetEditorNotesResponses = {
791
+ /**
792
+ * Notes
793
+ */
794
+ 200: EditorNotes;
795
+ };
796
+ type GetEditorNotesResponse = GetEditorNotesResponses[keyof GetEditorNotesResponses];
797
+ type DeleteNoteData = {
798
+ body?: never;
799
+ path: {
800
+ appSlug: string;
801
+ channel: string;
802
+ version: string;
803
+ locale: string;
804
+ };
805
+ query?: never;
806
+ url: '/api/v1/apps/{appSlug}/channels/{channel}/versions/{version}/notes/{locale}';
807
+ };
808
+ type DeleteNoteResponses = {
809
+ /**
810
+ * Deleted
811
+ */
812
+ 200: OkResponse;
813
+ };
814
+ type DeleteNoteResponse = DeleteNoteResponses[keyof DeleteNoteResponses];
815
+ type UpsertNoteData = {
816
+ body: UpsertNoteRequest;
817
+ path: {
818
+ appSlug: string;
819
+ channel: string;
820
+ version: string;
821
+ locale: string;
822
+ };
823
+ query?: never;
824
+ url: '/api/v1/apps/{appSlug}/channels/{channel}/versions/{version}/notes/{locale}';
825
+ };
826
+ type UpsertNoteResponses = {
827
+ /**
828
+ * Saved note
829
+ */
830
+ 200: SavedNote;
831
+ };
832
+ type UpsertNoteResponse = UpsertNoteResponses[keyof UpsertNoteResponses];
833
+ type ListPublicNotesData = {
834
+ body?: never;
835
+ path: {
836
+ appSlug: string;
837
+ channel: string;
838
+ };
839
+ query?: {
840
+ from?: string;
841
+ to?: string;
842
+ locale?: string;
843
+ };
844
+ url: '/api/v1/apps/{appSlug}/channels/{channel}/notes';
845
+ };
846
+ type ListPublicNotesResponses = {
847
+ /**
848
+ * Public notes
849
+ */
850
+ 200: PublicNotes;
851
+ };
852
+ type ListPublicNotesResponse = ListPublicNotesResponses[keyof ListPublicNotesResponses];
853
+ type SaveNotesConfigData = {
854
+ body: SaveNotesConfigRequest;
855
+ path: {
856
+ appSlug: string;
857
+ };
858
+ query?: never;
859
+ url: '/api/v1/apps/{appSlug}/notes-config';
860
+ };
861
+ type SaveNotesConfigResponses = {
862
+ /**
863
+ * Saved config
864
+ */
865
+ 200: NotesConfigResponse;
866
+ };
867
+ type SaveNotesConfigResponse = SaveNotesConfigResponses[keyof SaveNotesConfigResponses];
868
+ type InitUploadData = {
869
+ body: InitUploadRequest;
870
+ path?: never;
871
+ query?: never;
872
+ url: '/api/v1/upload/init';
873
+ };
874
+ type InitUploadResponses = {
875
+ /**
876
+ * uploadId and presigned PUT URLs
877
+ */
878
+ 200: UploadInitResponse;
879
+ };
880
+ type InitUploadResponse = InitUploadResponses[keyof InitUploadResponses];
881
+ type FinalizeUploadData = {
882
+ body: FinalizeUploadRequest;
883
+ path?: never;
884
+ query?: never;
885
+ url: '/api/v1/upload/finalize';
886
+ };
887
+ type FinalizeUploadResponses = {
888
+ /**
889
+ * Version created
890
+ */
891
+ 200: UploadFinalizeResponse;
892
+ };
893
+ type FinalizeUploadResponse = FinalizeUploadResponses[keyof FinalizeUploadResponses];
894
+ type GetChannelFeedData = {
895
+ body?: never;
896
+ path: {
897
+ appSlug: string;
898
+ channel: string;
899
+ };
900
+ query?: never;
901
+ url: '/api/update/{appSlug}/{channel}';
902
+ };
903
+ type GetChannelFeedErrors = {
904
+ /**
905
+ * Missing or draft
906
+ */
907
+ 404: Error;
908
+ };
909
+ type GetChannelFeedError = GetChannelFeedErrors[keyof GetChannelFeedErrors];
910
+ type GetChannelFeedResponses = {
911
+ /**
912
+ * Generated feed document
913
+ */
914
+ 200: TauriFeed;
915
+ };
916
+ type GetChannelFeedResponse = GetChannelFeedResponses[keyof GetChannelFeedResponses];
917
+ type GetFeedFileData = {
918
+ body?: never;
919
+ path: {
920
+ appSlug: string;
921
+ channel: string;
922
+ filename: string;
923
+ };
924
+ query?: never;
925
+ url: '/api/update/{appSlug}/{channel}/{filename}';
926
+ };
927
+ type GetFeedFileErrors = {
928
+ /**
929
+ * Missing or draft
930
+ */
931
+ 404: Error;
932
+ };
933
+ type GetFeedFileError = GetFeedFileErrors[keyof GetFeedFileErrors];
934
+ type GetFeedFileResponses = {
935
+ /**
936
+ * Generated feed document
937
+ */
938
+ 200: TauriFeed;
939
+ };
940
+ type GetFeedFileResponse = GetFeedFileResponses[keyof GetFeedFileResponses];
941
+
942
+ type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean, TResponse = unknown> = Options$1<TData, ThrowOnError, TResponse> & {
943
+ /**
944
+ * You can provide a client instance returned by `createClient()` instead of
945
+ * individual options. This might be also useful if you want to implement a
946
+ * custom client.
947
+ */
948
+ client?: Client;
949
+ /**
950
+ * You can pass arbitrary values through the `meta` object. This can be
951
+ * used to access values that aren't defined as part of the SDK function.
952
+ */
953
+ meta?: keyof ClientMeta extends never ? Record<string, unknown> : ClientMeta;
954
+ };
955
+ /**
956
+ * Get app
957
+ *
958
+ * App detail including channels, versions, and keys.
959
+ */
960
+ declare const getApp: <ThrowOnError extends boolean = false>(options: Options<GetAppData, ThrowOnError>) => RequestResult<GetAppResponses, unknown, ThrowOnError>;
961
+ /**
962
+ * Update app settings
963
+ *
964
+ * Probes S3. API keys may only change `name`. Slug and storage fields are session-only; resubmitting unchanged values is allowed. Changing endpoint/bucket/prefix with existing artifacts probes the newest object at the new location.
965
+ */
966
+ declare const updateApp: <ThrowOnError extends boolean = false>(options: Options<UpdateAppData, ThrowOnError>) => RequestResult<UpdateAppResponses, unknown, ThrowOnError>;
967
+ /**
968
+ * List channels
969
+ */
970
+ declare const listChannels: <ThrowOnError extends boolean = false>(options: Options<ListChannelsData, ThrowOnError>) => RequestResult<ListChannelsResponses, unknown, ThrowOnError>;
971
+ /**
972
+ * Create a channel
973
+ */
974
+ declare const createChannel: <ThrowOnError extends boolean = false>(options: Options<CreateChannelData, ThrowOnError>) => RequestResult<CreateChannelResponses, unknown, ThrowOnError>;
975
+ /**
976
+ * Delete a channel
977
+ *
978
+ * Deletes the channel and its objects.
979
+ */
980
+ declare const deleteChannel: <ThrowOnError extends boolean = false>(options: Options<DeleteChannelData, ThrowOnError>) => RequestResult<DeleteChannelResponses, unknown, ThrowOnError>;
981
+ /**
982
+ * Set current version
983
+ *
984
+ * Promote a draft (`currentVersion`) or roll back to a released version.
985
+ */
986
+ declare const setCurrentVersion: <ThrowOnError extends boolean = false>(options: Options<SetCurrentVersionData, ThrowOnError>) => RequestResult<SetCurrentVersionResponses, unknown, ThrowOnError>;
987
+ /**
988
+ * Channel hit trend
989
+ */
990
+ declare const getChannelTrend: <ThrowOnError extends boolean = false>(options: Options<GetChannelTrendData, ThrowOnError>) => RequestResult<GetChannelTrendResponses, unknown, ThrowOnError>;
991
+ /**
992
+ * Delete a version
993
+ *
994
+ * Deletes the version and its objects.
995
+ */
996
+ declare const deleteVersion: <ThrowOnError extends boolean = false>(options: Options<DeleteVersionData, ThrowOnError>) => RequestResult<DeleteVersionResponses, unknown, ThrowOnError>;
997
+ /**
998
+ * Get artifact
999
+ *
1000
+ * Presigned GET for one artifact on that version (drafts included). Does not increment hits.
1001
+ */
1002
+ declare const getArtifact: <ThrowOnError extends boolean = false>(options: Options<GetArtifactData, ThrowOnError>) => RequestResult<unknown, GetArtifactErrors, ThrowOnError>;
1003
+ /**
1004
+ * Get release metadata
1005
+ *
1006
+ * Read custom metadata for an exact version. Released versions are public; drafts require a session or bound app key. Explicit Authorization is validated (401/403). Returns no-store and does not increment update checks. Independent of release log.
1007
+ */
1008
+ declare const getReleaseMetadata: <ThrowOnError extends boolean = false>(options: Options<GetReleaseMetadataData, ThrowOnError>) => RequestResult<GetReleaseMetadataResponses, GetReleaseMetadataErrors, ThrowOnError>;
1009
+ /**
1010
+ * Replace release metadata
1011
+ *
1012
+ * Replace the whole metadata object (16 KiB UTF-8 JSON); {} clears it. Last write wins.
1013
+ */
1014
+ declare const replaceReleaseMetadata: <ThrowOnError extends boolean = false>(options: Options<ReplaceReleaseMetadataData, ThrowOnError>) => RequestResult<ReplaceReleaseMetadataResponses, unknown, ThrowOnError>;
1015
+ /**
1016
+ * Version hit trend
1017
+ *
1018
+ * Empty for drafts.
1019
+ */
1020
+ declare const getVersionTrend: <ThrowOnError extends boolean = false>(options: Options<GetVersionTrendData, ThrowOnError>) => RequestResult<GetVersionTrendResponses, unknown, ThrowOnError>;
1021
+ /**
1022
+ * Get editor notes
1023
+ *
1024
+ * Every locale for one version.
1025
+ */
1026
+ declare const getEditorNotes: <ThrowOnError extends boolean = false>(options: Options<GetEditorNotesData, ThrowOnError>) => RequestResult<GetEditorNotesResponses, unknown, ThrowOnError>;
1027
+ /**
1028
+ * Delete a locale note
1029
+ */
1030
+ declare const deleteNote: <ThrowOnError extends boolean = false>(options: Options<DeleteNoteData, ThrowOnError>) => RequestResult<DeleteNoteResponses, unknown, ThrowOnError>;
1031
+ /**
1032
+ * Upsert a locale note
1033
+ */
1034
+ declare const upsertNote: <ThrowOnError extends boolean = false>(options: Options<UpsertNoteData, ThrowOnError>) => RequestResult<UpsertNoteResponses, unknown, ThrowOnError>;
1035
+ /**
1036
+ * Get public notes
1037
+ *
1038
+ * Released versions only; no auth.
1039
+ */
1040
+ declare const listPublicNotes: <ThrowOnError extends boolean = false>(options: Options<ListPublicNotesData, ThrowOnError>) => RequestResult<ListPublicNotesResponses, unknown, ThrowOnError>;
1041
+ /**
1042
+ * Save notes config
1043
+ *
1044
+ * Saves release-log config without an S3 probe.
1045
+ */
1046
+ declare const saveNotesConfig: <ThrowOnError extends boolean = false>(options: Options<SaveNotesConfigData, ThrowOnError>) => RequestResult<SaveNotesConfigResponses, unknown, ThrowOnError>;
1047
+ /**
1048
+ * Start upload
1049
+ *
1050
+ * Start a pending upload. Electron requires at least one `.yml`; Tauri requires `latest.json` and/or artifact+`.sig` pairs; Sparkle requires `appcast.xml` and/or archive+`.sig` (see spec).
1051
+ */
1052
+ declare const initUpload: <ThrowOnError extends boolean = false>(options: Options<InitUploadData, ThrowOnError>) => RequestResult<InitUploadResponses, unknown, ThrowOnError>;
1053
+ /**
1054
+ * Finalize upload
1055
+ *
1056
+ * Creates a version. Default is draft; `release: true` goes live.
1057
+ */
1058
+ declare const finalizeUpload: <ThrowOnError extends boolean = false>(options: Options<FinalizeUploadData, ThrowOnError>) => RequestResult<FinalizeUploadResponses, unknown, ThrowOnError>;
1059
+ /**
1060
+ * Get channel feed
1061
+ *
1062
+ * Tauri returns JSON; Sparkle returns a one-item appcast.
1063
+ */
1064
+ declare const getChannelFeed: <ThrowOnError extends boolean = false>(options: Options<GetChannelFeedData, ThrowOnError>) => RequestResult<GetChannelFeedResponses, GetChannelFeedErrors, ThrowOnError>;
1065
+ /**
1066
+ * Get public feed
1067
+ *
1068
+ * Electron yml / Tauri latest.json / Sparkle appcast; artifacts 302. Drafts are 404.
1069
+ */
1070
+ declare const getFeedFile: <ThrowOnError extends boolean = false>(options: Options<GetFeedFileData, ThrowOnError>) => RequestResult<GetFeedFileResponses, GetFeedFileErrors, ThrowOnError>;
1071
+
1072
+ interface ShukkaClientOptions {
1073
+ /** Instance origin, for example `https://updates.example.com`. */
1074
+ baseUrl: string;
1075
+ /** App-scoped API key (`shk_…`). Omit for the public feed and notes operations. */
1076
+ apiKey?: string;
1077
+ /** Custom fetch implementation (tests, proxies, non-standard runtimes). */
1078
+ fetch?: typeof globalThis.fetch;
1079
+ }
1080
+ declare function createShukkaClient(options: ShukkaClientOptions): {
1081
+ client: Client;
1082
+ getApp: <T extends boolean = false>(input: Omit<Options<GetAppData, T>, "client">) => RequestResult<GetAppResponses, unknown, T, "fields">;
1083
+ updateApp: <T extends boolean = false>(input: Omit<Options<UpdateAppData, T>, "client">) => RequestResult<UpdateAppResponses, unknown, T, "fields">;
1084
+ listChannels: <T extends boolean = false>(input: Omit<Options<ListChannelsData, T>, "client">) => RequestResult<ListChannelsResponses, unknown, T, "fields">;
1085
+ createChannel: <T extends boolean = false>(input: Omit<Options<CreateChannelData, T>, "client">) => RequestResult<CreateChannelResponses, unknown, T, "fields">;
1086
+ setCurrentVersion: <T extends boolean = false>(input: Omit<Options<SetCurrentVersionData, T>, "client">) => RequestResult<SetCurrentVersionResponses, unknown, T, "fields">;
1087
+ deleteChannel: <T extends boolean = false>(input: Omit<Options<DeleteChannelData, T>, "client">) => RequestResult<DeleteChannelResponses, unknown, T, "fields">;
1088
+ getChannelTrend: <T extends boolean = false>(input: Omit<Options<GetChannelTrendData, T>, "client">) => RequestResult<GetChannelTrendResponses, unknown, T, "fields">;
1089
+ deleteVersion: <T extends boolean = false>(input: Omit<Options<DeleteVersionData, T>, "client">) => RequestResult<DeleteVersionResponses, unknown, T, "fields">;
1090
+ getArtifact: <T extends boolean = false>(input: Omit<Options<GetArtifactData, T>, "client">) => RequestResult<unknown, GetArtifactErrors, T, "fields">;
1091
+ getReleaseMetadata: <T extends boolean = false>(input: Omit<Options<GetReleaseMetadataData, T>, "client">) => RequestResult<GetReleaseMetadataResponses, GetReleaseMetadataErrors, T, "fields">;
1092
+ replaceReleaseMetadata: <T extends boolean = false>(input: Omit<Options<ReplaceReleaseMetadataData, T>, "client">) => RequestResult<ReplaceReleaseMetadataResponses, unknown, T, "fields">;
1093
+ getVersionTrend: <T extends boolean = false>(input: Omit<Options<GetVersionTrendData, T>, "client">) => RequestResult<GetVersionTrendResponses, unknown, T, "fields">;
1094
+ getEditorNotes: <T extends boolean = false>(input: Omit<Options<GetEditorNotesData, T>, "client">) => RequestResult<GetEditorNotesResponses, unknown, T, "fields">;
1095
+ upsertNote: <T extends boolean = false>(input: Omit<Options<UpsertNoteData, T>, "client">) => RequestResult<UpsertNoteResponses, unknown, T, "fields">;
1096
+ deleteNote: <T extends boolean = false>(input: Omit<Options<DeleteNoteData, T>, "client">) => RequestResult<DeleteNoteResponses, unknown, T, "fields">;
1097
+ listPublicNotes: <T extends boolean = false>(input: Omit<Options<ListPublicNotesData, T>, "client">) => RequestResult<ListPublicNotesResponses, unknown, T, "fields">;
1098
+ saveNotesConfig: <T extends boolean = false>(input: Omit<Options<SaveNotesConfigData, T>, "client">) => RequestResult<SaveNotesConfigResponses, unknown, T, "fields">;
1099
+ initUpload: <T extends boolean = false>(input: Omit<Options<InitUploadData, T>, "client">) => RequestResult<InitUploadResponses, unknown, T, "fields">;
1100
+ finalizeUpload: <T extends boolean = false>(input: Omit<Options<FinalizeUploadData, T>, "client">) => RequestResult<FinalizeUploadResponses, unknown, T, "fields">;
1101
+ getChannelFeed: <T extends boolean = false>(input: Omit<Options<GetChannelFeedData, T>, "client">) => RequestResult<GetChannelFeedResponses, GetChannelFeedErrors, T, "fields">;
1102
+ getFeedFile: <T extends boolean = false>(input: Omit<Options<GetFeedFileData, T>, "client">) => RequestResult<GetFeedFileResponses, GetFeedFileErrors, T, "fields">;
1103
+ };
1104
+ type ShukkaClient = ReturnType<typeof createShukkaClient>;
1105
+
1106
+ export { type AppDetail, type AppUpdateRequest, type AppUpdated, type ChannelCreated, type ChannelList, type ChannelTrend, type ClientOptions, type CreateChannelData, type CreateChannelRequest, type CreateChannelResponse, type CreateChannelResponses, type DeleteChannelData, type DeleteChannelResponse, type DeleteChannelResponses, type DeleteNoteData, type DeleteNoteResponse, type DeleteNoteResponses, type DeleteVersionData, type DeleteVersionResponse, type DeleteVersionResponses, type EditorNotes, type Error, type FinalizeUploadData, type FinalizeUploadRequest, type FinalizeUploadResponse, type FinalizeUploadResponses, type GetAppData, type GetAppResponse, type GetAppResponses, type GetArtifactData, type GetArtifactError, type GetArtifactErrors, type GetChannelFeedData, type GetChannelFeedError, type GetChannelFeedErrors, type GetChannelFeedResponse, type GetChannelFeedResponses, type GetChannelTrendData, type GetChannelTrendResponse, type GetChannelTrendResponses, type GetEditorNotesData, type GetEditorNotesResponse, type GetEditorNotesResponses, type GetFeedFileData, type GetFeedFileError, type GetFeedFileErrors, type GetFeedFileResponse, type GetFeedFileResponses, type GetReleaseMetadataData, type GetReleaseMetadataError, type GetReleaseMetadataErrors, type GetReleaseMetadataResponse, type GetReleaseMetadataResponses, type GetVersionTrendData, type GetVersionTrendResponse, type GetVersionTrendResponses, type InitUploadData, type InitUploadRequest, type InitUploadResponse, type InitUploadResponses, type ListChannelsData, type ListChannelsResponse, type ListChannelsResponses, type ListPublicNotesData, type ListPublicNotesResponse, type ListPublicNotesResponses, type NotesConfigResponse, type OkResponse, type Options, type PublicNotes, type ReleaseMetadata, type ReplaceReleaseMetadataData, type ReplaceReleaseMetadataRequest, type ReplaceReleaseMetadataResponse, type ReplaceReleaseMetadataResponses, type SaveNotesConfigData, type SaveNotesConfigRequest, type SaveNotesConfigResponse, type SaveNotesConfigResponses, type SavedNote, type SetCurrentVersionData, type SetCurrentVersionRequest, type SetCurrentVersionResponse, type SetCurrentVersionResponses, type ShukkaClient, type ShukkaClientOptions, type TauriFeed, type UpdateAppData, type UpdateAppResponse, type UpdateAppResponses, type UploadFinalizeResponse, type UploadInitResponse, type UpsertNoteData, type UpsertNoteRequest, type UpsertNoteResponse, type UpsertNoteResponses, type VersionTrend, createChannel, createShukkaClient, deleteChannel, deleteNote, deleteVersion, finalizeUpload, getApp, getArtifact, getChannelFeed, getChannelTrend, getEditorNotes, getFeedFile, getReleaseMetadata, getVersionTrend, initUpload, listChannels, listPublicNotes, replaceReleaseMetadata, saveNotesConfig, setCurrentVersion, updateApp, upsertNote };