@cloudfleet/sdk 0.0.1-3d290f0 → 0.0.1-3e55307

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.
Files changed (61) hide show
  1. package/README.md +26 -2
  2. package/dist/@tanstack/react-query.gen.d.ts +1077 -0
  3. package/dist/@tanstack/react-query.gen.d.ts.map +1 -0
  4. package/dist/@tanstack/react-query.gen.js +1286 -0
  5. package/dist/@tanstack/react-query.gen.js.map +1 -0
  6. package/dist/client/client.gen.d.ts.map +1 -1
  7. package/dist/client/client.gen.js +114 -102
  8. package/dist/client/client.gen.js.map +1 -1
  9. package/dist/client/index.d.ts +1 -1
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/client/types.gen.d.ts +9 -13
  13. package/dist/client/types.gen.d.ts.map +1 -1
  14. package/dist/client/utils.gen.d.ts +8 -4
  15. package/dist/client/utils.gen.d.ts.map +1 -1
  16. package/dist/client/utils.gen.js +13 -15
  17. package/dist/client/utils.gen.js.map +1 -1
  18. package/dist/client.gen.d.ts.map +1 -1
  19. package/dist/client.gen.js +1 -3
  20. package/dist/client.gen.js.map +1 -1
  21. package/dist/core/auth.gen.d.ts.map +1 -1
  22. package/dist/core/auth.gen.js.map +1 -1
  23. package/dist/core/bodySerializer.gen.d.ts +16 -8
  24. package/dist/core/bodySerializer.gen.d.ts.map +1 -1
  25. package/dist/core/bodySerializer.gen.js +1 -1
  26. package/dist/core/bodySerializer.gen.js.map +1 -1
  27. package/dist/core/params.gen.d.ts +10 -0
  28. package/dist/core/params.gen.d.ts.map +1 -1
  29. package/dist/core/params.gen.js +22 -10
  30. package/dist/core/params.gen.js.map +1 -1
  31. package/dist/core/pathSerializer.gen.d.ts.map +1 -1
  32. package/dist/core/pathSerializer.gen.js +3 -11
  33. package/dist/core/pathSerializer.gen.js.map +1 -1
  34. package/dist/core/queryKeySerializer.gen.d.ts.map +1 -1
  35. package/dist/core/queryKeySerializer.gen.js +4 -11
  36. package/dist/core/queryKeySerializer.gen.js.map +1 -1
  37. package/dist/core/serverSentEvents.gen.d.ts +1 -1
  38. package/dist/core/serverSentEvents.gen.d.ts.map +1 -1
  39. package/dist/core/serverSentEvents.gen.js +6 -9
  40. package/dist/core/serverSentEvents.gen.js.map +1 -1
  41. package/dist/core/types.gen.d.ts +1 -1
  42. package/dist/core/types.gen.d.ts.map +1 -1
  43. package/dist/core/utils.gen.d.ts.map +1 -1
  44. package/dist/core/utils.gen.js +1 -1
  45. package/dist/core/utils.gen.js.map +1 -1
  46. package/dist/schemas.gen.d.ts +1258 -140
  47. package/dist/schemas.gen.d.ts.map +1 -1
  48. package/dist/schemas.gen.js +2727 -215
  49. package/dist/schemas.gen.js.map +1 -1
  50. package/dist/sdk.gen.d.ts +286 -185
  51. package/dist/sdk.gen.d.ts.map +1 -1
  52. package/dist/sdk.gen.js +431 -376
  53. package/dist/sdk.gen.js.map +1 -1
  54. package/dist/services/kubernetes/api.d.ts +8 -8
  55. package/dist/types.gen.d.ts +1706 -687
  56. package/dist/types.gen.d.ts.map +1 -1
  57. package/dist/zod.gen.d.ts +3690 -1419
  58. package/dist/zod.gen.d.ts.map +1 -1
  59. package/dist/zod.gen.js +1500 -629
  60. package/dist/zod.gen.js.map +1 -1
  61. package/package.json +28 -8
@@ -2,6 +2,15 @@
2
2
  export const BillingContactSchema = {
3
3
  type: 'object',
4
4
  properties: {
5
+ type: {
6
+ type: 'string',
7
+ description: 'Type of the organization. `business` for legal entities, `personal` for individuals.',
8
+ example: 'business',
9
+ enum: [
10
+ 'business',
11
+ 'personal'
12
+ ]
13
+ },
5
14
  company: {
6
15
  type: 'string',
7
16
  maxLength: 120,
@@ -74,10 +83,154 @@ export const BillingContactSchema = {
74
83
  nullable: true,
75
84
  description: 'Type of the tax ID.',
76
85
  example: 'de_vat',
77
- enum: ['ad_nrt', 'ae_trn', 'al_tin', 'am_tin', 'ao_tin', 'ar_cuit', 'at_vat', 'au_abn', 'au_arn', 'ba_tin', 'bb_tin', 'be_vat', 'bg_uic', 'bg_vat', 'bh_vat', 'bo_tin', 'br_cnpj', 'br_cpf', 'bs_tin', 'by_tin', 'ca_bn', 'ca_gst_hst', 'ca_pst_bc', 'ca_pst_mb', 'ca_pst_sk', 'ca_qst', 'cd_nif', 'ch_uid', 'ch_vat', 'cl_tin', 'cn_tin', 'co_nit', 'cr_tin', 'cy_vat', 'cz_vat', 'de_stn', 'de_vat', 'dk_vat', 'do_rcn', 'ec_ruc', 'ee_vat', 'eg_tin', 'es_cif', 'es_vat', 'eu_oss_vat', 'fi_vat', 'fr_vat', 'gb_vat', 'ge_vat', 'gn_nif', 'gr_vat', 'hk_br', 'hr_oib', 'hr_vat', 'hu_tin', 'hu_vat', 'id_npwp', 'ie_vat', 'il_vat', 'in_gst', 'is_vat', 'it_vat', 'jp_cn', 'jp_rn', 'jp_trn', 'ke_pin', 'kh_tin', 'kr_brn', 'kz_bin', 'li_uid', 'li_vat', 'lt_vat', 'lu_vat', 'lv_vat', 'ma_vat', 'md_vat', 'me_pib', 'mk_vat', 'mr_nif', 'mt_vat', 'mx_rfc', 'my_frp', 'my_itn', 'my_sst', 'ng_tin', 'nl_vat', 'no_vat', 'no_voec', 'np_pan', 'nz_gst', 'om_vat', 'pe_ruc', 'ph_tin', 'pl_vat', 'pt_vat', 'ro_tin', 'ro_vat', 'rs_pib', 'ru_inn', 'ru_kpp', 'sa_vat', 'se_vat', 'sg_gst', 'sg_uen', 'si_tin', 'si_vat', 'sk_vat', 'sn_ninea', 'sr_fin', 'sv_nit', 'th_vat', 'tj_tin', 'tr_tin', 'tw_vat', 'tz_vat', 'ua_vat', 'ug_tin', 'us_ein', 'uy_ruc', 'uz_tin', 'uz_vat', 've_rif', 'vn_tin', 'xi_vat', 'za_vat', 'zm_tin', 'zw_tin', '']
86
+ enum: [
87
+ 'ad_nrt',
88
+ 'ae_trn',
89
+ 'al_tin',
90
+ 'am_tin',
91
+ 'ao_tin',
92
+ 'ar_cuit',
93
+ 'at_vat',
94
+ 'au_abn',
95
+ 'au_arn',
96
+ 'aw_tin',
97
+ 'az_tin',
98
+ 'ba_tin',
99
+ 'bb_tin',
100
+ 'bd_bin',
101
+ 'be_vat',
102
+ 'bf_ifu',
103
+ 'bg_uic',
104
+ 'bg_vat',
105
+ 'bh_vat',
106
+ 'bj_ifu',
107
+ 'bo_tin',
108
+ 'br_cnpj',
109
+ 'br_cpf',
110
+ 'bs_tin',
111
+ 'by_tin',
112
+ 'ca_bn',
113
+ 'ca_gst_hst',
114
+ 'ca_pst_bc',
115
+ 'ca_pst_mb',
116
+ 'ca_pst_sk',
117
+ 'ca_qst',
118
+ 'cd_nif',
119
+ 'ch_uid',
120
+ 'ch_vat',
121
+ 'cl_tin',
122
+ 'cm_niu',
123
+ 'cn_tin',
124
+ 'co_nit',
125
+ 'cr_tin',
126
+ 'cv_nif',
127
+ 'cy_vat',
128
+ 'cz_vat',
129
+ 'de_stn',
130
+ 'de_vat',
131
+ 'dk_vat',
132
+ 'do_rcn',
133
+ 'ec_ruc',
134
+ 'ee_vat',
135
+ 'eg_tin',
136
+ 'es_cif',
137
+ 'es_vat',
138
+ 'et_tin',
139
+ 'eu_oss_vat',
140
+ 'fi_vat',
141
+ 'fr_vat',
142
+ 'gb_vat',
143
+ 'ge_vat',
144
+ 'gn_nif',
145
+ 'gr_vat',
146
+ 'hk_br',
147
+ 'hr_oib',
148
+ 'hr_vat',
149
+ 'hu_tin',
150
+ 'hu_vat',
151
+ 'id_npwp',
152
+ 'ie_vat',
153
+ 'il_vat',
154
+ 'in_gst',
155
+ 'is_vat',
156
+ 'it_vat',
157
+ 'jp_cn',
158
+ 'jp_rn',
159
+ 'jp_trn',
160
+ 'ke_pin',
161
+ 'kg_tin',
162
+ 'kh_tin',
163
+ 'kr_brn',
164
+ 'kz_bin',
165
+ 'la_tin',
166
+ 'li_uid',
167
+ 'li_vat',
168
+ 'lk_vat',
169
+ 'lt_vat',
170
+ 'lu_vat',
171
+ 'lv_vat',
172
+ 'ma_vat',
173
+ 'md_vat',
174
+ 'me_pib',
175
+ 'mk_vat',
176
+ 'mr_nif',
177
+ 'mt_vat',
178
+ 'mx_rfc',
179
+ 'my_frp',
180
+ 'my_itn',
181
+ 'my_sst',
182
+ 'ng_tin',
183
+ 'nl_vat',
184
+ 'no_vat',
185
+ 'no_voec',
186
+ 'np_pan',
187
+ 'nz_gst',
188
+ 'om_vat',
189
+ 'pe_ruc',
190
+ 'ph_tin',
191
+ 'pl_vat',
192
+ 'pt_vat',
193
+ 'ro_tin',
194
+ 'ro_vat',
195
+ 'rs_pib',
196
+ 'ru_inn',
197
+ 'ru_kpp',
198
+ 'sa_vat',
199
+ 'se_vat',
200
+ 'sg_gst',
201
+ 'sg_uen',
202
+ 'si_tin',
203
+ 'si_vat',
204
+ 'sk_vat',
205
+ 'sn_ninea',
206
+ 'sr_fin',
207
+ 'sv_nit',
208
+ 'th_vat',
209
+ 'tj_tin',
210
+ 'tr_tin',
211
+ 'tw_vat',
212
+ 'tz_vat',
213
+ 'ua_vat',
214
+ 'ug_tin',
215
+ 'us_ein',
216
+ 'uy_ruc',
217
+ 'uz_tin',
218
+ 'uz_vat',
219
+ 've_rif',
220
+ 'vn_tin',
221
+ 'xi_vat',
222
+ 'za_vat',
223
+ 'zm_tin',
224
+ 'zw_tin',
225
+ ''
226
+ ]
78
227
  }
79
228
  },
80
- required: ['email', 'individual_name'],
229
+ required: [
230
+ 'type',
231
+ 'email',
232
+ 'individual_name'
233
+ ],
81
234
  additionalProperties: false
82
235
  };
83
236
  export const BillingCreditsSchema = {
@@ -92,7 +245,10 @@ export const BillingCreditsSchema = {
92
245
  type: 'string',
93
246
  description: 'Type of the promotional code.',
94
247
  example: 'credit',
95
- enum: ['credit', 'discount']
248
+ enum: [
249
+ 'credit',
250
+ 'discount'
251
+ ]
96
252
  },
97
253
  date_start: {
98
254
  type: 'string',
@@ -129,7 +285,12 @@ export const BillingCreditsSchema = {
129
285
  example: 8
130
286
  }
131
287
  },
132
- required: ['type', 'date_start', 'code', 'value_total'],
288
+ required: [
289
+ 'type',
290
+ 'date_start',
291
+ 'code',
292
+ 'value_total'
293
+ ],
133
294
  additionalProperties: false
134
295
  };
135
296
  export const ChartCreateInputSchema = {
@@ -170,7 +331,13 @@ export const ChartCreateInputSchema = {
170
331
  example: 'postgresql'
171
332
  }
172
333
  },
173
- required: ['values', 'version_channel', 'name', 'namespace', 'chart'],
334
+ required: [
335
+ 'values',
336
+ 'version_channel',
337
+ 'name',
338
+ 'namespace',
339
+ 'chart'
340
+ ],
174
341
  additionalProperties: false
175
342
  };
176
343
  export const ChartSchema = {
@@ -212,9 +379,8 @@ export const ChartSchema = {
212
379
  },
213
380
  status: {
214
381
  type: 'string',
215
- description: 'Status of the chart deployment.',
216
- example: 'active',
217
- enum: ['InstallSucceeded', 'InstallFailed', 'UpgradeSucceeded', 'UpgradeFailed', 'TestSucceeded', 'TestFailed', 'RollbackSucceeded', 'RollbackFailed', 'UninstallSucceeded', 'UninstallFailed', 'ArtifactFailed', 'DependencyNotReady', 'Progressing', 'SourceNotReady']
382
+ description: 'Status of the chart deployment (Flux HelmRelease Ready condition reason, e.g. InstallSucceeded, UpgradeFailed, Progressing).',
383
+ example: 'InstallSucceeded'
218
384
  },
219
385
  version_current: {
220
386
  type: 'string',
@@ -237,7 +403,18 @@ export const ChartSchema = {
237
403
  example: true
238
404
  }
239
405
  },
240
- required: ['values', 'version_channel', 'name', 'namespace', 'chart', 'status', 'version_current', 'created_at', 'updated_at', 'ready'],
406
+ required: [
407
+ 'values',
408
+ 'version_channel',
409
+ 'name',
410
+ 'namespace',
411
+ 'chart',
412
+ 'status',
413
+ 'version_current',
414
+ 'created_at',
415
+ 'updated_at',
416
+ 'ready'
417
+ ],
241
418
  additionalProperties: false
242
419
  };
243
420
  export const ChartUpdateInputSchema = {
@@ -254,7 +431,10 @@ export const ChartUpdateInputSchema = {
254
431
  example: '2.x.x-cfke.x'
255
432
  }
256
433
  },
257
- required: ['values', 'version_channel'],
434
+ required: [
435
+ 'values',
436
+ 'version_channel'
437
+ ],
258
438
  additionalProperties: false
259
439
  };
260
440
  export const ClusterCreateInputSchema = {
@@ -271,27 +451,118 @@ export const ClusterCreateInputSchema = {
271
451
  tier: {
272
452
  type: 'string',
273
453
  description: 'Tier of the cluster.',
454
+ default: 'basic',
274
455
  example: 'pro',
275
- enum: ['basic', 'pro']
276
- },
277
- region: {
278
- type: 'string',
279
- description: 'Cloudfleet control plane region. One of "staging", "northamerica-central-1", "europe-central-1a", "northamerica-central-1a". This field can not be updated after creation.',
280
- default: 'staging',
281
- example: 'northamerica-central-1a',
282
- enum: ['staging', 'northamerica-central-1', 'europe-central-1a', 'northamerica-central-1a']
456
+ enum: [
457
+ 'basic',
458
+ 'pro',
459
+ 'enterprise'
460
+ ]
283
461
  },
284
462
  version_channel: {
285
463
  type: 'string',
286
464
  pattern: '^(x|X|0|[1-9]\\d*)\\.(x|X|0|[1-9]\\d*)\\.(x|X|0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$',
287
465
  description: 'Version of the kubernetes cluster.',
288
466
  default: '1.x.x-cfke.x',
289
- example: '1.x.x-cfke.x',
290
- enum: ['1.x.x-cfke.x', '1.31.x-cfke.x', '1.32.x-cfke.x', '1.33.x-cfke.x']
467
+ example: '1.x.x-cfke.x'
468
+ },
469
+ release_channel: {
470
+ type: 'string',
471
+ description: 'Release channel for the cluster\'s control plane.',
472
+ default: 'rapid',
473
+ example: 'rapid',
474
+ enum: [
475
+ 'rapid',
476
+ 'stable',
477
+ 'extended'
478
+ ]
479
+ },
480
+ features: {
481
+ type: 'object',
482
+ properties: {
483
+ gpu_sharing_strategy: {
484
+ type: 'string',
485
+ description: 'GPU sharing strategy.',
486
+ default: 'none',
487
+ example: 'none',
488
+ enum: [
489
+ 'none',
490
+ 'mps',
491
+ 'time_slicing'
492
+ ]
493
+ },
494
+ gpu_max_shared_clients_per_gpu: {
495
+ type: 'integer',
496
+ minimum: 2,
497
+ maximum: 48,
498
+ description: 'Maximum number of pods that may share a single GPU.',
499
+ default: 4,
500
+ example: 10
501
+ },
502
+ cilium_socket_lb_host_namespace_only: {
503
+ type: 'boolean',
504
+ description: 'Restrict Cilium socket load-balancing to the host namespace. Required for the Tailscale operator and Istio.',
505
+ example: false
506
+ }
507
+ },
508
+ additionalProperties: false,
509
+ description: 'Cluster feature toggles.',
510
+ default: {
511
+ gpu_sharing_strategy: 'none',
512
+ gpu_max_shared_clients_per_gpu: 4,
513
+ cilium_socket_lb_host_namespace_only: false
514
+ }
515
+ },
516
+ region: {
517
+ type: 'string',
518
+ description: 'Cloudfleet control plane region. This field can not be updated after creation.',
519
+ example: 'europe-central-1a'
520
+ },
521
+ networking: {
522
+ type: 'object',
523
+ properties: {
524
+ pod_cidr: {
525
+ type: 'string',
526
+ description: 'CIDR block for pod IPs.',
527
+ default: '10.244.0.0/16'
528
+ },
529
+ service_cidr: {
530
+ type: 'string',
531
+ description: 'CIDR block for service IPs.',
532
+ default: '10.96.0.0/12'
533
+ },
534
+ dual_stack: {
535
+ type: 'boolean',
536
+ description: 'Enable IPv4+IPv6 dual-stack networking.'
537
+ },
538
+ pod_cidr_v6: {
539
+ type: 'string',
540
+ description: 'IPv6 pod CIDR. Requires dual_stack.',
541
+ default: '2001:db8:1:2::/48'
542
+ },
543
+ service_cidr_v6: {
544
+ type: 'string',
545
+ description: 'IPv6 service CIDR. Requires dual_stack.',
546
+ default: '2001:db8:1:1::/112'
547
+ }
548
+ },
549
+ additionalProperties: false,
550
+ description: 'Cluster networking configuration. Immutable after creation.',
551
+ default: {
552
+ pod_cidr: '10.244.0.0/16',
553
+ service_cidr: '10.96.0.0/12',
554
+ dual_stack: false,
555
+ pod_cidr_v6: '2001:db8:1:2::/48',
556
+ service_cidr_v6: '2001:db8:1:1::/112'
557
+ }
291
558
  }
292
559
  },
293
- required: ['name', 'tier'],
294
- additionalProperties: false
560
+ required: [
561
+ 'name',
562
+ 'region'
563
+ ],
564
+ additionalProperties: false,
565
+ description: 'Mutable cluster configuration. Applied as a full overwrite: any omitted field is reset to its default rather than left unchanged.'
295
566
  };
