@cloudfleet/sdk 0.0.1-13073f9 → 0.0.1-1569b1f

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 +1084 -0
  3. package/dist/@tanstack/react-query.gen.d.ts.map +1 -0
  4. package/dist/@tanstack/react-query.gen.js +1305 -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 +1414 -171
  47. package/dist/schemas.gen.d.ts.map +1 -1
  48. package/dist/schemas.gen.js +2895 -238
  49. package/dist/schemas.gen.js.map +1 -1
  50. package/dist/sdk.gen.d.ts +296 -184
  51. package/dist/sdk.gen.d.ts.map +1 -1
  52. package/dist/sdk.gen.js +451 -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 +1814 -685
  56. package/dist/types.gen.d.ts.map +1 -1
  57. package/dist/zod.gen.d.ts +3751 -1415
  58. package/dist/zod.gen.d.ts.map +1 -1
  59. package/dist/zod.gen.js +1532 -616
  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,26 +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.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
+ }
290
558
  }
291
559
  },
292
- required: ['name', 'tier'],
293
- 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.'
294
566
  };
295
567
  export const ClusterJoinInformationSchema = {
296
568
  type: 'object',
@@ -298,8 +570,7 @@ export const ClusterJoinInformationSchema = {
298
570
  certificate_authority: {
299
571
  type: 'string',
300
572
  description: 'Certificate authority data for the kubernetes cluster. This is the root certificate authority for the cluster.',
301
- example: `-----BEGIN CERTIFICATE-----
302
- MIIC0DCCAbigAwIBAgI...`
573
+ example: '-----BEGIN CERTIFICATE-----\nMIIC0DCCAbigAwIBAgI...'
303
574
  },
304
575
  endpoint: {
305
576
  type: 'string',
@@ -307,11 +578,26 @@ MIIC0DCCAbigAwIBAgI...`
307
578
  description: 'Internal URL of the Kubernetes cluster control plane. This is the endpoint that kubelet uses to connect to the cluster.',
308
579
  example: 'https://10.31.64.7:6443'
309
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
+ },
310
591
  auth_key: {
311
592
  type: 'string',
312
593
  description: 'Authentication key for the cluster.',
313
594
  example: 'tskey-auth-kBV8wr1dk911CNTRL-...'
314
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
+ },
315
601
  bootstrap_token: {
316
602
  type: 'string',
317
603
  description: 'Bootstrap token for the cluster.',
@@ -341,7 +627,12 @@ MIIC0DCCAbigAwIBAgI...`
341
627
  example: '565.0.0'
342
628
  }
343
629
  },
344
- required: ['kubernetes', 'tailscale', 'containerd', 'nvidia_driver'],
630
+ required: [
631
+ 'kubernetes',
632
+ 'tailscale',
633
+ 'containerd',
634
+ 'nvidia_driver'
635
+ ],
345
636
  additionalProperties: false,
346
637
  description: 'Versions of the different components of the cluster.'
347
638
  },
@@ -364,12 +655,26 @@ MIIC0DCCAbigAwIBAgI...`
364
655
  example: '//iam.googleapis.com/projects/89014267864/locations/global/workloadIdentityPools/cfke/providers/oidc'
365
656
  }
366
657
  },
367
- 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
+ ],
368
663
  additionalProperties: false,
369
- 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.'
370
665
  }
371
666
  },
372
- 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
+ ],
373
678
  additionalProperties: false
374
679
  };
375
680
  export const ClusterSchema = {
@@ -386,22 +691,122 @@ export const ClusterSchema = {
386
691
  tier: {
387
692
  type: 'string',
388
693
  description: 'Tier of the cluster.',
694
+ default: 'basic',
389
695
  example: 'pro',
390
- enum: ['basic', 'pro']
391
- },
392
- region: {
393
- type: 'string',
394
- 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.',
395
- default: 'staging',
396
- example: 'northamerica-central-1a',
397
- enum: ['staging', 'northamerica-central-1', 'europe-central-1a', 'northamerica-central-1a']
696
+ enum: [
697
+ 'basic',
698
+ 'pro',
699
+ 'enterprise'
700
+ ]
398
701
  },
399
702
  version_channel: {
400
703
  type: 'string',
401
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-]+)*))?$',
402
705
  description: 'Version of the kubernetes cluster.',
403
706
  default: '1.x.x-cfke.x',
404
- example: '1.33.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
+ }
760
+ },
761
+ region: {
762
+ type: 'string',
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
+ }
405
810
  },
406
811
  id: {
407
812
  type: 'string',
@@ -411,29 +816,51 @@ export const ClusterSchema = {
411
816
  },
412
817
  status: {
413
818
  type: 'string',
414
- description: 'Status of the cluster. When creating a new cluster, set to `active`. When deleting a clusters, set to `deleted`.',
415
- example: 'active',
416
- 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
+ ]
417
827
  },
418
828
  endpoint: {
419
829
  anyOf: [
420
830
  {
421
831
  type: 'string',
422
832
  format: 'uri',
423
- description: 'URL of the Kubernetes cluster control plane. This is the endpoint that kubectl uses to connect to the cluster.',
424
- 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'
425
835
  },
426
836
  {
427
837
  type: 'string',
428
- enum: ['']
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'
851
+ },
852
+ {
853
+ type: 'string',
854
+ enum: [
855
+ ''
856
+ ]
429
857
  }
430
858
  ]
431
859
  },
432
860
  certificate_ca: {
433
861
  type: 'string',
434
862
  description: 'Certificate authority data for the kubernetes cluster. This is the root certificate authority for the cluster.',
435
- example: `-----BEGIN CERTIFICATE-----
436
- MIIC0DCCAbigAwIBAgI...`
863
+ example: '-----BEGIN CERTIFICATE-----\nMIIC0DCCAbigAwIBAgI...'
437
864
  },
438
865
  version_current: {
439
866
  type: 'string',
@@ -456,8 +883,20 @@ MIIC0DCCAbigAwIBAgI...`
456
883
  example: true
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,17 +912,139 @@ 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.',
483
- example: '1.33.x-cfke.x'
927
+ default: '1.x.x-cfke.x',
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'],
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.'
983
+ };
984
+ export const FeedbackCreateInputSchema = {
985
+ type: 'object',
986
+ properties: {
987
+ sentiment: {
988
+ type: 'string',
989
+ description: 'Overall sentiment: positive, neutral or negative.',
990
+ example: 'negative',
991
+ enum: [
992
+ 'positive',
993
+ 'neutral',
994
+ 'negative'
995
+ ]
996
+ },
997
+ message: {
998
+ type: 'string',
999
+ maxLength: 2000,
1000
+ minLength: 1,
1001
+ description: 'What was useful, confusing, wrong or missing.',
1002
+ example: 'The error for a missing kubeconfig does not say which path it looked in.'
1003
+ },
1004
+ context: {
1005
+ type: 'string',
1006
+ maxLength: 2000,
1007
+ description: 'What you were trying to do when it happened.',
1008
+ example: 'Connecting kubectl to a new cluster.'
1009
+ },
1010
+ source: {
1011
+ type: 'string',
1012
+ description: 'Where the feedback was sent from: cli, mcp, plugin, console or api. Defaults to api.',
1013
+ default: 'api',
1014
+ example: 'cli',
1015
+ enum: [
1016
+ 'cli',
1017
+ 'mcp',
1018
+ 'plugin',
1019
+ 'console',
1020
+ 'api'
1021
+ ]
1022
+ },
1023
+ client: {
1024
+ type: 'string',
1025
+ maxLength: 100,
1026
+ description: 'Name and version of the sending client.',
1027
+ example: 'cloudfleet-plugin-claude/0.5.0'
1028
+ }
1029
+ },
1030
+ required: [
1031
+ 'sentiment',
1032
+ 'message'
1033
+ ],
1034
+ additionalProperties: false
1035
+ };
1036
+ export const FeedbackSchema = {
1037
+ type: 'object',
1038
+ properties: {
1039
+ id: {
1040
+ type: 'string',
1041
+ description: 'Unique identifier of the feedback entry (Mongo ObjectId).',
1042
+ example: '60c72b2f9f1b2c001f8e4d3a'
1043
+ }
1044
+ },
1045
+ required: [
1046
+ 'id'
1047
+ ],
487
1048
  additionalProperties: false
488
1049
  };
