@cloudfleet/sdk 0.0.1-a64863e → 0.0.1-a9ac9eb

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.
@@ -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,
@@ -207,6 +216,7 @@ export const BillingContactSchema = {
207
216
  }
208
217
  },
209
218
  required: [
219
+ 'type',
210
220
  'email',
211
221
  'individual_name'
212
222
  ],
@@ -642,7 +652,7 @@ export const ClusterSchema = {
642
652
  {
643
653
  type: 'string',
644
654
  format: 'uri',
645
- description: 'URL of the Kubernetes cluster control plane. This is the endpoint that kubectl uses to connect to the cluster.',
655
+ description: 'URL signed by the private CA of the Kubernetes cluster control plane. This is the endpoint that kubectl uses to connect to the cluster. (Deprecated, use endpoint_public instead)',
646
656
  example: 'https://2ae6557c-c61f-49c6-b4c1-a65473470a03.staging.cfke.cloudfleet.dev:6443'
647
657
  },
648
658
  {
@@ -653,6 +663,22 @@ export const ClusterSchema = {
653
663
  }
654
664
  ]
655
665
  },
666
+ endpoint_public: {
667
+ anyOf: [
668
+ {
669
+ type: 'string',
670
+ format: 'uri',
671
+ 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.',
672
+ example: 'https://2ae6557c-c61f-49c6-b4c1-a65473470a03.staging.cfke.io'
673
+ },
674
+ {
675
+ type: 'string',
676
+ enum: [
677
+ ''
678
+ ]
679
+ }
680
+ ]
681
+ },
656
682
  certificate_ca: {
657
683
  type: 'string',
658
684
  description: 'Certificate authority data for the kubernetes cluster. This is the root certificate authority for the cluster.',
@@ -732,15 +758,12 @@ export const FleetCreateInputSchema = {
732
758
  type: 'object',
733
759
  properties: {
734
760
  cpu: {
735
- type: 'number',
736
- format: 'float',
761
+ type: 'integer',
737
762
  minimum: 0,
738
- description: 'CPU limit in cores.'
763
+ maximum: 100000,
764
+ description: 'CPU limit in cores. Maximum 100,000.'
739
765
  }
740
766
  },
741
- required: [
742
- 'cpu'
743
- ],
744
767
  additionalProperties: false,
745
768
  description: 'Limits define a set of bounds for provisioning capacity.'
746
769
  },
@@ -748,16 +771,17 @@ export const FleetCreateInputSchema = {
748
771
  type: 'object',
749
772
  properties: {
750
773
  enabled: {
751
- type: 'boolean',
752
- default: true
774
+ type: 'boolean'
753
775
  },
754
776
  project: {
755
777
  type: 'string',
756
- description: 'Project GCP Project id to deploy instances into'
778
+ pattern: '^[a-z][a-z0-9-]{4,28}[a-z0-9]$',
779
+ 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.',
780
+ example: 'my-cloudfleet-project'
757
781
  }
758
782
  },
759
783
  required: [
760
- 'project'
784
+ 'enabled'
761
785
  ],
762
786
  additionalProperties: false
763
787
  },
@@ -765,16 +789,18 @@ export const FleetCreateInputSchema = {
765
789
  type: 'object',
766
790
  properties: {
767
791
  enabled: {
768
- type: 'boolean',
769
- default: true
792
+ type: 'boolean'
770
793
  },
771
794
  apiKey: {
772
795
  type: 'string',
773
- description: 'Hetzner Cloud API key with read / write access'
796
+ maxLength: 64,
797
+ minLength: 64,
798
+ pattern: '^[A-Za-z0-9]+$',
799
+ description: 'Hetzner Cloud API token with read / write access (64 alphanumeric characters). Omit this field to keep the existing value.'
774
800
  }
775
801
  },
776
802
  required: [
777
- 'apiKey'
803
+ 'enabled'
778
804
  ],
779
805
  additionalProperties: false
780
806
  },
@@ -782,19 +808,308 @@ export const FleetCreateInputSchema = {
782
808
  type: 'object',
783
809
  properties: {
784
810
  enabled: {
785
- type: 'boolean',
786
- default: true
811
+ type: 'boolean'
787
812
  },
788
813
  controllerRoleArn: {
789
814
  type: 'string',
790
- description: 'ControllerRoleArn is the AWS IAM role that Karpenter uses to manage resources.'
815
+ pattern: '^arn:aws(-[a-z]+)*:iam::\\d{12}:role\\/[\\w+=,.@/-]+$',
816
+ description: 'AWS IAM role ARN that Karpenter uses to manage resources. Omit when AWS is disabled.',
817
+ example: 'arn:aws:iam::123456789012:role/Cloudfleet'
791
818
  }
792
819
  },
793
820
  required: [
794
- 'controllerRoleArn'
821
+ 'enabled'
795
822
  ],
796
823
  additionalProperties: false
797
824
  },
825
+ constraints: {
826
+ type: 'object',
827
+ properties: {
828
+ 'karpenter.sh/capacity-type': {
829
+ type: 'array',
830
+ items: {
831
+ type: 'string',
832
+ enum: [
833
+ 'on-demand',
834
+ 'spot'
835
+ ]
836
+ },
837
+ minItems: 1,
838
+ description: 'Allowed values for `karpenter.sh/capacity-type`.',
839
+ default: [
840
+ 'on-demand',
841
+ 'spot'
842
+ ]
843
+ },
844
+ 'kubernetes.io/arch': {
845
+ type: 'array',
846
+ items: {
847
+ type: 'string',
848
+ enum: [
849
+ 'amd64',
850
+ 'arm64'
851
+ ]
852
+ },
853
+ minItems: 1,
854
+ description: 'Allowed values for `kubernetes.io/arch`.',
855
+ default: [
856
+ 'amd64'
857
+ ]
858
+ },
859
+ 'cfke.io/instance-family': {
860
+ type: 'array',
861
+ items: {
862
+ type: 'string',
863
+ enum: [
864
+ 'a1',
865
+ 'a2',
866
+ 'a3',
867
+ 'a4',
868
+ 'c1',
869
+ 'c2',
870
+ 'c2d',
871
+ 'c3',
872
+ 'c3d',
873
+ 'c4',
874
+ 'c4a',
875
+ 'c4d',
876
+ 'c5',
877
+ 'c5a',
878
+ 'c5ad',
879
+ 'c5d',
880
+ 'c5n',
881
+ 'c6a',
882
+ 'c6g',
883
+ 'c6gd',
884
+ 'c6gn',
885
+ 'c6i',
886
+ 'c6id',
887
+ 'c6in',
888
+ 'c7a',
889
+ 'c7g',
890
+ 'c7gd',
891
+ 'c7gn',
892
+ 'c7i',
893
+ 'c7i-flex',
894
+ 'c8g',
895
+ 'c8gd',
896
+ 'cax',
897
+ 'ccx',
898
+ 'cpx',
899
+ 'cx',
900
+ 'd2',
901
+ 'd3',
902
+ 'd3en',
903
+ 'dl1',
904
+ 'dl2q',
905
+ 'e2',
906
+ 'f1',
907
+ 'f2',
908
+ 'g1',
909
+ 'g2',
910
+ 'g4ad',
911
+ 'g4dn',
912
+ 'g5',
913
+ 'g5g',
914
+ 'g6',
915
+ 'g6e',
916
+ 'gr6',
917
+ 'h1',
918
+ 'h3',
919
+ 'hpc6a',
920
+ 'hpc6id',
921
+ 'hpc7a',
922
+ 'hpc7g',
923
+ 'i2',
924
+ 'i3',
925
+ 'i3en',
926
+ 'i4g',
927
+ 'i4i',
928
+ 'i7i',
929
+ 'i7ie',
930
+ 'i8g',
931
+ 'im4gn',
932
+ 'inf1',
933
+ 'inf2',
934
+ 'is4gen',
935
+ 'm1',
936
+ 'm2',
937
+ 'm3',
938
+ 'm4',
939
+ 'm5',
940
+ 'm5a',
941
+ 'm5ad',
942
+ 'm5d',
943
+ 'm5dn',
944
+ 'm5n',
945
+ 'm5zn',
946
+ 'm6a',
947
+ 'm6g',
948
+ 'm6gd',
949
+ 'm6i',
950
+ 'm6id',
951
+ 'm6idn',
952
+ 'm6in',
953
+ 'm7a',
954
+ 'm7g',
955
+ 'm7gd',
956
+ 'm7i',
957
+ 'm7i-flex',
958
+ 'm8g',
959
+ 'm8gd',
960
+ 'n1',
961
+ 'n2',
962
+ 'n2d',
963
+ 'n4',
964
+ 'p3',
965
+ 'p3dn',
966
+ 'p4d',
967
+ 'p4de',
968
+ 'p5',
969
+ 'p5e',
970
+ 'p5en',
971
+ 'p6-b200',
972
+ 'r3',
973
+ 'r4',
974
+ 'r5',
975
+ 'r5a',
976
+ 'r5ad',
977
+ 'r5b',
978
+ 'r5d',
979
+ 'r5dn',
980
+ 'r5n',
981
+ 'r6a',
982
+ 'r6g',
983
+ 'r6gd',
984
+ 'r6i',
985
+ 'r6id',
986
+ 'r6idn',
987
+ 'r6in',
988
+ 'r7a',
989
+ 'r7g',
990
+ 'r7gd',
991
+ 'r7i',
992
+ 'r7iz',
993
+ 'r8g',
994
+ 'r8gd',
995
+ 't2',
996
+ 't2a',
997
+ 't2d',
998
+ 't3',
999
+ 't3a',
1000
+ 't4g',
1001
+ 'trn1',
1002
+ 'trn1n',
1003
+ 'u-3tb1',
1004
+ 'u-6tb1',
1005
+ 'u7i-12tb',
1006
+ 'u7i-6tb',
1007
+ 'u7i-8tb',
1008
+ 'u7in-16tb',
1009
+ 'u7in-24tb',
1010
+ 'u7in-32tb',
1011
+ 'vt1',
1012
+ 'x1',
1013
+ 'x1e',
1014
+ 'x2gd',
1015
+ 'x2idn',
1016
+ 'x2iedn',
1017
+ 'x2iezn',
1018
+ 'x4',
1019
+ 'x8g',
1020
+ 'z1d',
1021
+ 'z3'
1022
+ ]
1023
+ },
1024
+ description: 'Allowed values for `cfke.io/instance-family`.'
1025
+ },
1026
+ 'topology.kubernetes.io/region': {
1027
+ type: 'array',
1028
+ items: {
1029
+ type: 'string',
1030
+ enum: [
1031
+ 'africa-south1',
1032
+ 'ap-northeast-1',
1033
+ 'ap-northeast-2',
1034
+ 'ap-northeast-3',
1035
+ 'ap-south-1',
1036
+ 'ap-southeast-1',
1037
+ 'ap-southeast-2',
1038
+ 'ash',
1039
+ 'asia-east1',
1040
+ 'asia-east2',
1041
+ 'asia-northeast1',
1042
+ 'asia-northeast2',
1043
+ 'asia-northeast3',
1044
+ 'asia-south1',
1045
+ 'asia-south2',
1046
+ 'asia-southeast1',
1047
+ 'asia-southeast2',
1048
+ 'australia-southeast1',
1049
+ 'australia-southeast2',
1050
+ 'ca-central-1',
1051
+ 'eu-central-1',
1052
+ 'eu-central-2',
1053
+ 'eu-north-1',
1054
+ 'eu-west-1',
1055
+ 'eu-west-2',
1056
+ 'eu-west-3',
1057
+ 'europe-central2',
1058
+ 'europe-north1',
1059
+ 'europe-southwest1',
1060
+ 'europe-west1',
1061
+ 'europe-west10',
1062
+ 'europe-west12',
1063
+ 'europe-west2',
1064
+ 'europe-west3',
1065
+ 'europe-west4',
1066
+ 'europe-west6',
1067
+ 'europe-west8',
1068
+ 'europe-west9',
1069
+ 'fsn1',
1070
+ 'hel1',
1071
+ 'hil',
1072
+ 'me-central1',
1073
+ 'me-central2',
1074
+ 'me-west1',
1075
+ 'nbg1',
1076
+ 'northamerica-northeast1',
1077
+ 'northamerica-northeast2',
1078
+ 'sa-east-1',
1079
+ 'sin',
1080
+ 'southamerica-east1',
1081
+ 'southamerica-west1',
1082
+ 'us-central1',
1083
+ 'us-east-1',
1084
+ 'us-east-2',
1085
+ 'us-east1',
1086
+ 'us-east4',
1087
+ 'us-east5',
1088
+ 'us-south1',
1089
+ 'us-west-1',
1090
+ 'us-west-2',
1091
+ 'us-west1',
1092
+ 'us-west2',
1093
+ 'us-west3',
1094
+ 'us-west4'
1095
+ ]
1096
+ },
1097
+ description: 'Allowed values for `topology.kubernetes.io/region`.'
1098
+ }
1099
+ },
1100
+ additionalProperties: false,
1101
+ 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. Omit a field to place no restriction on that key.'
1102
+ },
1103
+ scalingProfile: {
1104
+ type: 'string',
1105
+ description: 'Controls scale-up / scale-down responsiveness. `aggressive` prioritizes cost-optimization. `conservative` prioritizes stability of the fleet.',
1106
+ default: 'conservative',
1107
+ example: 'conservative',
1108
+ enum: [
1109
+ 'aggressive',
1110
+ 'conservative'
1111
+ ]
1112
+ },
798
1113
  id: {
799
1114
  type: 'string',
800
1115
  maxLength: 63,
@@ -816,15 +1131,12 @@ export const FleetSchema = {
816
1131
  type: 'object',
817
1132
  properties: {
818
1133
  cpu: {
819
- type: 'number',
820
- format: 'float',
1134
+ type: 'integer',
821
1135
  minimum: 0,
822
- description: 'CPU limit in cores.'
1136
+ maximum: 100000,
1137
+ description: 'CPU limit in cores. Maximum 100,000.'
823
1138
  }
824
1139
  },
825
- required: [
826
- 'cpu'
827
- ],
828
1140
  additionalProperties: false,
829
1141
  description: 'Limits define a set of bounds for provisioning capacity.'
830
1142
  },
@@ -832,16 +1144,17 @@ export const FleetSchema = {
832
1144
  type: 'object',
833
1145
  properties: {
834
1146
  enabled: {
835
- type: 'boolean',
836
- default: true
1147
+ type: 'boolean'
837
1148
  },
838
1149
  project: {
839
1150
  type: 'string',
840
- description: 'Project GCP Project id to deploy instances into'
1151
+ pattern: '^[a-z][a-z0-9-]{4,28}[a-z0-9]$',
1152
+ 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.',
1153
+ example: 'my-cloudfleet-project'
841
1154
  }
842
1155
  },
843
1156
  required: [
844
- 'project'
1157
+ 'enabled'
845
1158
  ],
846
1159
  additionalProperties: false
847
1160
  },
@@ -849,16 +1162,16 @@ export const FleetSchema = {
849
1162
  type: 'object',
850
1163
  properties: {
851
1164
  enabled: {
852
- type: 'boolean',
853
- default: true
1165
+ type: 'boolean'
854
1166
  },
855
1167
  apiKey: {
856
1168
  type: 'string',
857
- description: 'Hetzner Cloud API key with read / write access'
1169
+ pattern: '^\\*{64}$',
1170
+ 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.'
858
1171
  }
859
1172
  },
860
1173
  required: [
861
- 'apiKey'
1174
+ 'enabled'
862
1175
  ],
863
1176
  additionalProperties: false
864
1177
  },
@@ -866,19 +1179,308 @@ export const FleetSchema = {
866
1179
  type: 'object',
867
1180
  properties: {
868
1181
  enabled: {
869
- type: 'boolean',
870
- default: true
1182
+ type: 'boolean'
871
1183
  },
872
1184
  controllerRoleArn: {
873
1185
  type: 'string',
874
- description: 'ControllerRoleArn is the AWS IAM role that Karpenter uses to manage resources.'
1186
+ pattern: '^arn:aws(-[a-z]+)*:iam::\\d{12}:role\\/[\\w+=,.@/-]+$',
1187
+ description: 'AWS IAM role ARN that Karpenter uses to manage resources. Omit when AWS is disabled.',
1188
+ example: 'arn:aws:iam::123456789012:role/Cloudfleet'
875
1189
  }
876
1190
  },
877
1191
  required: [
878
- 'controllerRoleArn'
1192
+ 'enabled'
879
1193
  ],
880
1194
  additionalProperties: false
881
1195
  },
1196
+ constraints: {
1197
+ type: 'object',
1198
+ properties: {
1199
+ 'karpenter.sh/capacity-type': {
1200
+ type: 'array',
1201
+ items: {
1202
+ type: 'string',
1203
+ enum: [
1204
+ 'on-demand',
1205
+ 'spot'
1206
+ ]
1207
+ },
1208
+ minItems: 1,
1209
+ description: 'Allowed values for `karpenter.sh/capacity-type`.',
1210
+ default: [
1211
+ 'on-demand',
1212
+ 'spot'
1213
+ ]
1214
+ },
1215
+ 'kubernetes.io/arch': {
1216
+ type: 'array',
1217
+ items: {
1218
+ type: 'string',
1219
+ enum: [
1220
+ 'amd64',
1221
+ 'arm64'
1222
+ ]
1223
+ },
1224
+ minItems: 1,
1225
+ description: 'Allowed values for `kubernetes.io/arch`.',
1226
+ default: [
1227
+ 'amd64'
1228
+ ]
1229
+ },
1230
+ 'cfke.io/instance-family': {
1231
+ type: 'array',
1232
+ items: {
1233
+ type: 'string',
1234
+ enum: [
1235
+ 'a1',
1236
+ 'a2',
1237
+ 'a3',
1238
+ 'a4',
1239
+ 'c1',
1240
+ 'c2',
1241
+ 'c2d',
1242
+ 'c3',
1243
+ 'c3d',
1244
+ 'c4',
1245
+ 'c4a',
1246
+ 'c4d',
1247
+ 'c5',
1248
+ 'c5a',
1249
+ 'c5ad',
1250
+ 'c5d',
1251
+ 'c5n',
1252
+ 'c6a',
1253
+ 'c6g',
1254
+ 'c6gd',
1255
+ 'c6gn',
1256
+ 'c6i',
1257
+ 'c6id',
1258
+ 'c6in',
1259
+ 'c7a',
1260
+ 'c7g',
1261
+ 'c7gd',
1262
+ 'c7gn',
1263
+ 'c7i',
1264
+ 'c7i-flex',
1265
+ 'c8g',
1266
+ 'c8gd',
1267
+ 'cax',
1268
+ 'ccx',
1269
+ 'cpx',
1270
+ 'cx',
1271
+ 'd2',
1272
+ 'd3',
1273
+ 'd3en',
1274
+ 'dl1',
1275
+ 'dl2q',
1276
+ 'e2',
1277
+ 'f1',
1278
+ 'f2',
1279
+ 'g1',
1280
+ 'g2',
1281
+ 'g4ad',
1282
+ 'g4dn',
1283
+ 'g5',
1284
+ 'g5g',
1285
+ 'g6',
1286
+ 'g6e',
1287
+ 'gr6',
1288
+ 'h1',
1289
+ 'h3',
1290
+ 'hpc6a',
1291
+ 'hpc6id',
1292
+ 'hpc7a',
1293
+ 'hpc7g',
1294
+ 'i2',
1295
+ 'i3',
1296
+ 'i3en',
1297
+ 'i4g',
1298
+ 'i4i',
1299
+ 'i7i',
1300
+ 'i7ie',
1301
+ 'i8g',
1302
+ 'im4gn',
1303
+ 'inf1',
1304
+ 'inf2',
1305
+ 'is4gen',
1306
+ 'm1',
1307
+ 'm2',
1308
+ 'm3',
1309
+ 'm4',
1310
+ 'm5',
1311
+ 'm5a',
1312
+ 'm5ad',
1313
+ 'm5d',
1314
+ 'm5dn',
1315
+ 'm5n',
1316
+ 'm5zn',
1317
+ 'm6a',
1318
+ 'm6g',
1319
+ 'm6gd',
1320
+ 'm6i',
1321
+ 'm6id',
1322
+ 'm6idn',
1323
+ 'm6in',
1324
+ 'm7a',
1325
+ 'm7g',
1326
+ 'm7gd',
1327
+ 'm7i',
1328
+ 'm7i-flex',
1329
+ 'm8g',
1330
+ 'm8gd',
1331
+ 'n1',
1332
+ 'n2',
1333
+ 'n2d',
1334
+ 'n4',
1335
+ 'p3',
1336
+ 'p3dn',
1337
+ 'p4d',
1338
+ 'p4de',
1339
+ 'p5',
1340
+ 'p5e',
1341
+ 'p5en',
1342
+ 'p6-b200',
1343
+ 'r3',
1344
+ 'r4',
1345
+ 'r5',
1346
+ 'r5a',
1347
+ 'r5ad',
1348
+ 'r5b',
1349
+ 'r5d',
1350
+ 'r5dn',
1351
+ 'r5n',
1352
+ 'r6a',
1353
+ 'r6g',
1354
+ 'r6gd',
1355
+ 'r6i',
1356
+ 'r6id',
1357
+ 'r6idn',
1358
+ 'r6in',
1359
+ 'r7a',
1360
+ 'r7g',
1361
+ 'r7gd',
1362
+ 'r7i',
1363
+ 'r7iz',
1364
+ 'r8g',
1365
+ 'r8gd',
1366
+ 't2',
1367
+ 't2a',
1368
+ 't2d',
1369
+ 't3',
1370
+ 't3a',
1371
+ 't4g',
1372
+ 'trn1',
1373
+ 'trn1n',
1374
+ 'u-3tb1',
1375
+ 'u-6tb1',
1376
+ 'u7i-12tb',
1377
+ 'u7i-6tb',
1378
+ 'u7i-8tb',
1379
+ 'u7in-16tb',
1380
+ 'u7in-24tb',
1381
+ 'u7in-32tb',
1382
+ 'vt1',
1383
+ 'x1',
1384
+ 'x1e',
1385
+ 'x2gd',
1386
+ 'x2idn',
1387
+ 'x2iedn',
1388
+ 'x2iezn',
1389
+ 'x4',
1390
+ 'x8g',
1391
+ 'z1d',
1392
+ 'z3'
1393
+ ]
1394
+ },
1395
+ description: 'Allowed values for `cfke.io/instance-family`.'
1396
+ },
1397
+ 'topology.kubernetes.io/region': {
1398
+ type: 'array',
1399
+ items: {
1400
+ type: 'string',
1401
+ enum: [
1402
+ 'africa-south1',
1403
+ 'ap-northeast-1',
1404
+ 'ap-northeast-2',
1405
+ 'ap-northeast-3',
1406
+ 'ap-south-1',
1407
+ 'ap-southeast-1',
1408
+ 'ap-southeast-2',
1409
+ 'ash',
1410
+ 'asia-east1',
1411
+ 'asia-east2',
1412
+ 'asia-northeast1',
1413
+ 'asia-northeast2',
1414
+ 'asia-northeast3',
1415
+ 'asia-south1',
1416
+ 'asia-south2',
1417
+ 'asia-southeast1',
1418
+ 'asia-southeast2',
1419
+ 'australia-southeast1',
1420
+ 'australia-southeast2',
1421
+ 'ca-central-1',
1422
+ 'eu-central-1',
1423
+ 'eu-central-2',
1424
+ 'eu-north-1',
1425
+ 'eu-west-1',
1426
+ 'eu-west-2',
1427
+ 'eu-west-3',
1428
+ 'europe-central2',
1429
+ 'europe-north1',
1430
+ 'europe-southwest1',
1431
+ 'europe-west1',
1432
+ 'europe-west10',
1433
+ 'europe-west12',
1434
+ 'europe-west2',
1435
+ 'europe-west3',
1436
+ 'europe-west4',
1437
+ 'europe-west6',
1438
+ 'europe-west8',
1439
+ 'europe-west9',
1440
+ 'fsn1',
1441
+ 'hel1',
1442
+ 'hil',
1443
+ 'me-central1',
1444
+ 'me-central2',
1445
+ 'me-west1',
1446
+ 'nbg1',
1447
+ 'northamerica-northeast1',
1448
+ 'northamerica-northeast2',
1449
+ 'sa-east-1',
1450
+ 'sin',
1451
+ 'southamerica-east1',
1452
+ 'southamerica-west1',
1453
+ 'us-central1',
1454
+ 'us-east-1',
1455
+ 'us-east-2',
1456
+ 'us-east1',
1457
+ 'us-east4',
1458
+ 'us-east5',
1459
+ 'us-south1',
1460
+ 'us-west-1',
1461
+ 'us-west-2',
1462
+ 'us-west1',
1463
+ 'us-west2',
1464
+ 'us-west3',
1465
+ 'us-west4'
1466
+ ]
1467
+ },
1468
+ description: 'Allowed values for `topology.kubernetes.io/region`.'
1469
+ }
1470
+ },
1471
+ additionalProperties: false,
1472
+ 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. Omit a field to place no restriction on that key.'
1473
+ },
1474
+ scalingProfile: {
1475
+ type: 'string',
1476
+ description: 'Controls scale-up / scale-down responsiveness. `aggressive` prioritizes cost-optimization. `conservative` prioritizes stability of the fleet.',
1477
+ default: 'conservative',
1478
+ example: 'conservative',
1479
+ enum: [
1480
+ 'aggressive',
1481
+ 'conservative'
1482
+ ]
1483
+ },
882
1484
  id: {
883
1485
  type: 'string',
884
1486
  maxLength: 63,
@@ -889,6 +1491,7 @@ export const FleetSchema = {
889
1491
  }
890
1492
  },
891
1493
  required: [
1494
+ 'scalingProfile',
892
1495
  'id'
893
1496
  ],
894
1497
  additionalProperties: false
@@ -900,15 +1503,12 @@ export const FleetUpdateInputSchema = {
900
1503
  type: 'object',
901
1504
  properties: {
902
1505
  cpu: {
903
- type: 'number',
904
- format: 'float',
1506
+ type: 'integer',
905
1507
  minimum: 0,
906
- description: 'CPU limit in cores.'
1508
+ maximum: 100000,
1509
+ description: 'CPU limit in cores. Maximum 100,000.'
907
1510
  }
908
1511
  },
909
- required: [
910
- 'cpu'
911
- ],
912
1512
  additionalProperties: false,
913
1513
  description: 'Limits define a set of bounds for provisioning capacity.'
914
1514
  },
@@ -916,16 +1516,17 @@ export const FleetUpdateInputSchema = {
916
1516
  type: 'object',
917
1517
  properties: {
918
1518
  enabled: {
919
- type: 'boolean',
920
- default: true
1519
+ type: 'boolean'
921
1520
  },
922
1521
  project: {
923
1522
  type: 'string',
924
- description: 'Project GCP Project id to deploy instances into'
1523
+ pattern: '^[a-z][a-z0-9-]{4,28}[a-z0-9]$',
1524
+ 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.',
1525
+ example: 'my-cloudfleet-project'
925
1526
  }
926
1527
  },
927
1528
  required: [
928
- 'project'
1529
+ 'enabled'
929
1530
  ],
930
1531
  additionalProperties: false
931
1532
  },
@@ -933,16 +1534,18 @@ export const FleetUpdateInputSchema = {
933
1534
  type: 'object',
934
1535
  properties: {
935
1536
  enabled: {
936
- type: 'boolean',
937
- default: true
1537
+ type: 'boolean'
938
1538
  },
939
1539
  apiKey: {
940
1540
  type: 'string',
941
- description: 'Hetzner Cloud API key with read / write access'
1541
+ maxLength: 64,
1542
+ minLength: 64,
1543
+ pattern: '^[A-Za-z0-9]+$',
1544
+ description: 'Hetzner Cloud API token with read / write access (64 alphanumeric characters). Omit this field to keep the existing value.'
942
1545
  }
943
1546
  },
944
1547
  required: [
945
- 'apiKey'
1548
+ 'enabled'
946
1549
  ],
947
1550
  additionalProperties: false
948
1551
  },
@@ -950,20 +1553,304 @@ export const FleetUpdateInputSchema = {
950
1553
  type: 'object',
951
1554
  properties: {
952
1555
  enabled: {
953
- type: 'boolean',
954
- default: true
1556
+ type: 'boolean'
955
1557
  },
956
1558
  controllerRoleArn: {
957
1559
  type: 'string',
958
- description: 'ControllerRoleArn is the AWS IAM role that Karpenter uses to manage resources.'
1560
+ pattern: '^arn:aws(-[a-z]+)*:iam::\\d{12}:role\\/[\\w+=,.@/-]+$',
1561
+ description: 'AWS IAM role ARN that Karpenter uses to manage resources. Omit when AWS is disabled.',
1562
+ example: 'arn:aws:iam::123456789012:role/Cloudfleet'
959
1563
  }
960
1564
  },
961
1565
  required: [
962
- 'controllerRoleArn'
1566
+ 'enabled'
963
1567
  ],
964
1568
  additionalProperties: false
1569
+ },
1570
+ constraints: {
1571
+ type: 'object',
1572
+ properties: {
1573
+ 'karpenter.sh/capacity-type': {
1574
+ type: 'array',
1575
+ items: {
1576
+ type: 'string',
1577
+ enum: [
1578
+ 'on-demand',
1579
+ 'spot'
1580
+ ]
1581
+ },
1582
+ minItems: 1,
1583
+ description: 'Allowed values for `karpenter.sh/capacity-type`.'
1584
+ },
1585
+ 'kubernetes.io/arch': {
1586
+ type: 'array',
1587
+ items: {
1588
+ type: 'string',
1589
+ enum: [
1590
+ 'amd64',
1591
+ 'arm64'
1592
+ ]
1593
+ },
1594
+ minItems: 1,
1595
+ description: 'Allowed values for `kubernetes.io/arch`.'
1596
+ },
1597
+ 'cfke.io/instance-family': {
1598
+ type: 'array',
1599
+ items: {
1600
+ type: 'string',
1601
+ enum: [
1602
+ 'a1',
1603
+ 'a2',
1604
+ 'a3',
1605
+ 'a4',
1606
+ 'c1',
1607
+ 'c2',
1608
+ 'c2d',
1609
+ 'c3',
1610
+ 'c3d',
1611
+ 'c4',
1612
+ 'c4a',
1613
+ 'c4d',
1614
+ 'c5',
1615
+ 'c5a',
1616
+ 'c5ad',
1617
+ 'c5d',
1618
+ 'c5n',
1619
+ 'c6a',
1620
+ 'c6g',
1621
+ 'c6gd',
1622
+ 'c6gn',
1623
+ 'c6i',
1624
+ 'c6id',
1625
+ 'c6in',
1626
+ 'c7a',
1627
+ 'c7g',
1628
+ 'c7gd',
1629
+ 'c7gn',
1630
+ 'c7i',
1631
+ 'c7i-flex',
1632
+ 'c8g',
1633
+ 'c8gd',
1634
+ 'cax',
1635
+ 'ccx',
1636
+ 'cpx',
1637
+ 'cx',
1638
+ 'd2',
1639
+ 'd3',
1640
+ 'd3en',
1641
+ 'dl1',
1642
+ 'dl2q',
1643
+ 'e2',
1644
+ 'f1',
1645
+ 'f2',
1646
+ 'g1',
1647
+ 'g2',
1648
+ 'g4ad',
1649
+ 'g4dn',
1650
+ 'g5',
1651
+ 'g5g',
1652
+ 'g6',
1653
+ 'g6e',
1654
+ 'gr6',
1655
+ 'h1',
1656
+ 'h3',
1657
+ 'hpc6a',
1658
+ 'hpc6id',
1659
+ 'hpc7a',
1660
+ 'hpc7g',
1661
+ 'i2',
1662
+ 'i3',
1663
+ 'i3en',
1664
+ 'i4g',
1665
+ 'i4i',
1666
+ 'i7i',
1667
+ 'i7ie',
1668
+ 'i8g',
1669
+ 'im4gn',
1670
+ 'inf1',
1671
+ 'inf2',
1672
+ 'is4gen',
1673
+ 'm1',
1674
+ 'm2',
1675
+ 'm3',
1676
+ 'm4',
1677
+ 'm5',
1678
+ 'm5a',
1679
+ 'm5ad',
1680
+ 'm5d',
1681
+ 'm5dn',
1682
+ 'm5n',
1683
+ 'm5zn',
1684
+ 'm6a',
1685
+ 'm6g',
1686
+ 'm6gd',
1687
+ 'm6i',
1688
+ 'm6id',
1689
+ 'm6idn',
1690
+ 'm6in',
1691
+ 'm7a',
1692
+ 'm7g',
1693
+ 'm7gd',
1694
+ 'm7i',
1695
+ 'm7i-flex',
1696
+ 'm8g',
1697
+ 'm8gd',
1698
+ 'n1',
1699
+ 'n2',
1700
+ 'n2d',
1701
+ 'n4',
1702
+ 'p3',
1703
+ 'p3dn',
1704
+ 'p4d',
1705
+ 'p4de',
1706
+ 'p5',
1707
+ 'p5e',
1708
+ 'p5en',
1709
+ 'p6-b200',
1710
+ 'r3',
1711
+ 'r4',
1712
+ 'r5',
1713
+ 'r5a',
1714
+ 'r5ad',
1715
+ 'r5b',
1716
+ 'r5d',
1717
+ 'r5dn',
1718
+ 'r5n',
1719
+ 'r6a',
1720
+ 'r6g',
1721
+ 'r6gd',
1722
+ 'r6i',
1723
+ 'r6id',
1724
+ 'r6idn',
1725
+ 'r6in',
1726
+ 'r7a',
1727
+ 'r7g',
1728
+ 'r7gd',
1729
+ 'r7i',
1730
+ 'r7iz',
1731
+ 'r8g',
1732
+ 'r8gd',
1733
+ 't2',
1734
+ 't2a',
1735
+ 't2d',
1736
+ 't3',
1737
+ 't3a',
1738
+ 't4g',
1739
+ 'trn1',
1740
+ 'trn1n',
1741
+ 'u-3tb1',
1742
+ 'u-6tb1',
1743
+ 'u7i-12tb',
1744
+ 'u7i-6tb',
1745
+ 'u7i-8tb',
1746
+ 'u7in-16tb',
1747
+ 'u7in-24tb',
1748
+ 'u7in-32tb',
1749
+ 'vt1',
1750
+ 'x1',
1751
+ 'x1e',
1752
+ 'x2gd',
1753
+ 'x2idn',
1754
+ 'x2iedn',
1755
+ 'x2iezn',
1756
+ 'x4',
1757
+ 'x8g',
1758
+ 'z1d',
1759
+ 'z3'
1760
+ ]
1761
+ },
1762
+ description: 'Allowed values for `cfke.io/instance-family`.'
1763
+ },
1764
+ 'topology.kubernetes.io/region': {
1765
+ type: 'array',
1766
+ items: {
1767
+ type: 'string',
1768
+ enum: [
1769
+ 'africa-south1',
1770
+ 'ap-northeast-1',
1771
+ 'ap-northeast-2',
1772
+ 'ap-northeast-3',
1773
+ 'ap-south-1',
1774
+ 'ap-southeast-1',
1775
+ 'ap-southeast-2',
1776
+ 'ash',
1777
+ 'asia-east1',
1778
+ 'asia-east2',
1779
+ 'asia-northeast1',
1780
+ 'asia-northeast2',
1781
+ 'asia-northeast3',
1782
+ 'asia-south1',
1783
+ 'asia-south2',
1784
+ 'asia-southeast1',
1785
+ 'asia-southeast2',
1786
+ 'australia-southeast1',
1787
+ 'australia-southeast2',
1788
+ 'ca-central-1',
1789
+ 'eu-central-1',
1790
+ 'eu-central-2',
1791
+ 'eu-north-1',
1792
+ 'eu-west-1',
1793
+ 'eu-west-2',
1794
+ 'eu-west-3',
1795
+ 'europe-central2',
1796
+ 'europe-north1',
1797
+ 'europe-southwest1',
1798
+ 'europe-west1',
1799
+ 'europe-west10',
1800
+ 'europe-west12',
1801
+ 'europe-west2',
1802
+ 'europe-west3',
1803
+ 'europe-west4',
1804
+ 'europe-west6',
1805
+ 'europe-west8',
1806
+ 'europe-west9',
1807
+ 'fsn1',
1808
+ 'hel1',
1809
+ 'hil',
1810
+ 'me-central1',
1811
+ 'me-central2',
1812
+ 'me-west1',
1813
+ 'nbg1',
1814
+ 'northamerica-northeast1',
1815
+ 'northamerica-northeast2',
1816
+ 'sa-east-1',
1817
+ 'sin',
1818
+ 'southamerica-east1',
1819
+ 'southamerica-west1',
1820
+ 'us-central1',
1821
+ 'us-east-1',
1822
+ 'us-east-2',
1823
+ 'us-east1',
1824
+ 'us-east4',
1825
+ 'us-east5',
1826
+ 'us-south1',
1827
+ 'us-west-1',
1828
+ 'us-west-2',
1829
+ 'us-west1',
1830
+ 'us-west2',
1831
+ 'us-west3',
1832
+ 'us-west4'
1833
+ ]
1834
+ },
1835
+ description: 'Allowed values for `topology.kubernetes.io/region`.'
1836
+ }
1837
+ },
1838
+ additionalProperties: false,
1839
+ 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. Omit a field to place no restriction on that key.'
1840
+ },
1841
+ scalingProfile: {
1842
+ type: 'string',
1843
+ description: 'Controls scale-up / scale-down responsiveness. `aggressive` prioritizes cost-optimization. `conservative` prioritizes stability of the fleet.',
1844
+ example: 'conservative',
1845
+ enum: [
1846
+ 'aggressive',
1847
+ 'conservative'
1848
+ ]
965
1849
  }
966
1850
  },
1851
+ required: [
1852
+ 'scalingProfile'
1853
+ ],
967
1854
  additionalProperties: false
968
1855
  };