296
567
  export const ClusterJoinInformationSchema = {
297
568
  type: 'object',
@@ -299,8 +570,7 @@ export const ClusterJoinInformationSchema = {
299
570
  certificate_authority: {
300
571
  type: 'string',
301
572
  description: 'Certificate authority data for the kubernetes cluster. This is the root certificate authority for the cluster.',
302
- example: `-----BEGIN CERTIFICATE-----
303
- MIIC0DCCAbigAwIBAgI...`
573
+ example: '-----BEGIN CERTIFICATE-----\nMIIC0DCCAbigAwIBAgI...'
304
574
  },
305
575
  endpoint: {
306
576
  type: 'string',
@@ -308,11 +578,26 @@ MIIC0DCCAbigAwIBAgI...`
308
578
  description: 'Internal URL of the Kubernetes cluster control plane. This is the endpoint that kubelet uses to connect to the cluster.',
309
579
  example: 'https://10.31.64.7:6443'
310
580
  },
581
+ cluster_dns: {
582
+ type: 'string',
583
+ description: 'Cluster DNS IP address. This is the IP address of the kube-dns service in the cluster.',
584
+ example: '10.96.0.10'
585
+ },
586
+ pod_cidr: {
587
+ type: 'string',
588
+ description: 'Pod CIDR for the cluster. Used to configure iptables rules on nodes to prevent Tailscale routing loops.',
589
+ example: '10.244.0.0/16'
590
+ },
311
591
  auth_key: {
312
592
  type: 'string',
313
593
  description: 'Authentication key for the cluster.',
314
594
  example: 'tskey-auth-kBV8wr1dk911CNTRL-...'
315
595
  },
596
+ login_server: {
597
+ type: 'string',
598
+ description: 'Coordination server the node registers against. Empty on data plane v1 clusters, where the node advertises its own tag instead. A non-empty value requires a client that declares the dataplane-v2 capability.',
599
+ example: 'https://415026b6-f00f-44f8-968d-fc6ef4d0fc6d.fabric.europe-central-1a.cfke.io'
600
+ },
316
601
  bootstrap_token: {
317
602
  type: 'string',
318
603
  description: 'Bootstrap token for the cluster.',
@@ -342,7 +627,12 @@ MIIC0DCCAbigAwIBAgI...`
342
627
  example: '565.0.0'
343
628
  }
344
629
  },
345
- required: ['kubernetes', 'tailscale', 'containerd', 'nvidia_driver'],
630
+ required: [
631
+ 'kubernetes',
632
+ 'tailscale',
633
+ 'containerd',
634
+ 'nvidia_driver'
635
+ ],
346
636
  additionalProperties: false,
347
637
  description: 'Versions of the different components of the cluster.'
348
638
  },
@@ -365,12 +655,26 @@ MIIC0DCCAbigAwIBAgI...`
365
655
  example: '//iam.googleapis.com/projects/89014267864/locations/global/workloadIdentityPools/cfke/providers/oidc'
366
656
  }
367
657
  },
368
- required: ['metadata_url', 'aws_role_arn', 'gcp_workload_identity_provider'],
658
+ required: [
659
+ 'metadata_url',
660
+ 'aws_role_arn',
661
+ 'gcp_workload_identity_provider'
662
+ ],
369
663
  additionalProperties: false,
370
- description: "OIDC Information for hosts to access to third party API's."
664
+ description: 'OIDC Information for hosts to access to third party API\'s.'
371
665
  }
372
666
  },
373
- required: ['certificate_authority', 'endpoint', 'auth_key', 'bootstrap_token', 'versions', 'third_party_api_access_config'],
667
+ required: [
668
+ 'certificate_authority',
669
+ 'endpoint',
670
+ 'cluster_dns',
671
+ 'pod_cidr',
672
+ 'auth_key',
673
+ 'login_server',
674
+ 'bootstrap_token',
675
+ 'versions',
676
+ 'third_party_api_access_config'
677
+ ],
374
678
  additionalProperties: false
375
679
  };
376
680
  export const ClusterSchema = {
@@ -387,15 +691,122 @@ export const ClusterSchema = {
387
691
  tier: {
388
692
  type: 'string',
389
693
  description: 'Tier of the cluster.',
694
+ default: 'basic',
390
695
  example: 'pro',
391
- enum: ['basic', 'pro']
696
+ enum: [
697
+ 'basic',
698
+ 'pro',
699
+ 'enterprise'
700
+ ]
701
+ },
702
+ version_channel: {
703
+ type: 'string',
704
+ pattern: '^(x|X|0|[1-9]\\d*)\\.(x|X|0|[1-9]\\d*)\\.(x|X|0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$',
705
+ description: 'Version of the kubernetes cluster.',
706
+ default: '1.x.x-cfke.x',
707
+ example: '1.x.x-cfke.x'
708
+ },
709
+ release_channel: {
710
+ type: 'string',
711
+ description: 'Release channel for the cluster\'s control plane.',
712
+ default: 'rapid',
713
+ example: 'rapid',
714
+ enum: [
715
+ 'rapid',
716
+ 'stable',
717
+ 'extended'
718
+ ]
719
+ },
720
+ features: {
721
+ type: 'object',
722
+ properties: {
723
+ gpu_sharing_strategy: {
724
+ type: 'string',
725
+ description: 'GPU sharing strategy.',
726
+ default: 'none',
727
+ example: 'none',
728
+ enum: [
729
+ 'none',
730
+ 'mps',
731
+ 'time_slicing'
732
+ ]
733
+ },
734
+ gpu_max_shared_clients_per_gpu: {
735
+ type: 'integer',
736
+ minimum: 2,
737
+ maximum: 48,
738
+ description: 'Maximum number of pods that may share a single GPU.',
739
+ default: 4,
740
+ example: 10
741
+ },
742
+ cilium_socket_lb_host_namespace_only: {
743
+ type: 'boolean',
744
+ description: 'Restrict Cilium socket load-balancing to the host namespace. Required for the Tailscale operator and Istio.',
745
+ example: false
746
+ }
747
+ },
748
+ required: [
749
+ 'gpu_sharing_strategy',
750
+ 'gpu_max_shared_clients_per_gpu',
751
+ 'cilium_socket_lb_host_namespace_only'
752
+ ],
753
+ additionalProperties: false,
754
+ description: 'Cluster feature toggles.',
755
+ default: {
756
+ gpu_sharing_strategy: 'none',
757
+ gpu_max_shared_clients_per_gpu: 4,
758
+ cilium_socket_lb_host_namespace_only: false
759
+ }
392
760
  },
393
761
  region: {
394
762
  type: 'string',
395
- description: 'Cloudfleet control plane region. One of "staging", "northamerica-central-1", "europe-central-1a", "northamerica-central-1a". This field can not be updated after creation.',
396
- default: 'staging',
397
- example: 'northamerica-central-1a',
398
- enum: ['staging', 'northamerica-central-1', 'europe-central-1a', 'northamerica-central-1a']
763
+ description: 'Cloudfleet control plane region. This field can not be updated after creation.',
764
+ example: 'europe-central-1a'
765
+ },
766
+ networking: {
767
+ type: 'object',
768
+ properties: {
769
+ pod_cidr: {
770
+ type: 'string',
771
+ description: 'CIDR block for pod IPs.',
772
+ default: '10.244.0.0/16'
773
+ },
774
+ service_cidr: {
775
+ type: 'string',
776
+ description: 'CIDR block for service IPs.',
777
+ default: '10.96.0.0/12'
778
+ },
779
+ dual_stack: {
780
+ type: 'boolean',
781
+ description: 'Enable IPv4+IPv6 dual-stack networking.'
782
+ },
783
+ pod_cidr_v6: {
784
+ type: 'string',
785
+ description: 'IPv6 pod CIDR. Requires dual_stack.',
786
+ default: '2001:db8:1:2::/48'
787
+ },
788
+ service_cidr_v6: {
789
+ type: 'string',
790
+ description: 'IPv6 service CIDR. Requires dual_stack.',
791
+ default: '2001:db8:1:1::/112'
792
+ }
793
+ },
794
+ required: [
795
+ 'pod_cidr',
796
+ 'service_cidr',
797
+ 'dual_stack',
798
+ 'pod_cidr_v6',
799
+ 'service_cidr_v6'
800
+ ],
801
+ additionalProperties: false,
802
+ description: 'Cluster networking configuration. Immutable after creation.',
803
+ default: {
804
+ pod_cidr: '10.244.0.0/16',
805
+ service_cidr: '10.96.0.0/12',
806
+ dual_stack: false,
807
+ pod_cidr_v6: '2001:db8:1:2::/48',
808
+ service_cidr_v6: '2001:db8:1:1::/112'
809
+ }
399
810
  },
400
811
  id: {
401
812
  type: 'string',
@@ -405,29 +816,51 @@ export const ClusterSchema = {
405
816
  },
406
817
  status: {
407
818
  type: 'string',
408
- description: 'Status of the cluster. When creating a new cluster, set to `active`. When deleting a clusters, set to `deleted`.',
409
- example: 'active',
410
- enum: ['active', 'disabled', 'deleted', 'creating', 'deployed', 'failed', 'updating']
819
+ description: 'Status of the cluster.',
820
+ example: 'deployed',
821
+ enum: [
822
+ 'creating',
823
+ 'deployed',
824
+ 'updating',
825
+ 'disabled'
826
+ ]
411
827
  },
412
828
  endpoint: {
413
829
  anyOf: [
414
830
  {
415
831
  type: 'string',
416
832
  format: 'uri',
417
- description: 'URL of the Kubernetes cluster control plane. This is the endpoint that kubectl uses to connect to the cluster.',
418
- example: 'https://2ae6557c-c61f-49c6-b4c1-a65473470a03.staging.cfke.cloudfleet.dev:6443'
833
+ description: 'URL signed by a public CA of the Kubernetes cluster control plane. This is the endpoint that kubectl uses to connect to the cluster.',
834
+ example: 'https://2ae6557c-c61f-49c6-b4c1-a65473470a03.staging.cfke.io'
835
+ },
836
+ {
837
+ type: 'string',
838
+ enum: [
839
+ ''
840
+ ]
841
+ }
842
+ ]
843
+ },
844
+ endpoint_public: {
845
+ anyOf: [
846
+ {
847
+ type: 'string',
848
+ format: 'uri',
849
+ description: 'Deprecated alias of `endpoint`; retained for backward compatibility.',
850
+ example: 'https://2ae6557c-c61f-49c6-b4c1-a65473470a03.staging.cfke.io'
419
851
  },
420
852
  {
421
853
  type: 'string',
422
- enum: ['']
854
+ enum: [
855
+ ''
856
+ ]
423
857
  }
424
858
  ]
425
859
  },
426
860
  certificate_ca: {
427
861
  type: 'string',
428
862
  description: 'Certificate authority data for the kubernetes cluster. This is the root certificate authority for the cluster.',
429
- example: `-----BEGIN CERTIFICATE-----
430
- MIIC0DCCAbigAwIBAgI...`
863
+ example: '-----BEGIN CERTIFICATE-----\nMIIC0DCCAbigAwIBAgI...'
431
864
  },
432
865
  version_current: {
433
866
  type: 'string',
@@ -448,16 +881,22 @@ MIIC0DCCAbigAwIBAgI...`
448
881
  type: 'boolean',
449
882
  description: 'Indicates if the cluster is ready to be used.',
450
883
  example: true
451
- },
452
- version_channel: {
453
- type: 'string',
454
- pattern: '^(x|X|0|[1-9]\\d*)\\.(x|X|0|[1-9]\\d*)\\.(x|X|0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$',
455
- description: 'Version of the kubernetes cluster.',
456
- example: '1.x.x-cfke.x'
457
884
  }
458
885
  },
459
- required: ['name', 'tier', 'id', 'status'],
460
- additionalProperties: false
886
+ required: [
887
+ 'name',
888
+ 'tier',
889
+ 'version_channel',
890
+ 'release_channel',
891
+ 'features',
892
+ 'region',
893
+ 'networking',
894
+ 'id',
895
+ 'status',
896
+ 'ready'
897
+ ],
898
+ additionalProperties: false,
899
+ description: 'Mutable cluster configuration. Applied as a full overwrite: any omitted field is reset to its default rather than left unchanged.'
461
900
  };
462
901
  export const ClusterUpdateInputSchema = {
463
902
  type: 'object',
@@ -473,18 +912,74 @@ export const ClusterUpdateInputSchema = {
473
912
  tier: {
474
913
  type: 'string',
475
914
  description: 'Tier of the cluster.',
915
+ default: 'basic',
476
916
  example: 'pro',
477
- enum: ['basic', 'pro']
917
+ enum: [
918
+ 'basic',
919
+ 'pro',
920
+ 'enterprise'
921
+ ]
478
922
  },
479
923
  version_channel: {
480
924
  type: 'string',
481
925
  pattern: '^(x|X|0|[1-9]\\d*)\\.(x|X|0|[1-9]\\d*)\\.(x|X|0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$',
482
926
  description: 'Version of the kubernetes cluster.',
927
+ default: '1.x.x-cfke.x',
483
928
  example: '1.x.x-cfke.x'
929
+ },
930
+ release_channel: {
931
+ type: 'string',
932
+ description: 'Release channel for the cluster\'s control plane.',
933
+ default: 'rapid',
934
+ example: 'rapid',
935
+ enum: [
936
+ 'rapid',
937
+ 'stable',
938
+ 'extended'
939
+ ]
940
+ },
941
+ features: {
942
+ type: 'object',
943
+ properties: {
944
+ gpu_sharing_strategy: {
945
+ type: 'string',
946
+ description: 'GPU sharing strategy.',
947
+ default: 'none',
948
+ example: 'none',
949
+ enum: [
950
+ 'none',
951
+ 'mps',
952
+ 'time_slicing'
953
+ ]
954
+ },
955
+ gpu_max_shared_clients_per_gpu: {
956
+ type: 'integer',
957
+ minimum: 2,
958
+ maximum: 48,
959
+ description: 'Maximum number of pods that may share a single GPU.',
960
+ default: 4,
961
+ example: 10
962
+ },
963
+ cilium_socket_lb_host_namespace_only: {
964
+ type: 'boolean',
965
+ description: 'Restrict Cilium socket load-balancing to the host namespace. Required for the Tailscale operator and Istio.',
966
+ example: false
967
+ }
968
+ },
969
+ additionalProperties: false,
970
+ description: 'Cluster feature toggles.',
971
+ default: {
972
+ gpu_sharing_strategy: 'none',
973
+ gpu_max_shared_clients_per_gpu: 4,
974
+ cilium_socket_lb_host_namespace_only: false
975
+ }
484
976
  }
485
977
  },
486
- required: ['tier'],
487
- additionalProperties: false
978
+ required: [
979
+ 'name'
980
+ ],
981
+ additionalProperties: false,
982
+ description: 'Mutable cluster configuration. Applied as a full overwrite: any omitted field is reset to its default rather than left unchanged.'
488
983
  };