489
1050
  export const FleetCreateInputSchema = {
@@ -493,13 +1054,12 @@ export const FleetCreateInputSchema = {
493
1054
  type: 'object',
494
1055
  properties: {
495
1056
  cpu: {
496
- type: 'number',
497
- format: 'float',
1057
+ type: 'integer',
498
1058
  minimum: 0,
499
- description: 'CPU limit in cores.'
1059
+ maximum: 100000,
1060
+ description: 'CPU limit in cores. Maximum 100,000.'
500
1061
  }
501
1062
  },
502
- required: ['cpu'],
503
1063
  additionalProperties: false,
504
1064
  description: 'Limits define a set of bounds for provisioning capacity.'
505
1065
  },
@@ -507,47 +1067,396 @@ export const FleetCreateInputSchema = {
507
1067
  type: 'object',
508
1068
  properties: {
509
1069
  enabled: {
510
- type: 'boolean',
511
- default: true
1070
+ type: 'boolean'
512
1071
  },
513
1072
  project: {
514
1073
  type: 'string',
515
- description: 'Project GCP Project id to deploy instances into'
1074
+ pattern: '^[a-z][a-z0-9-]{4,28}[a-z0-9]$',
1075
+ 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.',
1076
+ example: 'my-cloudfleet-project'
516
1077
  }
517
1078
  },
518
- required: ['project'],
1079
+ required: [
1080
+ 'enabled'
1081
+ ],
519
1082
  additionalProperties: false
520
1083
  },
521
1084
  hetzner: {
522
1085
  type: 'object',
523
1086
  properties: {
524
1087
  enabled: {
525
- type: 'boolean',
526
- default: true
1088
+ type: 'boolean'
527
1089
  },
528
1090
  apiKey: {
529
1091
  type: 'string',
530
- description: 'Hetzner Cloud API key with read / write access'
1092
+ maxLength: 64,
1093
+ minLength: 64,
1094
+ pattern: '^([A-Za-z0-9]{64}|\\*{64})$',
1095
+ 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
1096
  }
532
1097
  },
533
- required: ['apiKey'],
1098
+ required: [
1099
+ 'enabled'
1100
+ ],
534
1101
  additionalProperties: false
535
1102
  },
536
1103
  aws: {
537
1104
  type: 'object',
538
1105
  properties: {
539
1106
  enabled: {
540
- type: 'boolean',
541
- default: true
1107
+ type: 'boolean'
542
1108
  },
543
1109
  controllerRoleArn: {
544
1110
  type: 'string',
545
- description: 'ControllerRoleArn is the AWS IAM role that Karpenter uses to manage resources.'
1111
+ pattern: '^arn:aws(-[a-z]+)*:iam::\\d{12}:role\\/[\\w+=,.@/-]+$',
1112
+ description: 'AWS IAM role ARN that Karpenter uses to manage resources. Omit when AWS is disabled.',
1113
+ example: 'arn:aws:iam::123456789012:role/Cloudfleet'
546
1114
  }
547
1115
  },
548
- required: ['controllerRoleArn'],
1116
+ required: [
1117
+ 'enabled'
1118
+ ],
549
1119
  additionalProperties: false
550
1120
  },
1121
+ constraints: {
1122
+ type: 'object',
1123
+ properties: {
1124
+ 'karpenter.sh/capacity-type': {
1125
+ type: 'array',
1126
+ items: {
1127
+ type: 'string',
1128
+ enum: [
1129
+ 'on-demand',
1130
+ 'spot'
1131
+ ]
1132
+ },
1133
+ minItems: 1,
1134
+ description: 'Allowed values for `karpenter.sh/capacity-type`.',
1135
+ default: [
1136
+ 'on-demand',
1137
+ 'spot'
1138
+ ]
1139
+ },
1140
+ 'kubernetes.io/arch': {
1141
+ type: 'array',
1142
+ items: {
1143
+ type: 'string',
1144
+ enum: [
1145
+ 'amd64',
1146
+ 'arm64'
1147
+ ]
1148
+ },
1149
+ minItems: 1,
1150
+ description: 'Allowed values for `kubernetes.io/arch`.',
1151
+ default: [
1152
+ 'amd64'
1153
+ ]
1154
+ },
1155
+ 'cfke.io/instance-family': {
1156
+ type: 'array',
1157
+ items: {
1158
+ type: 'string',
1159
+ enum: [
1160
+ 'a1',
1161
+ 'a2',
1162
+ 'a3',
1163
+ 'a4',
1164
+ 'c1',
1165
+ 'c2',
1166
+ 'c2d',
1167
+ 'c3',
1168
+ 'c3d',
1169
+ 'c4',
1170
+ 'c4a',
1171
+ 'c4d',
1172
+ 'c5',
1173
+ 'c5a',
1174
+ 'c5ad',
1175
+ 'c5d',
1176
+ 'c5n',
1177
+ 'c6a',
1178
+ 'c6g',
1179
+ 'c6gd',
1180
+ 'c6gn',
1181
+ 'c6i',
1182
+ 'c6id',
1183
+ 'c6in',
1184
+ 'c7a',
1185
+ 'c7g',
1186
+ 'c7gd',
1187
+ 'c7gn',
1188
+ 'c7i',
1189
+ 'c7i-flex',
1190
+ 'c8g',
1191
+ 'c8gd',
1192
+ 'cax',
1193
+ 'ccx',
1194
+ 'cpx',
1195
+ 'cx',
1196
+ 'd2',
1197
+ 'd3',
1198
+ 'd3en',
1199
+ 'dl1',
1200
+ 'dl2q',
1201
+ 'e2',
1202
+ 'f1',
1203
+ 'f2',
1204
+ 'g1',
1205
+ 'g2',
1206
+ 'g4ad',
1207
+ 'g4dn',
1208
+ 'g5',
1209
+ 'g5g',
1210
+ 'g6',
1211
+ 'g6e',
1212
+ 'gr6',
1213
+ 'h1',
1214
+ 'h3',
1215
+ 'hpc6a',
1216
+ 'hpc6id',
1217
+ 'hpc7a',
1218
+ 'hpc7g',
1219
+ 'i2',
1220
+ 'i3',
1221
+ 'i3en',
1222
+ 'i4g',
1223
+ 'i4i',
1224
+ 'i7i',
1225
+ 'i7ie',
1226
+ 'i8g',
1227
+ 'im4gn',
1228
+ 'inf1',
1229
+ 'inf2',
1230
+ 'is4gen',
1231
+ 'm1',
1232
+ 'm2',
1233
+ 'm3',
1234
+ 'm4',
1235
+ 'm5',
1236
+ 'm5a',
1237
+ 'm5ad',
1238
+ 'm5d',
1239
+ 'm5dn',
1240
+ 'm5n',
1241
+ 'm5zn',
1242
+ 'm6a',
1243
+ 'm6g',
1244
+ 'm6gd',
1245
+ 'm6i',
1246
+ 'm6id',
1247
+ 'm6idn',
1248
+ 'm6in',
1249
+ 'm7a',
1250
+ 'm7g',
1251
+ 'm7gd',
1252
+ 'm7i',
1253
+ 'm7i-flex',
1254
+ 'm8g',
1255
+ 'm8gd',
1256
+ 'n1',
1257
+ 'n2',
1258
+ 'n2d',
1259
+ 'n4',
1260
+ 'p3',
1261
+ 'p3dn',
1262
+ 'p4d',
1263
+ 'p4de',
1264
+ 'p5',
1265
+ 'p5e',
1266
+ 'p5en',
1267
+ 'p6-b200',
1268
+ 'r3',
1269
+ 'r4',
1270
+ 'r5',
1271
+ 'r5a',
1272
+ 'r5ad',
1273
+ 'r5b',
1274
+ 'r5d',
1275
+ 'r5dn',
1276
+ 'r5n',
1277
+ 'r6a',
1278
+ 'r6g',
1279
+ 'r6gd',
1280
+ 'r6i',
1281
+ 'r6id',
1282
+ 'r6idn',
1283
+ 'r6in',
1284
+ 'r7a',
1285
+ 'r7g',
1286
+ 'r7gd',
1287
+ 'r7i',
1288
+ 'r7iz',
1289
+ 'r8g',
1290
+ 'r8gd',
1291
+ 't2',
1292
+ 't2a',
1293
+ 't2d',
1294
+ 't3',
1295
+ 't3a',
1296
+ 't4g',
1297
+ 'trn1',
1298
+ 'trn1n',
1299
+ 'u-3tb1',
1300
+ 'u-6tb1',
1301
+ 'u7i-12tb',
1302
+ 'u7i-6tb',
1303
+ 'u7i-8tb',
1304
+ 'u7in-16tb',
1305
+ 'u7in-24tb',
1306
+ 'u7in-32tb',
1307
+ 'vt1',
1308
+ 'x1',
1309
+ 'x1e',
1310
+ 'x2gd',
1311
+ 'x2idn',
1312
+ 'x2iedn',
1313
+ 'x2iezn',
1314
+ 'x4',
1315
+ 'x8g',
1316
+ 'z1d',
1317
+ 'z3'
1318
+ ]
1319
+ },
1320
+ description: 'Allowed values for `cfke.io/instance-family`.',
1321
+ default: []
1322
+ },
1323
+ 'topology.kubernetes.io/region': {
1324
+ type: 'array',
1325
+ items: {
1326
+ type: 'string',
1327
+ enum: [
1328
+ 'africa-south1',
1329
+ 'ap-northeast-1',
1330
+ 'ap-northeast-2',
1331
+ 'ap-northeast-3',
1332
+ 'ap-south-1',
1333
+ 'ap-southeast-1',
1334
+ 'ap-southeast-2',
1335
+ 'ash',
1336
+ 'asia-east1',
1337
+ 'asia-east2',
1338
+ 'asia-northeast1',
1339
+ 'asia-northeast2',
1340
+ 'asia-northeast3',
1341
+ 'asia-south1',
1342
+ 'asia-south2',
1343
+ 'asia-southeast1',
1344
+ 'asia-southeast2',
1345
+ 'australia-southeast1',
1346
+ 'australia-southeast2',
1347
+ 'ca-central-1',
1348
+ 'eu-central-1',
1349
+ 'eu-central-2',
1350
+ 'eu-north-1',
1351
+ 'eu-west-1',
1352
+ 'eu-west-2',
1353
+ 'eu-west-3',
1354
+ 'europe-central2',
1355
+ 'europe-north1',
1356
+ 'europe-southwest1',
1357
+ 'europe-west1',
1358
+ 'europe-west10',
1359
+ 'europe-west12',
1360
+ 'europe-west2',
1361
+ 'europe-west3',
1362
+ 'europe-west4',
1363
+ 'europe-west6',
1364
+ 'europe-west8',
1365
+ 'europe-west9',
1366
+ 'fsn1',
1367
+ 'hel1',
1368
+ 'hil',
1369
+ 'me-central1',
1370
+ 'me-central2',
1371
+ 'me-west1',
1372
+ 'nbg1',
1373
+ 'northamerica-northeast1',
1374
+ 'northamerica-northeast2',
1375
+ 'sa-east-1',
1376
+ 'sin',
1377
+ 'southamerica-east1',
1378
+ 'southamerica-west1',
1379
+ 'us-central1',
1380
+ 'us-east-1',
1381
+ 'us-east-2',
1382
+ 'us-east1',
1383
+ 'us-east4',
1384
+ 'us-east5',
1385
+ 'us-south1',
1386
+ 'us-west-1',
1387
+ 'us-west-2',
1388
+ 'us-west1',
1389
+ 'us-west2',
1390
+ 'us-west3',
1391
+ 'us-west4'
1392
+ ]
1393
+ },
1394
+ description: 'Allowed values for `topology.kubernetes.io/region`.',
1395
+ default: []
1396
+ }
1397
+ },
1398
+ additionalProperties: false,
1399
+ 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.',
1400
+ default: {
1401
+ 'karpenter.sh/capacity-type': [
1402
+ 'on-demand',
1403
+ 'spot'
1404
+ ],
1405
+ 'kubernetes.io/arch': [
1406
+ 'amd64'
1407
+ ],
1408
+ 'cfke.io/instance-family': [],
1409
+ 'topology.kubernetes.io/region': []
1410
+ }
1411
+ },
1412
+ scalingProfile: {
1413
+ type: 'string',
1414
+ 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`).',
1415
+ default: 'conservative',
1416
+ example: 'conservative',
1417
+ enum: [
1418
+ 'aggressive',
1419
+ 'conservative'
1420
+ ]
1421
+ },
1422
+ taints: {
1423
+ type: 'array',
1424
+ items: {
1425
+ type: 'object',
1426
+ properties: {
1427
+ key: {
1428
+ type: 'string',
1429
+ 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.',
1430
+ example: 'dedicated'
1431
+ },
1432
+ value: {
1433
+ type: 'string',
1434
+ maxLength: 63,
1435
+ pattern: '^([A-Za-z0-9]([-A-Za-z0-9_.]*[A-Za-z0-9])?)?$',
1436
+ description: 'Taint value. Optional.',
1437
+ example: 'ci'
1438
+ },
1439
+ effect: {
1440
+ type: 'string',
1441
+ description: 'Taint effect.',
1442
+ example: 'NoSchedule',
1443
+ enum: [
1444
+ 'NoSchedule',
1445
+ 'PreferNoSchedule',
1446
+ 'NoExecute'
1447
+ ]
1448
+ }
1449
+ },
1450
+ required: [
1451
+ 'key',
1452
+ 'effect'
1453
+ ],
1454
+ additionalProperties: false
1455
+ },
1456
+ maxItems: 50,
1457
+ 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.',
1458
+ default: []
1459
+ },
551
1460
  id: {
552
1461
  type: 'string',
553
1462
  maxLength: 63,
@@ -557,8 +1466,11 @@ export const FleetCreateInputSchema = {
557
1466
  example: 'new-clouds-fleet'
558
1467
  }
559
1468
  },
560
- required: ['id'],
561
- additionalProperties: false
1469
+ required: [
1470
+ 'id'
1471
+ ],
1472
+ additionalProperties: false,
1473
+ description: 'Mutable fleet configuration. Applied as a full overwrite: any omitted field is reset to its default rather than left unchanged.'
562
1474
  };
563
1475
  export const FleetSchema = {
564
1476
  type: 'object',
@@ -567,13 +1479,12 @@ export const FleetSchema = {
567
1479
  type: 'object',
568
1480
  properties: {
569
1481
  cpu: {
570
- type: 'number',
571
- format: 'float',
1482
+ type: 'integer',
572
1483
  minimum: 0,
573
- description: 'CPU limit in cores.'
1484
+ maximum: 100000,
1485
+ description: 'CPU limit in cores. Maximum 100,000.'
574
1486
  }
575
1487
  },
576
- required: ['cpu'],
577
1488
  additionalProperties: false,
578
1489
  description: 'Limits define a set of bounds for provisioning capacity.'
579
1490
  },
@@ -581,47 +1492,398 @@ export const FleetSchema = {
581
1492
  type: 'object',
582
1493
  properties: {
583
1494
  enabled: {
584
- type: 'boolean',
585
- default: true
1495
+ type: 'boolean'
586
1496
  },
587
1497
  project: {
588
1498
  type: 'string',
589
- description: 'Project GCP Project id to deploy instances into'
1499
+ pattern: '^[a-z][a-z0-9-]{4,28}[a-z0-9]$',
1500
+ 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.',
1501
+ example: 'my-cloudfleet-project'
590
1502
  }
591
1503
  },
592
- required: ['project'],
1504
+ required: [
1505
+ 'enabled'
1506
+ ],
593
1507
  additionalProperties: false
594
1508
  },
595
1509
  hetzner: {
596
1510
  type: 'object',
597
1511
  properties: {
598
1512
  enabled: {
599
- type: 'boolean',
600
- default: true
1513
+ type: 'boolean'
601
1514
  },
602
1515
  apiKey: {
603
1516
  type: 'string',
604
- description: 'Hetzner Cloud API key with read / write access'
1517
+ pattern: '^\\*{64}$',
1518
+ 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
1519
  }
606
1520
  },
607
- required: ['apiKey'],
1521
+ required: [
1522
+ 'enabled'
1523
+ ],
608
1524
  additionalProperties: false
609
1525
  },
610
1526
  aws: {
611
1527
  type: 'object',
612
1528
  properties: {
613
1529
  enabled: {
614
- type: 'boolean',
615
- default: true
1530
+ type: 'boolean'
616
1531
  },
617
1532
  controllerRoleArn: {
618
1533
  type: 'string',
619
- description: 'ControllerRoleArn is the AWS IAM role that Karpenter uses to manage resources.'
1534
+ pattern: '^arn:aws(-[a-z]+)*:iam::\\d{12}:role\\/[\\w+=,.@/-]+$',
1535
+ description: 'AWS IAM role ARN that Karpenter uses to manage resources. Omit when AWS is disabled.',
1536
+ example: 'arn:aws:iam::123456789012:role/Cloudfleet'
620
1537
  }
621
1538
  },
622
- required: ['controllerRoleArn'],
1539
+ required: [
1540
+ 'enabled'
1541
+ ],
623
1542
  additionalProperties: false
624
1543
  },
1544
+ constraints: {
1545
+ type: 'object',
1546
+ properties: {
1547
+ 'karpenter.sh/capacity-type': {
1548
+ type: 'array',
1549
+ items: {
1550
+ type: 'string',
1551
+ enum: [
1552
+ 'on-demand',
1553
+ 'spot'
1554
+ ]
1555
+ },
1556
+ minItems: 1,
1557
+ description: 'Allowed values for `karpenter.sh/capacity-type`.',
1558
+ default: [
1559
+ 'on-demand',
1560
+ 'spot'
1561
+ ]
1562
+ },
1563
+ 'kubernetes.io/arch': {
1564
+ type: 'array',
1565
+ items: {
1566
+ type: 'string',
1567
+ enum: [
1568
+ 'amd64',
1569
+ 'arm64'
1570
+ ]
1571
+ },
1572
+ minItems: 1,
1573
+ description: 'Allowed values for `kubernetes.io/arch`.',
1574
+ default: [
1575
+ 'amd64'
1576
+ ]
1577
+ },
1578
+ 'cfke.io/instance-family': {
1579
+ type: 'array',
1580
+ items: {
1581
+ type: 'string',
1582
+ enum: [
1583
+ 'a1',
1584
+ 'a2',
1585
+ 'a3',
1586
+ 'a4',
1587
+ 'c1',
1588
+ 'c2',
1589
+ 'c2d',
1590
+ 'c3',
1591
+ 'c3d',
1592
+ 'c4',
1593
+ 'c4a',
1594
+ 'c4d',
1595
+ 'c5',
1596
+ 'c5a',
1597
+ 'c5ad',
1598
+ 'c5d',
1599
+ 'c5n',
1600
+ 'c6a',
1601
+ 'c6g',
1602
+ 'c6gd',
1603
+ 'c6gn',
1604
+ 'c6i',
1605
+ 'c6id',
1606
+ 'c6in',
1607
+ 'c7a',
1608
+ 'c7g',
1609
+ 'c7gd',
1610
+ 'c7gn',
1611
+ 'c7i',
1612
+ 'c7i-flex',
1613
+ 'c8g',
1614
+ 'c8gd',
1615
+ 'cax',
1616
+ 'ccx',
1617
+ 'cpx',
1618
+ 'cx',
1619
+ 'd2',
1620
+ 'd3',
1621
+ 'd3en',
1622
+ 'dl1',
1623
+ 'dl2q',
1624
+ 'e2',
1625
+ 'f1',
1626
+ 'f2',
1627
+ 'g1',
1628
+ 'g2',
1629
+ 'g4ad',
1630
+ 'g4dn',
1631
+ 'g5',
1632
+ 'g5g',
1633
+ 'g6',
1634
+ 'g6e',
1635
+ 'gr6',
1636
+ 'h1',
1637
+ 'h3',
1638
+ 'hpc6a',
1639
+ 'hpc6id',
1640
+ 'hpc7a',
1641
+ 'hpc7g',
1642
+ 'i2',
1643
+ 'i3',
1644
+ 'i3en',
1645
+ 'i4g',
1646
+ 'i4i',
1647
+ 'i7i',
1648
+ 'i7ie',
1649
+ 'i8g',
1650
+ 'im4gn',
1651
+ 'inf1',
1652
+ 'inf2',
1653
+ 'is4gen',
1654
+ 'm1',
1655
+ 'm2',
1656
+ 'm3',
1657
+ 'm4',
1658
+ 'm5',
1659
+ 'm5a',
1660
+ 'm5ad',
1661
+ 'm5d',
1662
+ 'm5dn',
1663
+ 'm5n',
1664
+ 'm5zn',
1665
+ 'm6a',
1666
+ 'm6g',
1667
+ 'm6gd',
1668
+ 'm6i',
1669
+ 'm6id',
1670
+ 'm6idn',
1671
+ 'm6in',
1672
+ 'm7a',
1673
+ 'm7g',
1674
+ 'm7gd',
1675
+ 'm7i',
1676
+ 'm7i-flex',
1677
+ 'm8g',
1678
+ 'm8gd',
1679
+ 'n1',
1680
+ 'n2',
1681
+ 'n2d',
1682
+ 'n4',
1683
+ 'p3',
1684
+ 'p3dn',
1685
+ 'p4d',
1686
+ 'p4de',
1687
+ 'p5',
1688
+ 'p5e',
1689
+ 'p5en',
1690
+ 'p6-b200',
1691
+ 'r3',
1692
+ 'r4',
1693
+ 'r5',
1694
+ 'r5a',
1695
+ 'r5ad',
1696
+ 'r5b',
1697
+ 'r5d',
1698
+ 'r5dn',
1699
+ 'r5n',
1700
+ 'r6a',
1701
+ 'r6g',
1702
+ 'r6gd',
1703
+ 'r6i',
1704
+ 'r6id',
1705
+ 'r6idn',
1706
+ 'r6in',
1707
+ 'r7a',
1708
+ 'r7g',
1709
+ 'r7gd',
1710
+ 'r7i',
1711
+ 'r7iz',
1712
+ 'r8g',
1713
+ 'r8gd',
1714
+ 't2',
1715
+ 't2a',
1716
+ 't2d',
1717
+ 't3',
1718
+ 't3a',
1719
+ 't4g',
1720
+ 'trn1',
1721
+ 'trn1n',
1722
+ 'u-3tb1',
1723
+ 'u-6tb1',
1724
+ 'u7i-12tb',
1725
+ 'u7i-6tb',
1726
+ 'u7i-8tb',
1727
+ 'u7in-16tb',
1728
+ 'u7in-24tb',
1729
+ 'u7in-32tb',
1730
+ 'vt1',
1731
+ 'x1',
1732
+ 'x1e',
1733
+ 'x2gd',
1734
+ 'x2idn',
1735
+ 'x2iedn',
1736
+ 'x2iezn',
1737
+ 'x4',
1738
+ 'x8g',
1739
+ 'z1d',
1740
+ 'z3'
1741
+ ]
1742
+ },
1743
+ description: 'Allowed values for `cfke.io/instance-family`.',
1744
+ default: []
1745
+ },
1746
+ 'topology.kubernetes.io/region': {
1747
+ type: 'array',
1748
+ items: {
1749
+ type: 'string',
1750
+ enum: [
1751
+ 'africa-south1',
1752
+ 'ap-northeast-1',
1753
+ 'ap-northeast-2',
1754
+ 'ap-northeast-3',
1755
+ 'ap-south-1',
1756
+ 'ap-southeast-1',
1757
+ 'ap-southeast-2',
1758
+ 'ash',
1759
+ 'asia-east1',
1760
+ 'asia-east2',
1761
+ 'asia-northeast1',
1762
+ 'asia-northeast2',
1763
+ 'asia-northeast3',
1764
+ 'asia-south1',
1765
+ 'asia-south2',
1766
+ 'asia-southeast1',
1767
+ 'asia-southeast2',
1768
+ 'australia-southeast1',
1769
+ 'australia-southeast2',
1770
+ 'ca-central-1',
1771
+ 'eu-central-1',
1772
+ 'eu-central-2',
1773
+ 'eu-north-1',
1774
+ 'eu-west-1',
1775
+ 'eu-west-2',
1776
+ 'eu-west-3',
1777
+ 'europe-central2',
1778
+ 'europe-north1',
1779
+ 'europe-southwest1',
1780
+ 'europe-west1',
1781
+ 'europe-west10',
1782
+ 'europe-west12',
1783
+ 'europe-west2',
1784
+ 'europe-west3',
1785
+ 'europe-west4',
1786
+ 'europe-west6',
1787
+ 'europe-west8',
1788
+ 'europe-west9',
1789
+ 'fsn1',
1790
+ 'hel1',
1791
+ 'hil',
1792
+ 'me-central1',
1793
+ 'me-central2',
1794
+ 'me-west1',
1795
+ 'nbg1',
1796
+ 'northamerica-northeast1',
1797
+ 'northamerica-northeast2',
1798
+ 'sa-east-1',
1799
+ 'sin',
1800
+ 'southamerica-east1',
1801
+ 'southamerica-west1',
1802
+ 'us-central1',
1803
+ 'us-east-1',
1804
+ 'us-east-2',
1805
+ 'us-east1',
1806
+ 'us-east4',
1807
+ 'us-east5',
1808
+ 'us-south1',
1809
+ 'us-west-1',
1810
+ 'us-west-2',
1811
+ 'us-west1',
1812
+ 'us-west2',
1813
+ 'us-west3',
1814
+ 'us-west4'
1815
+ ]
1816
+ },
1817
+ description: 'Allowed values for `topology.kubernetes.io/region`.',
1818
+ default: []
1819
+ }
1820
+ },
1821
+ required: [
1822
+ 'karpenter.sh/capacity-type',
1823
+ 'kubernetes.io/arch'
1824
+ ],
1825
+ additionalProperties: false,
1826
+ 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.',
1827
+ default: {
1828
+ 'karpenter.sh/capacity-type': [
1829
+ 'on-demand',
1830
+ 'spot'
1831
+ ],
1832
+ 'kubernetes.io/arch': [
1833
+ 'amd64'
1834
+ ],
1835
+ 'cfke.io/instance-family': [],
1836
+ 'topology.kubernetes.io/region': []
1837
+ }
1838
+ },
1839
+ scalingProfile: {
1840
+ type: 'string',
1841
+ 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`).',
1842
+ default: 'conservative',
1843
+ example: 'conservative',
1844
+ enum: [
1845
+ 'aggressive',
1846
+ 'conservative'
1847
+ ]
1848
+ },
1849
+ taints: {
1850
+ type: 'array',
1851
+ items: {
1852
+ type: 'object',
1853
+ properties: {
1854
+ key: {
1855
+ type: 'string',
1856
+ 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.',
1857
+ example: 'dedicated'
1858
+ },
1859
+ value: {
1860
+ type: 'string',
1861
+ maxLength: 63,
1862
+ pattern: '^([A-Za-z0-9]([-A-Za-z0-9_.]*[A-Za-z0-9])?)?$',
1863
+ description: 'Taint value. Optional.',
1864
+ example: 'ci'
1865
+ },
1866
+ effect: {
1867
+ type: 'string',
1868
+ description: 'Taint effect.',
1869
+ example: 'NoSchedule',
1870
+ enum: [
1871
+ 'NoSchedule',
1872
+ 'PreferNoSchedule',
1873
+ 'NoExecute'
1874
+ ]
1875
+ }
1876
+ },
1877
+ required: [
1878
+ 'key',
1879
+ 'effect'
1880
+ ],
1881
+ additionalProperties: false
1882
+ },
1883
+ maxItems: 50,
1884
+ 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.',
1885
+ default: []
1886
+ },
625
1887
  id: {
626
1888
  type: 'string',
627
1889
  maxLength: 63,
@@ -629,10 +1891,39 @@ export const FleetSchema = {
629
1891
  pattern: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$',
630
1892
  description: 'Unique identifier of the kubernetes fleet.',
631
1893
  example: 'new-clouds-fleet'
1894
+ },
1895
+ ready: {
1896
+ type: 'boolean',
1897
+ description: 'Indicates whether the fleet configuration is healthy.',
1898
+ example: true
1899
+ },
1900
+ status_message: {
1901
+ type: 'string',
1902
+ description: 'Human-readable reason the fleet is not ready. Present only when `ready` is false.',
1903
+ example: 'Invalid provider permissions.'
1904
+ },
1905
+ created_at: {
1906
+ type: 'string',
1907
+ description: 'Creation date and time of the fleet.',
1908
+ example: '2024-09-12T09:11:27Z'
1909
+ },
1910
+ updated_at: {
1911
+ type: 'string',
1912
+ description: 'Date and time the fleet was last updated.',
1913
+ example: '2024-09-12T09:11:27Z'
632
1914
  }
633
1915
  },
