@krovacloud/sdk 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,1674 @@
1
+ import { Client } from 'openapi-fetch';
2
+
3
+ /**
4
+ * This file was auto-generated by openapi-typescript.
5
+ * Do not make direct changes to the file.
6
+ */
7
+ interface paths {
8
+ "/regions": {
9
+ parameters: {
10
+ query?: never;
11
+ header?: never;
12
+ path?: never;
13
+ cookie?: never;
14
+ };
15
+ /** List regions with available capacity */
16
+ get: {
17
+ parameters: {
18
+ query?: never;
19
+ header?: never;
20
+ path?: never;
21
+ cookie?: never;
22
+ };
23
+ requestBody?: never;
24
+ responses: {
25
+ /** @description Region list */
26
+ 200: {
27
+ headers: {
28
+ [name: string]: unknown;
29
+ };
30
+ content: {
31
+ "application/json": Record<string, never>;
32
+ };
33
+ };
34
+ };
35
+ };
36
+ put?: never;
37
+ post?: never;
38
+ delete?: never;
39
+ options?: never;
40
+ head?: never;
41
+ patch?: never;
42
+ trace?: never;
43
+ };
44
+ "/images": {
45
+ parameters: {
46
+ query?: never;
47
+ header?: never;
48
+ path?: never;
49
+ cookie?: never;
50
+ };
51
+ /** List available OS images */
52
+ get: {
53
+ parameters: {
54
+ query?: never;
55
+ header?: never;
56
+ path?: never;
57
+ cookie?: never;
58
+ };
59
+ requestBody?: never;
60
+ responses: {
61
+ /** @description Image list */
62
+ 200: {
63
+ headers: {
64
+ [name: string]: unknown;
65
+ };
66
+ content: {
67
+ "application/json": Record<string, never>;
68
+ };
69
+ };
70
+ };
71
+ };
72
+ put?: never;
73
+ post?: never;
74
+ delete?: never;
75
+ options?: never;
76
+ head?: never;
77
+ patch?: never;
78
+ trace?: never;
79
+ };
80
+ "/pricing": {
81
+ parameters: {
82
+ query?: never;
83
+ header?: never;
84
+ path?: never;
85
+ cookie?: never;
86
+ };
87
+ /** Per-resource hourly rates and volume pricing tiers */
88
+ get: {
89
+ parameters: {
90
+ query?: never;
91
+ header?: never;
92
+ path?: never;
93
+ cookie?: never;
94
+ };
95
+ requestBody?: never;
96
+ responses: {
97
+ /** @description Pricing data */
98
+ 200: {
99
+ headers: {
100
+ [name: string]: unknown;
101
+ };
102
+ content: {
103
+ "application/json": Record<string, never>;
104
+ };
105
+ };
106
+ };
107
+ };
108
+ put?: never;
109
+ post?: never;
110
+ delete?: never;
111
+ options?: never;
112
+ head?: never;
113
+ patch?: never;
114
+ trace?: never;
115
+ };
116
+ "/spaces/{spaceId}/cubes": {
117
+ parameters: {
118
+ query?: never;
119
+ header?: never;
120
+ path?: never;
121
+ cookie?: never;
122
+ };
123
+ /** List Cubes in a Space */
124
+ get: {
125
+ parameters: {
126
+ query?: never;
127
+ header?: never;
128
+ path: {
129
+ spaceId: string;
130
+ };
131
+ cookie?: never;
132
+ };
133
+ requestBody?: never;
134
+ responses: {
135
+ /** @description Paginated Cube list */
136
+ 200: {
137
+ headers: {
138
+ [name: string]: unknown;
139
+ };
140
+ content: {
141
+ "application/json": Record<string, never>;
142
+ };
143
+ };
144
+ 401: components["responses"]["Unauthorized"];
145
+ 403: components["responses"]["Forbidden"];
146
+ };
147
+ };
148
+ put?: never;
149
+ /** Create a Cube */
150
+ post: {
151
+ parameters: {
152
+ query?: never;
153
+ header?: {
154
+ /** @description Optional unique key (max 255 chars). Replays return the original response and add header Idempotency-Replayed: true. Scoped per space; expires after 24h. */
155
+ "Idempotency-Key"?: string;
156
+ };
157
+ path: {
158
+ spaceId: string;
159
+ };
160
+ cookie?: never;
161
+ };
162
+ requestBody: {
163
+ content: {
164
+ "application/json": {
165
+ name: string;
166
+ image: string;
167
+ resources: {
168
+ vcpu: number;
169
+ ramGb: number;
170
+ diskGb: number;
171
+ };
172
+ /** @description SSH public key written to /root/.ssh/authorized_keys at boot. Must start with ssh-ed25519, ssh-rsa, ecdsa-sha2-*, ssh-dss, or sk-*@openssh.com. */
173
+ sshPublicKey: string;
174
+ /** @description Region slug from /v1/regions (optional). */
175
+ region?: string;
176
+ /** @description cloud-init script (max 16 KB, optional). */
177
+ userData?: string;
178
+ };
179
+ };
180
+ };
181
+ responses: {
182
+ /** @description Cube created */
183
+ 201: {
184
+ headers: {
185
+ [name: string]: unknown;
186
+ };
187
+ content: {
188
+ "application/json": {
189
+ cube?: components["schemas"]["Cube"];
190
+ };
191
+ };
192
+ };
193
+ 400: components["responses"]["BadRequest"];
194
+ 401: components["responses"]["Unauthorized"];
195
+ 403: components["responses"]["Forbidden"];
196
+ 429: components["responses"]["RateLimited"];
197
+ };
198
+ };
199
+ delete?: never;
200
+ options?: never;
201
+ head?: never;
202
+ patch?: never;
203
+ trace?: never;
204
+ };
205
+ "/spaces/{spaceId}/cubes/{cubeId}": {
206
+ parameters: {
207
+ query?: never;
208
+ header?: never;
209
+ path?: never;
210
+ cookie?: never;
211
+ };
212
+ /** Get a Cube */
213
+ get: {
214
+ parameters: {
215
+ query?: never;
216
+ header?: never;
217
+ path: {
218
+ spaceId: string;
219
+ cubeId: string;
220
+ };
221
+ cookie?: never;
222
+ };
223
+ requestBody?: never;
224
+ responses: {
225
+ /** @description Cube */
226
+ 200: {
227
+ headers: {
228
+ [name: string]: unknown;
229
+ };
230
+ content: {
231
+ "application/json": Record<string, never>;
232
+ };
233
+ };
234
+ 404: components["responses"]["NotFound"];
235
+ };
236
+ };
237
+ put?: never;
238
+ post?: never;
239
+ /** Delete a Cube (asynchronous) */
240
+ delete: {
241
+ parameters: {
242
+ query?: never;
243
+ header?: never;
244
+ path: {
245
+ spaceId: string;
246
+ cubeId: string;
247
+ };
248
+ cookie?: never;
249
+ };
250
+ requestBody?: never;
251
+ responses: {
252
+ /** @description Deletion enqueued */
253
+ 200: {
254
+ headers: {
255
+ [name: string]: unknown;
256
+ };
257
+ content: {
258
+ "application/json": Record<string, never>;
259
+ };
260
+ };
261
+ 404: components["responses"]["NotFound"];
262
+ 429: components["responses"]["RateLimited"];
263
+ };
264
+ };
265
+ options?: never;
266
+ head?: never;
267
+ patch?: never;
268
+ trace?: never;
269
+ };
270
+ "/spaces/{spaceId}/cubes/{cubeId}/sleep": {
271
+ parameters: {
272
+ query?: never;
273
+ header?: never;
274
+ path?: never;
275
+ cookie?: never;
276
+ };
277
+ get?: never;
278
+ put?: never;
279
+ /** Sleep a running Cube */
280
+ post: {
281
+ parameters: {
282
+ query?: never;
283
+ header?: never;
284
+ path: {
285
+ spaceId: string;
286
+ cubeId: string;
287
+ };
288
+ cookie?: never;
289
+ };
290
+ requestBody?: never;
291
+ responses: {
292
+ /** @description Sleep enqueued */
293
+ 200: {
294
+ headers: {
295
+ [name: string]: unknown;
296
+ };
297
+ content?: never;
298
+ };
299
+ 404: components["responses"]["NotFound"];
300
+ 429: components["responses"]["RateLimited"];
301
+ };
302
+ };
303
+ delete?: never;
304
+ options?: never;
305
+ head?: never;
306
+ patch?: never;
307
+ trace?: never;
308
+ };
309
+ "/spaces/{spaceId}/cubes/{cubeId}/wake": {
310
+ parameters: {
311
+ query?: never;
312
+ header?: never;
313
+ path?: never;
314
+ cookie?: never;
315
+ };
316
+ get?: never;
317
+ put?: never;
318
+ /** Wake a sleeping Cube */
319
+ post: {
320
+ parameters: {
321
+ query?: never;
322
+ header?: never;
323
+ path: {
324
+ spaceId: string;
325
+ cubeId: string;
326
+ };
327
+ cookie?: never;
328
+ };
329
+ requestBody?: never;
330
+ responses: {
331
+ /** @description Wake enqueued */
332
+ 200: {
333
+ headers: {
334
+ [name: string]: unknown;
335
+ };
336
+ content?: never;
337
+ };
338
+ 404: components["responses"]["NotFound"];
339
+ 429: components["responses"]["RateLimited"];
340
+ };
341
+ };
342
+ delete?: never;
343
+ options?: never;
344
+ head?: never;
345
+ patch?: never;
346
+ trace?: never;
347
+ };
348
+ "/spaces/{spaceId}/cubes/{cubeId}/ssh-port": {
349
+ parameters: {
350
+ query?: never;
351
+ header?: never;
352
+ path?: never;
353
+ cookie?: never;
354
+ };
355
+ get?: never;
356
+ /**
357
+ * Change a Cube's SSH port
358
+ * @description Sets the host port the Cube's SSH is reachable on. The change is applied atomically (the old port mapping is replaced).
359
+ */
360
+ put: {
361
+ parameters: {
362
+ query?: never;
363
+ header?: never;
364
+ path: {
365
+ spaceId: string;
366
+ cubeId: string;
367
+ };
368
+ cookie?: never;
369
+ };
370
+ requestBody: {
371
+ content: {
372
+ "application/json": {
373
+ /** @description The new SSH port. */
374
+ cubePort: number;
375
+ };
376
+ };
377
+ };
378
+ responses: {
379
+ /** @description SSH port updated */
380
+ 200: {
381
+ headers: {
382
+ [name: string]: unknown;
383
+ };
384
+ content?: never;
385
+ };
386
+ 400: components["responses"]["BadRequest"];
387
+ 404: components["responses"]["NotFound"];
388
+ 429: components["responses"]["RateLimited"];
389
+ };
390
+ };
391
+ post?: never;
392
+ delete?: never;
393
+ options?: never;
394
+ head?: never;
395
+ patch?: never;
396
+ trace?: never;
397
+ };
398
+ "/spaces/{spaceId}/cubes/{cubeId}/domains": {
399
+ parameters: {
400
+ query?: never;
401
+ header?: never;
402
+ path?: never;
403
+ cookie?: never;
404
+ };
405
+ /** List custom domains attached to a Cube */
406
+ get: {
407
+ parameters: {
408
+ query?: never;
409
+ header?: never;
410
+ path: {
411
+ spaceId: string;
412
+ cubeId: string;
413
+ };
414
+ cookie?: never;
415
+ };
416
+ requestBody?: never;
417
+ responses: {
418
+ /** @description Domain list */
419
+ 200: {
420
+ headers: {
421
+ [name: string]: unknown;
422
+ };
423
+ content?: never;
424
+ };
425
+ };
426
+ };
427
+ put?: never;
428
+ /**
429
+ * Attach a custom domain to a Cube
430
+ * @description Attaches a domain and optionally configures any per-domain proxy settings at the same time. Settings can also be changed later via PATCH.
431
+ */
432
+ post: {
433
+ parameters: {
434
+ query?: never;
435
+ header?: {
436
+ /** @description Optional unique key (max 255 chars). Replays return the original response and add header Idempotency-Replayed: true. Scoped per space; expires after 24h. */
437
+ "Idempotency-Key"?: string;
438
+ };
439
+ path: {
440
+ spaceId: string;
441
+ cubeId: string;
442
+ };
443
+ cookie?: never;
444
+ };
445
+ requestBody: {
446
+ content: {
447
+ "application/json": {
448
+ /** @description The hostname to attach, e.g. app.example.com */
449
+ domain: string;
450
+ /** @description The Cube port the domain proxies to. */
451
+ port: number;
452
+ /**
453
+ * @description enforced = proxy sets platform security headers (HSTS, X-Frame-Options, …); app_managed = the app's own headers pass through. Default enforced.
454
+ * @enum {string}
455
+ */
456
+ securityHeadersMode?: "enforced" | "app_managed";
457
+ /** @description Seconds the app may take to send response headers (streaming unaffected). Default 60. */
458
+ responseHeaderTimeoutSecs?: number;
459
+ /** @description Header rewrites: `set` adds/overwrites, `remove` deletes. Null clears all. */
460
+ responseHeaderOverrides?: {
461
+ set?: {
462
+ [key: string]: string;
463
+ };
464
+ remove?: string[];
465
+ } | null;
466
+ /** @description Header rewrites: `set` adds/overwrites, `remove` deletes. Null clears all. */
467
+ requestHeaderOverrides?: {
468
+ set?: {
469
+ [key: string]: string;
470
+ };
471
+ remove?: string[];
472
+ } | null;
473
+ /** @description Max request body size (MB). Null = unlimited (default). */
474
+ maxRequestBodyMb?: number | null;
475
+ /** @description Edge gzip/zstd compression. Default false (domains behind a CDN are already compressed there). */
476
+ responseCompression?: boolean;
477
+ /** @description Visitor IP/CIDR allow-list (v4+v6). Non-empty ⇒ only these reach the app. Null/empty = open. */
478
+ ipAllowList?: string[] | null;
479
+ /** @description Visitor IP/CIDR deny-list (v4+v6) → 403. Null/empty = none. */
480
+ ipDenyList?: string[] | null;
481
+ /** @description HTTP Basic Auth username. Null/empty clears Basic Auth. Setting it requires basicAuthPassword. */
482
+ basicAuthUser?: string | null;
483
+ /** @description Plaintext Basic Auth password — bcrypt-hashed server-side, never stored or returned. Required when setting basicAuthUser. */
484
+ basicAuthPassword?: string;
485
+ };
486
+ };
487
+ };
488
+ responses: {
489
+ /** @description Domain attached */
490
+ 201: {
491
+ headers: {
492
+ [name: string]: unknown;
493
+ };
494
+ content?: never;
495
+ };
496
+ 400: components["responses"]["BadRequest"];
497
+ 429: components["responses"]["RateLimited"];
498
+ };
499
+ };
500
+ delete?: never;
501
+ options?: never;
502
+ head?: never;
503
+ patch?: never;
504
+ trace?: never;
505
+ };
506
+ "/spaces/{spaceId}/cubes/{cubeId}/domains/{mappingId}": {
507
+ parameters: {
508
+ query?: never;
509
+ header?: never;
510
+ path?: never;
511
+ cookie?: never;
512
+ };
513
+ get?: never;
514
+ put?: never;
515
+ post?: never;
516
+ /** Detach a custom domain */
517
+ delete: {
518
+ parameters: {
519
+ query?: never;
520
+ header?: never;
521
+ path: {
522
+ spaceId: string;
523
+ cubeId: string;
524
+ mappingId: string;
525
+ };
526
+ cookie?: never;
527
+ };
528
+ requestBody?: never;
529
+ responses: {
530
+ /** @description Detached */
531
+ 200: {
532
+ headers: {
533
+ [name: string]: unknown;
534
+ };
535
+ content?: never;
536
+ };
537
+ 404: components["responses"]["NotFound"];
538
+ };
539
+ };
540
+ options?: never;
541
+ head?: never;
542
+ /**
543
+ * Update a custom domain's proxy settings
544
+ * @description Partial update — only the fields you send change; omitted fields are left as-is. The Basic Auth password is write-only and bcrypt-hashed server-side.
545
+ */
546
+ patch: {
547
+ parameters: {
548
+ query?: never;
549
+ header?: never;
550
+ path: {
551
+ spaceId: string;
552
+ cubeId: string;
553
+ mappingId: string;
554
+ };
555
+ cookie?: never;
556
+ };
557
+ requestBody: {
558
+ content: {
559
+ "application/json": {
560
+ /**
561
+ * @description enforced = proxy sets platform security headers (HSTS, X-Frame-Options, …); app_managed = the app's own headers pass through. Default enforced.
562
+ * @enum {string}
563
+ */
564
+ securityHeadersMode?: "enforced" | "app_managed";
565
+ /** @description Seconds the app may take to send response headers (streaming unaffected). Default 60. */
566
+ responseHeaderTimeoutSecs?: number;
567
+ /** @description Header rewrites: `set` adds/overwrites, `remove` deletes. Null clears all. */
568
+ responseHeaderOverrides?: {
569
+ set?: {
570
+ [key: string]: string;
571
+ };
572
+ remove?: string[];
573
+ } | null;
574
+ /** @description Header rewrites: `set` adds/overwrites, `remove` deletes. Null clears all. */
575
+ requestHeaderOverrides?: {
576
+ set?: {
577
+ [key: string]: string;
578
+ };
579
+ remove?: string[];
580
+ } | null;
581
+ /** @description Max request body size (MB). Null = unlimited (default). */
582
+ maxRequestBodyMb?: number | null;
583
+ /** @description Edge gzip/zstd compression. Default false (domains behind a CDN are already compressed there). */
584
+ responseCompression?: boolean;
585
+ /** @description Visitor IP/CIDR allow-list (v4+v6). Non-empty ⇒ only these reach the app. Null/empty = open. */
586
+ ipAllowList?: string[] | null;
587
+ /** @description Visitor IP/CIDR deny-list (v4+v6) → 403. Null/empty = none. */
588
+ ipDenyList?: string[] | null;
589
+ /** @description HTTP Basic Auth username. Null/empty clears Basic Auth. Setting it requires basicAuthPassword. */
590
+ basicAuthUser?: string | null;
591
+ /** @description Plaintext Basic Auth password — bcrypt-hashed server-side, never stored or returned. Required when setting basicAuthUser. */
592
+ basicAuthPassword?: string;
593
+ };
594
+ };
595
+ };
596
+ responses: {
597
+ /** @description Settings updated */
598
+ 200: {
599
+ headers: {
600
+ [name: string]: unknown;
601
+ };
602
+ content?: never;
603
+ };
604
+ 400: components["responses"]["BadRequest"];
605
+ 404: components["responses"]["NotFound"];
606
+ 429: components["responses"]["RateLimited"];
607
+ };
608
+ };
609
+ trace?: never;
610
+ };
611
+ "/spaces/{spaceId}/cubes/{cubeId}/tcp-mappings": {
612
+ parameters: {
613
+ query?: never;
614
+ header?: never;
615
+ path?: never;
616
+ cookie?: never;
617
+ };
618
+ /** List TCP port forwards for a Cube */
619
+ get: {
620
+ parameters: {
621
+ query?: never;
622
+ header?: never;
623
+ path: {
624
+ spaceId: string;
625
+ cubeId: string;
626
+ };
627
+ cookie?: never;
628
+ };
629
+ requestBody?: never;
630
+ responses: {
631
+ /** @description TCP mapping list */
632
+ 200: {
633
+ headers: {
634
+ [name: string]: unknown;
635
+ };
636
+ content?: never;
637
+ };
638
+ };
639
+ };
640
+ put?: never;
641
+ /** Create a TCP port forward */
642
+ post: {
643
+ parameters: {
644
+ query?: never;
645
+ header?: {
646
+ /** @description Optional unique key (max 255 chars). Replays return the original response and add header Idempotency-Replayed: true. Scoped per space; expires after 24h. */
647
+ "Idempotency-Key"?: string;
648
+ };
649
+ path: {
650
+ spaceId: string;
651
+ cubeId: string;
652
+ };
653
+ cookie?: never;
654
+ };
655
+ requestBody: {
656
+ content: {
657
+ "application/json": {
658
+ cubePort: number;
659
+ whitelistIps?: string[];
660
+ };
661
+ };
662
+ };
663
+ responses: {
664
+ /** @description Mapping created */
665
+ 201: {
666
+ headers: {
667
+ [name: string]: unknown;
668
+ };
669
+ content?: never;
670
+ };
671
+ 400: components["responses"]["BadRequest"];
672
+ 429: components["responses"]["RateLimited"];
673
+ };
674
+ };
675
+ delete?: never;
676
+ options?: never;
677
+ head?: never;
678
+ patch?: never;
679
+ trace?: never;
680
+ };
681
+ "/spaces/{spaceId}/cubes/{cubeId}/tcp-mappings/{mappingId}": {
682
+ parameters: {
683
+ query?: never;
684
+ header?: never;
685
+ path?: never;
686
+ cookie?: never;
687
+ };
688
+ get?: never;
689
+ put?: never;
690
+ post?: never;
691
+ /** Delete a TCP port forward */
692
+ delete: {
693
+ parameters: {
694
+ query?: never;
695
+ header?: never;
696
+ path: {
697
+ spaceId: string;
698
+ cubeId: string;
699
+ mappingId: string;
700
+ };
701
+ cookie?: never;
702
+ };
703
+ requestBody?: never;
704
+ responses: {
705
+ /** @description Deleted */
706
+ 200: {
707
+ headers: {
708
+ [name: string]: unknown;
709
+ };
710
+ content?: never;
711
+ };
712
+ 404: components["responses"]["NotFound"];
713
+ };
714
+ };
715
+ options?: never;
716
+ head?: never;
717
+ patch?: never;
718
+ trace?: never;
719
+ };
720
+ "/spaces/{spaceId}/cubes/{cubeId}/snapshots": {
721
+ parameters: {
722
+ query?: never;
723
+ header?: never;
724
+ path?: never;
725
+ cookie?: never;
726
+ };
727
+ /** List snapshots for a Cube */
728
+ get: {
729
+ parameters: {
730
+ query?: never;
731
+ header?: never;
732
+ path: {
733
+ spaceId: string;
734
+ cubeId: string;
735
+ };
736
+ cookie?: never;
737
+ };
738
+ requestBody?: never;
739
+ responses: {
740
+ /** @description Snapshot list */
741
+ 200: {
742
+ headers: {
743
+ [name: string]: unknown;
744
+ };
745
+ content?: never;
746
+ };
747
+ };
748
+ };
749
+ put?: never;
750
+ /** Create a snapshot */
751
+ post: {
752
+ parameters: {
753
+ query?: never;
754
+ header?: {
755
+ /** @description Optional unique key (max 255 chars). Replays return the original response and add header Idempotency-Replayed: true. Scoped per space; expires after 24h. */
756
+ "Idempotency-Key"?: string;
757
+ };
758
+ path: {
759
+ spaceId: string;
760
+ cubeId: string;
761
+ };
762
+ cookie?: never;
763
+ };
764
+ requestBody?: {
765
+ content: {
766
+ "application/json": {
767
+ name?: string;
768
+ };
769
+ };
770
+ };
771
+ responses: {
772
+ /** @description Snapshot enqueued */
773
+ 201: {
774
+ headers: {
775
+ [name: string]: unknown;
776
+ };
777
+ content?: never;
778
+ };
779
+ 429: components["responses"]["RateLimited"];
780
+ };
781
+ };
782
+ delete?: never;
783
+ options?: never;
784
+ head?: never;
785
+ patch?: never;
786
+ trace?: never;
787
+ };
788
+ "/spaces/{spaceId}/cubes/{cubeId}/snapshots/{snapshotId}": {
789
+ parameters: {
790
+ query?: never;
791
+ header?: never;
792
+ path?: never;
793
+ cookie?: never;
794
+ };
795
+ get?: never;
796
+ put?: never;
797
+ post?: never;
798
+ /** Delete a snapshot */
799
+ delete: {
800
+ parameters: {
801
+ query?: never;
802
+ header?: never;
803
+ path: {
804
+ spaceId: string;
805
+ cubeId: string;
806
+ snapshotId: string;
807
+ };
808
+ cookie?: never;
809
+ };
810
+ requestBody?: never;
811
+ responses: {
812
+ /** @description Deleted */
813
+ 200: {
814
+ headers: {
815
+ [name: string]: unknown;
816
+ };
817
+ content?: never;
818
+ };
819
+ 404: components["responses"]["NotFound"];
820
+ };
821
+ };
822
+ options?: never;
823
+ head?: never;
824
+ patch?: never;
825
+ trace?: never;
826
+ };
827
+ "/spaces/{spaceId}/cubes/{cubeId}/restore": {
828
+ parameters: {
829
+ query?: never;
830
+ header?: never;
831
+ path?: never;
832
+ cookie?: never;
833
+ };
834
+ get?: never;
835
+ put?: never;
836
+ /** Restore a Cube from a snapshot */
837
+ post: {
838
+ parameters: {
839
+ query?: never;
840
+ header?: never;
841
+ path: {
842
+ spaceId: string;
843
+ cubeId: string;
844
+ };
845
+ cookie?: never;
846
+ };
847
+ requestBody: {
848
+ content: {
849
+ "application/json": {
850
+ snapshotId: string;
851
+ };
852
+ };
853
+ };
854
+ responses: {
855
+ /** @description Restore enqueued */
856
+ 200: {
857
+ headers: {
858
+ [name: string]: unknown;
859
+ };
860
+ content?: never;
861
+ };
862
+ 404: components["responses"]["NotFound"];
863
+ };
864
+ };
865
+ delete?: never;
866
+ options?: never;
867
+ head?: never;
868
+ patch?: never;
869
+ trace?: never;
870
+ };
871
+ "/spaces/{spaceId}/backups/{backupId}/download": {
872
+ parameters: {
873
+ query?: never;
874
+ header?: never;
875
+ path?: never;
876
+ cookie?: never;
877
+ };
878
+ /** Generate a presigned download URL for a backup .cube archive */
879
+ get: {
880
+ parameters: {
881
+ query?: never;
882
+ header?: never;
883
+ path: {
884
+ spaceId: string;
885
+ backupId: string;
886
+ };
887
+ cookie?: never;
888
+ };
889
+ requestBody?: never;
890
+ responses: {
891
+ /** @description Presigned URL valid for 15 minutes */
892
+ 200: {
893
+ headers: {
894
+ [name: string]: unknown;
895
+ };
896
+ content: {
897
+ "application/json": {
898
+ url?: string;
899
+ filename?: string;
900
+ sizeBytes?: number | null;
901
+ /** Format: date-time */
902
+ expiresAt?: string;
903
+ };
904
+ };
905
+ };
906
+ 404: components["responses"]["NotFound"];
907
+ /** @description Backup is not in 'complete' status */
908
+ 409: {
909
+ headers: {
910
+ [name: string]: unknown;
911
+ };
912
+ content?: never;
913
+ };
914
+ };
915
+ };
916
+ put?: never;
917
+ post?: never;
918
+ delete?: never;
919
+ options?: never;
920
+ head?: never;
921
+ patch?: never;
922
+ trace?: never;
923
+ };
924
+ "/spaces/{spaceId}/cubes/imports": {
925
+ parameters: {
926
+ query?: never;
927
+ header?: never;
928
+ path?: never;
929
+ cookie?: never;
930
+ };
931
+ get?: never;
932
+ put?: never;
933
+ /** Initiate a .cube archive import (browser-side multipart upload) */
934
+ post: {
935
+ parameters: {
936
+ query?: never;
937
+ header?: never;
938
+ path: {
939
+ spaceId: string;
940
+ };
941
+ cookie?: never;
942
+ };
943
+ requestBody: {
944
+ content: {
945
+ "application/json": {
946
+ name: string;
947
+ fileSizeBytes: number;
948
+ /**
949
+ * @default replace
950
+ * @enum {string}
951
+ */
952
+ sshKeyMode?: "replace" | "keep";
953
+ sshPublicKey?: string | null;
954
+ region?: string | null;
955
+ vcpusOverride?: number | null;
956
+ ramMbOverride?: number | null;
957
+ diskGbOverride?: number | null;
958
+ userData?: string | null;
959
+ expectedConfig?: {
960
+ vcpus?: number;
961
+ ramMb?: number;
962
+ diskLimitGb?: number;
963
+ } | null;
964
+ };
965
+ };
966
+ };
967
+ responses: {
968
+ /** @description Import initiated; returns presigned part URLs */
969
+ 201: {
970
+ headers: {
971
+ [name: string]: unknown;
972
+ };
973
+ content: {
974
+ "application/json": {
975
+ importId?: string;
976
+ uploadId?: string;
977
+ key?: string;
978
+ chunkSizeBytes?: number;
979
+ parts?: {
980
+ partNumber?: number;
981
+ url?: string;
982
+ }[];
983
+ /** Format: date-time */
984
+ expiresAt?: string;
985
+ };
986
+ };
987
+ };
988
+ /** @description Invalid input */
989
+ 400: {
990
+ headers: {
991
+ [name: string]: unknown;
992
+ };
993
+ content?: never;
994
+ };
995
+ /** @description Plan limit exceeded */
996
+ 403: {
997
+ headers: {
998
+ [name: string]: unknown;
999
+ };
1000
+ content?: never;
1001
+ };
1002
+ /** @description No active storage backend */
1003
+ 503: {
1004
+ headers: {
1005
+ [name: string]: unknown;
1006
+ };
1007
+ content?: never;
1008
+ };
1009
+ };
1010
+ };
1011
+ delete?: never;
1012
+ options?: never;
1013
+ head?: never;
1014
+ patch?: never;
1015
+ trace?: never;
1016
+ };
1017
+ "/spaces/{spaceId}/cubes/imports/{importId}": {
1018
+ parameters: {
1019
+ query?: never;
1020
+ header?: never;
1021
+ path?: never;
1022
+ cookie?: never;
1023
+ };
1024
+ /** Get the current state of an import */
1025
+ get: {
1026
+ parameters: {
1027
+ query?: never;
1028
+ header?: never;
1029
+ path: {
1030
+ spaceId: string;
1031
+ importId: string;
1032
+ };
1033
+ cookie?: never;
1034
+ };
1035
+ requestBody?: never;
1036
+ responses: {
1037
+ /** @description Current import state */
1038
+ 200: {
1039
+ headers: {
1040
+ [name: string]: unknown;
1041
+ };
1042
+ content: {
1043
+ "application/json": {
1044
+ import?: {
1045
+ id?: string;
1046
+ name?: string;
1047
+ /** @enum {string} */
1048
+ status?: "uploading" | "finalizing" | "provisioning" | "complete" | "failed" | "expired";
1049
+ cubeId?: string | null;
1050
+ error?: string | null;
1051
+ createdAt?: string;
1052
+ updatedAt?: string;
1053
+ completedAt?: string | null;
1054
+ };
1055
+ };
1056
+ };
1057
+ };
1058
+ 404: components["responses"]["NotFound"];
1059
+ };
1060
+ };
1061
+ put?: never;
1062
+ post?: never;
1063
+ /** Cancel an in-flight upload (only allowed in 'uploading' state) */
1064
+ delete: {
1065
+ parameters: {
1066
+ query?: never;
1067
+ header?: never;
1068
+ path: {
1069
+ spaceId: string;
1070
+ importId: string;
1071
+ };
1072
+ cookie?: never;
1073
+ };
1074
+ requestBody?: never;
1075
+ responses: {
1076
+ /** @description Cancelled */
1077
+ 200: {
1078
+ headers: {
1079
+ [name: string]: unknown;
1080
+ };
1081
+ content?: never;
1082
+ };
1083
+ 404: components["responses"]["NotFound"];
1084
+ /** @description Cannot cancel an import past the 'uploading' state */
1085
+ 409: {
1086
+ headers: {
1087
+ [name: string]: unknown;
1088
+ };
1089
+ content?: never;
1090
+ };
1091
+ };
1092
+ };
1093
+ options?: never;
1094
+ head?: never;
1095
+ patch?: never;
1096
+ trace?: never;
1097
+ };
1098
+ "/spaces/{spaceId}/cubes/imports/{importId}/complete": {
1099
+ parameters: {
1100
+ query?: never;
1101
+ header?: never;
1102
+ path?: never;
1103
+ cookie?: never;
1104
+ };
1105
+ get?: never;
1106
+ put?: never;
1107
+ /** Finalize a .cube import: complete multipart upload + create cube row + enqueue provisioning */
1108
+ post: {
1109
+ parameters: {
1110
+ query?: never;
1111
+ header?: never;
1112
+ path: {
1113
+ spaceId: string;
1114
+ importId: string;
1115
+ };
1116
+ cookie?: never;
1117
+ };
1118
+ requestBody: {
1119
+ content: {
1120
+ "application/json": {
1121
+ parts: {
1122
+ partNumber: number;
1123
+ etag: string;
1124
+ }[];
1125
+ config: {
1126
+ vcpus: number;
1127
+ ramMb: number;
1128
+ diskLimitGb: number;
1129
+ imageId: string;
1130
+ userData?: string | null;
1131
+ };
1132
+ };
1133
+ };
1134
+ };
1135
+ responses: {
1136
+ /** @description Provisioning enqueued */
1137
+ 200: {
1138
+ headers: {
1139
+ [name: string]: unknown;
1140
+ };
1141
+ content: {
1142
+ "application/json": {
1143
+ importId?: string;
1144
+ cubeId?: string;
1145
+ /** @enum {string} */
1146
+ status?: "provisioning";
1147
+ };
1148
+ };
1149
+ };
1150
+ /** @description Invalid input */
1151
+ 400: {
1152
+ headers: {
1153
+ [name: string]: unknown;
1154
+ };
1155
+ content?: never;
1156
+ };
1157
+ /** @description Plan limit exceeded */
1158
+ 403: {
1159
+ headers: {
1160
+ [name: string]: unknown;
1161
+ };
1162
+ content?: never;
1163
+ };
1164
+ /** @description Import not in 'uploading' state */
1165
+ 409: {
1166
+ headers: {
1167
+ [name: string]: unknown;
1168
+ };
1169
+ content?: never;
1170
+ };
1171
+ /** @description S3 finalization failed */
1172
+ 502: {
1173
+ headers: {
1174
+ [name: string]: unknown;
1175
+ };
1176
+ content?: never;
1177
+ };
1178
+ /** @description Storage backend unavailable */
1179
+ 503: {
1180
+ headers: {
1181
+ [name: string]: unknown;
1182
+ };
1183
+ content?: never;
1184
+ };
1185
+ };
1186
+ };
1187
+ delete?: never;
1188
+ options?: never;
1189
+ head?: never;
1190
+ patch?: never;
1191
+ trace?: never;
1192
+ };
1193
+ "/spaces/{spaceId}/webhooks": {
1194
+ parameters: {
1195
+ query?: never;
1196
+ header?: never;
1197
+ path?: never;
1198
+ cookie?: never;
1199
+ };
1200
+ /** List webhook endpoints */
1201
+ get: {
1202
+ parameters: {
1203
+ query?: never;
1204
+ header?: never;
1205
+ path: {
1206
+ spaceId: string;
1207
+ };
1208
+ cookie?: never;
1209
+ };
1210
+ requestBody?: never;
1211
+ responses: {
1212
+ /** @description Webhook list */
1213
+ 200: {
1214
+ headers: {
1215
+ [name: string]: unknown;
1216
+ };
1217
+ content?: never;
1218
+ };
1219
+ };
1220
+ };
1221
+ put?: never;
1222
+ /** Create a webhook endpoint (signing secret returned once) */
1223
+ post: {
1224
+ parameters: {
1225
+ query?: never;
1226
+ header?: never;
1227
+ path: {
1228
+ spaceId: string;
1229
+ };
1230
+ cookie?: never;
1231
+ };
1232
+ requestBody: {
1233
+ content: {
1234
+ "application/json": {
1235
+ /** Format: uri */
1236
+ url: string;
1237
+ events: ("cube.running" | "cube.sleeping" | "cube.error" | "cube.deleted")[];
1238
+ };
1239
+ };
1240
+ };
1241
+ responses: {
1242
+ /** @description Webhook created (response includes secret) */
1243
+ 201: {
1244
+ headers: {
1245
+ [name: string]: unknown;
1246
+ };
1247
+ content?: never;
1248
+ };
1249
+ 400: components["responses"]["BadRequest"];
1250
+ 429: components["responses"]["RateLimited"];
1251
+ };
1252
+ };
1253
+ delete?: never;
1254
+ options?: never;
1255
+ head?: never;
1256
+ patch?: never;
1257
+ trace?: never;
1258
+ };
1259
+ "/spaces/{spaceId}/webhooks/{endpointId}": {
1260
+ parameters: {
1261
+ query?: never;
1262
+ header?: never;
1263
+ path?: never;
1264
+ cookie?: never;
1265
+ };
1266
+ /** Get a webhook (no secret) */
1267
+ get: {
1268
+ parameters: {
1269
+ query?: never;
1270
+ header?: never;
1271
+ path: {
1272
+ spaceId: string;
1273
+ endpointId: string;
1274
+ };
1275
+ cookie?: never;
1276
+ };
1277
+ requestBody?: never;
1278
+ responses: {
1279
+ /** @description Webhook */
1280
+ 200: {
1281
+ headers: {
1282
+ [name: string]: unknown;
1283
+ };
1284
+ content?: never;
1285
+ };
1286
+ };
1287
+ };
1288
+ put?: never;
1289
+ post?: never;
1290
+ /** Delete a webhook (cascades deliveries) */
1291
+ delete: {
1292
+ parameters: {
1293
+ query?: never;
1294
+ header?: never;
1295
+ path: {
1296
+ spaceId: string;
1297
+ endpointId: string;
1298
+ };
1299
+ cookie?: never;
1300
+ };
1301
+ requestBody?: never;
1302
+ responses: {
1303
+ /** @description Deleted */
1304
+ 200: {
1305
+ headers: {
1306
+ [name: string]: unknown;
1307
+ };
1308
+ content?: never;
1309
+ };
1310
+ 429: components["responses"]["RateLimited"];
1311
+ };
1312
+ };
1313
+ options?: never;
1314
+ head?: never;
1315
+ patch?: never;
1316
+ trace?: never;
1317
+ };
1318
+ "/spaces/{spaceId}/webhooks/{endpointId}/deliveries": {
1319
+ parameters: {
1320
+ query?: never;
1321
+ header?: never;
1322
+ path?: never;
1323
+ cookie?: never;
1324
+ };
1325
+ /** Last 30 days of webhook delivery history (max 100) */
1326
+ get: {
1327
+ parameters: {
1328
+ query?: {
1329
+ limit?: number;
1330
+ };
1331
+ header?: never;
1332
+ path: {
1333
+ spaceId: string;
1334
+ endpointId: string;
1335
+ };
1336
+ cookie?: never;
1337
+ };
1338
+ requestBody?: never;
1339
+ responses: {
1340
+ /** @description Delivery list */
1341
+ 200: {
1342
+ headers: {
1343
+ [name: string]: unknown;
1344
+ };
1345
+ content?: never;
1346
+ };
1347
+ };
1348
+ };
1349
+ put?: never;
1350
+ post?: never;
1351
+ delete?: never;
1352
+ options?: never;
1353
+ head?: never;
1354
+ patch?: never;
1355
+ trace?: never;
1356
+ };
1357
+ }
1358
+ interface components {
1359
+ schemas: {
1360
+ Cube: {
1361
+ id: string;
1362
+ name: string;
1363
+ /** @enum {string} */
1364
+ state: "pending" | "booting" | "running" | "sleeping" | "stopping" | "error" | "deleted";
1365
+ publicIpv4: string | null;
1366
+ resources: {
1367
+ vcpu: number;
1368
+ ramGb: number;
1369
+ diskGb: number;
1370
+ };
1371
+ image: string;
1372
+ costPerHour: number;
1373
+ /** Format: date-time */
1374
+ createdAt: string;
1375
+ /** Format: date-time */
1376
+ updatedAt: string;
1377
+ };
1378
+ Domain: {
1379
+ id: string;
1380
+ cubeId: string;
1381
+ domain: string;
1382
+ port: number | null;
1383
+ status: string;
1384
+ ingressStatus: string | null;
1385
+ /** @enum {string} */
1386
+ securityHeadersMode: "enforced" | "app_managed";
1387
+ responseHeaderTimeoutSecs: number;
1388
+ /** @description Header rewrites: `set` adds/overwrites, `remove` deletes. Null clears all. */
1389
+ responseHeaderOverrides: {
1390
+ set?: {
1391
+ [key: string]: string;
1392
+ };
1393
+ remove?: string[];
1394
+ } | null;
1395
+ /** @description Header rewrites: `set` adds/overwrites, `remove` deletes. Null clears all. */
1396
+ requestHeaderOverrides: {
1397
+ set?: {
1398
+ [key: string]: string;
1399
+ };
1400
+ remove?: string[];
1401
+ } | null;
1402
+ maxRequestBodyMb: number | null;
1403
+ responseCompression: boolean;
1404
+ ipAllowList: string[] | null;
1405
+ ipDenyList: string[] | null;
1406
+ basicAuthUser: string | null;
1407
+ basicAuthEnabled: boolean;
1408
+ corsConfig: Record<string, never> | null;
1409
+ /** Format: date-time */
1410
+ createdAt: string;
1411
+ /** Format: date-time */
1412
+ updatedAt: string;
1413
+ };
1414
+ TcpMapping: {
1415
+ id: string;
1416
+ cubeId: string;
1417
+ cubePort: number;
1418
+ hostPort: number;
1419
+ label: string | null;
1420
+ status: string;
1421
+ isSsh: boolean;
1422
+ /** Format: date-time */
1423
+ createdAt: string;
1424
+ /** Format: date-time */
1425
+ updatedAt: string;
1426
+ whitelistedIps: {
1427
+ id: string;
1428
+ cidr: string;
1429
+ }[];
1430
+ };
1431
+ Snapshot: {
1432
+ id: string;
1433
+ cubeId: string;
1434
+ name: string;
1435
+ sizeBytes: number | null;
1436
+ status: string;
1437
+ kind: string;
1438
+ /** Format: date-time */
1439
+ createdAt: string;
1440
+ };
1441
+ Webhook: {
1442
+ id: string;
1443
+ /** Format: uri */
1444
+ url: string;
1445
+ events: string[];
1446
+ enabled: boolean;
1447
+ /** Format: date-time */
1448
+ createdAt: string;
1449
+ /** Format: date-time */
1450
+ updatedAt: string;
1451
+ };
1452
+ WebhookDelivery: {
1453
+ id: string;
1454
+ event: string;
1455
+ /** @enum {string} */
1456
+ status: "pending" | "delivered" | "failed";
1457
+ attempts: number;
1458
+ /** Format: date-time */
1459
+ lastAttemptAt: string | null;
1460
+ responseStatus: number | null;
1461
+ /** Format: date-time */
1462
+ createdAt: string;
1463
+ };
1464
+ Error: {
1465
+ error: string;
1466
+ };
1467
+ };
1468
+ responses: {
1469
+ /** @description Bad request */
1470
+ BadRequest: {
1471
+ headers: {
1472
+ [name: string]: unknown;
1473
+ };
1474
+ content: {
1475
+ "application/json": components["schemas"]["Error"];
1476
+ };
1477
+ };
1478
+ /** @description Missing or invalid API key */
1479
+ Unauthorized: {
1480
+ headers: {
1481
+ [name: string]: unknown;
1482
+ };
1483
+ content: {
1484
+ "application/json": components["schemas"]["Error"];
1485
+ };
1486
+ };
1487
+ /** @description Authenticated but lacks the required permission */
1488
+ Forbidden: {
1489
+ headers: {
1490
+ [name: string]: unknown;
1491
+ };
1492
+ content: {
1493
+ "application/json": components["schemas"]["Error"];
1494
+ };
1495
+ };
1496
+ /** @description Resource not found */
1497
+ NotFound: {
1498
+ headers: {
1499
+ [name: string]: unknown;
1500
+ };
1501
+ content: {
1502
+ "application/json": components["schemas"]["Error"];
1503
+ };
1504
+ };
1505
+ /** @description Rate limit exceeded (10 mutations / 60s) */
1506
+ RateLimited: {
1507
+ headers: {
1508
+ [name: string]: unknown;
1509
+ };
1510
+ content: {
1511
+ "application/json": components["schemas"]["Error"];
1512
+ };
1513
+ };
1514
+ };
1515
+ parameters: never;
1516
+ requestBodies: never;
1517
+ headers: never;
1518
+ pathItems: never;
1519
+ }
1520
+
1521
+ /** The Cube resource, as defined in the Krova Cloud OpenAPI spec. */
1522
+ type Cube = components["schemas"]["Cube"];
1523
+ /** Default API base URL — the single `servers[0].url` from the OpenAPI spec. */
1524
+ declare const DEFAULT_BASE_URL = "https://krova.cloud/api/v1";
1525
+ /**
1526
+ * How the API key is presented to the server.
1527
+ *
1528
+ * - `"x-api-key"` (default) — `X-API-KEY: <key>`, matching the spec's
1529
+ * `components.securitySchemes.ApiKeyAuth` (an `apiKey` header named
1530
+ * `X-API-KEY`).
1531
+ * - `"bearer"` — `Authorization: Bearer <key>`, for gateways that expect it.
1532
+ */
1533
+ type AuthScheme = "x-api-key" | "bearer";
1534
+ interface KrovaClientOptions {
1535
+ /**
1536
+ * Your Krova Cloud API key (a `kro_...` token). Keys are scoped per Space
1537
+ * and inherit the permissions of the membership that created them.
1538
+ */
1539
+ apiKey: string;
1540
+ /** Override the API base URL. Defaults to {@link DEFAULT_BASE_URL}. */
1541
+ baseUrl?: string;
1542
+ /**
1543
+ * Auth header scheme. Defaults to `"x-api-key"` (the spec's scheme).
1544
+ */
1545
+ authScheme?: AuthScheme;
1546
+ /**
1547
+ * Max automatic retries on retryable statuses (429, 503).
1548
+ * Defaults to 2. Set to 0 to disable retries.
1549
+ */
1550
+ maxRetries?: number;
1551
+ /**
1552
+ * A custom `fetch` implementation (e.g. for tests or a proxy). Defaults to
1553
+ * the global `fetch`.
1554
+ */
1555
+ fetch?: typeof fetch;
1556
+ }
1557
+ /**
1558
+ * A typed client for the Krova Cloud API.
1559
+ *
1560
+ * @example
1561
+ * ```ts
1562
+ * const krova = new KrovaClient({ apiKey: "kro_..." });
1563
+ * const cubes = await krova.cubes.list("space_123");
1564
+ * ```
1565
+ */
1566
+ declare class KrovaClient {
1567
+ /**
1568
+ * The underlying openapi-fetch client — a fully typed escape hatch to every
1569
+ * path in the spec. Returns `{ data, error, response }` and never throws.
1570
+ *
1571
+ * @example
1572
+ * ```ts
1573
+ * const { data, error } = await krova.raw.GET(
1574
+ * "/spaces/{spaceId}/cubes/{cubeId}",
1575
+ * { params: { path: { spaceId, cubeId } } },
1576
+ * );
1577
+ * ```
1578
+ */
1579
+ readonly raw: Client<paths>;
1580
+ /** The resolved base URL in use. */
1581
+ readonly baseUrl: string;
1582
+ constructor(options: KrovaClientOptions);
1583
+ readonly cubes: {
1584
+ /** List Cubes in a Space. Returns the raw (paginated) response body. */
1585
+ list: (spaceId: string) => Promise<unknown>;
1586
+ /**
1587
+ * Create a Cube. Returns the created {@link Cube}.
1588
+ *
1589
+ * @param spaceId Target Space id.
1590
+ * @param body Cube spec — `{ name, image, resources, sshPublicKey, ... }`.
1591
+ * @param opts Optional `idempotencyKey` (max 255 chars, scoped per space).
1592
+ */
1593
+ create: (spaceId: string, body: NonNullable<paths["/spaces/{spaceId}/cubes"]["post"]["requestBody"]>["content"]["application/json"], opts?: {
1594
+ idempotencyKey?: string;
1595
+ }) => Promise<Cube>;
1596
+ /** Get a single Cube. Returns the raw response body. */
1597
+ get: (spaceId: string, cubeId: string) => Promise<unknown>;
1598
+ /**
1599
+ * Update a Cube's SSH port.
1600
+ *
1601
+ * The Krova Cloud API exposes no general Cube-mutation endpoint; the only
1602
+ * mutable Cube field over the API is its SSH port, via
1603
+ * `PUT /spaces/{spaceId}/cubes/{cubeId}/ssh-port`. This helper maps to that
1604
+ * endpoint. (Compute resize / rename are not part of the public API.)
1605
+ */
1606
+ update: (spaceId: string, cubeId: string, body: NonNullable<paths["/spaces/{spaceId}/cubes/{cubeId}/ssh-port"]["put"]["requestBody"]>["content"]["application/json"]) => Promise<unknown>;
1607
+ /** Delete a Cube (asynchronous — deletion is enqueued). */
1608
+ delete: (spaceId: string, cubeId: string) => Promise<unknown>;
1609
+ /** Sleep a running Cube (asynchronous — sleep is enqueued). */
1610
+ sleep: (spaceId: string, cubeId: string) => Promise<unknown>;
1611
+ /** Wake a sleeping Cube (asynchronous — wake is enqueued). */
1612
+ wake: (spaceId: string, cubeId: string) => Promise<unknown>;
1613
+ };
1614
+ readonly catalog: {
1615
+ /** List regions with available capacity. */
1616
+ regions: () => Promise<unknown>;
1617
+ /** List available OS images. */
1618
+ images: () => Promise<unknown>;
1619
+ /** Per-resource hourly rates and volume pricing tiers. */
1620
+ pricing: () => Promise<unknown>;
1621
+ };
1622
+ }
1623
+
1624
+ /**
1625
+ * The error body shape returned by the Krova Cloud API.
1626
+ *
1627
+ * Per the OpenAPI spec (`components.schemas.Error`), every non-2xx response
1628
+ * body is `{ "error": string }`. Additional fields may appear over time, so
1629
+ * we keep the type open.
1630
+ */
1631
+ interface KrovaErrorBody {
1632
+ error?: string;
1633
+ [key: string]: unknown;
1634
+ }
1635
+ /**
1636
+ * Error thrown by the ergonomic {@link KrovaClient} helpers when the API
1637
+ * responds with a non-2xx status.
1638
+ *
1639
+ * The raw openapi-fetch client (`client.raw`) never throws — it returns
1640
+ * `{ data, error, response }`. The helpers wrap that and throw `KrovaError`
1641
+ * so callers can `try/catch`.
1642
+ */
1643
+ declare class KrovaError extends Error {
1644
+ /** HTTP status code of the failing response. */
1645
+ readonly status: number;
1646
+ /**
1647
+ * A machine-readable error code, when the API surfaces one via the
1648
+ * `X-Error-Code` response header. The documented error body only carries a
1649
+ * human-readable `error` string, so this is best-effort.
1650
+ */
1651
+ readonly code?: string;
1652
+ /**
1653
+ * The request id from the `X-Request-Id` response header, when present.
1654
+ * Useful when contacting Krova Cloud support about a specific failure.
1655
+ */
1656
+ readonly requestId?: string;
1657
+ /** The parsed JSON error body, when the response had one. */
1658
+ readonly body?: KrovaErrorBody;
1659
+ /** The raw `Response` object, for callers that need headers/url/etc. */
1660
+ readonly response?: Response;
1661
+ constructor(message: string, init: {
1662
+ status: number;
1663
+ code?: string;
1664
+ requestId?: string;
1665
+ body?: KrovaErrorBody;
1666
+ response?: Response;
1667
+ });
1668
+ }
1669
+ /**
1670
+ * Build a {@link KrovaError} from a failing response + parsed error body.
1671
+ */
1672
+ declare function krovaErrorFrom(response: Response, body: KrovaErrorBody | undefined): KrovaError;
1673
+
1674
+ export { type AuthScheme, type Cube, DEFAULT_BASE_URL, KrovaClient, type KrovaClientOptions, KrovaError, type KrovaErrorBody, type components, krovaErrorFrom, type paths };