489
984
  export const FleetCreateInputSchema = {
490
985
  type: 'object',
@@ -493,13 +988,12 @@ export const FleetCreateInputSchema = {
493
988
  type: 'object',
494
989
  properties: {
495
990
  cpu: {
496
- type: 'number',
497
- format: 'float',
991
+ type: 'integer',
498
992
  minimum: 0,
499
- description: 'CPU limit in cores.'
993
+ maximum: 100000,
994
+ description: 'CPU limit in cores. Maximum 100,000.'
500
995
  }
501
996
  },
502
- required: ['cpu'],
503
997
  additionalProperties: false,
504
998
  description: 'Limits define a set of bounds for provisioning capacity.'
505
999
  },
@@ -507,47 +1001,396 @@ export const FleetCreateInputSchema = {
507
1001
  type: 'object',
508
1002
  properties: {
509
1003
  enabled: {
510
- type: 'boolean',
511
- default: true
1004
+ type: 'boolean'
512
1005
  },
513
1006
  project: {
514
1007
  type: 'string',
515
- description: 'Project GCP Project id to deploy instances into'
1008
+ pattern: '^[a-z][a-z0-9-]{4,28}[a-z0-9]$',
1009
+ description: 'GCP project ID to deploy instances into. 6-30 chars, lowercase letters/digits/hyphens, must start with a letter and not end with a hyphen. Omit when GCP is disabled.',
1010
+ example: 'my-cloudfleet-project'
516
1011
  }
517
1012
  },
518
- required: ['project'],
1013
+ required: [
1014
+ 'enabled'
1015
+ ],
519
1016
  additionalProperties: false
520
1017
  },
521
1018
  hetzner: {
522
1019
  type: 'object',
523
1020
  properties: {
524
1021
  enabled: {
525
- type: 'boolean',
526
- default: true
1022
+ type: 'boolean'
527
1023
  },
528
1024
  apiKey: {
529
1025
  type: 'string',
530
- description: 'Hetzner Cloud API key with read / write access'
1026
+ maxLength: 64,
1027
+ minLength: 64,
1028
+ pattern: '^([A-Za-z0-9]{64}|\\*{64})$',
1029
+ description: 'Hetzner Cloud API token with read/write access (64 alphanumeric characters). Write-only: reads return a redacted placeholder, never the token. Omit the field, or send the placeholder back unchanged, to keep the existing key. Send a new value to rotate it.'
531
1030
  }
532
1031
  },
533
- required: ['apiKey'],
1032
+ required: [
1033
+ 'enabled'
1034
+ ],
534
1035
  additionalProperties: false
535
1036
  },
536
1037
  aws: {
537
1038
  type: 'object',
538
1039
  properties: {
539
1040
  enabled: {
540
- type: 'boolean',
541
- default: true
1041
+ type: 'boolean'
542
1042
  },
543
1043
  controllerRoleArn: {
544
1044
  type: 'string',
545
- description: 'ControllerRoleArn is the AWS IAM role that Karpenter uses to manage resources.'
1045
+ pattern: '^arn:aws(-[a-z]+)*:iam::\\d{12}:role\\/[\\w+=,.@/-]+$',
1046
+ description: 'AWS IAM role ARN that Karpenter uses to manage resources. Omit when AWS is disabled.',
1047
+ example: 'arn:aws:iam::123456789012:role/Cloudfleet'
546
1048
  }
547
1049
  },
548
- required: ['controllerRoleArn'],
1050
+ required: [
1051
+ 'enabled'
1052
+ ],
549
1053
  additionalProperties: false
550
1054
  },
1055
+ constraints: {
1056
+ type: 'object',
1057
+ properties: {
1058
+ 'karpenter.sh/capacity-type': {
1059
+ type: 'array',
1060
+ items: {
1061
+ type: 'string',
1062
+ enum: [
1063
+ 'on-demand',
1064
+ 'spot'
1065
+ ]
1066
+ },
1067
+ minItems: 1,
1068
+ description: 'Allowed values for `karpenter.sh/capacity-type`.',
1069
+ default: [
1070
+ 'on-demand',
1071
+ 'spot'
1072
+ ]
1073
+ },
1074
+ 'kubernetes.io/arch': {
1075
+ type: 'array',
1076
+ items: {
1077
+ type: 'string',
1078
+ enum: [
1079
+ 'amd64',
1080
+ 'arm64'
1081
+ ]
1082
+ },
1083
+ minItems: 1,
1084
+ description: 'Allowed values for `kubernetes.io/arch`.',
1085
+ default: [
1086
+ 'amd64'
1087
+ ]
1088
+ },
1089
+ 'cfke.io/instance-family': {
1090
+ type: 'array',
1091
+ items: {
1092
+ type: 'string',
1093
+ enum: [
1094
+ 'a1',
1095
+ 'a2',
1096
+ 'a3',
1097
+ 'a4',
1098
+ 'c1',
1099
+ 'c2',
1100
+ 'c2d',
1101
+ 'c3',
1102
+ 'c3d',
1103
+ 'c4',
1104
+ 'c4a',
1105
+ 'c4d',
1106
+ 'c5',
1107
+ 'c5a',
1108
+ 'c5ad',
1109
+ 'c5d',
1110
+ 'c5n',
1111
+ 'c6a',
1112
+ 'c6g',
1113
+ 'c6gd',
1114
+ 'c6gn',
1115
+ 'c6i',
1116
+ 'c6id',
1117
+ 'c6in',
1118
+ 'c7a',
1119
+ 'c7g',
1120
+ 'c7gd',
1121
+ 'c7gn',
1122
+ 'c7i',
1123
+ 'c7i-flex',
1124
+ 'c8g',
1125
+ 'c8gd',
1126
+ 'cax',
1127
+ 'ccx',
1128
+ 'cpx',
1129
+ 'cx',
1130
+ 'd2',
1131
+ 'd3',
1132
+ 'd3en',
1133
+ 'dl1',
1134
+ 'dl2q',
1135
+ 'e2',
1136
+ 'f1',
1137
+ 'f2',
1138
+ 'g1',
1139
+ 'g2',
1140
+ 'g4ad',
1141
+ 'g4dn',
1142
+ 'g5',
1143
+ 'g5g',
1144
+ 'g6',
1145
+ 'g6e',
1146
+ 'gr6',
1147
+ 'h1',
1148
+ 'h3',
1149
+ 'hpc6a',
1150
+ 'hpc6id',
1151
+ 'hpc7a',
1152
+ 'hpc7g',
1153
+ 'i2',
1154
+ 'i3',
1155
+ 'i3en',
1156
+ 'i4g',
1157
+ 'i4i',
1158
+ 'i7i',
1159
+ 'i7ie',
1160
+ 'i8g',
1161
+ 'im4gn',
1162
+ 'inf1',
1163
+ 'inf2',
1164
+ 'is4gen',
1165
+ 'm1',
1166
+ 'm2',
1167
+ 'm3',
1168
+ 'm4',
1169
+ 'm5',
1170
+ 'm5a',
1171
+ 'm5ad',
1172
+ 'm5d',
1173
+ 'm5dn',
1174
+ 'm5n',
1175
+ 'm5zn',
1176
+ 'm6a',
1177
+ 'm6g',
1178
+ 'm6gd',
1179
+ 'm6i',
1180
+ 'm6id',
1181
+ 'm6idn',
1182
+ 'm6in',
1183
+ 'm7a',
1184
+ 'm7g',
1185
+ 'm7gd',
1186
+ 'm7i',
1187
+ 'm7i-flex',
1188
+ 'm8g',
1189
+ 'm8gd',
1190
+ 'n1',
1191
+ 'n2',
1192
+ 'n2d',
1193
+ 'n4',
1194
+ 'p3',
1195
+ 'p3dn',
1196
+ 'p4d',
1197
+ 'p4de',
1198
+ 'p5',
1199
+ 'p5e',
1200
+ 'p5en',
1201
+ 'p6-b200',
1202
+ 'r3',
1203
+ 'r4',
1204
+ 'r5',
1205
+ 'r5a',
1206
+ 'r5ad',
1207
+ 'r5b',
1208
+ 'r5d',
1209
+ 'r5dn',
1210
+ 'r5n',
1211
+ 'r6a',
1212
+ 'r6g',
1213
+ 'r6gd',
1214
+ 'r6i',
1215
+ 'r6id',
1216
+ 'r6idn',
1217
+ 'r6in',
1218
+ 'r7a',
1219
+ 'r7g',
1220
+ 'r7gd',
1221
+ 'r7i',
1222
+ 'r7iz',
1223
+ 'r8g',
1224
+ 'r8gd',
1225
+ 't2',
1226
+ 't2a',
1227
+ 't2d',
1228
+ 't3',
1229
+ 't3a',
1230
+ 't4g',
1231
+ 'trn1',
1232
+ 'trn1n',
1233
+ 'u-3tb1',
1234
+ 'u-6tb1',
1235
+ 'u7i-12tb',
1236
+ 'u7i-6tb',
1237
+ 'u7i-8tb',
1238
+ 'u7in-16tb',
1239
+ 'u7in-24tb',
1240
+ 'u7in-32tb',
1241
+ 'vt1',
1242
+ 'x1',
1243
+ 'x1e',
1244
+ 'x2gd',
1245
+ 'x2idn',
1246
+ 'x2iedn',
1247
+ 'x2iezn',
1248
+ 'x4',
1249
+ 'x8g',
1250
+ 'z1d',
1251
+ 'z3'
1252
+ ]
1253
+ },
1254
+ description: 'Allowed values for `cfke.io/instance-family`.',
1255
+ default: []
1256
+ },
1257
+ 'topology.kubernetes.io/region': {
1258
+ type: 'array',
1259
+ items: {
1260
+ type: 'string',
1261
+ enum: [
1262
+ 'africa-south1',
1263
+ 'ap-northeast-1',
1264
+ 'ap-northeast-2',
1265
+ 'ap-northeast-3',
1266
+ 'ap-south-1',
1267
+ 'ap-southeast-1',
1268
+ 'ap-southeast-2',
1269
+ 'ash',
1270
+ 'asia-east1',
1271
+ 'asia-east2',
1272
+ 'asia-northeast1',
1273
+ 'asia-northeast2',
1274
+ 'asia-northeast3',
1275
+ 'asia-south1',
1276
+ 'asia-south2',
1277
+ 'asia-southeast1',
1278
+ 'asia-southeast2',
1279
+ 'australia-southeast1',
1280
+ 'australia-southeast2',
1281
+ 'ca-central-1',
1282
+ 'eu-central-1',
1283
+ 'eu-central-2',
1284
+ 'eu-north-1',
1285
+ 'eu-west-1',
1286
+ 'eu-west-2',
1287
+ 'eu-west-3',
1288
+ 'europe-central2',
1289
+ 'europe-north1',
1290
+ 'europe-southwest1',
1291
+ 'europe-west1',
1292
+ 'europe-west10',
1293
+ 'europe-west12',
1294
+ 'europe-west2',
1295
+ 'europe-west3',
1296
+ 'europe-west4',
1297
+ 'europe-west6',
1298
+ 'europe-west8',
1299
+ 'europe-west9',
1300
+ 'fsn1',
1301
+ 'hel1',
1302
+ 'hil',
1303
+ 'me-central1',
1304
+ 'me-central2',
1305
+ 'me-west1',
1306
+ 'nbg1',
1307
+ 'northamerica-northeast1',
1308
+ 'northamerica-northeast2',
1309
+ 'sa-east-1',
1310
+ 'sin',
1311
+ 'southamerica-east1',
1312
+ 'southamerica-west1',
1313
+ 'us-central1',
1314
+ 'us-east-1',
1315
+ 'us-east-2',
1316
+ 'us-east1',
1317
+ 'us-east4',
1318
+ 'us-east5',
1319
+ 'us-south1',
1320
+ 'us-west-1',
1321
+ 'us-west-2',
1322
+ 'us-west1',
1323
+ 'us-west2',
1324
+ 'us-west3',
1325
+ 'us-west4'
1326
+ ]
1327
+ },
1328
+ description: 'Allowed values for `topology.kubernetes.io/region`.',
1329
+ default: []
1330
+ }
1331
+ },
1332
+ additionalProperties: false,
1333
+ description: 'Constraints define scheduling and provisioning requirements for the fleet. Each field restricts the values allowed for a given Kubernetes label key. Multiple constraints are ANDed together.',
1334
+ default: {
1335
+ 'karpenter.sh/capacity-type': [
1336
+ 'on-demand',
1337
+ 'spot'
1338
+ ],
1339
+ 'kubernetes.io/arch': [
1340
+ 'amd64'
1341
+ ],
1342
+ 'cfke.io/instance-family': [],
1343
+ 'topology.kubernetes.io/region': []
1344
+ }
1345
+ },
1346
+ scalingProfile: {
1347
+ type: 'string',
1348
+ description: 'Controls scale-up / scale-down responsiveness. `aggressive` prioritizes cost-optimization. `conservative` prioritizes stability of the fleet. Full-overwrite: omit to reset to the default (`conservative`).',
1349
+ default: 'conservative',
1350
+ example: 'conservative',
1351
+ enum: [
1352
+ 'aggressive',
1353
+ 'conservative'
1354
+ ]
1355
+ },
1356
+ taints: {
1357
+ type: 'array',
1358
+ items: {
1359
+ type: 'object',
1360
+ properties: {
1361
+ key: {
1362
+ type: 'string',
1363
+ description: 'Taint key: a Kubernetes qualified name with an optional DNS subdomain prefix. Keys under `node.kubernetes.io`, `node.cloudprovider.kubernetes.io`, `node.cilium.io`, `karpenter.sh` and `cfke.io` (and their subdomains) are reserved.',
1364
+ example: 'dedicated'
1365
+ },
1366
+ value: {
1367
+ type: 'string',
1368
+ maxLength: 63,
1369
+ pattern: '^([A-Za-z0-9]([-A-Za-z0-9_.]*[A-Za-z0-9])?)?$',
1370
+ description: 'Taint value. Optional.',
1371
+ example: 'ci'
1372
+ },
1373
+ effect: {
1374
+ type: 'string',
1375
+ description: 'Taint effect.',
1376
+ example: 'NoSchedule',
1377
+ enum: [
1378
+ 'NoSchedule',
1379
+ 'PreferNoSchedule',
1380
+ 'NoExecute'
1381
+ ]
1382
+ }
1383
+ },
1384
+ required: [
1385
+ 'key',
1386
+ 'effect'
1387
+ ],
1388
+ additionalProperties: false
1389
+ },
1390
+ maxItems: 50,
1391
+ description: 'Taints applied to every node the fleet provisions, so only pods that tolerate them schedule there. Each key and effect pair may appear once. Full-overwrite: omit to remove all taints.',
1392
+ default: []
1393
+ },
551
1394
  id: {
552
1395
  type: 'string',
553
1396
  maxLength: 63,
@@ -557,8 +1400,11 @@ export const FleetCreateInputSchema = {
557
1400
  example: 'new-clouds-fleet'
558
1401
  }
559
1402
  },
560
- required: ['id'],
561
- additionalProperties: false
1403
+ required: [
1404
+ 'id'
1405
+ ],
1406
+ additionalProperties: false,
1407
+ description: 'Mutable fleet configuration. Applied as a full overwrite: any omitted field is reset to its default rather than left unchanged.'
562
1408
  };