634
- required: ['id'],
635
- additionalProperties: false
1916
+ required: [
1917
+ 'constraints',
1918
+ 'scalingProfile',
1919
+ 'taints',
1920
+ 'id',
1921
+ 'ready',
1922
+ 'created_at',
1923
+ 'updated_at'
1924
+ ],
1925
+ additionalProperties: false,
1926
+ description: 'Mutable fleet configuration. Applied as a full overwrite: any omitted field is reset to its default rather than left unchanged.'
636
1927
  };
637
1928
  export const FleetUpdateInputSchema = {
638
1929
  type: 'object',
@@ -641,13 +1932,12 @@ export const FleetUpdateInputSchema = {
641
1932
  type: 'object',
642
1933
  properties: {
643
1934
  cpu: {
644
- type: 'number',
645
- format: 'float',
1935
+ type: 'integer',
646
1936
  minimum: 0,
647
- description: 'CPU limit in cores.'
1937
+ maximum: 100000,
1938
+ description: 'CPU limit in cores. Maximum 100,000.'
648
1939
  }
649
1940
  },
650
- required: ['cpu'],
651
1941
  additionalProperties: false,
652
1942
  description: 'Limits define a set of bounds for provisioning capacity.'
653
1943
  },
@@ -655,48 +1945,423 @@ export const FleetUpdateInputSchema = {
655
1945
  type: 'object',
656
1946
  properties: {
657
1947
  enabled: {
658
- type: 'boolean',
659
- default: true
1948
+ type: 'boolean'
660
1949
  },
661
1950
  project: {
662
1951
  type: 'string',
663
- description: 'Project GCP Project id to deploy instances into'
1952
+ pattern: '^[a-z][a-z0-9-]{4,28}[a-z0-9]$',
1953
+ 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.',
1954
+ example: 'my-cloudfleet-project'
664
1955
  }
665
1956
  },
666
- required: ['project'],
1957
+ required: [
1958
+ 'enabled'
1959
+ ],
667
1960
  additionalProperties: false
668
1961
  },
669
1962
  hetzner: {
670
1963
  type: 'object',
671
1964
  properties: {
672
1965
  enabled: {
673
- type: 'boolean',
674
- default: true
1966
+ type: 'boolean'
675
1967
  },
676
1968
  apiKey: {
677
1969
  type: 'string',
678
- description: 'Hetzner Cloud API key with read / write access'
1970
+ maxLength: 64,
1971
+ minLength: 64,
1972
+ pattern: '^([A-Za-z0-9]{64}|\\*{64})$',
1973
+ 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
1974
  }
680
1975
  },
681
- required: ['apiKey'],
1976
+ required: [
1977
+ 'enabled'
1978
+ ],
682
1979
  additionalProperties: false
683
1980
  },
684
1981
  aws: {
685
1982
  type: 'object',
686
1983
  properties: {
687
1984
  enabled: {
688
- type: 'boolean',
689
- default: true
1985
+ type: 'boolean'
690
1986
  },
691
1987
  controllerRoleArn: {
692
1988
  type: 'string',
693
- description: 'ControllerRoleArn is the AWS IAM role that Karpenter uses to manage resources.'
1989
+ pattern: '^arn:aws(-[a-z]+)*:iam::\\d{12}:role\\/[\\w+=,.@/-]+$',
1990
+ description: 'AWS IAM role ARN that Karpenter uses to manage resources. Omit when AWS is disabled.',
1991
+ example: 'arn:aws:iam::123456789012:role/Cloudfleet'
694
1992
  }
695
1993
  },
696
- required: ['controllerRoleArn'],
1994
+ required: [
1995
+ 'enabled'
1996
+ ],
697
1997
  additionalProperties: false
1998
+ },
1999
+ constraints: {
2000
+ type: 'object',
2001
+ properties: {
2002
+ 'karpenter.sh/capacity-type': {
2003
+ type: 'array',
2004
+ items: {
2005
+ type: 'string',
2006
+ enum: [
2007
+ 'on-demand',
2008
+ 'spot'
2009
+ ]
2010
+ },
2011
+ minItems: 1,
2012
+ description: 'Allowed values for `karpenter.sh/capacity-type`.',
2013
+ default: [
2014
+ 'on-demand',
2015
+ 'spot'
2016
+ ]
2017
+ },
2018
+ 'kubernetes.io/arch': {
2019
+ type: 'array',
2020
+ items: {
2021
+ type: 'string',
2022
+ enum: [
2023
+ 'amd64',
2024
+ 'arm64'
2025
+ ]
2026
+ },
2027
+ minItems: 1,
2028
+ description: 'Allowed values for `kubernetes.io/arch`.',
2029
+ default: [
2030
+ 'amd64'
2031
+ ]
2032
+ },
2033
+ 'cfke.io/instance-family': {
2034
+ type: 'array',
2035
+ items: {
2036
+ type: 'string',
2037
+ enum: [
2038
+ 'a1',
2039
+ 'a2',
2040
+ 'a3',
2041
+ 'a4',
2042
+ 'c1',
2043
+ 'c2',
2044
+ 'c2d',
2045
+ 'c3',
2046
+ 'c3d',
2047
+ 'c4',
2048
+ 'c4a',
2049
+ 'c4d',
2050
+ 'c5',
2051
+ 'c5a',
2052
+ 'c5ad',
2053
+ 'c5d',
2054
+ 'c5n',
2055
+ 'c6a',
2056
+ 'c6g',
2057
+ 'c6gd',
2058
+ 'c6gn',
2059
+ 'c6i',
2060
+ 'c6id',
2061
+ 'c6in',
2062
+ 'c7a',
2063
+ 'c7g',
2064
+ 'c7gd',
2065
+ 'c7gn',
2066
+ 'c7i',
2067
+ 'c7i-flex',
2068
+ 'c8g',
2069
+ 'c8gd',
2070
+ 'cax',
2071
+ 'ccx',
2072
+ 'cpx',
2073
+ 'cx',
2074
+ 'd2',
2075
+ 'd3',
2076
+ 'd3en',
2077
+ 'dl1',
2078
+ 'dl2q',
2079
+ 'e2',
2080
+ 'f1',
2081
+ 'f2',
2082
+ 'g1',
2083
+ 'g2',
2084
+ 'g4ad',
2085
+ 'g4dn',
2086
+ 'g5',
2087
+ 'g5g',
2088
+ 'g6',
2089
+ 'g6e',
2090
+ 'gr6',
2091
+ 'h1',
2092
+ 'h3',
2093
+ 'hpc6a',
2094
+ 'hpc6id',
2095
+ 'hpc7a',
2096
+ 'hpc7g',
2097
+ 'i2',
2098
+ 'i3',
2099
+ 'i3en',
2100
+ 'i4g',
2101
+ 'i4i',
2102
+ 'i7i',
2103
+ 'i7ie',
2104
+ 'i8g',
2105
+ 'im4gn',
2106
+ 'inf1',
2107
+ 'inf2',
2108
+ 'is4gen',
2109
+ 'm1',
2110
+ 'm2',
2111
+ 'm3',
2112
+ 'm4',
2113
+ 'm5',
2114
+ 'm5a',
2115
+ 'm5ad',
2116
+ 'm5d',
2117
+ 'm5dn',
2118
+ 'm5n',
2119
+ 'm5zn',
2120
+ 'm6a',
2121
+ 'm6g',
2122
+ 'm6gd',
2123
+ 'm6i',
2124
+ 'm6id',
2125
+ 'm6idn',
2126
+ 'm6in',
2127
+ 'm7a',
2128
+ 'm7g',
2129
+ 'm7gd',
2130
+ 'm7i',
2131
+ 'm7i-flex',
2132
+ 'm8g',
2133
+ 'm8gd',
2134
+ 'n1',
2135
+ 'n2',
2136
+ 'n2d',
2137
+ 'n4',
2138
+ 'p3',
2139
+ 'p3dn',
2140
+ 'p4d',
2141
+ 'p4de',
2142
+ 'p5',
2143
+ 'p5e',
2144
+ 'p5en',
2145
+ 'p6-b200',
2146
+ 'r3',
2147
+ 'r4',
2148
+ 'r5',
2149
+ 'r5a',
2150
+ 'r5ad',
2151
+ 'r5b',
2152
+ 'r5d',
2153
+ 'r5dn',
2154
+ 'r5n',
2155
+ 'r6a',
2156
+ 'r6g',
2157
+ 'r6gd',
2158
+ 'r6i',
2159
+ 'r6id',
2160
+ 'r6idn',
2161
+ 'r6in',
2162
+ 'r7a',
2163
+ 'r7g',
2164
+ 'r7gd',
2165
+ 'r7i',
2166
+ 'r7iz',
2167
+ 'r8g',
2168
+ 'r8gd',
2169
+ 't2',
2170
+ 't2a',
2171
+ 't2d',
2172
+ 't3',
2173
+ 't3a',
2174
+ 't4g',
2175
+ 'trn1',
2176
+ 'trn1n',
2177
+ 'u-3tb1',
2178
+ 'u-6tb1',
2179
+ 'u7i-12tb',
2180
+ 'u7i-6tb',
2181
+ 'u7i-8tb',
2182
+ 'u7in-16tb',
2183
+ 'u7in-24tb',
2184
+ 'u7in-32tb',
2185
+ 'vt1',
2186
+ 'x1',
2187
+ 'x1e',
2188
+ 'x2gd',
2189
+ 'x2idn',
2190
+ 'x2iedn',
2191
+ 'x2iezn',
2192
+ 'x4',
2193
+ 'x8g',
2194
+ 'z1d',
2195
+ 'z3'
2196
+ ]
2197
+ },
2198
+ description: 'Allowed values for `cfke.io/instance-family`.',
2199
+ default: []
2200
+ },
2201
+ 'topology.kubernetes.io/region': {
2202
+ type: 'array',
2203
+ items: {
2204
+ type: 'string',
2205
+ enum: [
2206
+ 'africa-south1',
2207
+ 'ap-northeast-1',
2208
+ 'ap-northeast-2',
2209
+ 'ap-northeast-3',
2210
+ 'ap-south-1',
2211
+ 'ap-southeast-1',
2212
+ 'ap-southeast-2',
2213
+ 'ash',
2214
+ 'asia-east1',
2215
+ 'asia-east2',
2216
+ 'asia-northeast1',
2217
+ 'asia-northeast2',
2218
+ 'asia-northeast3',
2219
+ 'asia-south1',
2220
+ 'asia-south2',
2221
+ 'asia-southeast1',
2222
+ 'asia-southeast2',
2223
+ 'australia-southeast1',
2224
+ 'australia-southeast2',
2225
+ 'ca-central-1',
2226
+ 'eu-central-1',
2227
+ 'eu-central-2',
2228
+ 'eu-north-1',
2229
+ 'eu-west-1',
2230
+ 'eu-west-2',
2231
+ 'eu-west-3',
2232
+ 'europe-central2',
2233
+ 'europe-north1',
2234
+ 'europe-southwest1',
2235
+ 'europe-west1',
2236
+ 'europe-west10',
2237
+ 'europe-west12',
2238
+ 'europe-west2',
2239
+ 'europe-west3',
2240
+ 'europe-west4',
2241
+ 'europe-west6',
2242
+ 'europe-west8',
2243
+ 'europe-west9',
2244
+ 'fsn1',
2245
+ 'hel1',
2246
+ 'hil',
2247
+ 'me-central1',
2248
+ 'me-central2',
2249
+ 'me-west1',
2250
+ 'nbg1',
2251
+ 'northamerica-northeast1',
2252
+ 'northamerica-northeast2',
2253
+ 'sa-east-1',
2254
+ 'sin',
2255
+ 'southamerica-east1',
2256
+ 'southamerica-west1',
2257
+ 'us-central1',
2258
+ 'us-east-1',
2259
+ 'us-east-2',
2260
+ 'us-east1',
2261
+ 'us-east4',
2262
+ 'us-east5',
2263
+ 'us-south1',
2264
+ 'us-west-1',
2265
+ 'us-west-2',
2266
+ 'us-west1',
2267
+ 'us-west2',
2268
+ 'us-west3',
2269
+ 'us-west4'
2270
+ ]
2271
+ },
2272
+ description: 'Allowed values for `topology.kubernetes.io/region`.',
2273
+ default: []
2274
+ }
2275
+ },
2276
+ additionalProperties: false,
2277
+ 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.',
2278
+ default: {
2279
+ 'karpenter.sh/capacity-type': [
2280
+ 'on-demand',
2281
+ 'spot'
2282
+ ],
2283
+ 'kubernetes.io/arch': [
2284
+ 'amd64'
2285
+ ],
2286
+ 'cfke.io/instance-family': [],
2287
+ 'topology.kubernetes.io/region': []
2288
+ }
2289
+ },
2290
+ scalingProfile: {
2291
+ type: 'string',
2292
+ 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`).',
2293
+ default: 'conservative',
2294
+ example: 'conservative',
2295
+ enum: [
2296
+ 'aggressive',
2297
+ 'conservative'
2298
+ ]
2299
+ },
2300
+ taints: {
2301
+ type: 'array',
2302
+ items: {
2303
+ type: 'object',
2304
+ properties: {
2305
+ key: {
2306
+ type: 'string',
2307
+ 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.',
2308
+ example: 'dedicated'
2309
+ },
2310
+ value: {
2311
+ type: 'string',
2312
+ maxLength: 63,
2313
+ pattern: '^([A-Za-z0-9]([-A-Za-z0-9_.]*[A-Za-z0-9])?)?$',
2314
+ description: 'Taint value. Optional.',
2315
+ example: 'ci'
2316
+ },
2317
+ effect: {
2318
+ type: 'string',
2319
+ description: 'Taint effect.',
2320
+ example: 'NoSchedule',
2321
+ enum: [
2322
+ 'NoSchedule',
2323
+ 'PreferNoSchedule',
2324
+ 'NoExecute'
2325
+ ]
2326
+ }
2327
+ },
2328
+ required: [
2329
+ 'key',
2330
+ 'effect'
2331
+ ],
2332
+ additionalProperties: false
2333
+ },
2334
+ maxItems: 50,
2335
+ 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.',
2336
+ default: []
2337
+ }
2338
+ },
2339
+ additionalProperties: false,
2340
+ description: 'Mutable fleet configuration. Applied as a full overwrite: any omitted field is reset to its default rather than left unchanged.'
2341
+ };
2342
+ export const InviteCreateInputSchema = {
2343
+ type: 'object',
2344
+ properties: {
2345
+ email: {
2346
+ type: 'string',
2347
+ format: 'email',
2348
+ description: 'Email address of the user to invite.',
2349
+ example: 'email@example.com'
2350
+ },
2351
+ role: {
2352
+ type: 'string',
2353
+ description: 'Role the invited user will be assigned on redemption. Can be \'Administrator\' or \'User\'.',
2354
+ default: 'User',
2355
+ example: 'User',
2356
+ enum: [
2357
+ 'Administrator',
2358
+ 'User'
2359
+ ]
698
2360
  }
699
2361
  },
2362
+ required: [
2363
+ 'email'
2364
+ ],
700
2365
  additionalProperties: false
701
2366
  };
702
2367
  export const InviteSchema = {
@@ -729,9 +2394,185 @@ export const InviteSchema = {
729
2394
  type: 'string',
730
2395
  description: 'Generated unique invite code.',
731
2396
  example: '7kUZnH7nnKUFfvc4NK2KQF'
2397
+ },
2398
+ role: {
2399
+ type: 'string',
2400
+ description: 'Role the invited user will be assigned on redemption. Can be \'Administrator\' or \'User\'.',
2401
+ default: 'User',
2402
+ example: 'User',
2403
+ enum: [
2404
+ 'Administrator',
2405
+ 'User'
2406
+ ]
2407
+ }
2408
+ },
2409
+ required: [
2410
+ 'date_created'
2411
+ ],
2412
+ additionalProperties: false
2413
+ };
2414
+ export const InvoicePaymentAttemptSchema = {
2415
+ type: 'object',
2416
+ properties: {
2417
+ invoice_id: {
2418
+ type: 'string',
2419
+ description: 'Identifier of the invoice.',
2420
+ example: 'in_1234567890xCrwxghOTj1234'
2421
+ },
2422
+ number: {
2423
+ type: 'string',
2424
+ nullable: true,
2425
+ description: 'Invoice number. Null if the invoice has no number.',
2426
+ example: 'CF-0042'
2427
+ },
2428
+ amount: {
2429
+ type: 'number',
2430
+ format: 'float',
2431
+ description: 'Amount outstanding when the charge was attempted, in the smallest currency unit.',
2432
+ example: 4200
2433
+ },
2434
+ currency: {
2435
+ type: 'string',
2436
+ description: 'Currency of the invoice.',
2437
+ example: 'eur'
2438
+ },
2439
+ status: {
2440
+ type: 'string',
2441
+ description: 'Outcome for this invoice: `paid`, `processing` (accepted, not yet settled), `requires_action` (awaiting customer authentication), or `failed` (declined).',
2442
+ example: 'paid',
2443
+ enum: [
2444
+ 'paid',
2445
+ 'processing',
2446
+ 'requires_action',
2447
+ 'failed'
2448
+ ]
2449
+ },
2450
+ client_secret: {
2451
+ type: 'string',
2452
+ nullable: true,
2453
+ description: 'Client secret used to complete customer authentication. Set only when `status` is `requires_action`.',
2454
+ example: 'pi_3MtwBwLkdIwHu7ix28a3tqPa_secret_YrKJUKribcBjcG8HVhfZluoGH'
2455
+ },
2456
+ failure_code: {
2457
+ type: 'string',
2458
+ nullable: true,
2459
+ description: 'Decline code. Set only when `status` is `failed`.',
2460
+ example: 'insufficient_funds'
2461
+ },
2462
+ failure_message: {
2463
+ type: 'string',
2464
+ nullable: true,
2465
+ description: 'Explanation of the decline, suitable for display. Set only when `status` is `failed`.',
2466
+ example: 'Your card has insufficient funds.'
2467
+ }
2468
+ },
2469
+ required: [
2470
+ 'invoice_id',
2471
+ 'number',
2472
+ 'amount',
2473
+ 'currency',
2474
+ 'status',
2475
+ 'client_secret',
2476
+ 'failure_code',
2477
+ 'failure_message'
2478
+ ],
2479
+ additionalProperties: false
2480
+ };
2481
+ export const InvoicePaymentResultSchema = {
2482
+ type: 'object',
2483
+ properties: {
2484
+ code: {
2485
+ type: 'string',
2486
+ 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).',
2487
+ example: 'partially_paid',
2488
+ enum: [
2489
+ 'paid',
2490
+ 'processing',
2491
+ 'action_required',
2492
+ 'partially_paid',
2493
+ 'failed',
2494
+ 'nothing_due',
2495
+ 'bank_transfer_due'
2496
+ ]
2497
+ },
2498
+ message: {
2499
+ type: 'string',
2500
+ description: 'Summary of the outcome, suitable for display.',
2501
+ example: '1 of 2 open invoices was paid. Invoice CF-0043 was declined: Your card has insufficient funds.'
2502
+ },
2503
+ results: {
2504
+ type: 'array',
2505
+ items: {
2506
+ type: 'object',
2507
+ properties: {
2508
+ invoice_id: {
2509
+ type: 'string',
2510
+ description: 'Identifier of the invoice.',
2511
+ example: 'in_1234567890xCrwxghOTj1234'
2512
+ },
2513
+ number: {
2514
+ type: 'string',
2515
+ description: 'Invoice number. Null if the invoice has no number.',
2516
+ example: 'CF-0042'
2517
+ },
2518
+ amount: {
2519
+ type: 'number',
2520
+ format: 'float',
2521
+ description: 'Amount outstanding when the charge was attempted, in the smallest currency unit.',
2522
+ example: 4200
2523
+ },
2524
+ currency: {
2525
+ type: 'string',
2526
+ description: 'Currency of the invoice.',
2527
+ example: 'eur'
2528
+ },
2529
+ status: {
2530
+ type: 'string',
2531
+ description: 'Outcome for this invoice: `paid`, `processing` (accepted, not yet settled), `requires_action` (awaiting customer authentication), or `failed` (declined).',
2532
+ example: 'paid',
2533
+ enum: [
2534
+ 'paid',
2535
+ 'processing',
2536
+ 'requires_action',
2537
+ 'failed'
2538
+ ]
2539
+ },
2540
+ client_secret: {
2541
+ type: 'string',
2542
+ description: 'Client secret used to complete customer authentication. Set only when `status` is `requires_action`.',
2543
+ example: 'pi_3MtwBwLkdIwHu7ix28a3tqPa_secret_YrKJUKribcBjcG8HVhfZluoGH'
2544
+ },
2545
+ failure_code: {
2546
+ type: 'string',
2547
+ description: 'Decline code. Set only when `status` is `failed`.',
2548
+ example: 'insufficient_funds'
2549
+ },
2550
+ failure_message: {
2551
+ type: 'string',
2552
+ description: 'Explanation of the decline, suitable for display. Set only when `status` is `failed`.',
2553
+ example: 'Your card has insufficient funds.'
2554
+ }
2555
+ },
2556
+ required: [
2557
+ 'invoice_id',
2558
+ 'number',
2559
+ 'amount',
2560
+ 'currency',
2561
+ 'status',
2562
+ 'client_secret',
2563
+ 'failure_code',
2564
+ 'failure_message'
2565
+ ],
2566
+ additionalProperties: false
2567
+ },
2568
+ description: 'One entry per invoice charged, oldest first.'
732
2569
  }
733
2570
  },
734
- required: ['date_created'],
2571
+ required: [
2572
+ 'code',
2573
+ 'message',
2574
+ 'results'
2575
+ ],
735
2576
  additionalProperties: false
736
2577
  };
737
2578
  export const InvoiceSchema = {
@@ -739,9 +2580,8 @@ export const InvoiceSchema = {
739
2580
  properties: {
740
2581
  id: {
741
2582
  type: 'string',
742
- format: 'uuid',
743
- description: 'Unique identifier of the invoice. UUID v4 string in canonical form',
744
- example: '415026b6-f00f-44f8-968d-fc6ef4d0fc6d'
2583
+ description: 'Unique identifier of the invoice.',
2584
+ example: 'in_1234567890xCrwxghOTj1234'
745
2585
  },
746
2586
  number: {
747
2587
  type: 'string'
@@ -784,95 +2624,179 @@ export const InvoiceSchema = {
784
2624
  type: 'string'
785
2625
  }
786
2626
  },
787
- required: ['created', 'period_start', 'period_end'],
2627
+ required: [
2628
+ 'created',
2629
+ 'period_start',
2630
+ 'period_end'
2631
+ ],
788
2632
  additionalProperties: false
789
2633
  };
790
- export const MarketplaceListingSchema = {
2634
+ export const MarketplaceListingFilesSchema = {
791
2635
  type: 'object',
792
2636
  properties: {
793
- id: {
2637
+ chartYaml: {
794
2638
  type: 'string',
795
- maxLength: 63,
796
- minLength: 1,
797
- pattern: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$',
798
- description: 'Id of the chart listing',
799
- example: 'portworx-enterprise-disaster-recovery-baremetal'
2639
+ description: 'Raw Chart.yaml content from the Helm chart',
2640
+ example: 'apiVersion: v2\nname: nginx-ingress\nversion: 1.18.2-cfke.45\nappVersion: 1.9.4'
800
2641
  },
801
- name: {
802
- type: 'string',
803
- description: 'Name of the chart listing',
804
- example: 'Portworx Enterprise + Disaster Recovery - Baremetal'
805
- },
806
- developer: {
807
- type: 'string',
808
- description: 'Author of the chart listing',
809
- example: 'Portworx'
810
- },
811
- description: {
2642
+ valuesYaml: {
812
2643
  type: 'string',
813
- description: 'Short description of the chart listing',
814
- example: 'Run Kubernetes with unmatched scalability, availability, and self-service access to any storage'
2644
+ description: 'Raw values.yaml content from the Helm chart',
2645
+ example: 'replicaCount: 1\nimage:\n repository: nginx\n tag: latest'
815
2646
  },
816
- logoUrl: {
2647
+ valuesSchemaJson: {
817
2648
  type: 'string',
818
- description: 'Logo of the chart listing',
819
- example: 'https://portworx.com/wp-content/themes/portworx/assets/images/header/portworx-logo.png'
820
- },
821
- longDescription: {
2649
+ description: 'JSON schema for values.yaml as a string',
2650
+ example: '{"type":"object","properties":{"replicaCount":{"type":"number"}}}'
2651
+ }
2652
+ },
2653
+ additionalProperties: false
2654
+ };
2655
+ export const MarketplaceListingSchema = {
2656
+ type: 'object',
2657
+ properties: {
2658
+ name: {
822
2659
  type: 'string',
823
- description: 'Long description of the chart listing',
824
- example: 'Portworx-Enterprise is the complete multi-cloud ready Kubernetes storage platform for running mission-critical apps in production....'
2660
+ description: 'Name of the chart',
2661
+ example: 'nginx-ingress'
825
2662
  },
826
- categories: {
2663
+ versions: {
827
2664
  type: 'array',
828
2665
  items: {
829
2666
  type: 'string',
830
- example: 'AI & Machine Learning'
2667
+ pattern: '^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(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-]+)*))?$',
2668
+ description: 'Specific version of the chart',
2669
+ example: '1.18.2-cfke.45'
831
2670
  },
832
- description: 'Tags of the chart'
2671
+ description: 'Available versions of the chart'
833
2672
  },
834
2673
  version_channels: {
835
2674
  type: 'array',
836
2675
  items: {
837
2676
  type: 'string',
838
2677
  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-]+)*))?$',
839
- description: 'Version of the chart.',
840
- example: '2.x.x-cfke.x'
841
- }
2678
+ description: 'Version channel pattern',
2679
+ example: '1.18.x-cfke.x'
2680
+ },
2681
+ description: 'Version channels for the chart'
842
2682
  },
843
- value_schemas: {
844
- type: 'array',
845
- items: {
846
- type: 'object',
847
- properties: {
848
- version: {
849
- type: 'string',
850
- 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-]+)*))?$',
851
- description: 'Version of the chart.',
852
- example: '2.1.1-cfke.123'
2683
+ latestVersion: {
2684
+ type: 'string',
2685
+ description: 'Latest version of the chart',
2686
+ example: '1.18.2-cfke.45'
2687
+ },
2688
+ metadata: {
2689
+ type: 'object',
2690
+ properties: {
2691
+ name: {
2692
+ type: 'string',
2693
+ description: 'Chart name from metadata',
2694
+ example: 'nginx-ingress'
2695
+ },
2696
+ version: {
2697
+ type: 'string',
2698
+ description: 'Chart version from metadata',
2699
+ example: '1.18.2-cfke.45'
2700
+ },
2701
+ description: {
2702
+ type: 'string',
2703
+ description: 'Chart description',
2704
+ example: 'NGINX Ingress Controller for Kubernetes'
2705
+ },
2706
+ appVersion: {
2707
+ type: 'string',
2708
+ description: 'Application version',
2709
+ example: '1.9.4'
2710
+ },
2711
+ apiVersion: {
2712
+ type: 'string',
2713
+ description: 'Helm API version',
2714
+ example: 'v2'
2715
+ },
2716
+ keywords: {
2717
+ type: 'array',
2718
+ items: {
2719
+ type: 'string'
853
2720
  },
854
- schema: {
855
- type: 'string',
856
- description: 'Schema of the chart values. JSON Schema as string'
2721
+ description: 'Chart keywords',
2722
+ example: [
2723
+ 'ingress',
2724
+ 'nginx',
2725
+ 'load-balancer'
2726
+ ]
2727
+ },
2728
+ home: {
2729
+ type: 'string',
2730
+ description: 'Chart home URL',
2731
+ example: 'https://kubernetes.github.io/ingress-nginx/'
2732
+ },
2733
+ icon: {
2734
+ type: 'string',
2735
+ description: 'A URL to an SVG or PNG image to be used as an icon',
2736
+ example: 'https://cloudfleet.ai/images/marketplace/icons/ingress-nginx.png'
2737
+ },
2738
+ sources: {
2739
+ type: 'array',
2740
+ items: {
2741
+ type: 'string'
857
2742
  },
858
- placeholder: {
859
- type: 'string',
860
- description: 'Schema of the chart values',
861
- example: `foo: 1
862
- bar: example`
863
- }
2743
+ description: 'Chart source URLs',
2744
+ example: [
2745
+ 'https://github.com/kubernetes/ingress-nginx'
2746
+ ]
864
2747
  },
865
- required: ['version', 'schema', 'placeholder'],
866
- additionalProperties: false
867
- }
2748
+ maintainers: {
2749
+ type: 'array',
2750
+ items: {
2751
+ type: 'object',
2752
+ properties: {
2753
+ name: {
2754
+ type: 'string',
2755
+ description: 'Maintainer name',
2756
+ example: 'NGINX Team'
2757
+ },
2758
+ email: {
2759
+ type: 'string',
2760
+ description: 'Maintainer email',
2761
+ example: 'support@nginx.org'
2762
+ }
2763
+ },
2764
+ required: [
2765
+ 'name'
2766
+ ],
2767
+ additionalProperties: false
2768
+ },
2769
+ description: 'Chart maintainers'
2770
+ }
2771
+ },
2772
+ required: [
2773
+ 'name',
2774
+ 'version'
2775
+ ],
2776
+ additionalProperties: false,
2777
+ description: 'Chart metadata'
868
2778
  }
869
2779
  },
870
- required: ['id', 'name', 'developer', 'description', 'logoUrl', 'longDescription', 'categories', 'version_channels', 'value_schemas'],
2780
+ required: [
2781
+ 'name',
2782
+ 'versions',
2783
+ 'version_channels',
2784
+ 'latestVersion'
2785
+ ],
871
2786
  additionalProperties: false
872
2787
  };
873
2788
  export const OrganizationCreateInputSchema = {
874
2789
  type: 'object',
875
2790
  properties: {
2791
+ type: {
2792
+ type: 'string',
2793
+ description: 'Type of the organization. `business` for legal entities, `personal` for individuals.',
2794
+ example: 'business',
2795
+ enum: [
2796
+ 'business',
2797
+ 'personal'
2798
+ ]
2799
+ },
876
2800
  email: {
877
2801
  type: 'string',
878
2802
  format: 'email',
@@ -881,11 +2805,13 @@ export const OrganizationCreateInputSchema = {
881
2805
  },
882
2806
  first_name: {
883
2807
  type: 'string',
2808
+ minLength: 1,
884
2809
  description: 'First name of the billing contact person.',
885
2810
  example: 'John'
886
2811
  },
887
2812
  last_name: {
888
2813
  type: 'string',
2814
+ minLength: 1,
889
2815
  description: 'Last name of the billing contact person.',
890
2816
  example: 'Doe'
891
2817
  },
@@ -903,7 +2829,28 @@ export const OrganizationCreateInputSchema = {
903
2829
  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.'
904
2830
  }
905
2831
  },
906
- required: ['email', 'first_name', 'last_name', 'company_name', 'password'],
2832
+ required: [
2833
+ 'type',
2834
+ 'email',
2835
+ 'first_name',
2836
+ 'last_name',
2837
+ 'company_name',
2838
+ 'password'
2839
+ ],
2840
+ additionalProperties: false
2841
+ };
2842
+ export const OrganizationCreateOutputSchema = {
2843
+ type: 'object',
2844
+ properties: {
2845
+ id: {
2846
+ type: 'string',
2847
+ description: 'Unique identifier of the newly created organization. Generated by the API and safe to use for client-side tracking immediately.',
2848
+ example: 'organization-id'
2849
+ }
2850
+ },
2851
+ required: [
2852
+ 'id'
2853
+ ],
907
2854
  additionalProperties: false
908
2855
  };
909
2856
  export const OrganizationSchema = {
@@ -922,6 +2869,15 @@ export const OrganizationSchema = {
922
2869
  description: 'Name of the legal entity. This name will be used in invoices. Use your first and last name for individual accounts.',
923
2870
  example: 'ACME Corp.'
924
2871
  },
2872
+ type: {
2873
+ type: 'string',
2874
+ description: 'Type of the organization. `business` for legal entities, `personal` for individuals.',
2875
+ example: 'business',
2876
+ enum: [
2877
+ 'business',
2878
+ 'personal'
2879
+ ]
2880
+ },
925
2881
  date_created: {
926
2882
  type: 'string',
927
2883
  format: 'date-time',
@@ -953,6 +2909,17 @@ export const OrganizationSchema = {
953
2909
  description: 'Available number of Pro clusters that can be created.',
954
2910
  example: 999
955
2911
  },
2912
+ enterprise_clusters_max: {
2913
+ type: 'integer',
2914
+ minimum: 0,
2915
+ description: 'Maximum number of Enterprise clusters that can be created.',
2916
+ example: 999
2917
+ },
2918
+ enterprise_clusters_available: {
2919
+ type: 'integer',
2920
+ description: 'Available number of Enterprise clusters that can be created.',
2921
+ example: 999
2922
+ },
956
2923
  fleets_max: {
957
2924
  type: 'integer',
958
2925
  minimum: 0,
@@ -972,7 +2939,7 @@ export const OrganizationSchema = {
972
2939
  type: 'array',
973
2940
  items: {
974
2941
  type: 'string',
975
- example: 'northamerica-central-1'
2942
+ example: 'northamerica-central-1a'
976
2943
  },
977
2944
  minItems: 1,
978
2945
  description: 'List of Cloudfleet control plane regions available for the organization.'
@@ -993,24 +2960,66 @@ export const OrganizationSchema = {
993
2960
  example: '1.33.x (Always latest 1.33 patch version)'
994
2961
  }
995
2962
  },
996
- required: ['id', 'label'],
2963
+ required: [
2964
+ 'id',
2965
+ 'label'
2966
+ ],
997
2967
  additionalProperties: false
998
2968
  },
999
2969
  minItems: 1,
1000
2970
  description: 'List of CFKE control plane versions available for the organization.'
2971
+ },
2972
+ cfcr_storage_gb: {
2973
+ type: 'integer',
2974
+ minimum: -1,
2975
+ description: 'Organization-level maximum CFCR storage volume in GB. -1 means no limit.',
2976
+ example: 500
1001
2977
  }
1002
2978
  },
1003
- required: ['basic_clusters_max', 'basic_clusters_available', 'pro_clusters_max', 'pro_clusters_available', 'fleets_max', 'cluster_tiers', 'regions', 'versions'],
2979
+ required: [
2980
+ 'basic_clusters_max',
2981
+ 'basic_clusters_available',
2982
+ 'pro_clusters_max',
2983
+ 'pro_clusters_available',
2984
+ 'enterprise_clusters_max',
2985
+ 'enterprise_clusters_available',
2986
+ 'fleets_max',
2987
+ 'cluster_tiers',
2988
+ 'regions',
2989
+ 'versions',
2990
+ 'cfcr_storage_gb'
2991
+ ],
1004
2992
  additionalProperties: false,
1005
2993
  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.'
1006
2994
  },
1007
2995
  status: {
1008
2996
  type: 'string',
1009
2997
  description: 'Status of the organization. Can be `active` or `closed`, or `suspended`.',
1010
- enum: ['active', 'closed', 'suspended']
2998
+ enum: [
2999
+ 'active',
3000
+ 'closed',
3001
+ 'suspended'
3002
+ ]
3003
+ },
3004
+ verification: {
3005
+ type: 'string',
3006
+ 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.',
3007
+ example: 'verified',
3008
+ enum: [
3009
+ 'none',
3010
+ 'submitted',
3011
+ 'verified'
3012
+ ]
1011
3013
  }
1012
3014
  },
1013
- required: ['id', 'date_created', 'quota', 'status'],
3015
+ required: [
3016
+ 'id',
3017
+ 'type',
3018
+ 'date_created',
3019
+ 'quota',
3020
+ 'status',
3021
+ 'verification'
3022
+ ],
1014
3023
  additionalProperties: false
1015
3024
  };
1016
3025
  export const PaymentMethodSchema = {
@@ -1018,26 +3027,23 @@ export const PaymentMethodSchema = {
1018
3027
  properties: {
1019
3028
  id: {
1020
3029
  type: 'string',
1021
- format: 'uuid',
1022
- description: 'Unique identifier of the organization. UUID v4 string in canonical form.',
1023
- example: 'e94d30ec-a2dd-4dcb-832c-ac2be144ba91'
1024
- },
1025
- setup: {
1026
- type: 'boolean',
1027
- description: 'Whether organization payment method was set up and ready to use for payments.',
1028
- example: true
3030
+ 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.',
3031
+ example: 'pm_1MtwBwLkdIwHu7ix28a3tqPa'
1029
3032
  },
1030
3033
  type: {
1031
3034
  type: 'string',
1032
- nullable: true,
1033
- description: 'Payment method type type. Only `card` payments supported at the moment.',
3035
+ description: 'Payment method type. `card`, `sepa_debit` for SEPA Direct Debit (business accounts only), or `bank_transfer` for paying invoices by bank transfer.',
1034
3036
  example: 'card',
1035
- enum: ['card']
3037
+ enum: [
3038
+ 'card',
3039
+ 'sepa_debit',
3040
+ 'bank_transfer'
3041
+ ]
1036
3042
  },
1037
3043
  last4: {
1038
3044
  type: 'string',
1039
3045
  nullable: true,
1040
- description: 'Last 4 digits of the payment card number.',
3046
+ 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.',
1041
3047
  example: '4242'
1042
3048
  },
1043
3049
  exp_month: {
@@ -1045,25 +3051,57 @@ export const PaymentMethodSchema = {
1045
3051
  minimum: 1,
1046
3052
  maximum: 12,
1047
3053
  nullable: true,
1048
- description: "Two-digit number representing the card's expiration month.",
1049
- example: '12'
3054
+ description: 'Two-digit number representing the card\'s expiration month. Null for SEPA Direct Debit and bank transfer.',
3055
+ example: 12
1050
3056
  },
1051
3057
  exp_year: {
1052
3058
  type: 'integer',
1053
- minimum: 2024,
1054
3059
  nullable: true,
1055
- description: "Four-digit number representing the card's expiration year.",
1056
- example: '2028'
3060
+ 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.',
3061
+ example: 2028
1057
3062
  },
1058
3063
  brand: {
1059
3064
  type: 'string',
1060
3065
  nullable: true,
1061
- description: 'Payment card brand. Can be `amex`, `diners`, `discover`, `eftpos_au`, `jcb`, `mastercard`, `unionpay`, `visa`, or `unknown`.',
1062
- example: 'visa',
1063
- enum: ['amex', 'diners', 'discover', 'eftpos_au', 'jcb', 'mastercard', 'unionpay', 'visa', 'unknown']
3066
+ 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.',
3067
+ example: 'visa'
3068
+ },
3069
+ iban: {
3070
+ type: 'string',
3071
+ nullable: true,
3072
+ 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.',
3073
+ example: 'DE11243015658023127510'
3074
+ },
3075
+ bic: {
3076
+ type: 'string',
3077
+ nullable: true,
3078
+ description: 'BIC/SWIFT of the destination bank for bank transfers. Set only for `bank_transfer`; null otherwise.',
3079
+ example: 'SOGEDEFFXXX'
3080
+ },
3081
+ account_holder_name: {
3082
+ type: 'string',
3083
+ nullable: true,
3084
+ description: 'Account holder name of the destination bank account for bank transfers. Set only for `bank_transfer`; null otherwise.',
3085
+ example: 'Cloudfleet GmbH'
3086
+ },
3087
+ is_default: {
3088
+ type: 'boolean',
3089
+ 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).',
3090
+ example: true
1064
3091
  }
1065
3092
  },
1066
- required: ['id', 'setup', 'type', 'last4', 'exp_month', 'exp_year', 'brand'],
3093
+ required: [
3094
+ 'id',
3095
+ 'type',
3096
+ 'last4',
3097
+ 'exp_month',
3098
+ 'exp_year',
3099
+ 'brand',
3100
+ 'iban',
3101
+ 'bic',
3102
+ 'account_holder_name',
3103
+ 'is_default'
3104
+ ],
1067
3105
  additionalProperties: false
1068
3106
  };
1069
3107
  export const PlatformQuotaSchema = {
@@ -1091,6 +3129,17 @@ export const PlatformQuotaSchema = {
1091
3129
  description: 'Available number of Pro clusters that can be created.',
1092
3130
  example: 999
1093
3131
  },
3132
+ enterprise_clusters_max: {
3133
+ type: 'integer',
3134
+ minimum: 0,
3135
+ description: 'Maximum number of Enterprise clusters that can be created.',
3136
+ example: 999
3137
+ },
3138
+ enterprise_clusters_available: {
3139
+ type: 'integer',
3140
+ description: 'Available number of Enterprise clusters that can be created.',
3141
+ example: 999
3142
+ },
1094
3143
  fleets_max: {
1095
3144
  type: 'integer',
1096
3145
  minimum: 0,
@@ -1110,7 +3159,7 @@ export const PlatformQuotaSchema = {
1110
3159
  type: 'array',
1111
3160
  items: {
1112
3161
  type: 'string',
1113
- example: 'northamerica-central-1'
3162
+ example: 'northamerica-central-1a'
1114
3163
  },
1115
3164
  minItems: 1,
1116
3165
  description: 'List of Cloudfleet control plane regions available for the organization.'
@@ -1131,14 +3180,35 @@ export const PlatformQuotaSchema = {
1131
3180
  example: '1.33.x (Always latest 1.33 patch version)'
1132
3181
  }
1133
3182
  },
1134
- required: ['id', 'label'],
3183
+ required: [
3184
+ 'id',
3185
+ 'label'
3186
+ ],
1135
3187
  additionalProperties: false
1136
3188
  },
1137
3189
  minItems: 1,
1138
3190
  description: 'List of CFKE control plane versions available for the organization.'
3191
+ },
3192
+ cfcr_storage_gb: {
3193
+ type: 'integer',
3194
+ minimum: -1,
3195
+ description: 'Organization-level maximum CFCR storage volume in GB. -1 means no limit.',
3196
+ example: 500
1139
3197
  }
1140
3198
  },
1141
- required: ['basic_clusters_max', 'basic_clusters_available', 'pro_clusters_max', 'pro_clusters_available', 'fleets_max', 'cluster_tiers', 'regions', 'versions'],
3199
+ required: [
3200
+ 'basic_clusters_max',
3201
+ 'basic_clusters_available',
3202
+ 'pro_clusters_max',
3203
+ 'pro_clusters_available',
3204
+ 'enterprise_clusters_max',
3205
+ 'enterprise_clusters_available',
3206
+ 'fleets_max',
3207
+ 'cluster_tiers',
3208
+ 'regions',
3209
+ 'versions',
3210
+ 'cfcr_storage_gb'
3211
+ ],
1142
3212
  additionalProperties: false
1143
3213
  };
1144
3214
  export const RegistryRepositorySchema = {
@@ -1157,10 +3227,14 @@ export const RegistryRepositorySchema = {
1157
3227
  uri: {
1158
3228
  type: 'string',
1159
3229
  description: 'Full URI of the repository.',
1160
- example: 'ssds123e-6651-4e5d-9c04-079f6532989b.northamerica.registry.cloudfleet.dev/v2/my-app'
3230
+ example: 'ssds123e-6651-4e5d-9c04-079f6532989b.northamerica.registry.cloudfleet.dev/my-app'
1161
3231
  }
1162
3232
  },
1163
- required: ['name', 'region', 'uri'],
3233
+ required: [
3234
+ 'name',
3235
+ 'region',
3236
+ 'uri'
3237
+ ],
1164
3238
  additionalProperties: false
1165
3239
  };
1166
3240
  export const RegistryRepositoryWithTagsSchema = {
@@ -1179,7 +3253,7 @@ export const RegistryRepositoryWithTagsSchema = {
1179
3253
  uri: {
1180
3254
  type: 'string',
1181
3255
  description: 'Full URI of the repository.',
1182
- example: 'ssds123e-6651-4e5d-9c04-079f6532989b.northamerica.registry.cloudfleet.dev/v2/my-app'
3256
+ example: 'ssds123e-6651-4e5d-9c04-079f6532989b.northamerica.registry.cloudfleet.dev/my-app'
1183
3257
  },
1184
3258
  tags: {
1185
3259
  type: 'array',
@@ -1201,9 +3275,23 @@ export const RegistryRepositoryWithTagsSchema = {
1201
3275
  type: 'string',
1202
3276
  description: 'Media type of the manifest.',
1203
3277
  example: 'application/vnd.docker.distribution.manifest.v2+json'
3278
+ },
3279
+ platforms: {
3280
+ type: 'array',
3281
+ items: {
3282
+ type: 'string'
3283
+ },
3284
+ description: 'Array of platform strings for multi-arch images (e.g., linux/amd64, linux/arm64).',
3285
+ example: [
3286
+ 'linux/amd64',
3287
+ 'linux/arm64'
3288
+ ]
1204
3289
  }
1205
3290
  },
1206
- required: ['name', 'size'],
3291
+ required: [
3292
+ 'name',
3293
+ 'size'
3294
+ ],
1207
3295
  additionalProperties: false
1208
3296
  },
1209
3297
  description: 'Array of tags in the repository.'
@@ -1215,7 +3303,13 @@ export const RegistryRepositoryWithTagsSchema = {
1215
3303
  example: 987654321
1216
3304
  }
1217
3305
  },
1218
- required: ['name', 'region', 'uri', 'tags', 'totalSize'],
3306
+ required: [
3307
+ 'name',
3308
+ 'region',
3309
+ 'uri',
3310
+ 'tags',
3311
+ 'totalSize'
3312
+ ],
1219
3313
  additionalProperties: false
1220
3314
  };
1221
3315
  export const RegistryTagSchema = {
@@ -1226,6 +3320,11 @@ export const RegistryTagSchema = {
1226
3320
  description: 'Tag name.',
1227
3321
  example: 'latest'
1228
3322
  },
3323
+ digest: {
3324
+ type: 'string',
3325
+ description: 'Manifest digest for pulling by digest.',
3326
+ example: 'sha256:abcd1234ef567890abcd1234ef567890abcd1234ef567890abcd1234ef567890'
3327
+ },
1229
3328
  mediaType: {
1230
3329
  type: 'string',
1231
3330
  description: 'Media type of the manifest.',
@@ -1241,7 +3340,9 @@ export const RegistryTagSchema = {
1241
3340
  example: 1234
1242
3341
  }
1243
3342
  },
1244
- required: ['size'],
3343
+ required: [
3344
+ 'size'
3345
+ ],
1245
3346
  additionalProperties: false,
1246
3347
  description: 'Manifest config metadata.'
1247
3348
  },
@@ -1250,6 +3351,11 @@ export const RegistryTagSchema = {
1250
3351
  items: {
1251
3352
  type: 'object',
1252
3353
  properties: {
3354
+ digest: {
3355
+ type: 'string',
3356
+ description: 'Digest of the layer.',
3357
+ example: 'sha256:abcd1234ef567890abcd1234ef567890abcd1234ef567890abcd1234ef567890'
3358
+ },
1253
3359
  size: {
1254
3360
  type: 'number',
1255
3361
  format: 'float',
@@ -1257,7 +3363,9 @@ export const RegistryTagSchema = {
1257
3363
  example: 5678
1258
3364
  }
1259
3365
  },
1260
- required: ['size'],
3366
+ required: [
3367
+ 'size'
3368
+ ],
1261
3369
  additionalProperties: false
1262
3370
  },
1263
3371
  description: 'Array of layer metadata.'
@@ -1284,14 +3392,54 @@ export const RegistryTagSchema = {
1284
3392
  type: 'string',
1285
3393
  description: 'Operating system of the platform.',
1286
3394
  example: 'linux'
3395
+ },
3396
+ variant: {
3397
+ type: 'string',
3398
+ description: 'Variant of the platform (e.g., v7, v8 for ARM).',
3399
+ example: 'v8'
1287
3400
  }
1288
3401
  },
1289
- required: ['architecture', 'os'],
3402
+ required: [
3403
+ 'architecture',
3404
+ 'os'
3405
+ ],
1290
3406
  additionalProperties: false,
1291
3407
  description: 'Platform information for the manifest.'
3408
+ },
3409
+ layers: {
3410
+ type: 'array',
3411
+ items: {
3412
+ type: 'object',
3413
+ properties: {
3414
+ digest: {
3415
+ type: 'string',
3416
+ description: 'Digest of the layer.',
3417
+ example: 'sha256:abcd1234ef567890abcd1234ef567890abcd1234ef567890abcd1234ef567890'
3418
+ },
3419
+ size: {
3420
+ type: 'number',
3421
+ format: 'float',
3422
+ description: 'Size of the layer in bytes.',
3423
+ example: 5678
3424
+ }
3425
+ },
3426
+ required: [
3427
+ 'size'
3428
+ ],
3429
+ additionalProperties: false
3430
+ },
3431
+ description: 'Layers for this platform.'
3432
+ },
3433
+ size: {
3434
+ type: 'number',
3435
+ format: 'float',
3436
+ description: 'Total size of this platform manifest in bytes.',
3437
+ example: 12345678
1292
3438
  }
1293
3439
  },
1294
- required: ['digest'],
3440
+ required: [
3441
+ 'digest'
3442
+ ],
1295
3443
  additionalProperties: false
1296
3444
  },
1297
3445
  description: 'Array of manifests for multi-arch images.'
@@ -1318,7 +3466,423 @@ export const RegistryTagSchema = {
1318
3466
  example: 'ssds123e-6651-4e5d-9c04-079f6532989b.northamerica.registry.cloudfleet.dev/my-app:latest'
1319
3467
  }
1320
3468
  },
1321
- required: ['name', 'size', 'region', 'repository', 'uri'],
3469
+ required: [
3470
+ 'name',
3471
+ 'digest',
3472
+ 'size',
3473
+ 'region',
3474
+ 'repository',
3475
+ 'uri'
3476
+ ],
3477
+ additionalProperties: false
3478
+ };
3479
+ export const RoadmapItemCreateInputSchema = {
3480
+ type: 'object',
3481
+ properties: {
3482
+ text: {
3483
+ type: 'string',
3484
+ maxLength: 500,
3485
+ minLength: 1,
3486
+ description: 'Your suggestion in one or two sentences. It is reviewed before it appears on the roadmap.',
3487
+ example: 'Support for ARM nodes on Hetzner.'
3488
+ }
3489
+ },
3490
+ required: [
3491
+ 'text'
3492
+ ],
3493
+ additionalProperties: false
3494
+ };
3495
+ export const RoadmapItemSchema = {
3496
+ type: 'object',
3497
+ properties: {
3498
+ id: {
3499
+ type: 'string',
3500
+ description: 'Unique identifier of the roadmap item (Mongo ObjectId).',
3501
+ example: '60c72b2f9f1b2c001f8e4d3a'
3502
+ },
3503
+ text: {
3504
+ type: 'string',
3505
+ description: 'Short description of the roadmap item.',
3506
+ example: 'Support for ARM nodes on Hetzner.'
3507
+ },
3508
+ vote: {
3509
+ type: 'integer',
3510
+ nullable: true,
3511
+ description: 'The caller\'s vote on this item: -1 (down), 1 (up), 2 (double up), or null if the caller has not voted.',
3512
+ example: 1,
3513
+ enum: [
3514
+ -1,
3515
+ 1,
3516
+ 2
3517
+ ]
3518
+ }
3519
+ },
3520
+ required: [
3521
+ 'id',
3522
+ 'text',
3523
+ 'vote'
3524
+ ],
3525
+ additionalProperties: false
3526
+ };
3527
+ export const RoadmapVoteInputSchema = {
3528
+ type: 'object',
3529
+ properties: {
3530
+ value: {
3531
+ type: 'integer',
3532
+ description: 'Vote value: -1 (down), 1 (up), or 2 (double up).',
3533
+ example: 1,
3534
+ enum: [
3535
+ -1,
3536
+ 1,
3537
+ 2
3538
+ ]
3539
+ }
3540
+ },
3541
+ required: [
3542
+ 'value'
3543
+ ],
3544
+ additionalProperties: false
3545
+ };
3546
+ export const TicketAttachmentSchema = {
3547
+ type: 'object',
3548
+ properties: {
3549
+ id: {
3550
+ type: 'string',
3551
+ description: 'Unique identifier of the attachment (Mongo ObjectId).',
3552
+ example: '60c72b2f9f1b2c001f8e4d3c'
3553
+ },
3554
+ filename: {
3555
+ type: 'string',
3556
+ description: 'Original filename as uploaded.',
3557
+ example: 'debug.log'
3558
+ },
3559
+ content_type: {
3560
+ type: 'string',
3561
+ description: 'MIME content type of the attachment.',
3562
+ example: 'text/plain'
3563
+ },
3564
+ size: {
3565
+ type: 'integer',
3566
+ description: 'Size of the attachment in bytes.',
3567
+ example: 12345
3568
+ }
3569
+ },
3570
+ required: [
3571
+ 'id',
3572
+ 'filename',
3573
+ 'content_type',
3574
+ 'size'
3575
+ ],
3576
+ additionalProperties: false
3577
+ };
3578
+ export const TicketCreateInputSchema = {
3579
+ type: 'object',
3580
+ properties: {
3581
+ category: {
3582
+ type: 'string',
3583
+ description: 'Ticket category. Drives auto-assignment and may carry a subcategory in `properties`.',
3584
+ example: 'technical',
3585
+ enum: [
3586
+ 'billing',
3587
+ 'technical',
3588
+ 'general'
3589
+ ]
3590
+ },
3591
+ body: {
3592
+ type: 'string',
3593
+ maxLength: 50000,
3594
+ minLength: 1,
3595
+ pattern: '\\S',
3596
+ description: 'Initial message body in markdown. There is no separate subject — the first message body is the description.',
3597
+ example: 'My cluster cannot reach the registry. Logs attached.'
3598
+ },
3599
+ properties: {
3600
+ type: 'object',
3601
+ additionalProperties: true,
3602
+ description: 'Free-form key/value bag set by the UI (e.g. `subcategory`, `cluster_id`, `cluster_name`, `region`).',
3603
+ example: {
3604
+ subcategory: 'cluster-question',
3605
+ cluster_id: '60c72b2f9f1b2c001f8e4d3a'
3606
+ }
3607
+ },
3608
+ grant_support_access: {
3609
+ type: 'boolean',
3610
+ 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.',
3611
+ example: true
3612
+ }
3613
+ },
3614
+ required: [
3615
+ 'category',
3616
+ 'body'
3617
+ ],
3618
+ additionalProperties: false
3619
+ };
3620
+ export const TicketMessageInputSchema = {
3621
+ type: 'object',
3622
+ properties: {
3623
+ body: {
3624
+ type: 'string',
3625
+ maxLength: 50000,
3626
+ minLength: 1,
3627
+ pattern: '\\S',
3628
+ description: 'Reply body in markdown.',
3629
+ example: 'Thanks — that resolved it on my side.'
3630
+ }
3631
+ },
3632
+ required: [
3633
+ 'body'
3634
+ ],
3635
+ additionalProperties: false
3636
+ };
3637
+ export const TicketMessageSchema = {
3638
+ type: 'object',
3639
+ properties: {
3640
+ id: {
3641
+ type: 'string',
3642
+ description: 'Unique identifier of the message (Mongo ObjectId).',
3643
+ example: '60c72b2f9f1b2c001f8e4d3b'
3644
+ },
3645
+ type: {
3646
+ type: 'string',
3647
+ description: 'Message type. Internal notes are filtered out of customer-facing responses.',
3648
+ example: 'customer_reply',
3649
+ enum: [
3650
+ 'customer_reply',
3651
+ 'agent_reply'
3652
+ ]
3653
+ },
3654
+ body: {
3655
+ type: 'string',
3656
+ description: 'Message body in markdown.',
3657
+ example: 'Thanks — that resolved it on my side.'
3658
+ },
3659
+ author_first_name: {
3660
+ type: 'string',
3661
+ nullable: true,
3662
+ description: 'First name of the author. Null when not provided.',
3663
+ example: 'Jane'
3664
+ },
3665
+ author_last_name: {
3666
+ type: 'string',
3667
+ nullable: true,
3668
+ description: 'Last name of the author. Null when not provided.',
3669
+ example: 'Doe'
3670
+ },
3671
+ attachments: {
3672
+ type: 'array',
3673
+ items: {
3674
+ type: 'object',
3675
+ properties: {
3676
+ id: {
3677
+ type: 'string',
3678
+ description: 'Unique identifier of the attachment (Mongo ObjectId).',
3679
+ example: '60c72b2f9f1b2c001f8e4d3c'
3680
+ },
3681
+ filename: {
3682
+ type: 'string',
3683
+ description: 'Original filename as uploaded.',
3684
+ example: 'debug.log'
3685
+ },
3686
+ content_type: {
3687
+ type: 'string',
3688
+ description: 'MIME content type of the attachment.',
3689
+ example: 'text/plain'
3690
+ },
3691
+ size: {
3692
+ type: 'integer',
3693
+ description: 'Size of the attachment in bytes.',
3694
+ example: 12345
3695
+ }
3696
+ },
3697
+ required: [
3698
+ 'id',
3699
+ 'filename',
3700
+ 'content_type',
3701
+ 'size'
3702
+ ],
3703
+ additionalProperties: false
3704
+ },
3705
+ description: 'Attachments associated with this message.',
3706
+ example: []
3707
+ },
3708
+ date_created: {
3709
+ type: 'string',
3710
+ format: 'date-time',
3711
+ description: 'Creation date of the message. ISO 8601 UTC.',
3712
+ example: '2026-05-11T16:08:14.338Z'
3713
+ }
3714
+ },
3715
+ required: [
3716
+ 'id',
3717
+ 'type',
3718
+ 'body',
3719
+ 'date_created'
3720
+ ],
3721
+ additionalProperties: false
3722
+ };
3723
+ export const TicketSchema = {
3724
+ type: 'object',
3725
+ properties: {
3726
+ id: {
3727
+ type: 'string',
3728
+ description: 'Unique identifier of the ticket (Mongo ObjectId).',
3729
+ example: '60c72b2f9f1b2c001f8e4d3a'
3730
+ },
3731
+ status: {
3732
+ type: 'string',
3733
+ description: 'Current state of the ticket.',
3734
+ example: 'waiting_on_us',
3735
+ enum: [
3736
+ 'waiting_on_us',
3737
+ 'waiting_on_user',
3738
+ 'closed'
3739
+ ]
3740
+ },
3741
+ category: {
3742
+ type: 'string',
3743
+ description: 'Ticket category.',
3744
+ example: 'technical',
3745
+ enum: [
3746
+ 'billing',
3747
+ 'technical',
3748
+ 'general'
3749
+ ]
3750
+ },
3751
+ summary: {
3752
+ type: 'string',
3753
+ description: 'First 128 characters of the initial message body, with markdown formatting and newlines stripped. Used for ticket list previews.',
3754
+ example: 'My cluster cannot reach the registry. Logs attached.'
3755
+ },
3756
+ support_access_granted: {
3757
+ type: 'boolean',
3758
+ description: 'Whether Cloudfleet support staff currently have access to the organization\'s resources. True once access is granted and until the ticket is closed.',
3759
+ example: true
3760
+ },
3761
+ support_access_granted_at: {
3762
+ type: 'string',
3763
+ format: 'date-time',
3764
+ nullable: true,
3765
+ description: 'When support access was granted. Null if it never was. Kept after the ticket is closed.',
3766
+ example: '2026-05-11T16:08:14.338Z'
3767
+ },
3768
+ closed_at: {
3769
+ type: 'string',
3770
+ format: 'date-time',
3771
+ nullable: true,
3772
+ description: 'Closure timestamp. Null while the ticket is open.',
3773
+ example: '2026-05-18T16:08:14.338Z'
3774
+ },
3775
+ date_created: {
3776
+ type: 'string',
3777
+ format: 'date-time',
3778
+ description: 'Creation date of the ticket. ISO 8601 UTC.',
3779
+ example: '2026-05-11T16:08:14.338Z'
3780
+ },
3781
+ date_updated: {
3782
+ type: 'string',
3783
+ format: 'date-time',
3784
+ description: 'Last update date of the ticket. ISO 8601 UTC.',
3785
+ example: '2026-05-11T16:08:14.338Z'
3786
+ },
3787
+ messages: {
3788
+ type: 'array',
3789
+ items: {
3790
+ type: 'object',
3791
+ properties: {
3792
+ id: {
3793
+ type: 'string',
3794
+ description: 'Unique identifier of the message (Mongo ObjectId).',
3795
+ example: '60c72b2f9f1b2c001f8e4d3b'
3796
+ },
3797
+ type: {
3798
+ type: 'string',
3799
+ description: 'Message type. Internal notes are filtered out of customer-facing responses.',
3800
+ example: 'customer_reply',
3801
+ enum: [
3802
+ 'customer_reply',
3803
+ 'agent_reply'
3804
+ ]
3805
+ },
3806
+ body: {
3807
+ type: 'string',
3808
+ description: 'Message body in markdown.',
3809
+ example: 'Thanks — that resolved it on my side.'
3810
+ },
3811
+ author_first_name: {
3812
+ type: 'string',
3813
+ description: 'First name of the author. Null when not provided.',
3814
+ example: 'Jane'
3815
+ },
3816
+ author_last_name: {
3817
+ type: 'string',
3818
+ description: 'Last name of the author. Null when not provided.',
3819
+ example: 'Doe'
3820
+ },
3821
+ attachments: {
3822
+ type: 'array',
3823
+ items: {
3824
+ type: 'object',
3825
+ properties: {
3826
+ id: {
3827
+ type: 'string',
3828
+ description: 'Unique identifier of the attachment (Mongo ObjectId).',
3829
+ example: '60c72b2f9f1b2c001f8e4d3c'
3830
+ },
3831
+ filename: {
3832
+ type: 'string',
3833
+ description: 'Original filename as uploaded.',
3834
+ example: 'debug.log'
3835
+ },
3836
+ content_type: {
3837
+ type: 'string',
3838
+ description: 'MIME content type of the attachment.',
3839
+ example: 'text/plain'
3840
+ },
3841
+ size: {
3842
+ type: 'integer',
3843
+ description: 'Size of the attachment in bytes.',
3844
+ example: 12345
3845
+ }
3846
+ },
3847
+ required: [
3848
+ 'id',
3849
+ 'filename',
3850
+ 'content_type',
3851
+ 'size'
3852
+ ],
3853
+ additionalProperties: false
3854
+ },
3855
+ description: 'Attachments associated with this message.',
3856
+ example: []
3857
+ },
3858
+ date_created: {
3859
+ type: 'string',
3860
+ format: 'date-time',
3861
+ description: 'Creation date of the message. ISO 8601 UTC.',
3862
+ example: '2026-05-11T16:08:14.338Z'
3863
+ }
3864
+ },
3865
+ required: [
3866
+ 'id',
3867
+ 'type',
3868
+ 'body',
3869
+ 'date_created'
3870
+ ],
3871
+ additionalProperties: false
3872
+ },
3873
+ description: 'Messages on the ticket in chronological order. Internal notes are excluded. Returned by the detail endpoint only.'
3874
+ }
3875
+ },
3876
+ required: [
3877
+ 'id',
3878
+ 'status',
3879
+ 'category',
3880
+ 'summary',
3881
+ 'support_access_granted',
3882
+ 'support_access_granted_at',
3883
+ 'date_created',
3884
+ 'date_updated'
3885
+ ],
1322
3886
  additionalProperties: false
1323
3887
  };
1324
3888
  export const TokenCreateInputSchema = {
@@ -1336,10 +3900,16 @@ export const TokenCreateInputSchema = {
1336
3900
  type: 'string',
1337
3901
  description: 'Role assumed by the token.',
1338
3902
  example: 'User',
1339
- enum: ['Administrator', 'User']
3903
+ enum: [
3904
+ 'Administrator',
3905
+ 'User'
3906
+ ]
1340
3907
  }
1341
3908
  },
1342
- required: ['name', 'role'],
3909
+ required: [
3910
+ 'name',
3911
+ 'role'
3912
+ ],
1343
3913
  additionalProperties: false
1344
3914
  };
1345
3915
  export const TokenSchema = {
@@ -1357,7 +3927,10 @@ export const TokenSchema = {
1357
3927
  type: 'string',
1358
3928
  description: 'Role assumed by the token.',
1359
3929
  example: 'User',
1360
- enum: ['Administrator', 'User']
3930
+ enum: [
3931
+ 'Administrator',
3932
+ 'User'
3933
+ ]
1361
3934
  },
1362
3935
  id: {
1363
3936
  type: 'string',
@@ -1376,7 +3949,11 @@ export const TokenSchema = {
1376
3949
  example: '2023-12-20T13:53:32.000Z'
1377
3950
  }
1378
3951
  },
1379
- required: ['name', 'role', 'date_created'],
3952
+ required: [
3953
+ 'name',
3954
+ 'role',
3955
+ 'date_created'
3956
+ ],
1380
3957
  additionalProperties: false
1381
3958
  };
1382
3959
  export const TokenUpdateInputSchema = {
@@ -1394,7 +3971,10 @@ export const TokenUpdateInputSchema = {
1394
3971
  type: 'string',
1395
3972
  description: 'Role assumed by the token.',
1396
3973
  example: 'User',
1397
- enum: ['Administrator', 'User']
3974
+ enum: [
3975
+ 'Administrator',
3976
+ 'User'
3977
+ ]
1398
3978
  }
1399
3979
  },
1400
3980
  additionalProperties: false
@@ -1408,15 +3988,29 @@ export const UsageFacetsSchema = {
1408
3988
  type: 'string'
1409
3989
  },
1410
3990
  description: 'List of unique cluster IDs',
1411
- example: ['6b5439b1-923a-4f2b-a371-d554e5ea23fa']
3991
+ example: [
3992
+ '6b5439b1-923a-4f2b-a371-d554e5ea23fa'
3993
+ ]
1412
3994
  },
1413
3995
  product: {
1414
3996
  type: 'array',
1415
3997
  items: {
1416
- type: 'string'
3998
+ type: 'string',
3999
+ enum: [
4000
+ 'cfke_controlplane_basic',
4001
+ 'cfke_controlplane_pro',
4002
+ 'cfke_controlplane_enterprise',
4003
+ 'cfke_connected_nodes_basic',
4004
+ 'cfke_connected_nodes_pro',
4005
+ 'cfke_connected_nodes_enterprise',
4006
+ 'cfcr_storage'
4007
+ ]
1417
4008
  },
1418
4009
  description: 'List of unique products',
1419
- example: ['cfke_controlplane', 'cfke_connected_nodes']
4010
+ example: [
4011
+ 'cfke_controlplane_pro',
4012
+ 'cfke_connected_nodes_pro'
4013
+ ]
1420
4014
  }
1421
4015
  },
1422
4016
  additionalProperties: false
@@ -1442,7 +4036,16 @@ export const UsageResponseSchema = {
1442
4036
  product: {
1443
4037
  type: 'string',
1444
4038
  description: 'The product the usage is associated with',
1445
- example: 'cfke_controlplane'
4039
+ example: 'cfke_controlplane_pro',
4040
+ enum: [
4041
+ 'cfke_controlplane_basic',
4042
+ 'cfke_controlplane_pro',
4043
+ 'cfke_controlplane_enterprise',
4044
+ 'cfke_connected_nodes_basic',
4045
+ 'cfke_connected_nodes_pro',
4046
+ 'cfke_connected_nodes_enterprise',
4047
+ 'cfcr_storage'
4048
+ ]
1446
4049
  },
1447
4050
  value: {
1448
4051
  type: 'number',
@@ -1462,7 +4065,14 @@ export const UsageResponseSchema = {
1462
4065
  description: 'Total cost'
1463
4066
  }
1464
4067
  },
1465
- required: ['hour', 'cluster_id', 'product', 'value', 'price', 'total'],
4068
+ required: [
4069
+ 'hour',
4070
+ 'cluster_id',
4071
+ 'product',
4072
+ 'value',
4073
+ 'price',
4074
+ 'total'
4075
+ ],
1466
4076
  additionalProperties: false
1467
4077
  },
1468
4078
  description: 'Usage data'
@@ -1476,22 +4086,39 @@ export const UsageResponseSchema = {
1476
4086
  type: 'string'
1477
4087
  },
1478
4088
  description: 'List of unique cluster IDs',
1479
- example: ['6b5439b1-923a-4f2b-a371-d554e5ea23fa']
4089
+ example: [
4090
+ '6b5439b1-923a-4f2b-a371-d554e5ea23fa'
4091
+ ]
1480
4092
  },
1481
4093
  product: {
1482
4094
  type: 'array',
1483
4095
  items: {
1484
- type: 'string'
4096
+ type: 'string',
4097
+ enum: [
4098
+ 'cfke_controlplane_basic',
4099
+ 'cfke_controlplane_pro',
4100
+ 'cfke_controlplane_enterprise',
4101
+ 'cfke_connected_nodes_basic',
4102
+ 'cfke_connected_nodes_pro',
4103
+ 'cfke_connected_nodes_enterprise',
4104
+ 'cfcr_storage'
4105
+ ]
1485
4106
  },
1486
4107
  description: 'List of unique products',
1487
- example: ['cfke_controlplane', 'cfke_connected_nodes']
4108
+ example: [
4109
+ 'cfke_controlplane_pro',
4110
+ 'cfke_connected_nodes_pro'
4111
+ ]
1488
4112
  }
1489
4113
  },
1490
4114
  additionalProperties: false,
1491
4115
  description: 'Facets for filtering'
1492
4116
  }
1493
4117
  },
1494
- required: ['data', 'facets'],
4118
+ required: [
4119
+ 'data',
4120
+ 'facets'
4121
+ ],
1495
4122
  additionalProperties: false
1496
4123
  };
1497
4124
  export const UsageSchema = {
@@ -1510,7 +4137,16 @@ export const UsageSchema = {
1510
4137
  product: {
1511
4138
  type: 'string',
1512
4139
  description: 'The product the usage is associated with',
1513
- example: 'cfke_controlplane'
4140
+ example: 'cfke_controlplane_pro',
4141
+ enum: [
4142
+ 'cfke_controlplane_basic',
4143
+ 'cfke_controlplane_pro',
4144
+ 'cfke_controlplane_enterprise',
4145
+ 'cfke_connected_nodes_basic',
4146
+ 'cfke_connected_nodes_pro',
4147
+ 'cfke_connected_nodes_enterprise',
4148
+ 'cfcr_storage'
4149
+ ]
1514
4150
  },
1515
4151
  value: {
1516
4152
  type: 'number',
@@ -1530,7 +4166,14 @@ export const UsageSchema = {
1530
4166
  description: 'Total cost'
1531
4167
  }
1532
4168
  },
1533
- required: ['hour', 'cluster_id', 'product', 'value', 'price', 'total'],
4169
+ required: [
4170
+ 'hour',
4171
+ 'cluster_id',
4172
+ 'product',
4173
+ 'value',
4174
+ 'price',
4175
+ 'total'
4176
+ ],
1534
4177
  additionalProperties: false
1535
4178
  };
1536
4179
  export const UserCreateInputSchema = {
@@ -1566,21 +4209,15 @@ export const UserCreateInputSchema = {
1566
4209
  type: 'string',
1567
4210
  minLength: 8,
1568
4211
  description: 'User password. Must be at least 8 characters long.'
1569
- },
1570
- status: {
1571
- type: 'string',
1572
- description: 'Status of the user. Can be `active` or `inactive`. Inactive users cannot log in or manage organization resources.',
1573
- example: 'active',
1574
- enum: ['active', 'inactive']
1575
- },
1576
- role: {
1577
- type: 'string',
1578
- description: "User role. Can be 'Administrator', 'User'.",
1579
- example: 'User',
1580
- enum: ['Administrator', 'User']
1581
4212
  }
1582
4213
  },
1583
- required: ['email', 'first_name', 'last_name', 'code', 'password'],
4214
+ required: [
4215
+ 'email',
4216
+ 'first_name',
4217
+ 'last_name',
4218
+ 'code',
4219
+ 'password'
4220
+ ],
1584
4221
  additionalProperties: false
1585
4222
  };
1586
4223
  export const UserSchema = {
@@ -1608,15 +4245,21 @@ export const UserSchema = {
1608
4245
  },
1609
4246
  role: {
1610
4247
  type: 'string',
1611
- description: "User role. Can be 'Administrator', 'User'.",
4248
+ description: 'User role. Can be \'Administrator\', \'User\'.',
1612
4249
  example: 'User',
1613
- enum: ['Administrator', 'User']
4250
+ enum: [
4251
+ 'Administrator',
4252
+ 'User'
4253
+ ]
1614
4254
  },
1615
4255
  status: {
1616
4256
  type: 'string',
1617
4257
  description: 'Status of the user. Can be `active` or `inactive`. Inactive users cannot log in or manage organization resources.',
1618
4258
  example: 'active',
1619
- enum: ['active', 'inactive']
4259
+ enum: [
4260
+ 'active',
4261
+ 'inactive'
4262
+ ]
1620
4263
  },
1621
4264
  id: {
1622
4265
  type: 'string',
@@ -1631,7 +4274,15 @@ export const UserSchema = {
1631
4274
  example: '2023-11-02T16:08:14.338Z'
1632
4275
  }
1633
4276
  },
1634
- required: ['email', 'first_name', 'last_name', 'role', 'status', 'id', 'date_created'],
4277
+ required: [
4278
+ 'email',
4279
+ 'first_name',
4280
+ 'last_name',
4281
+ 'role',
4282
+ 'status',
4283
+ 'id',
4284
+ 'date_created'
4285
+ ],
1635
4286
  additionalProperties: false
1636
4287
  };
1637
4288
  export const UserUpdateInputSchema = {
@@ -1659,15 +4310,21 @@ export const UserUpdateInputSchema = {
1659
4310
  },
1660
4311
  role: {
1661
4312
  type: 'string',
1662
- description: "User role. Can be 'Administrator', 'User'.",
4313
+ description: 'User role. Can be \'Administrator\', \'User\'.',
1663
4314
  example: 'User',
1664
- enum: ['Administrator', 'User']
4315
+ enum: [
4316
+ 'Administrator',
4317
+ 'User'
4318
+ ]
1665
4319
  },
1666
4320
  status: {
1667
4321
  type: 'string',
1668
4322
  description: 'Status of the user. Can be `active` or `inactive`. Inactive users cannot log in or manage organization resources.',
1669
4323
  example: 'active',
1670
- enum: ['active', 'inactive']
4324
+ enum: [
4325
+ 'active',
4326
+ 'inactive'
4327
+ ]
1671
4328
  }
1672
4329
  },
1673
4330
  additionalProperties: false