969
1856
  export const InviteSchema = {
@@ -1216,6 +2103,15 @@ export const MarketplaceListingSchema = {
1216
2103
  export const OrganizationCreateInputSchema = {
1217
2104
  type: 'object',
1218
2105
  properties: {
2106
+ type: {
2107
+ type: 'string',
2108
+ description: 'Type of the organization. `business` for legal entities, `personal` for individuals.',
2109
+ example: 'business',
2110
+ enum: [
2111
+ 'business',
2112
+ 'personal'
2113
+ ]
2114
+ },
1219
2115
  email: {
1220
2116
  type: 'string',
1221
2117
  format: 'email',
@@ -1224,11 +2120,13 @@ export const OrganizationCreateInputSchema = {
1224
2120
  },
1225
2121
  first_name: {
1226
2122
  type: 'string',
2123
+ minLength: 1,
1227
2124
  description: 'First name of the billing contact person.',
1228
2125
  example: 'John'
1229
2126
  },
1230
2127
  last_name: {
1231
2128
  type: 'string',
2129
+ minLength: 1,
1232
2130
  description: 'Last name of the billing contact person.',
1233
2131
  example: 'Doe'
1234
2132
  },
@@ -1247,6 +2145,7 @@ export const OrganizationCreateInputSchema = {
1247
2145
  }
1248
2146
  },
1249
2147
  required: [
2148
+ 'type',
1250
2149
  'email',
1251
2150
  'first_name',
1252
2151
  'last_name',
@@ -1255,6 +2154,20 @@ export const OrganizationCreateInputSchema = {
1255
2154
  ],
1256
2155
  additionalProperties: false
1257
2156
  };
2157
+ export const OrganizationCreateOutputSchema = {
2158
+ type: 'object',
2159
+ properties: {
2160
+ id: {
2161
+ type: 'string',
2162
+ description: 'Unique identifier of the newly created organization. Generated by the API and safe to use for client-side tracking immediately.',
2163
+ example: 'organization-id'
2164
+ }
2165
+ },
2166
+ required: [
2167
+ 'id'
2168
+ ],
2169
+ additionalProperties: false
2170
+ };
1258
2171
  export const OrganizationSchema = {
1259
2172
  type: 'object',
1260
2173
  properties: {
@@ -1271,6 +2184,15 @@ export const OrganizationSchema = {
1271
2184
  description: 'Name of the legal entity. This name will be used in invoices. Use your first and last name for individual accounts.',
1272
2185
  example: 'ACME Corp.'
1273
2186
  },
2187
+ type: {
2188
+ type: 'string',
2189
+ description: 'Type of the organization. `business` for legal entities, `personal` for individuals.',
2190
+ example: 'business',
2191
+ enum: [
2192
+ 'business',
2193
+ 'personal'
2194
+ ]
2195
+ },
1274
2196
  date_created: {
1275
2197
  type: 'string',
1276
2198
  format: 'date-time',
@@ -1351,18 +2273,6 @@ export const OrganizationSchema = {
1351
2273
  minItems: 1,
1352
2274
  description: 'List of CFKE control plane versions available for the organization.'
1353
2275
  },
1354
- copilot_user_hourly_tokens: {
1355
- type: 'integer',
1356
- minimum: 0,
1357
- description: 'User-level maximum number of tokens Cloudfleet Copilot can process per hour.',
1358
- example: 42000
1359
- },
1360
- copilot_organization_hourly_tokens: {
1361
- type: 'integer',
1362
- minimum: 0,
1363
- description: 'Organization-level maximum number of tokens Cloudfleet Copilot can process per hour.',
1364
- example: 242000
1365
- },
1366
2276
  cfcr_storage_gb: {
1367
2277
  type: 'integer',
1368
2278
  minimum: -1,
@@ -1379,8 +2289,6 @@ export const OrganizationSchema = {
1379
2289
  'cluster_tiers',
1380
2290
  'regions',
1381
2291
  'versions',
1382
- 'copilot_user_hourly_tokens',
1383
- 'copilot_organization_hourly_tokens',
1384
2292
  'cfcr_storage_gb'
1385
2293
  ],
1386
2294
  additionalProperties: false,
@@ -1394,13 +2302,25 @@ export const OrganizationSchema = {
1394
2302
  'closed',
1395
2303
  'suspended'
1396
2304
  ]
2305
+ },
2306
+ verification: {
2307
+ type: 'string',
2308
+ 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.',
2309
+ example: 'verified',
2310
+ enum: [
2311
+ 'none',
2312
+ 'submitted',
2313
+ 'verified'
2314
+ ]
1397
2315
  }
1398
2316
  },
1399
2317
  required: [
1400
2318
  'id',
2319
+ 'type',
1401
2320
  'date_created',
1402
2321
  'quota',
1403
- 'status'
2322
+ 'status',
2323
+ 'verification'
1404
2324
  ],
1405
2325
  additionalProperties: false
1406
2326
  };
@@ -1551,18 +2471,6 @@ export const PlatformQuotaSchema = {
1551
2471
  minItems: 1,
1552
2472
  description: 'List of CFKE control plane versions available for the organization.'
1553
2473
  },
1554
- copilot_user_hourly_tokens: {
1555
- type: 'integer',
1556
- minimum: 0,
1557
- description: 'User-level maximum number of tokens Cloudfleet Copilot can process per hour.',
1558
- example: 42000
1559
- },
1560
- copilot_organization_hourly_tokens: {
1561
- type: 'integer',
1562
- minimum: 0,
1563
- description: 'Organization-level maximum number of tokens Cloudfleet Copilot can process per hour.',
1564
- example: 242000
1565
- },
1566
2474
  cfcr_storage_gb: {
1567
2475
  type: 'integer',
1568
2476
  minimum: -1,
@@ -1579,8 +2487,6 @@ export const PlatformQuotaSchema = {
1579
2487
  'cluster_tiers',
1580
2488
  'regions',
1581
2489
  'versions',
1582
- 'copilot_user_hourly_tokens',
1583
- 'copilot_organization_hourly_tokens',
1584
2490
  'cfcr_storage_gb'
1585
2491
  ],
1586
2492
  additionalProperties: false
@@ -1850,6 +2756,492 @@ export const RegistryTagSchema = {
1850
2756
  ],
1851
2757
  additionalProperties: false
1852
2758
  };
2759
+ export const TicketAttachmentSchema = {
2760
+ type: 'object',
2761
+ properties: {
2762
+ id: {
2763
+ type: 'string',
2764
+ description: 'Unique identifier of the attachment (Mongo ObjectId).',
2765
+ example: '60c72b2f9f1b2c001f8e4d3c'
2766
+ },
2767
+ filename: {
2768
+ type: 'string',
2769
+ description: 'Original filename as uploaded.',
2770
+ example: 'debug.log'
2771
+ },
2772
+ content_type: {
2773
+ type: 'string',
2774
+ description: 'MIME content type of the attachment.',
2775
+ example: 'text/plain'
2776
+ },
2777
+ size: {
2778
+ type: 'integer',
2779
+ description: 'Size of the attachment in bytes.',
2780
+ example: 12345
2781
+ }
2782
+ },
2783
+ required: [
2784
+ 'id',
2785
+ 'filename',
2786
+ 'content_type',
2787
+ 'size'
2788
+ ],
2789
+ additionalProperties: false
2790
+ };
2791
+ export const TicketCreateInputSchema = {
2792
+ type: 'object',
2793
+ properties: {
2794
+ category: {
2795
+ type: 'string',
2796
+ description: 'Ticket category. Drives auto-assignment and may carry a subcategory in `properties`.',
2797
+ example: 'technical',
2798
+ enum: [
2799
+ 'billing',
2800
+ 'technical',
2801
+ 'general'
2802
+ ]
2803
+ },
2804
+ body: {
2805
+ type: 'string',
2806
+ maxLength: 50000,
2807
+ minLength: 1,
2808
+ pattern: '\\S',
2809
+ description: 'Initial message body in markdown. There is no separate subject — the first message body is the description.',
2810
+ example: 'My cluster cannot reach the registry. Logs attached.'
2811
+ },
2812
+ properties: {
2813
+ type: 'object',
2814
+ additionalProperties: true,
2815
+ description: 'Free-form key/value bag set by the UI (e.g. `subcategory`, `cluster_id`, `cluster_name`, `region`).',
2816
+ example: {
2817
+ subcategory: 'cluster-question',
2818
+ cluster_id: '60c72b2f9f1b2c001f8e4d3a'
2819
+ }
2820
+ }
2821
+ },
2822
+ required: [
2823
+ 'category',
2824
+ 'body'
2825
+ ],
2826
+ additionalProperties: false
2827
+ };
2828
+ export const TicketListResponseSchema = {
2829
+ type: 'object',
2830
+ properties: {
2831
+ items: {
2832
+ type: 'array',
2833
+ items: {
2834
+ type: 'object',
2835
+ properties: {
2836
+ id: {
2837
+ type: 'string',
2838
+ description: 'Unique identifier of the ticket (Mongo ObjectId).',
2839
+ example: '60c72b2f9f1b2c001f8e4d3a'
2840
+ },
2841
+ status: {
2842
+ type: 'string',
2843
+ description: 'Current state of the ticket.',
2844
+ example: 'waiting_on_us',
2845
+ enum: [
2846
+ 'waiting_on_us',
2847
+ 'waiting_on_user',
2848
+ 'closed'
2849
+ ]
2850
+ },
2851
+ category: {
2852
+ type: 'string',
2853
+ description: 'Ticket category.',
2854
+ example: 'technical',
2855
+ enum: [
2856
+ 'billing',
2857
+ 'technical',
2858
+ 'general'
2859
+ ]
2860
+ },
2861
+ summary: {
2862
+ type: 'string',
2863
+ description: 'First 128 characters of the initial message body, with markdown formatting and newlines stripped. Used for ticket list previews.',
2864
+ example: 'My cluster cannot reach the registry. Logs attached.'
2865
+ },
2866
+ closed_at: {
2867
+ type: 'string',
2868
+ format: 'date-time',
2869
+ nullable: true,
2870
+ description: 'Closure timestamp. Null while the ticket is open.',
2871
+ example: '2026-05-18T16:08:14.338Z'
2872
+ },
2873
+ date_created: {
2874
+ type: 'string',
2875
+ format: 'date-time',
2876
+ description: 'Creation date of the ticket. ISO 8601 UTC.',
2877
+ example: '2026-05-11T16:08:14.338Z'
2878
+ },
2879
+ date_updated: {
2880
+ type: 'string',
2881
+ format: 'date-time',
2882
+ description: 'Last update date of the ticket. ISO 8601 UTC.',
2883
+ example: '2026-05-11T16:08:14.338Z'
2884
+ },
2885
+ messages: {
2886
+ type: 'array',
2887
+ items: {
2888
+ type: 'object',
2889
+ properties: {
2890
+ id: {
2891
+ type: 'string',
2892
+ description: 'Unique identifier of the message (Mongo ObjectId).',
2893
+ example: '60c72b2f9f1b2c001f8e4d3b'
2894
+ },
2895
+ type: {
2896
+ type: 'string',
2897
+ description: 'Message type. Internal notes are filtered out of customer-facing responses.',
2898
+ example: 'customer_reply',
2899
+ enum: [
2900
+ 'customer_reply',
2901
+ 'agent_reply'
2902
+ ]
2903
+ },
2904
+ body: {
2905
+ type: 'string',
2906
+ description: 'Message body in markdown.',
2907
+ example: 'Thanks — that resolved it on my side.'
2908
+ },
2909
+ author_first_name: {
2910
+ type: 'string',
2911
+ nullable: true,
2912
+ description: 'First name of the author. Null when not provided.',
2913
+ example: 'Jane'
2914
+ },
2915
+ author_last_name: {
2916
+ type: 'string',
2917
+ nullable: true,
2918
+ description: 'Last name of the author. Null when not provided.',
2919
+ example: 'Doe'
2920
+ },
2921
+ attachments: {
2922
+ type: 'array',
2923
+ items: {
2924
+ type: 'object',
2925
+ properties: {
2926
+ id: {
2927
+ type: 'string',
2928
+ description: 'Unique identifier of the attachment (Mongo ObjectId).',
2929
+ example: '60c72b2f9f1b2c001f8e4d3c'
2930
+ },
2931
+ filename: {
2932
+ type: 'string',
2933
+ description: 'Original filename as uploaded.',
2934
+ example: 'debug.log'
2935
+ },
2936
+ content_type: {
2937
+ type: 'string',
2938
+ description: 'MIME content type of the attachment.',
2939
+ example: 'text/plain'
2940
+ },
2941
+ size: {
2942
+ type: 'integer',
2943
+ description: 'Size of the attachment in bytes.',
2944
+ example: 12345
2945
+ }
2946
+ },
2947
+ required: [
2948
+ 'id',
2949
+ 'filename',
2950
+ 'content_type',
2951
+ 'size'
2952
+ ],
2953
+ additionalProperties: false
2954
+ },
2955
+ description: 'Attachments associated with this message.',
2956
+ example: []
2957
+ },
2958
+ date_created: {
2959
+ type: 'string',
2960
+ format: 'date-time',
2961
+ description: 'Creation date of the message. ISO 8601 UTC.',
2962
+ example: '2026-05-11T16:08:14.338Z'
2963
+ }
2964
+ },
2965
+ required: [
2966
+ 'id',
2967
+ 'type',
2968
+ 'body',
2969
+ 'date_created'
2970
+ ],
2971
+ additionalProperties: false
2972
+ },
2973
+ description: 'Messages on the ticket in chronological order. Internal notes are excluded. Returned by the detail endpoint only.'
2974
+ }
2975
+ },
2976
+ required: [
2977
+ 'id',
2978
+ 'status',
2979
+ 'category',
2980
+ 'summary',
2981
+ 'date_created',
2982
+ 'date_updated'
2983
+ ],
2984
+ additionalProperties: false
2985
+ },
2986
+ description: 'Tickets for the organization, ordered newest first. Messages are omitted from list responses.'
2987
+ }
2988
+ },
2989
+ required: [
2990
+ 'items'
2991
+ ],
2992
+ additionalProperties: false
2993
+ };
2994
+ export const TicketMessageInputSchema = {
2995
+ type: 'object',
2996
+ properties: {
2997
+ body: {
2998
+ type: 'string',
2999
+ maxLength: 50000,
3000
+ minLength: 1,
3001
+ pattern: '\\S',
3002
+ description: 'Reply body in markdown.',
3003
+ example: 'Thanks — that resolved it on my side.'
3004
+ }
3005
+ },
3006
+ required: [
3007
+ 'body'
3008
+ ],
3009
+ additionalProperties: false
3010
+ };
3011
+ export const TicketMessageSchema = {
3012
+ type: 'object',
3013
+ properties: {
3014
+ id: {
3015
+ type: 'string',
3016
+ description: 'Unique identifier of the message (Mongo ObjectId).',
3017
+ example: '60c72b2f9f1b2c001f8e4d3b'
3018
+ },
3019
+ type: {
3020
+ type: 'string',
3021
+ description: 'Message type. Internal notes are filtered out of customer-facing responses.',
3022
+ example: 'customer_reply',
3023
+ enum: [
3024
+ 'customer_reply',
3025
+ 'agent_reply'
3026
+ ]
3027
+ },
3028
+ body: {
3029
+ type: 'string',
3030
+ description: 'Message body in markdown.',
3031
+ example: 'Thanks — that resolved it on my side.'
3032
+ },
3033
+ author_first_name: {
3034
+ type: 'string',
3035
+ description: 'First name of the author. Null when not provided.',
3036
+ example: 'Jane'
3037
+ },
3038
+ author_last_name: {
3039
+ type: 'string',
3040
+ description: 'Last name of the author. Null when not provided.',
3041
+ example: 'Doe'
3042
+ },
3043
+ attachments: {
3044
+ type: 'array',
3045
+ items: {
3046
+ type: 'object',
3047
+ properties: {
3048
+ id: {
3049
+ type: 'string',
3050
+ description: 'Unique identifier of the attachment (Mongo ObjectId).',
3051
+ example: '60c72b2f9f1b2c001f8e4d3c'
3052
+ },
3053
+ filename: {
3054
+ type: 'string',
3055
+ description: 'Original filename as uploaded.',
3056
+ example: 'debug.log'
3057
+ },
3058
+ content_type: {
3059
+ type: 'string',
3060
+ description: 'MIME content type of the attachment.',
3061
+ example: 'text/plain'
3062
+ },
3063
+ size: {
3064
+ type: 'integer',
3065
+ description: 'Size of the attachment in bytes.',
3066
+ example: 12345
3067
+ }
3068
+ },
3069
+ required: [
3070
+ 'id',
3071
+ 'filename',
3072
+ 'content_type',
3073
+ 'size'
3074
+ ],
3075
+ additionalProperties: false
3076
+ },
3077
+ description: 'Attachments associated with this message.',
3078
+ example: []
3079
+ },
3080
+ date_created: {
3081
+ type: 'string',
3082
+ format: 'date-time',
3083
+ description: 'Creation date of the message. ISO 8601 UTC.',
3084
+ example: '2026-05-11T16:08:14.338Z'
3085
+ }
3086
+ },
3087
+ required: [
3088
+ 'id',
3089
+ 'type',
3090
+ 'body',
3091
+ 'date_created'
3092
+ ],
3093
+ additionalProperties: false
3094
+ };
3095
+ export const TicketSchema = {
3096
+ type: 'object',
3097
+ properties: {
3098
+ id: {
3099
+ type: 'string',
3100
+ description: 'Unique identifier of the ticket (Mongo ObjectId).',
3101
+ example: '60c72b2f9f1b2c001f8e4d3a'
3102
+ },
3103
+ status: {
3104
+ type: 'string',
3105
+ description: 'Current state of the ticket.',
3106
+ example: 'waiting_on_us',
3107
+ enum: [
3108
+ 'waiting_on_us',
3109
+ 'waiting_on_user',
3110
+ 'closed'
3111
+ ]
3112
+ },
3113
+ category: {
3114
+ type: 'string',
3115
+ description: 'Ticket category.',
3116
+ example: 'technical',
3117
+ enum: [
3118
+ 'billing',
3119
+ 'technical',
3120
+ 'general'
3121
+ ]
3122
+ },
3123
+ summary: {
3124
+ type: 'string',
3125
+ description: 'First 128 characters of the initial message body, with markdown formatting and newlines stripped. Used for ticket list previews.',
3126
+ example: 'My cluster cannot reach the registry. Logs attached.'
3127
+ },
3128
+ closed_at: {
3129
+ type: 'string',
3130
+ format: 'date-time',
3131
+ description: 'Closure timestamp. Null while the ticket is open.',
3132
+ example: '2026-05-18T16:08:14.338Z'
3133
+ },
3134
+ date_created: {
3135
+ type: 'string',
3136
+ format: 'date-time',
3137
+ description: 'Creation date of the ticket. ISO 8601 UTC.',
3138
+ example: '2026-05-11T16:08:14.338Z'
3139
+ },
3140
+ date_updated: {
3141
+ type: 'string',
3142
+ format: 'date-time',
3143
+ description: 'Last update date of the ticket. ISO 8601 UTC.',
3144
+ example: '2026-05-11T16:08:14.338Z'
3145
+ },
3146
+ messages: {
3147
+ type: 'array',
3148
+ items: {
3149
+ type: 'object',
3150
+ properties: {
3151
+ id: {
3152
+ type: 'string',
3153
+ description: 'Unique identifier of the message (Mongo ObjectId).',
3154
+ example: '60c72b2f9f1b2c001f8e4d3b'
3155
+ },
3156
+ type: {
3157
+ type: 'string',
3158
+ description: 'Message type. Internal notes are filtered out of customer-facing responses.',
3159
+ example: 'customer_reply',
3160
+ enum: [
3161
+ 'customer_reply',
3162
+ 'agent_reply'
3163
+ ]
3164
+ },
3165
+ body: {
3166
+ type: 'string',
3167
+ description: 'Message body in markdown.',
3168
+ example: 'Thanks — that resolved it on my side.'
3169
+ },
3170
+ author_first_name: {
3171
+ type: 'string',
3172
+ description: 'First name of the author. Null when not provided.',
3173
+ example: 'Jane'
3174
+ },
3175
+ author_last_name: {
3176
+ type: 'string',
3177
+ description: 'Last name of the author. Null when not provided.',
3178
+ example: 'Doe'
3179
+ },
3180
+ attachments: {
3181
+ type: 'array',
3182
+ items: {
3183
+ type: 'object',
3184
+ properties: {
3185
+ id: {
3186
+ type: 'string',
3187
+ description: 'Unique identifier of the attachment (Mongo ObjectId).',
3188
+ example: '60c72b2f9f1b2c001f8e4d3c'
3189
+ },
3190
+ filename: {
3191
+ type: 'string',
3192
+ description: 'Original filename as uploaded.',
3193
+ example: 'debug.log'
3194
+ },
3195
+ content_type: {
3196
+ type: 'string',
3197
+ description: 'MIME content type of the attachment.',
3198
+ example: 'text/plain'
3199
+ },
3200
+ size: {
3201
+ type: 'integer',
3202
+ description: 'Size of the attachment in bytes.',
3203
+ example: 12345
3204
+ }
3205
+ },
3206
+ required: [
3207
+ 'id',
3208
+ 'filename',
3209
+ 'content_type',
3210
+ 'size'
3211
+ ],
3212
+ additionalProperties: false
3213
+ },
3214
+ description: 'Attachments associated with this message.',
3215
+ example: []
3216
+ },
3217
+ date_created: {
3218
+ type: 'string',
3219
+ format: 'date-time',
3220
+ description: 'Creation date of the message. ISO 8601 UTC.',
3221
+ example: '2026-05-11T16:08:14.338Z'
3222
+ }
3223
+ },
3224
+ required: [
3225
+ 'id',
3226
+ 'type',
3227
+ 'body',
3228
+ 'date_created'
3229
+ ],
3230
+ additionalProperties: false
3231
+ },
3232
+ description: 'Messages on the ticket in chronological order. Internal notes are excluded. Returned by the detail endpoint only.'
3233
+ }
3234
+ },
3235
+ required: [
3236
+ 'id',
3237
+ 'status',
3238
+ 'category',
3239
+ 'summary',
3240
+ 'date_created',
3241
+ 'date_updated'
3242
+ ],
3243
+ additionalProperties: false
3244
+ };
1853
3245
  export const TokenCreateInputSchema = {
1854
3246
  type: 'object',
1855
3247
  properties: {