563
1409
  export const FleetSchema = {
564
1410
  type: 'object',
@@ -567,13 +1413,12 @@ export const FleetSchema = {
567
1413
  type: 'object',
568
1414
  properties: {
569
1415
  cpu: {
570
- type: 'number',
571
- format: 'float',
1416
+ type: 'integer',
572
1417
  minimum: 0,
573
- description: 'CPU limit in cores.'
1418
+ maximum: 100000,
1419
+ description: 'CPU limit in cores. Maximum 100,000.'
574
1420
  }
575
1421
  },
576
- required: ['cpu'],
577
1422
  additionalProperties: false,
578
1423
  description: 'Limits define a set of bounds for provisioning capacity.'
579
1424
  },
@@ -581,47 +1426,398 @@ export const FleetSchema = {
581
1426
  type: 'object',
582
1427
  properties: {
583
1428
  enabled: {
584
- type: 'boolean',
585
- default: true
1429
+ type: 'boolean'
586
1430
  },
587
1431
  project: {
588
1432
  type: 'string',
589
- description: 'Project GCP Project id to deploy instances into'
1433
+ pattern: '^[a-z][a-z0-9-]{4,28}[a-z0-9]$',
1434
+ description: 'GCP project ID to deploy instances into. 6-30 chars, lowercase letters/digits/hyphens, must start with a letter and not end with a hyphen. Omit when GCP is disabled.',
1435
+ example: 'my-cloudfleet-project'
590
1436
  }
591
1437
  },
592
- required: ['project'],
1438
+ required: [
1439
+ 'enabled'
1440
+ ],
593
1441
  additionalProperties: false
594
1442
  },
595
1443
  hetzner: {
596
1444
  type: 'object',
597
1445
  properties: {
598
1446
  enabled: {
599
- type: 'boolean',
600
- default: true
1447
+ type: 'boolean'
601
1448
  },
602
1449
  apiKey: {
603
1450
  type: 'string',
604
- description: 'Hetzner Cloud API key with read / write access'
1451
+ pattern: '^\\*{64}$',
1452
+ description: 'Redacted Hetzner API token. Returned as 64 asterisks when a token is configured; omitted otherwise. The real value is never echoed by the API.'
605
1453
  }
606
1454
  },
607
- required: ['apiKey'],
1455
+ required: [
1456
+ 'enabled'
1457
+ ],
608
1458
  additionalProperties: false
609
1459
  },
610
1460
  aws: {
611
1461
  type: 'object',
612
1462
  properties: {
613
1463
  enabled: {
614
- type: 'boolean',
615
- default: true
1464
+ type: 'boolean'
616
1465
  },
617
1466
  controllerRoleArn: {
618
1467
  type: 'string',
619
- description: 'ControllerRoleArn is the AWS IAM role that Karpenter uses to manage resources.'
1468
+ pattern: '^arn:aws(-[a-z]+)*:iam::\\d{12}:role\\/[\\w+=,.@/-]+$',
1469
+ description: 'AWS IAM role ARN that Karpenter uses to manage resources. Omit when AWS is disabled.',
1470
+ example: 'arn:aws:iam::123456789012:role/Cloudfleet'
620
1471
  }
621
1472
  },
622
- required: ['controllerRoleArn'],
1473
+ required: [
1474
+ 'enabled'
1475
+ ],
623
1476
  additionalProperties: false
624
1477
  },
1478
+ constraints: {
1479
+ type: 'object',
1480
+ properties: {
1481
+ 'karpenter.sh/capacity-type': {
1482
+ type: 'array',
1483
+ items: {
1484
+ type: 'string',
1485
+ enum: [
1486
+ 'on-demand',
1487
+ 'spot'
1488
+ ]
1489
+ },
1490
+ minItems: 1,
1491
+ description: 'Allowed values for `karpenter.sh/capacity-type`.',
1492
+ default: [
1493
+ 'on-demand',
1494
+ 'spot'
1495
+ ]
1496
+ },
1497
+ 'kubernetes.io/arch': {
1498
+ type: 'array',
1499
+ items: {
1500
+ type: 'string',
1501
+ enum: [
1502
+ 'amd64',
1503
+ 'arm64'
1504
+ ]
1505
+ },
1506
+ minItems: 1,
1507
+ description: 'Allowed values for `kubernetes.io/arch`.',
1508
+ default: [
1509
+ 'amd64'
1510
+ ]
1511
+ },
1512
+ 'cfke.io/instance-family': {
1513
+ type: 'array',
1514
+ items: {
1515
+ type: 'string',
1516
+ enum: [
1517
+ 'a1',
1518
+ 'a2',
1519
+ 'a3',
1520
+ 'a4',
1521
+ 'c1',
1522
+ 'c2',
1523
+ 'c2d',
1524
+ 'c3',
1525
+ 'c3d',
1526
+ 'c4',
1527
+ 'c4a',
1528
+ 'c4d',
1529
+ 'c5',
1530
+ 'c5a',
1531
+ 'c5ad',
1532
+ 'c5d',
1533
+ 'c5n',
1534
+ 'c6a',
1535
+ 'c6g',
1536
+ 'c6gd',
1537
+ 'c6gn',
1538
+ 'c6i',
1539
+ 'c6id',
1540
+ 'c6in',
1541
+ 'c7a',
1542
+ 'c7g',
1543
+ 'c7gd',
1544
+ 'c7gn',
1545
+ 'c7i',
1546
+ 'c7i-flex',
1547
+ 'c8g',
1548
+ 'c8gd',
1549
+ 'cax',
1550
+ 'ccx',
1551
+ 'cpx',
1552
+ 'cx',
1553
+ 'd2',
1554
+ 'd3',
1555
+ 'd3en',
1556
+ 'dl1',
1557
+ 'dl2q',
1558
+ 'e2',
1559
+ 'f1',
1560
+ 'f2',
1561
+ 'g1',
1562
+ 'g2',
1563
+ 'g4ad',
1564
+ 'g4dn',
1565
+ 'g5',
1566
+ 'g5g',
1567
+ 'g6',
1568
+ 'g6e',
1569
+ 'gr6',
1570
+ 'h1',
1571
+ 'h3',
1572
+ 'hpc6a',
1573
+ 'hpc6id',
1574
+ 'hpc7a',
1575
+ 'hpc7g',
1576
+ 'i2',
1577
+ 'i3',
1578
+ 'i3en',
1579
+ 'i4g',
1580
+ 'i4i',
1581
+ 'i7i',
1582
+ 'i7ie',
1583
+ 'i8g',
1584
+ 'im4gn',
1585
+ 'inf1',
1586
+ 'inf2',
1587
+ 'is4gen',
1588
+ 'm1',
1589
+ 'm2',
1590
+ 'm3',
1591
+ 'm4',
1592
+ 'm5',
1593
+ 'm5a',
1594
+ 'm5ad',
1595
+ 'm5d',
1596
+ 'm5dn',
1597
+ 'm5n',
1598
+ 'm5zn',
1599
+ 'm6a',
1600
+ 'm6g',
1601
+ 'm6gd',
1602
+ 'm6i',
1603
+ 'm6id',
1604
+ 'm6idn',
1605
+ 'm6in',
1606
+ 'm7a',
1607
+ 'm7g',
1608
+ 'm7gd',
1609
+ 'm7i',
1610
+ 'm7i-flex',
1611
+ 'm8g',
1612
+ 'm8gd',
1613
+ 'n1',
1614
+ 'n2',
1615
+ 'n2d',
1616
+ 'n4',
1617
+ 'p3',
1618
+ 'p3dn',
1619
+ 'p4d',
1620
+ 'p4de',
1621
+ 'p5',
1622
+ 'p5e',
1623
+ 'p5en',
1624
+ 'p6-b200',
1625
+ 'r3',
1626
+ 'r4',
1627
+ 'r5',
1628
+ 'r5a',
1629
+ 'r5ad',
1630
+ 'r5b',
1631
+ 'r5d',
1632
+ 'r5dn',
1633
+ 'r5n',
1634
+ 'r6a',
1635
+ 'r6g',
1636
+ 'r6gd',
1637
+ 'r6i',
1638
+ 'r6id',
1639
+ 'r6idn',
1640
+ 'r6in',
1641
+ 'r7a',
1642
+ 'r7g',
1643
+ 'r7gd',
1644
+ 'r7i',
1645
+ 'r7iz',
1646
+ 'r8g',
1647
+ 'r8gd',
1648
+ 't2',
1649
+ 't2a',
1650
+ 't2d',
1651
+ 't3',
1652
+ 't3a',
1653
+ 't4g',
1654
+ 'trn1',
1655
+ 'trn1n',
1656
+ 'u-3tb1',
1657
+ 'u-6tb1',
1658
+ 'u7i-12tb',
1659
+ 'u7i-6tb',
1660
+ 'u7i-8tb',
1661
+ 'u7in-16tb',
1662
+ 'u7in-24tb',
1663
+ 'u7in-32tb',
1664
+ 'vt1',
1665
+ 'x1',
1666
+ 'x1e',
1667
+ 'x2gd',
1668
+ 'x2idn',
1669
+ 'x2iedn',
1670
+ 'x2iezn',
1671
+ 'x4',
1672
+ 'x8g',
1673
+ 'z1d',
1674
+ 'z3'
1675
+ ]
1676
+ },
1677
+ description: 'Allowed values for `cfke.io/instance-family`.',
1678
+ default: []
1679
+ },
1680
+ 'topology.kubernetes.io/region': {
1681
+ type: 'array',
1682
+ items: {
1683
+ type: 'string',
1684
+ enum: [
1685
+ 'africa-south1',
1686
+ 'ap-northeast-1',
1687
+ 'ap-northeast-2',
1688
+ 'ap-northeast-3',
1689
+ 'ap-south-1',
1690
+ 'ap-southeast-1',
1691
+ 'ap-southeast-2',
1692
+ 'ash',
1693
+ 'asia-east1',
1694
+ 'asia-east2',
1695
+ 'asia-northeast1',
1696
+ 'asia-northeast2',
1697
+ 'asia-northeast3',
1698
+ 'asia-south1',
1699
+ 'asia-south2',
1700
+ 'asia-southeast1',
1701
+ 'asia-southeast2',
1702
+ 'australia-southeast1',
1703
+ 'australia-southeast2',
1704
+ 'ca-central-1',
1705
+ 'eu-central-1',
1706
+ 'eu-central-2',
1707
+ 'eu-north-1',
1708
+ 'eu-west-1',
1709
+ 'eu-west-2',
1710
+ 'eu-west-3',
1711
+ 'europe-central2',
1712
+ 'europe-north1',
1713
+ 'europe-southwest1',
1714
+ 'europe-west1',
1715
+ 'europe-west10',
1716
+ 'europe-west12',
1717
+ 'europe-west2',
1718
+ 'europe-west3',
1719
+ 'europe-west4',
1720
+ 'europe-west6',
1721
+ 'europe-west8',
1722
+ 'europe-west9',
1723
+ 'fsn1',
1724
+ 'hel1',
1725
+ 'hil',
1726
+ 'me-central1',
1727
+ 'me-central2',
1728
+ 'me-west1',
1729
+ 'nbg1',
1730
+ 'northamerica-northeast1',
1731
+ 'northamerica-northeast2',
1732
+ 'sa-east-1',
1733
+ 'sin',
1734
+ 'southamerica-east1',
1735
+ 'southamerica-west1',
1736
+ 'us-central1',
1737
+ 'us-east-1',
1738
+ 'us-east-2',
1739
+ 'us-east1',
1740
+ 'us-east4',
1741
+ 'us-east5',
1742
+ 'us-south1',
1743
+ 'us-west-1',
1744
+ 'us-west-2',
1745
+ 'us-west1',
1746
+ 'us-west2',
1747
+ 'us-west3',
1748
+ 'us-west4'
1749
+ ]
1750
+ },
1751
+ description: 'Allowed values for `topology.kubernetes.io/region`.',
1752
+ default: []
1753
+ }
1754
+ },
1755
+ required: [
1756
+ 'karpenter.sh/capacity-type',
1757
+ 'kubernetes.io/arch'
1758
+ ],
1759
+ additionalProperties: false,
1760
+ description: 'Constraints define scheduling and provisioning requirements for the fleet. Each field restricts the values allowed for a given Kubernetes label key. Multiple constraints are ANDed together.',
1761
+ default: {
1762
+ 'karpenter.sh/capacity-type': [
1763
+ 'on-demand',
1764
+ 'spot'
1765
+ ],
1766
+ 'kubernetes.io/arch': [
1767
+ 'amd64'
1768
+ ],
1769
+ 'cfke.io/instance-family': [],
1770
+ 'topology.kubernetes.io/region': []
1771
+ }
1772
+ },
1773
+ scalingProfile: {
1774
+ type: 'string',
1775
+ description: 'Controls scale-up / scale-down responsiveness. `aggressive` prioritizes cost-optimization. `conservative` prioritizes stability of the fleet. Full-overwrite: omit to reset to the default (`conservative`).',
1776
+ default: 'conservative',
1777
+ example: 'conservative',
1778
+ enum: [
1779
+ 'aggressive',
1780
+ 'conservative'
1781
+ ]
1782
+ },
1783
+ taints: {
1784
+ type: 'array',
1785
+ items: {
1786
+ type: 'object',
1787
+ properties: {
1788
+ key: {
1789
+ type: 'string',
1790
+ description: 'Taint key: a Kubernetes qualified name with an optional DNS subdomain prefix. Keys under `node.kubernetes.io`, `node.cloudprovider.kubernetes.io`, `node.cilium.io`, `karpenter.sh` and `cfke.io` (and their subdomains) are reserved.',
1791
+ example: 'dedicated'
1792
+ },
1793
+ value: {
1794
+ type: 'string',
1795
+ maxLength: 63,
1796
+ pattern: '^([A-Za-z0-9]([-A-Za-z0-9_.]*[A-Za-z0-9])?)?$',
1797
+ description: 'Taint value. Optional.',
1798
+ example: 'ci'
1799
+ },
1800
+ effect: {
1801
+ type: 'string',
1802
+ description: 'Taint effect.',
1803
+ example: 'NoSchedule',
1804
+ enum: [
1805
+ 'NoSchedule',
1806
+ 'PreferNoSchedule',
1807
+ 'NoExecute'
1808
+ ]
1809
+ }
1810
+ },
1811
+ required: [
1812
+ 'key',
1813
+ 'effect'
1814
+ ],
1815
+ additionalProperties: false
1816
+ },
1817
+ maxItems: 50,
1818
+ description: 'Taints applied to every node the fleet provisions, so only pods that tolerate them schedule there. Each key and effect pair may appear once. Full-overwrite: omit to remove all taints.',
1819
+ default: []
1820
+ },
625
1821
  id: {
626
1822
  type: 'string',
627
1823
  maxLength: 63,
@@ -629,10 +1825,39 @@ export const FleetSchema = {
629
1825
  pattern: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$',
630
1826
  description: 'Unique identifier of the kubernetes fleet.',
631
1827
  example: 'new-clouds-fleet'
1828
+ },
1829
+ ready: {
1830
+ type: 'boolean',
1831
+ description: 'Indicates whether the fleet configuration is healthy.',
1832
+ example: true
1833
+ },
1834
+ status_message: {
1835
+ type: 'string',
1836
+ description: 'Human-readable reason the fleet is not ready. Present only when `ready` is false.',
1837
+ example: 'Invalid provider permissions.'
1838
+ },
1839
+ created_at: {
1840
+ type: 'string',
1841
+ description: 'Creation date and time of the fleet.',
1842
+ example: '2024-09-12T09:11:27Z'
1843
+ },
1844
+ updated_at: {
1845
+ type: 'string',
1846
+ description: 'Date and time the fleet was last updated.',
1847
+ example: '2024-09-12T09:11:27Z'
632
1848
  }
633
1849
  },
634
- required: ['id'],
635
- additionalProperties: false
1850
+ required: [
1851
+ 'constraints',
1852
+ 'scalingProfile',
1853
+ 'taints',
1854
+ 'id',
1855
+ 'ready',
1856
+ 'created_at',
1857
+ 'updated_at'
1858
+ ],
1859
+ additionalProperties: false,
1860
+ description: 'Mutable fleet configuration. Applied as a full overwrite: any omitted field is reset to its default rather than left unchanged.'
636
1861
  };
637
1862
  export const FleetUpdateInputSchema = {
638
1863
  type: 'object',
@@ -641,13 +1866,12 @@ export const FleetUpdateInputSchema = {
641
1866
  type: 'object',
642
1867
  properties: {
643
1868
  cpu: {
644
- type: 'number',
645
- format: 'float',
1869
+ type: 'integer',
646
1870
  minimum: 0,
647
- description: 'CPU limit in cores.'
1871
+ maximum: 100000,
1872
+ description: 'CPU limit in cores. Maximum 100,000.'
648
1873
  }
649
1874
  },
650
- required: ['cpu'],
651
1875
  additionalProperties: false,
652
1876
  description: 'Limits define a set of bounds for provisioning capacity.'
653
1877
  },
@@ -655,48 +1879,423 @@ export const FleetUpdateInputSchema = {
655
1879
  type: 'object',
656
1880
  properties: {
657
1881
  enabled: {
658
- type: 'boolean',
659
- default: true
1882
+ type: 'boolean'
660
1883
  },
661
1884
  project: {
662
1885
  type: 'string',
663
- description: 'Project GCP Project id to deploy instances into'
1886
+ pattern: '^[a-z][a-z0-9-]{4,28}[a-z0-9]$',
1887
+ description: 'GCP project ID to deploy instances into. 6-30 chars, lowercase letters/digits/hyphens, must start with a letter and not end with a hyphen. Omit when GCP is disabled.',
1888
+ example: 'my-cloudfleet-project'
664
1889
  }
665
1890
  },
666
- required: ['project'],
1891
+ required: [
1892
+ 'enabled'
1893
+ ],
667
1894
  additionalProperties: false
668
1895
  },
669
1896
  hetzner: {
670
1897
  type: 'object',
671
1898
  properties: {
672
1899
  enabled: {
673
- type: 'boolean',
674
- default: true
1900
+ type: 'boolean'
675
1901
  },
676
1902
  apiKey: {
677
1903
  type: 'string',
678
- description: 'Hetzner Cloud API key with read / write access'
1904
+ maxLength: 64,
1905
+ minLength: 64,
1906
+ pattern: '^([A-Za-z0-9]{64}|\\*{64})$',
1907
+ description: 'Hetzner Cloud API token with read/write access (64 alphanumeric characters). Write-only: reads return a redacted placeholder, never the token. Omit the field, or send the placeholder back unchanged, to keep the existing key. Send a new value to rotate it.'
679
1908
  }
680
1909
  },
681
- required: ['apiKey'],
1910
+ required: [
1911
+ 'enabled'
1912
+ ],
682
1913
  additionalProperties: false
683
1914
  },
684
1915
  aws: {
685
1916
  type: 'object',
686
1917
  properties: {
687
1918
  enabled: {
688
- type: 'boolean',
689
- default: true
1919
+ type: 'boolean'
690
1920
  },
691
1921
  controllerRoleArn: {
692
1922
  type: 'string',
693
- description: 'ControllerRoleArn is the AWS IAM role that Karpenter uses to manage resources.'
1923
+ pattern: '^arn:aws(-[a-z]+)*:iam::\\d{12}:role\\/[\\w+=,.@/-]+$',
1924
+ description: 'AWS IAM role ARN that Karpenter uses to manage resources. Omit when AWS is disabled.',
1925
+ example: 'arn:aws:iam::123456789012:role/Cloudfleet'
694
1926
  }
695
1927
  },
696
- required: ['controllerRoleArn'],
1928
+ required: [
1929
+ 'enabled'
1930
+ ],
697
1931
  additionalProperties: false
1932
+ },
1933
+ constraints: {
1934
+ type: 'object',
1935
+ properties: {
1936
+ 'karpenter.sh/capacity-type': {
1937
+ type: 'array',
1938
+ items: {
1939
+ type: 'string',
1940
+ enum: [
1941
+ 'on-demand',
1942
+ 'spot'
1943
+ ]
1944
+ },
1945
+ minItems: 1,
1946
+ description: 'Allowed values for `karpenter.sh/capacity-type`.',
1947
+ default: [
1948
+ 'on-demand',
1949
+ 'spot'
1950
+ ]
1951
+ },
1952
+ 'kubernetes.io/arch': {
1953
+ type: 'array',
1954
+ items: {
1955
+ type: 'string',
1956
+ enum: [
1957
+ 'amd64',
1958
+ 'arm64'
1959
+ ]
1960
+ },
1961
+ minItems: 1,
1962
+ description: 'Allowed values for `kubernetes.io/arch`.',
1963
+ default: [
1964
+ 'amd64'
1965
+ ]
1966
+ },
1967
+ 'cfke.io/instance-family': {
1968
+ type: 'array',
1969
+ items: {
1970
+ type: 'string',
1971
+ enum: [
1972
+ 'a1',
1973
+ 'a2',
1974
+ 'a3',
1975
+ 'a4',
1976
+ 'c1',
1977
+ 'c2',
1978
+ 'c2d',
1979
+ 'c3',
1980
+ 'c3d',
1981
+ 'c4',
1982
+ 'c4a',
1983
+ 'c4d',
1984
+ 'c5',
1985
+ 'c5a',
1986
+ 'c5ad',
1987
+ 'c5d',
1988
+ 'c5n',
1989
+ 'c6a',
1990
+ 'c6g',
1991
+ 'c6gd',
1992
+ 'c6gn',
1993
+ 'c6i',
1994
+ 'c6id',
1995
+ 'c6in',
1996
+ 'c7a',
1997
+ 'c7g',
1998
+ 'c7gd',
1999
+ 'c7gn',
2000
+ 'c7i',
2001
+ 'c7i-flex',
2002
+ 'c8g',
2003
+ 'c8gd',
2004
+ 'cax',
2005
+ 'ccx',
2006
+ 'cpx',
2007
+ 'cx',
2008
+ 'd2',
2009
+ 'd3',
2010
+ 'd3en',
2011
+ 'dl1',
2012
+ 'dl2q',
2013
+ 'e2',
2014
+ 'f1',
2015
+ 'f2',
2016
+ 'g1',
2017
+ 'g2',
2018
+ 'g4ad',
2019
+ 'g4dn',
2020
+ 'g5',
2021
+ 'g5g',
2022
+ 'g6',
2023
+ 'g6e',
2024
+ 'gr6',
2025
+ 'h1',
2026
+ 'h3',
2027
+ 'hpc6a',
2028
+ 'hpc6id',
2029
+ 'hpc7a',
2030
+ 'hpc7g',
2031
+ 'i2',
2032
+ 'i3',
2033
+ 'i3en',
2034
+ 'i4g',
2035
+ 'i4i',
2036
+ 'i7i',
2037
+ 'i7ie',
2038
+ 'i8g',
2039
+ 'im4gn',
2040
+ 'inf1',
2041
+ 'inf2',
2042
+ 'is4gen',
2043
+ 'm1',
2044
+ 'm2',
2045
+ 'm3',
2046
+ 'm4',
2047
+ 'm5',
2048
+ 'm5a',
2049
+ 'm5ad',
2050
+ 'm5d',
2051
+ 'm5dn',
2052
+ 'm5n',
2053
+ 'm5zn',
2054
+ 'm6a',
2055
+ 'm6g',
2056
+ 'm6gd',
2057
+ 'm6i',
2058
+ 'm6id',
2059
+ 'm6idn',
2060
+ 'm6in',
2061
+ 'm7a',
2062
+ 'm7g',
2063
+ 'm7gd',
2064
+ 'm7i',
2065
+ 'm7i-flex',
2066
+ 'm8g',
2067
+ 'm8gd',
2068
+ 'n1',
2069
+ 'n2',
2070
+ 'n2d',
2071
+ 'n4',
2072
+ 'p3',
2073
+ 'p3dn',
2074
+ 'p4d',
2075
+ 'p4de',
2076
+ 'p5',
2077
+ 'p5e',
2078
+ 'p5en',
2079
+ 'p6-b200',
2080
+ 'r3',
2081
+ 'r4',
2082
+ 'r5',
2083
+ 'r5a',
2084
+ 'r5ad',
2085
+ 'r5b',
2086
+ 'r5d',
2087
+ 'r5dn',
2088
+ 'r5n',
2089
+ 'r6a',
2090
+ 'r6g',
2091
+ 'r6gd',
2092
+ 'r6i',
2093
+ 'r6id',
2094
+ 'r6idn',
2095
+ 'r6in',
2096
+ 'r7a',
2097
+ 'r7g',
2098
+ 'r7gd',
2099
+ 'r7i',
2100
+ 'r7iz',
2101
+ 'r8g',
2102
+ 'r8gd',
2103
+ 't2',
2104
+ 't2a',
2105
+ 't2d',
2106
+ 't3',
2107
+ 't3a',
2108
+ 't4g',
2109
+ 'trn1',
2110
+ 'trn1n',
2111
+ 'u-3tb1',
2112
+ 'u-6tb1',
2113
+ 'u7i-12tb',
2114
+ 'u7i-6tb',
2115
+ 'u7i-8tb',
2116
+ 'u7in-16tb',
2117
+ 'u7in-24tb',
2118
+ 'u7in-32tb',
2119
+ 'vt1',
2120
+ 'x1',
2121
+ 'x1e',
2122
+ 'x2gd',
2123
+ 'x2idn',
2124
+ 'x2iedn',
2125
+ 'x2iezn',
2126
+ 'x4',
2127
+ 'x8g',
2128
+ 'z1d',
2129
+ 'z3'
2130
+ ]
2131
+ },
2132
+ description: 'Allowed values for `cfke.io/instance-family`.',
2133
+ default: []
2134
+ },
2135
+ 'topology.kubernetes.io/region': {
2136
+ type: 'array',
2137
+ items: {
2138
+ type: 'string',
2139
+ enum: [
2140
+ 'africa-south1',
2141
+ 'ap-northeast-1',
2142
+ 'ap-northeast-2',
2143
+ 'ap-northeast-3',
2144
+ 'ap-south-1',
2145
+ 'ap-southeast-1',
2146
+ 'ap-southeast-2',
2147
+ 'ash',
2148
+ 'asia-east1',
2149
+ 'asia-east2',
2150
+ 'asia-northeast1',
2151
+ 'asia-northeast2',
2152
+ 'asia-northeast3',
2153
+ 'asia-south1',
2154
+ 'asia-south2',
2155
+ 'asia-southeast1',
2156
+ 'asia-southeast2',
2157
+ 'australia-southeast1',
2158
+ 'australia-southeast2',
2159
+ 'ca-central-1',
2160
+ 'eu-central-1',
2161
+ 'eu-central-2',
2162
+ 'eu-north-1',
2163
+ 'eu-west-1',
2164
+ 'eu-west-2',
2165
+ 'eu-west-3',
2166
+ 'europe-central2',
2167
+ 'europe-north1',
2168
+ 'europe-southwest1',
2169
+ 'europe-west1',
2170
+ 'europe-west10',
2171
+ 'europe-west12',
2172
+ 'europe-west2',
2173
+ 'europe-west3',
2174
+ 'europe-west4',
2175
+ 'europe-west6',
2176
+ 'europe-west8',
2177
+ 'europe-west9',
2178
+ 'fsn1',
2179
+ 'hel1',
2180
+ 'hil',
2181
+ 'me-central1',
2182
+ 'me-central2',
2183
+ 'me-west1',
2184
+ 'nbg1',
2185
+ 'northamerica-northeast1',
2186
+ 'northamerica-northeast2',
2187
+ 'sa-east-1',
2188
+ 'sin',
2189
+ 'southamerica-east1',
2190
+ 'southamerica-west1',
2191
+ 'us-central1',
2192
+ 'us-east-1',
2193
+ 'us-east-2',
2194
+ 'us-east1',
2195
+ 'us-east4',
2196
+ 'us-east5',
2197
+ 'us-south1',
2198
+ 'us-west-1',
2199
+ 'us-west-2',
2200
+ 'us-west1',
2201
+ 'us-west2',
2202
+ 'us-west3',
2203
+ 'us-west4'
2204
+ ]
2205
+ },
2206
+ description: 'Allowed values for `topology.kubernetes.io/region`.',
2207
+ default: []
2208
+ }
2209
+ },
2210
+ additionalProperties: false,
2211
+ description: 'Constraints define scheduling and provisioning requirements for the fleet. Each field restricts the values allowed for a given Kubernetes label key. Multiple constraints are ANDed together.',
2212
+ default: {
2213
+ 'karpenter.sh/capacity-type': [
2214
+ 'on-demand',
2215
+ 'spot'
2216
+ ],
2217
+ 'kubernetes.io/arch': [
2218
+ 'amd64'
2219
+ ],
2220
+ 'cfke.io/instance-family': [],
2221
+ 'topology.kubernetes.io/region': []
2222
+ }
2223
+ },
2224
+ scalingProfile: {
2225
+ type: 'string',
2226
+ description: 'Controls scale-up / scale-down responsiveness. `aggressive` prioritizes cost-optimization. `conservative` prioritizes stability of the fleet. Full-overwrite: omit to reset to the default (`conservative`).',
2227
+ default: 'conservative',
2228
+ example: 'conservative',
2229
+ enum: [
2230
+ 'aggressive',
2231
+ 'conservative'
2232
+ ]
2233
+ },
2234
+ taints: {
2235
+ type: 'array',
2236
+ items: {
2237
+ type: 'object',
2238
+ properties: {
2239
+ key: {
2240
+ type: 'string',
2241
+ description: 'Taint key: a Kubernetes qualified name with an optional DNS subdomain prefix. Keys under `node.kubernetes.io`, `node.cloudprovider.kubernetes.io`, `node.cilium.io`, `karpenter.sh` and `cfke.io` (and their subdomains) are reserved.',
2242
+ example: 'dedicated'
2243
+ },
2244
+ value: {
2245
+ type: 'string',
2246
+ maxLength: 63,
2247
+ pattern: '^([A-Za-z0-9]([-A-Za-z0-9_.]*[A-Za-z0-9])?)?$',
2248
+ description: 'Taint value. Optional.',
2249
+ example: 'ci'
2250
+ },
2251
+ effect: {
2252
+ type: 'string',
2253
+ description: 'Taint effect.',
2254
+ example: 'NoSchedule',
2255
+ enum: [
2256
+ 'NoSchedule',
2257
+ 'PreferNoSchedule',
2258
+ 'NoExecute'
2259
+ ]
2260
+ }
2261
+ },
2262
+ required: [
2263
+ 'key',
2264
+ 'effect'
2265
+ ],
2266
+ additionalProperties: false
2267
+ },
2268
+ maxItems: 50,
2269
+ description: 'Taints applied to every node the fleet provisions, so only pods that tolerate them schedule there. Each key and effect pair may appear once. Full-overwrite: omit to remove all taints.',
2270
+ default: []
698
2271
  }
699
2272
  },
2273
+ additionalProperties: false,
2274
+ description: 'Mutable fleet configuration. Applied as a full overwrite: any omitted field is reset to its default rather than left unchanged.'
2275
+ };
2276
+ export const InviteCreateInputSchema = {
2277
+ type: 'object',
2278
+ properties: {
2279
+ email: {
2280
+ type: 'string',
2281
+ format: 'email',
2282
+ description: 'Email address of the user to invite.',
2283
+ example: 'email@example.com'
2284
+ },
2285
+ role: {
2286
+ type: 'string',
2287
+ description: 'Role the invited user will be assigned on redemption. Can be \'Administrator\' or \'User\'.',
2288
+ default: 'User',
2289
+ example: 'User',
2290
+ enum: [
2291
+ 'Administrator',
2292
+ 'User'
2293
+ ]
2294
+ }
2295
+ },
2296
+ required: [
2297
+ 'email'
2298
+ ],
700
2299
  additionalProperties: false
701
2300
  };
702
2301
  export const InviteSchema = {
@@ -729,9 +2328,185 @@ export const InviteSchema = {
729
2328
  type: 'string',
730
2329
  description: 'Generated unique invite code.',
731
2330
  example: '7kUZnH7nnKUFfvc4NK2KQF'
2331
+ },
2332
+ role: {
2333
+ type: 'string',
2334
+ description: 'Role the invited user will be assigned on redemption. Can be \'Administrator\' or \'User\'.',
2335
+ default: 'User',
2336
+ example: 'User',
2337
+ enum: [
2338
+ 'Administrator',
2339
+ 'User'
2340
+ ]
732
2341
  }
733
2342
  },
734
- required: ['date_created'],
2343
+ required: [
2344
+ 'date_created'
2345
+ ],
2346
+ additionalProperties: false
2347
+ };
2348
+ export const InvoicePaymentAttemptSchema = {
2349
+ type: 'object',
2350
+ properties: {
2351
+ invoice_id: {
2352
+ type: 'string',
2353
+ description: 'Identifier of the invoice.',
2354
+ example: 'in_1234567890xCrwxghOTj1234'
2355
+ },
2356
+ number: {
2357
+ type: 'string',
2358
+ nullable: true,
2359
+ description: 'Invoice number. Null if the invoice has no number.',
2360
+ example: 'CF-0042'
2361
+ },
2362
+ amount: {
2363
+ type: 'number',
2364
+ format: 'float',
2365
+ description: 'Amount outstanding when the charge was attempted, in the smallest currency unit.',
2366
+ example: 4200
2367
+ },
2368
+ currency: {
2369
+ type: 'string',
2370
+ description: 'Currency of the invoice.',
2371
+ example: 'eur'
2372
+ },
2373
+ status: {
2374
+ type: 'string',
2375
+ description: 'Outcome for this invoice: `paid`, `processing` (accepted, not yet settled), `requires_action` (awaiting customer authentication), or `failed` (declined).',
2376
+ example: 'paid',
2377
+ enum: [
2378
+ 'paid',
2379
+ 'processing',
2380
+ 'requires_action',
2381
+ 'failed'
2382
+ ]
2383
+ },
2384
+ client_secret: {
2385
+ type: 'string',
2386
+ nullable: true,
2387
+ description: 'Client secret used to complete customer authentication. Set only when `status` is `requires_action`.',
2388
+ example: 'pi_3MtwBwLkdIwHu7ix28a3tqPa_secret_YrKJUKribcBjcG8HVhfZluoGH'
2389
+ },
2390
+ failure_code: {
2391
+ type: 'string',
2392
+ nullable: true,
2393
+ description: 'Decline code. Set only when `status` is `failed`.',
2394
+ example: 'insufficient_funds'
2395
+ },
2396
+ failure_message: {
2397
+ type: 'string',
2398
+ nullable: true,
2399
+ description: 'Explanation of the decline, suitable for display. Set only when `status` is `failed`.',
2400
+ example: 'Your card has insufficient funds.'
2401
+ }
2402
+ },
2403
+ required: [
2404
+ 'invoice_id',
2405
+ 'number',
2406
+ 'amount',
2407
+ 'currency',
2408
+ 'status',
2409
+ 'client_secret',
2410
+ 'failure_code',
2411
+ 'failure_message'
2412
+ ],
2413
+ additionalProperties: false
2414
+ };
2415
+ export const InvoicePaymentResultSchema = {
2416
+ type: 'object',
2417
+ properties: {
2418
+ code: {
2419
+ type: 'string',
2420
+ description: 'Overall outcome: `paid` (nothing outstanding), `processing` (all accepted, not yet settled), `action_required` (one or more await customer authentication), `partially_paid`, `failed`, `nothing_due`, or `bank_transfer_due` (the organization pays by bank transfer; nothing was charged).',
2421
+ example: 'partially_paid',
2422
+ enum: [
2423
+ 'paid',
2424
+ 'processing',
2425
+ 'action_required',
2426
+ 'partially_paid',
2427
+ 'failed',
2428
+ 'nothing_due',
2429
+ 'bank_transfer_due'
2430
+ ]
2431
+ },
2432
+ message: {
2433
+ type: 'string',
2434
+ description: 'Summary of the outcome, suitable for display.',
2435
+ example: '1 of 2 open invoices was paid. Invoice CF-0043 was declined: Your card has insufficient funds.'
2436
+ },
2437
+ results: {
2438
+ type: 'array',
2439
+ items: {
2440
+ type: 'object',
2441
+ properties: {
2442
+ invoice_id: {
2443
+ type: 'string',
2444
+ description: 'Identifier of the invoice.',
2445
+ example: 'in_1234567890xCrwxghOTj1234'
2446
+ },
2447
+ number: {
2448
+ type: 'string',
2449
+ description: 'Invoice number. Null if the invoice has no number.',
2450
+ example: 'CF-0042'
2451
+ },
2452
+ amount: {
2453
+ type: 'number',
2454
+ format: 'float',
2455
+ description: 'Amount outstanding when the charge was attempted, in the smallest currency unit.',
2456
+ example: 4200
2457
+ },
2458
+ currency: {
2459
+ type: 'string',
2460
+ description: 'Currency of the invoice.',
2461
+ example: 'eur'
2462
+ },
2463
+ status: {
2464
+ type: 'string',
2465
+ description: 'Outcome for this invoice: `paid`, `processing` (accepted, not yet settled), `requires_action` (awaiting customer authentication), or `failed` (declined).',
2466
+ example: 'paid',
2467
+ enum: [
2468
+ 'paid',
2469
+ 'processing',
2470
+ 'requires_action',
2471
+ 'failed'
2472
+ ]
2473
+ },
2474
+ client_secret: {
2475
+ type: 'string',
2476
+ description: 'Client secret used to complete customer authentication. Set only when `status` is `requires_action`.',
2477
+ example: 'pi_3MtwBwLkdIwHu7ix28a3tqPa_secret_YrKJUKribcBjcG8HVhfZluoGH'
2478
+ },
2479
+ failure_code: {
2480
+ type: 'string',
2481
+ description: 'Decline code. Set only when `status` is `failed`.',
2482
+ example: 'insufficient_funds'
2483
+ },
2484
+ failure_message: {
2485
+ type: 'string',
2486
+ description: 'Explanation of the decline, suitable for display. Set only when `status` is `failed`.',
2487
+ example: 'Your card has insufficient funds.'
2488
+ }
2489
+ },
2490
+ required: [
2491
+ 'invoice_id',
2492
+ 'number',
2493
+ 'amount',
2494
+ 'currency',
2495
+ 'status',
2496
+ 'client_secret',
2497
+ 'failure_code',
2498
+ 'failure_message'
2499
+ ],
2500
+ additionalProperties: false
2501
+ },
2502
+ description: 'One entry per invoice charged, oldest first.'
2503
+ }
2504
+ },
2505
+ required: [
2506
+ 'code',
2507
+ 'message',
2508
+ 'results'
2509
+ ],
735
2510
  additionalProperties: false
736
2511
  };
737
2512
  export const InvoiceSchema = {
@@ -783,7 +2558,11 @@ export const InvoiceSchema = {
783
2558
  type: 'string'
784
2559
  }
785
2560
  },
786
- required: ['created', 'period_start', 'period_end'],
2561
+ required: [
2562
+ 'created',
2563
+ 'period_start',
2564
+ 'period_end'
2565
+ ],
787
2566
  additionalProperties: false
788
2567
  };
789
2568
  export const MarketplaceListingFilesSchema = {
@@ -792,18 +2571,12 @@ export const MarketplaceListingFilesSchema = {
792
2571
  chartYaml: {
793
2572
  type: 'string',
794
2573
  description: 'Raw Chart.yaml content from the Helm chart',
795
- example: `apiVersion: v2
796
- name: nginx-ingress
797
- version: 1.18.2-cfke.45
798
- appVersion: 1.9.4`
2574
+ example: 'apiVersion: v2\nname: nginx-ingress\nversion: 1.18.2-cfke.45\nappVersion: 1.9.4'
799
2575
  },
800
2576
  valuesYaml: {
801
2577
  type: 'string',
802
2578
  description: 'Raw values.yaml content from the Helm chart',
803
- example: `replicaCount: 1
804
- image:
805
- repository: nginx
806
- tag: latest`
2579
+ example: 'replicaCount: 1\nimage:\n repository: nginx\n tag: latest'
807
2580
  },
808
2581
  valuesSchemaJson: {
809
2582
  type: 'string',
@@ -880,20 +2653,31 @@ export const MarketplaceListingSchema = {
880
2653
  type: 'string'
881
2654
  },
882
2655
  description: 'Chart keywords',
883
- example: ['ingress', 'nginx', 'load-balancer']
2656
+ example: [
2657
+ 'ingress',
2658
+ 'nginx',
2659
+ 'load-balancer'
2660
+ ]
884
2661
  },
885
2662
  home: {
886
2663
  type: 'string',
887
2664
  description: 'Chart home URL',
888
2665
  example: 'https://kubernetes.github.io/ingress-nginx/'
889
2666
  },
2667
+ icon: {
2668
+ type: 'string',
2669
+ description: 'A URL to an SVG or PNG image to be used as an icon',
2670
+ example: 'https://cloudfleet.ai/images/marketplace/icons/ingress-nginx.png'
2671
+ },
890
2672
  sources: {
891
2673
  type: 'array',
892
2674
  items: {
893
2675
  type: 'string'
894
2676
  },
895
2677
  description: 'Chart source URLs',
896
- example: ['https://github.com/kubernetes/ingress-nginx']
2678
+ example: [
2679
+ 'https://github.com/kubernetes/ingress-nginx'
2680
+ ]
897
2681
  },
898
2682
  maintainers: {
899
2683
  type: 'array',
@@ -911,23 +2695,42 @@ export const MarketplaceListingSchema = {
911
2695
  example: 'support@nginx.org'
912
2696
  }
913
2697
  },
914
- required: ['name'],
2698
+ required: [
2699
+ 'name'
2700
+ ],
915
2701
  additionalProperties: false
916
2702
  },
917
2703
  description: 'Chart maintainers'
918
2704
  }
919
2705
  },
920
- required: ['name', 'version'],
2706
+ required: [
2707
+ 'name',
2708
+ 'version'
2709
+ ],
921
2710
  additionalProperties: false,
922
2711
  description: 'Chart metadata'
923
2712
  }
924
2713
  },
925
- required: ['name', 'versions', 'version_channels', 'latestVersion'],
2714
+ required: [
2715
+ 'name',
2716
+ 'versions',
2717
+ 'version_channels',
2718
+ 'latestVersion'
2719
+ ],
926
2720
  additionalProperties: false
927
2721
  };
928
2722
  export const OrganizationCreateInputSchema = {
929
2723
  type: 'object',
930
2724
  properties: {
2725
+ type: {
2726
+ type: 'string',
2727
+ description: 'Type of the organization. `business` for legal entities, `personal` for individuals.',
2728
+ example: 'business',
2729
+ enum: [
2730
+ 'business',
2731
+ 'personal'
2732
+ ]
2733
+ },
931
2734
  email: {
932
2735
  type: 'string',
933
2736
  format: 'email',
@@ -936,11 +2739,13 @@ export const OrganizationCreateInputSchema = {
936
2739
  },
937
2740
  first_name: {
938
2741
  type: 'string',
2742
+ minLength: 1,
939
2743
  description: 'First name of the billing contact person.',
940
2744
  example: 'John'
941
2745
  },
942
2746
  last_name: {
943
2747
  type: 'string',
2748
+ minLength: 1,
944
2749
  description: 'Last name of the billing contact person.',
945
2750
  example: 'Doe'
946
2751
  },
@@ -958,7 +2763,28 @@ export const OrganizationCreateInputSchema = {
958
2763
  description: 'Password for the root account. Must be at least 8 characters long and contain at least one uppercase letter, one lowercase letter, one number and one special character.'
959
2764
  }
960
2765
  },
961
- required: ['email', 'first_name', 'last_name', 'company_name', 'password'],
2766
+ required: [
2767
+ 'type',
2768
+ 'email',
2769
+ 'first_name',
2770
+ 'last_name',
2771
+ 'company_name',
2772
+ 'password'
2773
+ ],
2774
+ additionalProperties: false
2775
+ };
2776
+ export const OrganizationCreateOutputSchema = {
2777
+ type: 'object',
2778
+ properties: {
2779
+ id: {
2780
+ type: 'string',
2781
+ description: 'Unique identifier of the newly created organization. Generated by the API and safe to use for client-side tracking immediately.',
2782
+ example: 'organization-id'
2783
+ }
2784
+ },
2785
+ required: [
2786
+ 'id'
2787
+ ],
962
2788
  additionalProperties: false
963
2789
  };
964
2790
  export const OrganizationSchema = {
@@ -977,6 +2803,15 @@ export const OrganizationSchema = {
977
2803
  description: 'Name of the legal entity. This name will be used in invoices. Use your first and last name for individual accounts.',
978
2804
  example: 'ACME Corp.'
979
2805
  },
2806
+ type: {
2807
+ type: 'string',
2808
+ description: 'Type of the organization. `business` for legal entities, `personal` for individuals.',
2809
+ example: 'business',
2810
+ enum: [
2811
+ 'business',
2812
+ 'personal'
2813
+ ]
2814
+ },
980
2815
  date_created: {
981
2816
  type: 'string',
982
2817
  format: 'date-time',
@@ -1008,6 +2843,17 @@ export const OrganizationSchema = {
1008
2843
  description: 'Available number of Pro clusters that can be created.',
1009
2844
  example: 999
1010
2845
  },
2846
+ enterprise_clusters_max: {
2847
+ type: 'integer',
2848
+ minimum: 0,
2849
+ description: 'Maximum number of Enterprise clusters that can be created.',
2850
+ example: 999
2851
+ },
2852
+ enterprise_clusters_available: {
2853
+ type: 'integer',
2854
+ description: 'Available number of Enterprise clusters that can be created.',
2855
+ example: 999
2856
+ },
1011
2857
  fleets_max: {
1012
2858
  type: 'integer',
1013
2859
  minimum: 0,
@@ -1027,7 +2873,7 @@ export const OrganizationSchema = {
1027
2873
  type: 'array',
1028
2874
  items: {
1029
2875
  type: 'string',
1030
- example: 'northamerica-central-1'
2876
+ example: 'northamerica-central-1a'
1031
2877
  },
1032
2878
  minItems: 1,
1033
2879
  description: 'List of Cloudfleet control plane regions available for the organization.'
@@ -1048,36 +2894,66 @@ export const OrganizationSchema = {
1048
2894
  example: '1.33.x (Always latest 1.33 patch version)'
1049
2895
  }
1050
2896
  },
1051
- required: ['id', 'label'],
2897
+ required: [
2898
+ 'id',
2899
+ 'label'
2900
+ ],
1052
2901
  additionalProperties: false
1053
2902
  },
1054
2903
  minItems: 1,
1055
2904
  description: 'List of CFKE control plane versions available for the organization.'
1056
2905
  },
1057
- copilot_user_hourly_tokens: {
1058
- type: 'integer',
1059
- minimum: 0,
1060
- description: 'User-level maximum number of tokens Cloudfleet Copilot can process per hour.',
1061
- example: 42000
1062
- },
1063
- copilot_organization_hourly_tokens: {
2906
+ cfcr_storage_gb: {
1064
2907
  type: 'integer',
1065
- minimum: 0,
1066
- description: 'Organization-level maximum number of tokens Cloudfleet Copilot can process per hour.',
1067
- example: 242000
2908
+ minimum: -1,
2909
+ description: 'Organization-level maximum CFCR storage volume in GB. -1 means no limit.',
2910
+ example: 500
1068
2911
  }
1069
2912
  },
1070
- required: ['basic_clusters_max', 'basic_clusters_available', 'pro_clusters_max', 'pro_clusters_available', 'fleets_max', 'cluster_tiers', 'regions', 'versions', 'copilot_user_hourly_tokens', 'copilot_organization_hourly_tokens'],
2913
+ required: [
2914
+ 'basic_clusters_max',
2915
+ 'basic_clusters_available',
2916
+ 'pro_clusters_max',
2917
+ 'pro_clusters_available',
2918
+ 'enterprise_clusters_max',
2919
+ 'enterprise_clusters_available',
2920
+ 'fleets_max',
2921
+ 'cluster_tiers',
2922
+ 'regions',
2923
+ 'versions',
2924
+ 'cfcr_storage_gb'
2925
+ ],
1071
2926
  additionalProperties: false,
1072
2927
  description: 'For security reasons, platform quota is controlled by Cloudfleet and can be updated only by Cloudfleet administrators. Please open a support ticket if you need to change the platform quota.'
1073
2928
  },
1074
2929
  status: {
1075
2930
  type: 'string',
1076
2931
  description: 'Status of the organization. Can be `active` or `closed`, or `suspended`.',
1077
- enum: ['active', 'closed', 'suspended']
2932
+ enum: [
2933
+ 'active',
2934
+ 'closed',
2935
+ 'suspended'
2936
+ ]
2937
+ },
2938
+ verification: {
2939
+ type: 'string',
2940
+ description: 'Verification status of the organization, which determines the assigned quota. `none` when billing information is incomplete, `submitted` when billing information is complete but the organization is not yet verified, `verified` when the organization is verified.',
2941
+ example: 'verified',
2942
+ enum: [
2943
+ 'none',
2944
+ 'submitted',
2945
+ 'verified'
2946
+ ]
1078
2947
  }
1079
2948
  },
1080
- required: ['id', 'date_created', 'quota', 'status'],
2949
+ required: [
2950
+ 'id',
2951
+ 'type',
2952
+ 'date_created',
2953
+ 'quota',
2954
+ 'status',
2955
+ 'verification'
2956
+ ],
1081
2957
  additionalProperties: false
1082
2958
  };
1083
2959
  export const PaymentMethodSchema = {
@@ -1085,26 +2961,23 @@ export const PaymentMethodSchema = {
1085
2961
  properties: {
1086
2962
  id: {
1087
2963
  type: 'string',
1088
- format: 'uuid',
1089
- description: 'Unique identifier of the organization. UUID v4 string in canonical form.',
1090
- example: 'e94d30ec-a2dd-4dcb-832c-ac2be144ba91'
1091
- },
1092
- setup: {
1093
- type: 'boolean',
1094
- description: 'Whether organization payment method was set up and ready to use for payments.',
1095
- example: true
2964
+ description: 'Payment method identifier. Stripe payment method id for cards/SEPA; the constant `bank_transfer` for the invoice/bank-transfer method. Used to set as default or delete the payment method.',
2965
+ example: 'pm_1MtwBwLkdIwHu7ix28a3tqPa'
1096
2966
  },
1097
2967
  type: {
1098
2968
  type: 'string',
1099
- nullable: true,
1100
- description: 'Payment method type type. Only `card` payments supported at the moment.',
2969
+ description: 'Payment method type. `card`, `sepa_debit` for SEPA Direct Debit (business accounts only), or `bank_transfer` for paying invoices by bank transfer.',
1101
2970
  example: 'card',
1102
- enum: ['card']
2971
+ enum: [
2972
+ 'card',
2973
+ 'sepa_debit',
2974
+ 'bank_transfer'
2975
+ ]
1103
2976
  },
1104
2977
  last4: {
1105
2978
  type: 'string',
1106
2979
  nullable: true,
1107
- description: 'Last 4 digits of the payment card number.',
2980
+ description: 'Last 4 digits of the payment card number, of the bank account (IBAN) for SEPA Direct Debit, or of the destination IBAN for bank transfer.',
1108
2981
  example: '4242'
1109
2982
  },
1110
2983
  exp_month: {
@@ -1112,25 +2985,57 @@ export const PaymentMethodSchema = {
1112
2985
  minimum: 1,
1113
2986
  maximum: 12,
1114
2987
  nullable: true,
1115
- description: "Two-digit number representing the card's expiration month.",
1116
- example: '12'
2988
+ description: 'Two-digit number representing the card\'s expiration month. Null for SEPA Direct Debit and bank transfer.',
2989
+ example: 12
1117
2990
  },
1118
2991
  exp_year: {
1119
2992
  type: 'integer',
1120
- minimum: 2024,
1121
2993
  nullable: true,
1122
- description: "Four-digit number representing the card's expiration year.",
1123
- example: '2028'
2994
+ description: 'Four-digit number representing the card\'s expiration year. May be in the past for an expired card still on file. Null for SEPA Direct Debit and bank transfer.',
2995
+ example: 2028
1124
2996
  },
1125
2997
  brand: {
1126
2998
  type: 'string',
1127
2999
  nullable: true,
1128
- description: 'Payment card brand. Can be `amex`, `diners`, `discover`, `eftpos_au`, `jcb`, `mastercard`, `unionpay`, `visa`, or `unknown`.',
1129
- example: 'visa',
1130
- enum: ['amex', 'diners', 'discover', 'eftpos_au', 'jcb', 'mastercard', 'unionpay', 'visa', 'unknown']
3000
+ description: 'Payment card brand as reported by Stripe, e.g. `visa`, `mastercard`, `amex`, `cartes_bancaires`, or `unknown`. Null for SEPA Direct Debit and bank transfer.',
3001
+ example: 'visa'
3002
+ },
3003
+ iban: {
3004
+ type: 'string',
3005
+ nullable: true,
3006
+ description: 'Full destination IBAN to send bank transfers to. Set only for `bank_transfer`; null otherwise. This is Cloudfleet\'s virtual receiving account, shown in full so the customer can pay into it.',
3007
+ example: 'DE11243015658023127510'
3008
+ },
3009
+ bic: {
3010
+ type: 'string',
3011
+ nullable: true,
3012
+ description: 'BIC/SWIFT of the destination bank for bank transfers. Set only for `bank_transfer`; null otherwise.',
3013
+ example: 'SOGEDEFFXXX'
3014
+ },
3015
+ account_holder_name: {
3016
+ type: 'string',
3017
+ nullable: true,
3018
+ description: 'Account holder name of the destination bank account for bank transfers. Set only for `bank_transfer`; null otherwise.',
3019
+ example: 'Cloudfleet GmbH'
3020
+ },
3021
+ is_default: {
3022
+ type: 'boolean',
3023
+ description: 'Whether this payment method is the default used for invoices and active subscriptions. Always false for `bank_transfer` (it cannot be a Stripe default payment method).',
3024
+ example: true
1131
3025
  }
1132
3026
  },
1133
- required: ['id', 'setup', 'type', 'last4', 'exp_month', 'exp_year', 'brand'],
3027
+ required: [
3028
+ 'id',
3029
+ 'type',
3030
+ 'last4',
3031
+ 'exp_month',
3032
+ 'exp_year',
3033
+ 'brand',
3034
+ 'iban',
3035
+ 'bic',
3036
+ 'account_holder_name',
3037
+ 'is_default'
3038
+ ],
1134
3039
  additionalProperties: false
1135
3040
  };
1136
3041
  export const PlatformQuotaSchema = {
@@ -1158,6 +3063,17 @@ export const PlatformQuotaSchema = {
1158
3063
  description: 'Available number of Pro clusters that can be created.',
1159
3064
  example: 999
1160
3065
  },
3066
+ enterprise_clusters_max: {
3067
+ type: 'integer',
3068
+ minimum: 0,
3069
+ description: 'Maximum number of Enterprise clusters that can be created.',
3070
+ example: 999
3071
+ },
3072
+ enterprise_clusters_available: {
3073
+ type: 'integer',
3074
+ description: 'Available number of Enterprise clusters that can be created.',
3075
+ example: 999
3076
+ },
1161
3077
  fleets_max: {
1162
3078
  type: 'integer',
1163
3079
  minimum: 0,
@@ -1177,7 +3093,7 @@ export const PlatformQuotaSchema = {
1177
3093
  type: 'array',
1178
3094
  items: {
1179
3095
  type: 'string',
1180
- example: 'northamerica-central-1'
3096
+ example: 'northamerica-central-1a'
1181
3097
  },
1182
3098
  minItems: 1,
1183
3099
  description: 'List of Cloudfleet control plane regions available for the organization.'
@@ -1198,26 +3114,35 @@ export const PlatformQuotaSchema = {
1198
3114
  example: '1.33.x (Always latest 1.33 patch version)'
1199
3115
  }
1200
3116
  },
1201
- required: ['id', 'label'],
3117
+ required: [
3118
+ 'id',
3119
+ 'label'
3120
+ ],
1202
3121
  additionalProperties: false
1203
3122
  },
1204
3123
  minItems: 1,
1205
3124
  description: 'List of CFKE control plane versions available for the organization.'
1206
3125
  },
1207
- copilot_user_hourly_tokens: {
1208
- type: 'integer',
1209
- minimum: 0,
1210
- description: 'User-level maximum number of tokens Cloudfleet Copilot can process per hour.',
1211
- example: 42000
1212
- },
1213
- copilot_organization_hourly_tokens: {
3126
+ cfcr_storage_gb: {
1214
3127
  type: 'integer',
1215
- minimum: 0,
1216
- description: 'Organization-level maximum number of tokens Cloudfleet Copilot can process per hour.',
1217
- example: 242000
3128
+ minimum: -1,
3129
+ description: 'Organization-level maximum CFCR storage volume in GB. -1 means no limit.',
3130
+ example: 500
1218
3131
  }
1219
3132
  },
1220
- required: ['basic_clusters_max', 'basic_clusters_available', 'pro_clusters_max', 'pro_clusters_available', 'fleets_max', 'cluster_tiers', 'regions', 'versions', 'copilot_user_hourly_tokens', 'copilot_organization_hourly_tokens'],
3133
+ required: [
3134
+ 'basic_clusters_max',
3135
+ 'basic_clusters_available',
3136
+ 'pro_clusters_max',
3137
+ 'pro_clusters_available',
3138
+ 'enterprise_clusters_max',
3139
+ 'enterprise_clusters_available',
3140
+ 'fleets_max',
3141
+ 'cluster_tiers',
3142
+ 'regions',
3143
+ 'versions',
3144
+ 'cfcr_storage_gb'
3145
+ ],
1221
3146
  additionalProperties: false
1222
3147
  };
1223
3148
  export const RegistryRepositorySchema = {
@@ -1236,10 +3161,14 @@ export const RegistryRepositorySchema = {
1236
3161
  uri: {
1237
3162
  type: 'string',
1238
3163
  description: 'Full URI of the repository.',
1239
- example: 'ssds123e-6651-4e5d-9c04-079f6532989b.northamerica.registry.cloudfleet.dev/v2/my-app'
3164
+ example: 'ssds123e-6651-4e5d-9c04-079f6532989b.northamerica.registry.cloudfleet.dev/my-app'
1240
3165
  }
1241
3166
  },
1242
- required: ['name', 'region', 'uri'],
3167
+ required: [
3168
+ 'name',
3169
+ 'region',
3170
+ 'uri'
3171
+ ],
1243
3172
  additionalProperties: false
1244
3173
  };
1245
3174
  export const RegistryRepositoryWithTagsSchema = {
@@ -1258,7 +3187,7 @@ export const RegistryRepositoryWithTagsSchema = {
1258
3187
  uri: {
1259
3188
  type: 'string',
1260
3189
  description: 'Full URI of the repository.',
1261
- example: 'ssds123e-6651-4e5d-9c04-079f6532989b.northamerica.registry.cloudfleet.dev/v2/my-app'
3190
+ example: 'ssds123e-6651-4e5d-9c04-079f6532989b.northamerica.registry.cloudfleet.dev/my-app'
1262
3191
  },
1263
3192
  tags: {
1264
3193
  type: 'array',
@@ -1280,9 +3209,23 @@ export const RegistryRepositoryWithTagsSchema = {
1280
3209
  type: 'string',
1281
3210
  description: 'Media type of the manifest.',
1282
3211
  example: 'application/vnd.docker.distribution.manifest.v2+json'
3212
+ },
3213
+ platforms: {
3214
+ type: 'array',
3215
+ items: {
3216
+ type: 'string'
3217
+ },
3218
+ description: 'Array of platform strings for multi-arch images (e.g., linux/amd64, linux/arm64).',
3219
+ example: [
3220
+ 'linux/amd64',
3221
+ 'linux/arm64'
3222
+ ]
1283
3223
  }
1284
3224
  },
1285
- required: ['name', 'size'],
3225
+ required: [
3226
+ 'name',
3227
+ 'size'
3228
+ ],
1286
3229
  additionalProperties: false
1287
3230
  },
1288
3231
  description: 'Array of tags in the repository.'
@@ -1294,7 +3237,13 @@ export const RegistryRepositoryWithTagsSchema = {
1294
3237
  example: 987654321
1295
3238
  }
1296
3239
  },
1297
- required: ['name', 'region', 'uri', 'tags', 'totalSize'],
3240
+ required: [
3241
+ 'name',
3242
+ 'region',
3243
+ 'uri',
3244
+ 'tags',
3245
+ 'totalSize'
3246
+ ],
1298
3247
  additionalProperties: false
1299
3248
  };
1300
3249
  export const RegistryTagSchema = {
@@ -1305,6 +3254,11 @@ export const RegistryTagSchema = {
1305
3254
  description: 'Tag name.',
1306
3255
  example: 'latest'
1307
3256
  },
3257
+ digest: {
3258
+ type: 'string',
3259
+ description: 'Manifest digest for pulling by digest.',
3260
+ example: 'sha256:abcd1234ef567890abcd1234ef567890abcd1234ef567890abcd1234ef567890'
3261
+ },
1308
3262
  mediaType: {
1309
3263
  type: 'string',
1310
3264
  description: 'Media type of the manifest.',
@@ -1320,7 +3274,9 @@ export const RegistryTagSchema = {
1320
3274
  example: 1234
1321
3275
  }
1322
3276
  },
1323
- required: ['size'],
3277
+ required: [
3278
+ 'size'
3279
+ ],
1324
3280
  additionalProperties: false,
1325
3281
  description: 'Manifest config metadata.'
1326
3282
  },
@@ -1329,6 +3285,11 @@ export const RegistryTagSchema = {
1329
3285
  items: {
1330
3286
  type: 'object',
1331
3287
  properties: {
3288
+ digest: {
3289
+ type: 'string',
3290
+ description: 'Digest of the layer.',
3291
+ example: 'sha256:abcd1234ef567890abcd1234ef567890abcd1234ef567890abcd1234ef567890'
3292
+ },
1332
3293
  size: {
1333
3294
  type: 'number',
1334
3295
  format: 'float',
@@ -1336,7 +3297,9 @@ export const RegistryTagSchema = {
1336
3297
  example: 5678
1337
3298
  }
1338
3299
  },
1339
- required: ['size'],
3300
+ required: [
3301
+ 'size'
3302
+ ],
1340
3303
  additionalProperties: false
1341
3304
  },
1342
3305
  description: 'Array of layer metadata.'
@@ -1363,14 +3326,54 @@ export const RegistryTagSchema = {
1363
3326
  type: 'string',
1364
3327
  description: 'Operating system of the platform.',
1365
3328
  example: 'linux'
3329
+ },
3330
+ variant: {
3331
+ type: 'string',
3332
+ description: 'Variant of the platform (e.g., v7, v8 for ARM).',
3333
+ example: 'v8'
1366
3334
  }
1367
3335
  },
1368
- required: ['architecture', 'os'],
3336
+ required: [
3337
+ 'architecture',
3338
+ 'os'
3339
+ ],
1369
3340
  additionalProperties: false,
1370
3341
  description: 'Platform information for the manifest.'
3342
+ },
3343
+ layers: {
3344
+ type: 'array',
3345
+ items: {
3346
+ type: 'object',
3347
+ properties: {
3348
+ digest: {
3349
+ type: 'string',
3350
+ description: 'Digest of the layer.',
3351
+ example: 'sha256:abcd1234ef567890abcd1234ef567890abcd1234ef567890abcd1234ef567890'
3352
+ },
3353
+ size: {
3354
+ type: 'number',
3355
+ format: 'float',
3356
+ description: 'Size of the layer in bytes.',
3357
+ example: 5678
3358
+ }
3359
+ },
3360
+ required: [
3361
+ 'size'
3362
+ ],
3363
+ additionalProperties: false
3364
+ },
3365
+ description: 'Layers for this platform.'
3366
+ },
3367
+ size: {
3368
+ type: 'number',
3369
+ format: 'float',
3370
+ description: 'Total size of this platform manifest in bytes.',
3371
+ example: 12345678
1371
3372
  }
1372
3373
  },
1373
- required: ['digest'],
3374
+ required: [
3375
+ 'digest'
3376
+ ],
1374
3377
  additionalProperties: false
1375
3378
  },
1376
3379
  description: 'Array of manifests for multi-arch images.'
@@ -1397,7 +3400,423 @@ export const RegistryTagSchema = {
1397
3400
  example: 'ssds123e-6651-4e5d-9c04-079f6532989b.northamerica.registry.cloudfleet.dev/my-app:latest'
1398
3401
  }
1399
3402
  },
1400
- required: ['name', 'size', 'region', 'repository', 'uri'],
3403
+ required: [
3404
+ 'name',
3405
+ 'digest',
3406
+ 'size',
3407
+ 'region',
3408
+ 'repository',
3409
+ 'uri'
3410
+ ],
3411
+ additionalProperties: false
3412
+ };
3413
+ export const RoadmapItemCreateInputSchema = {
3414
+ type: 'object',
3415
+ properties: {
3416
+ text: {
3417
+ type: 'string',
3418
+ maxLength: 500,
3419
+ minLength: 1,
3420
+ description: 'Your suggestion in one or two sentences. It is reviewed before it appears on the roadmap.',
3421
+ example: 'Support for ARM nodes on Hetzner.'
3422
+ }
3423
+ },
3424
+ required: [
3425
+ 'text'
3426
+ ],
3427
+ additionalProperties: false
3428
+ };
3429
+ export const RoadmapItemSchema = {
3430
+ type: 'object',
3431
+ properties: {
3432
+ id: {
3433
+ type: 'string',
3434
+ description: 'Unique identifier of the roadmap item (Mongo ObjectId).',
3435
+ example: '60c72b2f9f1b2c001f8e4d3a'
3436
+ },
3437
+ text: {
3438
+ type: 'string',
3439
+ description: 'Short description of the roadmap item.',
3440
+ example: 'Support for ARM nodes on Hetzner.'
3441
+ },
3442
+ vote: {
3443
+ type: 'integer',
3444
+ nullable: true,
3445
+ description: 'The caller\'s vote on this item: -1 (down), 1 (up), 2 (double up), or null if the caller has not voted.',
3446
+ example: 1,
3447
+ enum: [
3448
+ -1,
3449
+ 1,
3450
+ 2
3451
+ ]
3452
+ }
3453
+ },
3454
+ required: [
3455
+ 'id',
3456
+ 'text',
3457
+ 'vote'
3458
+ ],
3459
+ additionalProperties: false
3460
+ };
3461
+ export const RoadmapVoteInputSchema = {
3462
+ type: 'object',
3463
+ properties: {
3464
+ value: {
3465
+ type: 'integer',
3466
+ description: 'Vote value: -1 (down), 1 (up), or 2 (double up).',
3467
+ example: 1,
3468
+ enum: [
3469
+ -1,
3470
+ 1,
3471
+ 2
3472
+ ]
3473
+ }
3474
+ },
3475
+ required: [
3476
+ 'value'
3477
+ ],
3478
+ additionalProperties: false
3479
+ };
3480
+ export const TicketAttachmentSchema = {
3481
+ type: 'object',
3482
+ properties: {
3483
+ id: {
3484
+ type: 'string',
3485
+ description: 'Unique identifier of the attachment (Mongo ObjectId).',
3486
+ example: '60c72b2f9f1b2c001f8e4d3c'
3487
+ },
3488
+ filename: {
3489
+ type: 'string',
3490
+ description: 'Original filename as uploaded.',
3491
+ example: 'debug.log'
3492
+ },
3493
+ content_type: {
3494
+ type: 'string',
3495
+ description: 'MIME content type of the attachment.',
3496
+ example: 'text/plain'
3497
+ },
3498
+ size: {
3499
+ type: 'integer',
3500
+ description: 'Size of the attachment in bytes.',
3501
+ example: 12345
3502
+ }
3503
+ },
3504
+ required: [
3505
+ 'id',
3506
+ 'filename',
3507
+ 'content_type',
3508
+ 'size'
3509
+ ],
3510
+ additionalProperties: false
3511
+ };
3512
+ export const TicketCreateInputSchema = {
3513
+ type: 'object',
3514
+ properties: {
3515
+ category: {
3516
+ type: 'string',
3517
+ description: 'Ticket category. Drives auto-assignment and may carry a subcategory in `properties`.',
3518
+ example: 'technical',
3519
+ enum: [
3520
+ 'billing',
3521
+ 'technical',
3522
+ 'general'
3523
+ ]
3524
+ },
3525
+ body: {
3526
+ type: 'string',
3527
+ maxLength: 50000,
3528
+ minLength: 1,
3529
+ pattern: '\\S',
3530
+ description: 'Initial message body in markdown. There is no separate subject — the first message body is the description.',
3531
+ example: 'My cluster cannot reach the registry. Logs attached.'
3532
+ },
3533
+ properties: {
3534
+ type: 'object',
3535
+ additionalProperties: true,
3536
+ description: 'Free-form key/value bag set by the UI (e.g. `subcategory`, `cluster_id`, `cluster_name`, `region`).',
3537
+ example: {
3538
+ subcategory: 'cluster-question',
3539
+ cluster_id: '60c72b2f9f1b2c001f8e4d3a'
3540
+ }
3541
+ },
3542
+ grant_support_access: {
3543
+ type: 'boolean',
3544
+ description: 'Grant Cloudfleet support staff access to the organization\'s resources while the ticket is open. Access cannot be revoked; it ends when the ticket is closed.',
3545
+ example: true
3546
+ }
3547
+ },
3548
+ required: [
3549
+ 'category',
3550
+ 'body'
3551
+ ],
3552
+ additionalProperties: false
3553
+ };
3554
+ export const TicketMessageInputSchema = {
3555
+ type: 'object',
3556
+ properties: {
3557
+ body: {
3558
+ type: 'string',
3559
+ maxLength: 50000,
3560
+ minLength: 1,
3561
+ pattern: '\\S',
3562
+ description: 'Reply body in markdown.',
3563
+ example: 'Thanks — that resolved it on my side.'
3564
+ }
3565
+ },
3566
+ required: [
3567
+ 'body'
3568
+ ],
3569
+ additionalProperties: false
3570
+ };
3571
+ export const TicketMessageSchema = {
3572
+ type: 'object',
3573
+ properties: {
3574
+ id: {
3575
+ type: 'string',
3576
+ description: 'Unique identifier of the message (Mongo ObjectId).',
3577
+ example: '60c72b2f9f1b2c001f8e4d3b'
3578
+ },
3579
+ type: {
3580
+ type: 'string',
3581
+ description: 'Message type. Internal notes are filtered out of customer-facing responses.',
3582
+ example: 'customer_reply',
3583
+ enum: [
3584
+ 'customer_reply',
3585
+ 'agent_reply'
3586
+ ]
3587
+ },
3588
+ body: {
3589
+ type: 'string',
3590
+ description: 'Message body in markdown.',
3591
+ example: 'Thanks — that resolved it on my side.'
3592
+ },
3593
+ author_first_name: {
3594
+ type: 'string',
3595
+ nullable: true,
3596
+ description: 'First name of the author. Null when not provided.',
3597
+ example: 'Jane'
3598
+ },
3599
+ author_last_name: {
3600
+ type: 'string',
3601
+ nullable: true,
3602
+ description: 'Last name of the author. Null when not provided.',
3603
+ example: 'Doe'
3604
+ },
3605
+ attachments: {
3606
+ type: 'array',
3607
+ items: {
3608
+ type: 'object',
3609
+ properties: {
3610
+ id: {
3611
+ type: 'string',
3612
+ description: 'Unique identifier of the attachment (Mongo ObjectId).',
3613
+ example: '60c72b2f9f1b2c001f8e4d3c'
3614
+ },
3615
+ filename: {
3616
+ type: 'string',
3617
+ description: 'Original filename as uploaded.',
3618
+ example: 'debug.log'
3619
+ },
3620
+ content_type: {
3621
+ type: 'string',
3622
+ description: 'MIME content type of the attachment.',
3623
+ example: 'text/plain'
3624
+ },
3625
+ size: {
3626
+ type: 'integer',
3627
+ description: 'Size of the attachment in bytes.',
3628
+ example: 12345
3629
+ }
3630
+ },
3631
+ required: [
3632
+ 'id',
3633
+ 'filename',
3634
+ 'content_type',
3635
+ 'size'
3636
+ ],
3637
+ additionalProperties: false
3638
+ },
3639
+ description: 'Attachments associated with this message.',
3640
+ example: []
3641
+ },
3642
+ date_created: {
3643
+ type: 'string',
3644
+ format: 'date-time',
3645
+ description: 'Creation date of the message. ISO 8601 UTC.',
3646
+ example: '2026-05-11T16:08:14.338Z'
3647
+ }
3648
+ },
3649
+ required: [
3650
+ 'id',
3651
+ 'type',
3652
+ 'body',
3653
+ 'date_created'
3654
+ ],
3655
+ additionalProperties: false
3656
+ };
3657
+ export const TicketSchema = {
3658
+ type: 'object',
3659
+ properties: {
3660
+ id: {
3661
+ type: 'string',
3662
+ description: 'Unique identifier of the ticket (Mongo ObjectId).',
3663
+ example: '60c72b2f9f1b2c001f8e4d3a'
3664
+ },
3665
+ status: {
3666
+ type: 'string',
3667
+ description: 'Current state of the ticket.',
3668
+ example: 'waiting_on_us',
3669
+ enum: [
3670
+ 'waiting_on_us',
3671
+ 'waiting_on_user',
3672
+ 'closed'
3673
+ ]
3674
+ },
3675
+ category: {
3676
+ type: 'string',
3677
+ description: 'Ticket category.',
3678
+ example: 'technical',
3679
+ enum: [
3680
+ 'billing',
3681
+ 'technical',
3682
+ 'general'
3683
+ ]
3684
+ },
3685
+ summary: {
3686
+ type: 'string',
3687
+ description: 'First 128 characters of the initial message body, with markdown formatting and newlines stripped. Used for ticket list previews.',
3688
+ example: 'My cluster cannot reach the registry. Logs attached.'
3689
+ },
3690
+ support_access_granted: {
3691
+ type: 'boolean',
3692
+ description: 'Whether Cloudfleet support staff currently have access to the organization\'s resources. True once access is granted and until the ticket is closed.',
3693
+ example: true
3694
+ },
3695
+ support_access_granted_at: {
3696
+ type: 'string',
3697
+ format: 'date-time',
3698
+ nullable: true,
3699
+ description: 'When support access was granted. Null if it never was. Kept after the ticket is closed.',
3700
+ example: '2026-05-11T16:08:14.338Z'
3701
+ },
3702
+ closed_at: {
3703
+ type: 'string',
3704
+ format: 'date-time',
3705
+ nullable: true,
3706
+ description: 'Closure timestamp. Null while the ticket is open.',
3707
+ example: '2026-05-18T16:08:14.338Z'
3708
+ },
3709
+ date_created: {
3710
+ type: 'string',
3711
+ format: 'date-time',
3712
+ description: 'Creation date of the ticket. ISO 8601 UTC.',
3713
+ example: '2026-05-11T16:08:14.338Z'
3714
+ },
3715
+ date_updated: {
3716
+ type: 'string',
3717
+ format: 'date-time',
3718
+ description: 'Last update date of the ticket. ISO 8601 UTC.',
3719
+ example: '2026-05-11T16:08:14.338Z'
3720
+ },
3721
+ messages: {
3722
+ type: 'array',
3723
+ items: {
3724
+ type: 'object',
3725
+ properties: {
3726
+ id: {
3727
+ type: 'string',
3728
+ description: 'Unique identifier of the message (Mongo ObjectId).',
3729
+ example: '60c72b2f9f1b2c001f8e4d3b'
3730
+ },
3731
+ type: {
3732
+ type: 'string',
3733
+ description: 'Message type. Internal notes are filtered out of customer-facing responses.',
3734
+ example: 'customer_reply',
3735
+ enum: [
3736
+ 'customer_reply',
3737
+ 'agent_reply'
3738
+ ]
3739
+ },
3740
+ body: {
3741
+ type: 'string',
3742
+ description: 'Message body in markdown.',
3743
+ example: 'Thanks — that resolved it on my side.'
3744
+ },
3745
+ author_first_name: {
3746
+ type: 'string',
3747
+ description: 'First name of the author. Null when not provided.',
3748
+ example: 'Jane'
3749
+ },
3750
+ author_last_name: {
3751
+ type: 'string',
3752
+ description: 'Last name of the author. Null when not provided.',
3753
+ example: 'Doe'
3754
+ },
3755
+ attachments: {
3756
+ type: 'array',
3757
+ items: {
3758
+ type: 'object',
3759
+ properties: {
3760
+ id: {
3761
+ type: 'string',
3762
+ description: 'Unique identifier of the attachment (Mongo ObjectId).',
3763
+ example: '60c72b2f9f1b2c001f8e4d3c'
3764
+ },
3765
+ filename: {
3766
+ type: 'string',
3767
+ description: 'Original filename as uploaded.',
3768
+ example: 'debug.log'
3769
+ },
3770
+ content_type: {
3771
+ type: 'string',
3772
+ description: 'MIME content type of the attachment.',
3773
+ example: 'text/plain'
3774
+ },
3775
+ size: {
3776
+ type: 'integer',
3777
+ description: 'Size of the attachment in bytes.',
3778
+ example: 12345
3779
+ }
3780
+ },
3781
+ required: [
3782
+ 'id',
3783
+ 'filename',
3784
+ 'content_type',
3785
+ 'size'
3786
+ ],
3787
+ additionalProperties: false
3788
+ },
3789
+ description: 'Attachments associated with this message.',
3790
+ example: []
3791
+ },
3792
+ date_created: {
3793
+ type: 'string',
3794
+ format: 'date-time',
3795
+ description: 'Creation date of the message. ISO 8601 UTC.',
3796
+ example: '2026-05-11T16:08:14.338Z'
3797
+ }
3798
+ },
3799
+ required: [
3800
+ 'id',
3801
+ 'type',
3802
+ 'body',
3803
+ 'date_created'
3804
+ ],
3805
+ additionalProperties: false
3806
+ },
3807
+ description: 'Messages on the ticket in chronological order. Internal notes are excluded. Returned by the detail endpoint only.'
3808
+ }
3809
+ },
3810
+ required: [
3811
+ 'id',
3812
+ 'status',
3813
+ 'category',
3814
+ 'summary',
3815
+ 'support_access_granted',
3816
+ 'support_access_granted_at',
3817
+ 'date_created',
3818
+ 'date_updated'
3819
+ ],
1401
3820
  additionalProperties: false
1402
3821
  };
1403
3822
  export const TokenCreateInputSchema = {
@@ -1415,10 +3834,16 @@ export const TokenCreateInputSchema = {
1415
3834
  type: 'string',
1416
3835
  description: 'Role assumed by the token.',
1417
3836
  example: 'User',
1418
- enum: ['Administrator', 'User']
3837
+ enum: [
3838
+ 'Administrator',
3839
+ 'User'
3840
+ ]
1419
3841
  }
1420
3842
  },
1421
- required: ['name', 'role'],
3843
+ required: [
3844
+ 'name',
3845
+ 'role'
3846
+ ],
1422
3847
  additionalProperties: false
1423
3848
  };
1424
3849
  export const TokenSchema = {
@@ -1436,7 +3861,10 @@ export const TokenSchema = {
1436
3861
  type: 'string',
1437
3862
  description: 'Role assumed by the token.',
1438
3863
  example: 'User',
1439
- enum: ['Administrator', 'User']
3864
+ enum: [
3865
+ 'Administrator',
3866
+ 'User'
3867
+ ]
1440
3868
  },
1441
3869
  id: {
1442
3870
  type: 'string',
@@ -1455,7 +3883,11 @@ export const TokenSchema = {
1455
3883
  example: '2023-12-20T13:53:32.000Z'
1456
3884
  }
1457
3885
  },
1458
- required: ['name', 'role', 'date_created'],
3886
+ required: [
3887
+ 'name',
3888
+ 'role',
3889
+ 'date_created'
3890
+ ],
1459
3891
  additionalProperties: false
1460
3892
  };
1461
3893
  export const TokenUpdateInputSchema = {
@@ -1473,7 +3905,10 @@ export const TokenUpdateInputSchema = {
1473
3905
  type: 'string',
1474
3906
  description: 'Role assumed by the token.',
1475
3907
  example: 'User',
1476
- enum: ['Administrator', 'User']
3908
+ enum: [
3909
+ 'Administrator',
3910
+ 'User'
3911
+ ]
1477
3912
  }
1478
3913
  },
1479
3914
  additionalProperties: false
@@ -1487,15 +3922,29 @@ export const UsageFacetsSchema = {
1487
3922
  type: 'string'
1488
3923
  },
1489
3924
  description: 'List of unique cluster IDs',
1490
- example: ['6b5439b1-923a-4f2b-a371-d554e5ea23fa']
3925
+ example: [
3926
+ '6b5439b1-923a-4f2b-a371-d554e5ea23fa'
3927
+ ]
1491
3928
  },
1492
3929
  product: {
1493
3930
  type: 'array',
1494
3931
  items: {
1495
- type: 'string'
3932
+ type: 'string',
3933
+ enum: [
3934
+ 'cfke_controlplane_basic',
3935
+ 'cfke_controlplane_pro',
3936
+ 'cfke_controlplane_enterprise',
3937
+ 'cfke_connected_nodes_basic',
3938
+ 'cfke_connected_nodes_pro',
3939
+ 'cfke_connected_nodes_enterprise',
3940
+ 'cfcr_storage'
3941
+ ]
1496
3942
  },
1497
3943
  description: 'List of unique products',
1498
- example: ['cfke_controlplane', 'cfke_connected_nodes']
3944
+ example: [
3945
+ 'cfke_controlplane_pro',
3946
+ 'cfke_connected_nodes_pro'
3947
+ ]
1499
3948
  }
1500
3949
  },
1501
3950
  additionalProperties: false
@@ -1521,7 +3970,16 @@ export const UsageResponseSchema = {
1521
3970
  product: {
1522
3971
  type: 'string',
1523
3972
  description: 'The product the usage is associated with',
1524
- example: 'cfke_controlplane'
3973
+ example: 'cfke_controlplane_pro',
3974
+ enum: [
3975
+ 'cfke_controlplane_basic',
3976
+ 'cfke_controlplane_pro',
3977
+ 'cfke_controlplane_enterprise',
3978
+ 'cfke_connected_nodes_basic',
3979
+ 'cfke_connected_nodes_pro',
3980
+ 'cfke_connected_nodes_enterprise',
3981
+ 'cfcr_storage'
3982
+ ]
1525
3983
  },
1526
3984
  value: {
1527
3985
  type: 'number',
@@ -1541,7 +3999,14 @@ export const UsageResponseSchema = {
1541
3999
  description: 'Total cost'
1542
4000
  }
1543
4001
  },
1544
- required: ['hour', 'cluster_id', 'product', 'value', 'price', 'total'],
4002
+ required: [
4003
+ 'hour',
4004
+ 'cluster_id',
4005
+ 'product',
4006
+ 'value',
4007
+ 'price',
4008
+ 'total'
4009
+ ],
1545
4010
  additionalProperties: false
1546
4011
  },
1547
4012
  description: 'Usage data'
@@ -1555,22 +4020,39 @@ export const UsageResponseSchema = {
1555
4020
  type: 'string'
1556
4021
  },
1557
4022
  description: 'List of unique cluster IDs',
1558
- example: ['6b5439b1-923a-4f2b-a371-d554e5ea23fa']
4023
+ example: [
4024
+ '6b5439b1-923a-4f2b-a371-d554e5ea23fa'
4025
+ ]
1559
4026
  },
1560
4027
  product: {
1561
4028
  type: 'array',
1562
4029
  items: {
1563
- type: 'string'
4030
+ type: 'string',
4031
+ enum: [
4032
+ 'cfke_controlplane_basic',
4033
+ 'cfke_controlplane_pro',
4034
+ 'cfke_controlplane_enterprise',
4035
+ 'cfke_connected_nodes_basic',
4036
+ 'cfke_connected_nodes_pro',
4037
+ 'cfke_connected_nodes_enterprise',
4038
+ 'cfcr_storage'
4039
+ ]
1564
4040
  },
1565
4041
  description: 'List of unique products',
1566
- example: ['cfke_controlplane', 'cfke_connected_nodes']
4042
+ example: [
4043
+ 'cfke_controlplane_pro',
4044
+ 'cfke_connected_nodes_pro'
4045
+ ]
1567
4046
  }
1568
4047
  },
1569
4048
  additionalProperties: false,
1570
4049
  description: 'Facets for filtering'
1571
4050
  }
1572
4051
  },
1573
- required: ['data', 'facets'],
4052
+ required: [
4053
+ 'data',
4054
+ 'facets'
4055
+ ],
1574
4056
  additionalProperties: false
1575
4057
  };
1576
4058
  export const UsageSchema = {
@@ -1589,7 +4071,16 @@ export const UsageSchema = {
1589
4071
  product: {
1590
4072
  type: 'string',
1591
4073
  description: 'The product the usage is associated with',
1592
- example: 'cfke_controlplane'
4074
+ example: 'cfke_controlplane_pro',
4075
+ enum: [
4076
+ 'cfke_controlplane_basic',
4077
+ 'cfke_controlplane_pro',
4078
+ 'cfke_controlplane_enterprise',
4079
+ 'cfke_connected_nodes_basic',
4080
+ 'cfke_connected_nodes_pro',
4081
+ 'cfke_connected_nodes_enterprise',
4082
+ 'cfcr_storage'
4083
+ ]
1593
4084
  },
1594
4085
  value: {
1595
4086
  type: 'number',
@@ -1609,7 +4100,14 @@ export const UsageSchema = {
1609
4100
  description: 'Total cost'
1610
4101
  }
1611
4102
  },
1612
- required: ['hour', 'cluster_id', 'product', 'value', 'price', 'total'],
4103
+ required: [
4104
+ 'hour',
4105
+ 'cluster_id',
4106
+ 'product',
4107
+ 'value',
4108
+ 'price',
4109
+ 'total'
4110
+ ],
1613
4111
  additionalProperties: false
1614
4112
  };
1615
4113
  export const UserCreateInputSchema = {
@@ -1645,21 +4143,15 @@ export const UserCreateInputSchema = {
1645
4143
  type: 'string',
1646
4144
  minLength: 8,
1647
4145
  description: 'User password. Must be at least 8 characters long.'
1648
- },
1649
- status: {
1650
- type: 'string',
1651
- description: 'Status of the user. Can be `active` or `inactive`. Inactive users cannot log in or manage organization resources.',
1652
- example: 'active',
1653
- enum: ['active', 'inactive']
1654
- },
1655
- role: {
1656
- type: 'string',
1657
- description: "User role. Can be 'Administrator', 'User'.",
1658
- example: 'User',
1659
- enum: ['Administrator', 'User']
1660
4146
  }
1661
4147
  },
1662
- required: ['email', 'first_name', 'last_name', 'code', 'password'],
4148
+ required: [
4149
+ 'email',
4150
+ 'first_name',
4151
+ 'last_name',
4152
+ 'code',
4153
+ 'password'
4154
+ ],
1663
4155
  additionalProperties: false
1664
4156
  };
1665
4157
  export const UserSchema = {
@@ -1687,15 +4179,21 @@ export const UserSchema = {
1687
4179
  },
1688
4180
  role: {
1689
4181
  type: 'string',
1690
- description: "User role. Can be 'Administrator', 'User'.",
4182
+ description: 'User role. Can be \'Administrator\', \'User\'.',
1691
4183
  example: 'User',
1692
- enum: ['Administrator', 'User']
4184
+ enum: [
4185
+ 'Administrator',
4186
+ 'User'
4187
+ ]
1693
4188
  },
1694
4189
  status: {
1695
4190
  type: 'string',
1696
4191
  description: 'Status of the user. Can be `active` or `inactive`. Inactive users cannot log in or manage organization resources.',
1697
4192
  example: 'active',
1698
- enum: ['active', 'inactive']
4193
+ enum: [
4194
+ 'active',
4195
+ 'inactive'
4196
+ ]
1699
4197
  },
1700
4198
  id: {
1701
4199
  type: 'string',
@@ -1710,7 +4208,15 @@ export const UserSchema = {
1710
4208
  example: '2023-11-02T16:08:14.338Z'
1711
4209
  }
1712
4210
  },
1713
- required: ['email', 'first_name', 'last_name', 'role', 'status', 'id', 'date_created'],
4211
+ required: [
4212
+ 'email',
4213
+ 'first_name',
4214
+ 'last_name',
4215
+ 'role',
4216
+ 'status',
4217
+ 'id',
4218
+ 'date_created'
4219
+ ],
1714
4220
  additionalProperties: false
1715
4221
  };
1716
4222
  export const UserUpdateInputSchema = {
@@ -1738,15 +4244,21 @@ export const UserUpdateInputSchema = {
1738
4244
  },
1739
4245
  role: {
1740
4246
  type: 'string',
1741
- description: "User role. Can be 'Administrator', 'User'.",
4247
+ description: 'User role. Can be \'Administrator\', \'User\'.',
1742
4248
  example: 'User',
1743
- enum: ['Administrator', 'User']
4249
+ enum: [
4250
+ 'Administrator',
4251
+ 'User'
4252
+ ]
1744
4253
  },
1745
4254
  status: {
1746
4255
  type: 'string',
1747
4256
  description: 'Status of the user. Can be `active` or `inactive`. Inactive users cannot log in or manage organization resources.',
1748
4257
  example: 'active',
1749
- enum: ['active', 'inactive']
4258
+ enum: [
4259
+ 'active',
4260
+ 'inactive'
4261
+ ]
1750
4262
  }
1751
4263
  },
1752
4264
  additionalProperties: false