@truenas/api-client 1.0.2 → 1.0.3

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.
package/dist/index.cjs CHANGED
@@ -867,1172 +867,6 @@ var makeConnectionError = (message, hostname) => ({
867
867
  });
868
868
  var closedConnection = { state: "closed" };
869
869
 
870
- // src/config/api-version.config.ts
871
- var apiVersionConfig = {
872
- /**
873
- * Minimum supported API version.
874
- * Systems with older API versions will be rejected.
875
- */
876
- MIN_SUPPORTED_VERSION: "v25.10.0",
877
- /**
878
- * Maximum supported API version.
879
- * Systems with newer API versions will be rejected.
880
- */
881
- MAX_SUPPORTED_VERSION: "v26.0.0",
882
- /**
883
- * Fallback version to use when version discovery fails due to CORS/network errors.
884
- * When /api/versions returns HTTP status 0 (CORS block, network down, etc.),
885
- * the system will attempt to connect using this version as a best-effort fallback.
886
- *
887
- * WARNING: Status 0 errors have multiple causes:
888
- * - CORS policy blocking the request
889
- * - Network disconnected
890
- * - DNS lookup failure
891
- * - Server unreachable
892
- *
893
- * Using this fallback means systems with genuine network issues will still
894
- * attempt connection (and fail during WebSocket handshake instead of immediately).
895
- */
896
- FALLBACK_VERSION: "v25.10.0"
897
- };
898
-
899
- // src/types/api-version.type.ts
900
- var VersionCompatibility = /* @__PURE__ */ ((VersionCompatibility2) => {
901
- VersionCompatibility2["Compatible"] = "compatible";
902
- VersionCompatibility2["TooOld"] = "too-old";
903
- VersionCompatibility2["TooNew"] = "too-new";
904
- VersionCompatibility2["Invalid"] = "invalid";
905
- return VersionCompatibility2;
906
- })(VersionCompatibility || {});
907
-
908
- // src/utils/api-version.utils.ts
909
- var legacyCutoffYear = 25;
910
- function parseApiVersion(versionString) {
911
- const regex = /^v(\d{2})\.(\d+)\.(\d+)$/;
912
- const match = versionString.match(regex);
913
- if (!match) {
914
- return null;
915
- }
916
- const [, yearStr, minorStr, patchStr] = match;
917
- const year = parseInt(yearStr, 10);
918
- const minor = parseInt(minorStr, 10);
919
- const patch = parseInt(patchStr, 10);
920
- if (year <= legacyCutoffYear) {
921
- if (minor < 1 || minor > 12) {
922
- return null;
923
- }
924
- } else if (year >= 26) {
925
- if (minor < 0 || minor > 99) {
926
- return null;
927
- }
928
- }
929
- return {
930
- version: versionString,
931
- year,
932
- minor,
933
- patch,
934
- websocketPath: `/api/${versionString}`
935
- };
936
- }
937
- function compareVersions(a, b) {
938
- if (a.year !== b.year) {
939
- return a.year - b.year;
940
- }
941
- if (a.minor !== b.minor) {
942
- return a.minor - b.minor;
943
- }
944
- return a.patch - b.patch;
945
- }
946
- function checkVersionCompatibility(version) {
947
- const minVersion = parseApiVersion(apiVersionConfig.MIN_SUPPORTED_VERSION);
948
- const maxVersion = parseApiVersion(apiVersionConfig.MAX_SUPPORTED_VERSION);
949
- if (!minVersion || !maxVersion) {
950
- return "invalid" /* Invalid */;
951
- }
952
- if (compareVersions(version, minVersion) < 0) {
953
- return "too-old" /* TooOld */;
954
- }
955
- if (compareVersions(version, maxVersion) > 0) {
956
- return "too-new" /* TooNew */;
957
- }
958
- return "compatible" /* Compatible */;
959
- }
960
- function isVersionSupported(version) {
961
- return checkVersionCompatibility(version) === "compatible" /* Compatible */;
962
- }
963
- function filterCompatibleVersions(versions) {
964
- return versions.filter(isVersionSupported);
965
- }
966
- function getWebSocketPath(version) {
967
- return version.websocketPath;
968
- }
969
-
970
- // src/client/truenas-api-client.ts
971
- var TrueNasApiClient = class {
972
- constructor(uuid, hostnames, version, enabled, systemName, logger = noopLogger) {
973
- this.uuid = uuid;
974
- this.hostnames = hostnames;
975
- this.version = version;
976
- this.enabled = enabled;
977
- this.systemName = systemName;
978
- this.logger = logger;
979
- this.connection = this.createConnection();
980
- this.authenticator = this.createAuthenticator();
981
- this.api = this.createApi();
982
- this.ops = this.createOperations();
983
- }
984
- /**
985
- * Get current connection status.
986
- * @returns true if WebSocket is connected
987
- */
988
- get connected() {
989
- return this.connection.opened.getValue();
990
- }
991
- /**
992
- * Get current authentication status.
993
- * @returns true if authenticated with the system
994
- */
995
- get authenticated() {
996
- return this.authenticator.authenticated$.getValue();
997
- }
998
- /**
999
- * Close the WebSocket connection.
1000
- * Connection will automatically retry if retry is enabled.
1001
- */
1002
- close() {
1003
- this.connection.close();
1004
- }
1005
- /**
1006
- * Factory method to create the WebSocket connection.
1007
- * Override in subclasses to provide version-specific connection handling.
1008
- */
1009
- createConnection() {
1010
- const websocketPath = getWebSocketPath(this.version);
1011
- return new TrueNasConnection(
1012
- this.enabled,
1013
- this.hostnames,
1014
- this.uuid,
1015
- websocketPath,
1016
- this.systemName,
1017
- void 0,
1018
- // retryDelay (use default)
1019
- void 0,
1020
- // maxRetry (use default)
1021
- this.logger
1022
- );
1023
- }
1024
- /**
1025
- * Factory method to create the API handler.
1026
- * Override in subclasses to provide version-specific API implementations.
1027
- */
1028
- createApi() {
1029
- return new TrueNasApi(this.authenticator.authenticated$, this.connection);
1030
- }
1031
- /**
1032
- * Factory method to create the authenticator.
1033
- * Override in subclasses to provide version-specific authentication.
1034
- */
1035
- createAuthenticator() {
1036
- return new TrueNasAuthenticator(this.connection);
1037
- }
1038
- };
1039
-
1040
- // src/client/truenas-api-client-v25-10.ts
1041
- var TrueNasApiClientV2510 = class extends TrueNasApiClient {
1042
- /**
1043
- * Create v25.10-specific operation mappings
1044
- *
1045
- * virt.instance.* APIs return boolean (true) but emit job events via websocket.
1046
- * We use callAndGetJobId to capture the job ID, then track the job.
1047
- * All operations emit Job updates until the operation completes.
1048
- */
1049
- createOperations() {
1050
- return {
1051
- containerQuery: () => this.api.call("virt.instance.query" /* VirtualInstanceQuery */, [
1052
- [["type", "=", "CONTAINER" /* Container */]]
1053
- ]).pipe(rxjs.map((instances) => instances.map(this.toContainer))),
1054
- containerStart: (id) => this.api.callAndGetJobId("virt.instance.start" /* VirtualInstanceStart */, [id]).pipe(rxjs.switchMap((jobId) => this.api.trackJob(jobId))),
1055
- containerStop: (id, options) => this.api.callAndGetJobId("virt.instance.stop" /* VirtualInstanceStop */, [id, options]).pipe(rxjs.switchMap((jobId) => this.api.trackJob(jobId))),
1056
- containerRestart: (id, options) => this.api.callAndGetJobId("virt.instance.restart" /* VirtualInstanceRestart */, [
1057
- id,
1058
- options
1059
- ]).pipe(rxjs.switchMap((jobId) => this.api.trackJob(jobId)))
1060
- };
1061
- }
1062
- /**
1063
- * Transform VirtualInstanceQuery to unified Container type
1064
- */
1065
- toContainer(instance) {
1066
- return {
1067
- id: instance.id,
1068
- name: instance.name,
1069
- status: instance.status,
1070
- autostart: instance.autostart,
1071
- cpu: instance.cpu,
1072
- memory: instance.memory,
1073
- image: instance.image
1074
- };
1075
- }
1076
- };
1077
- var TrueNasApiClientV26 = class _TrueNasApiClientV26 extends TrueNasApiClient {
1078
- /**
1079
- * Map v26 status state string to AppState enum
1080
- */
1081
- static mapStatus(state) {
1082
- switch (state.toUpperCase()) {
1083
- case "RUNNING":
1084
- return "RUNNING" /* Running */;
1085
- case "STOPPED":
1086
- return "STOPPED" /* Stopped */;
1087
- case "STOPPING":
1088
- return "STOPPING" /* Stopping */;
1089
- default:
1090
- return "STOPPED" /* Stopped */;
1091
- }
1092
- }
1093
- /**
1094
- * Create v26-specific operation mappings
1095
- *
1096
- * Operations return Observable<Job | null>:
1097
- * - Async operations emit Job updates until complete
1098
- * - Sync operations emit null once
1099
- */
1100
- createOperations() {
1101
- return {
1102
- containerQuery: () => this.api.call("container.query" /* ContainerQuery */, [[]]).pipe(rxjs.map((containers) => containers.map(this.toContainer))),
1103
- // container.start is synchronous in v26.0.0 - emit null
1104
- containerStart: (id) => this.api.call("container.start" /* ContainerStart */, [parseInt(id, 10)]).pipe(rxjs.map(() => null)),
1105
- // container.stop emits job updates
1106
- containerStop: (id, options) => this.api.callAndGetJobId("container.stop" /* ContainerStop */, [
1107
- parseInt(id, 10),
1108
- {
1109
- force: options.force,
1110
- force_after_timeout: options.force
1111
- }
1112
- ]).pipe(rxjs.switchMap((jobId) => this.api.trackJob(jobId))),
1113
- // v26.0.0 doesn't have container.restart - chain stop + start
1114
- // Emits Job updates during stop, then null when start completes
1115
- containerRestart: (id, options) => {
1116
- const numericId = parseInt(id, 10);
1117
- return this.api.callAndGetJobId("container.stop" /* ContainerStop */, [
1118
- numericId,
1119
- {
1120
- force: options.force,
1121
- force_after_timeout: options.force
1122
- }
1123
- ]).pipe(
1124
- // Track stop job until it completes
1125
- rxjs.switchMap((stopJobId) => this.api.trackJob(stopJobId)),
1126
- // Collect all job updates to ensure stop fully completes
1127
- rxjs.toArray(),
1128
- // Re-emit job updates, then call start after stop is done
1129
- rxjs.switchMap(
1130
- (jobUpdates) => rxjs.concat(
1131
- rxjs.from(jobUpdates),
1132
- this.api.call("container.start" /* ContainerStart */, [numericId]).pipe(rxjs.map(() => null))
1133
- )
1134
- )
1135
- );
1136
- }
1137
- };
1138
- }
1139
- /**
1140
- * Transform v26 ContainerQueryV26 to unified Container type
1141
- */
1142
- toContainer(container) {
1143
- return {
1144
- id: container.id.toString(),
1145
- name: container.name,
1146
- status: _TrueNasApiClientV26.mapStatus(container.status.state),
1147
- autostart: container.autostart,
1148
- description: container.description
1149
- // cpu and memory are not available in v26 container.query
1150
- // image is not available in v26 container.query
1151
- };
1152
- }
1153
- };
1154
-
1155
- // src/errors/version-discovery.errors.ts
1156
- var VersionDiscoveryError = class extends Error {
1157
- constructor(message, hostname) {
1158
- super(message);
1159
- this.hostname = hostname;
1160
- this.name = this.constructor.name;
1161
- Object.setPrototypeOf(this, new.target.prototype);
1162
- }
1163
- };
1164
- var VersionTooOldError = class extends VersionDiscoveryError {
1165
- constructor(hostname, availableVersions, minRequired = apiVersionConfig.MIN_SUPPORTED_VERSION) {
1166
- super(
1167
- `System API version is too old. Minimum supported: ${minRequired}. Available versions: ${availableVersions.join(
1168
- ", "
1169
- )}`,
1170
- hostname
1171
- );
1172
- this.availableVersions = availableVersions;
1173
- this.minRequired = minRequired;
1174
- }
1175
- };
1176
- var VersionTooNewError = class extends VersionDiscoveryError {
1177
- constructor(hostname, availableVersions, maxSupported = apiVersionConfig.MAX_SUPPORTED_VERSION) {
1178
- super(
1179
- `System API version is too new. Maximum supported: ${maxSupported}. Available versions: ${availableVersions.join(
1180
- ", "
1181
- )}`,
1182
- hostname
1183
- );
1184
- this.availableVersions = availableVersions;
1185
- this.maxSupported = maxSupported;
1186
- }
1187
- };
1188
- var VersionEndpointNotFoundError = class extends VersionDiscoveryError {
1189
- constructor(hostname, statusCode = 404) {
1190
- super(
1191
- `Version discovery endpoint not found: ${hostname} (HTTP ${String(
1192
- statusCode
1193
- )})`,
1194
- hostname
1195
- );
1196
- this.statusCode = statusCode;
1197
- }
1198
- };
1199
- var VersionDiscoveryTimeoutError = class extends VersionDiscoveryError {
1200
- constructor(hostname, timeoutMs = 5e3) {
1201
- super(
1202
- `Cannot connect to system (timeout after ${String(
1203
- timeoutMs
1204
- )}ms): ${hostname}`,
1205
- hostname
1206
- );
1207
- this.timeoutMs = timeoutMs;
1208
- }
1209
- };
1210
- var VersionDiscoveryNetworkError = class extends VersionDiscoveryError {
1211
- constructor(hostname, originalError) {
1212
- super(
1213
- `Network error connecting to ${hostname}: ${originalError.message}`,
1214
- hostname
1215
- );
1216
- this.originalError = originalError;
1217
- }
1218
- };
1219
- var NoCompatibleVersionsError = class extends VersionDiscoveryError {
1220
- constructor(hostname, availableVersions, supportedRange = {
1221
- min: apiVersionConfig.MIN_SUPPORTED_VERSION,
1222
- max: apiVersionConfig.MAX_SUPPORTED_VERSION
1223
- }) {
1224
- super(
1225
- `No compatible API versions available. Supported: ${supportedRange.min} to ${supportedRange.max}. Available: ${availableVersions.join(", ")}`,
1226
- hostname
1227
- );
1228
- this.availableVersions = availableVersions;
1229
- this.supportedRange = supportedRange;
1230
- }
1231
- };
1232
- var InvalidVersionResponseError = class extends VersionDiscoveryError {
1233
- constructor(hostname, reason) {
1234
- super(`Invalid API response format from ${hostname}: ${reason}`, hostname);
1235
- this.reason = reason;
1236
- }
1237
- };
1238
- var discoveryTimeoutMs = 5e3;
1239
- function hasErrorName(error, expected) {
1240
- return typeof error === "object" && error !== null && "name" in error && error.name === expected;
1241
- }
1242
- var VersionDiscovery = class {
1243
- constructor(logger = noopLogger) {
1244
- this.logger = logger;
1245
- this.versionCache = /* @__PURE__ */ new Map();
1246
- }
1247
- /**
1248
- * Discovers the API version for a given hostname.
1249
- *
1250
- * Makes a GET request to `https://{hostname}/api/versions` and returns the latest
1251
- * compatible version. Results are cached per hostname; the cache entry is removed
1252
- * on failure so the next call retries.
1253
- *
1254
- * @param hostname - The TrueNAS system hostname (e.g., "truenas.local")
1255
- * @returns Observable that emits the selected ApiVersion
1256
- * @throws VersionDiscoveryError subclasses for specific failure scenarios
1257
- */
1258
- discoverVersion(hostname) {
1259
- const cached = this.versionCache.get(hostname);
1260
- if (cached) {
1261
- this.logger.info("Version discovery cache hit", { hostname });
1262
- return cached;
1263
- }
1264
- const url = `https://${hostname}/api/versions`;
1265
- this.logger.info("Starting version discovery", { hostname, url });
1266
- const discovery$ = rxjs.defer(() => rxjs.from(this.fetchVersions(hostname))).pipe(
1267
- operators.map((versionStrings) => this.selectVersion(hostname, versionStrings)),
1268
- operators.catchError((error) => {
1269
- this.versionCache.delete(hostname);
1270
- this.logger.error("Version discovery failed", { hostname, error });
1271
- return rxjs.throwError(() => this.classify(error, hostname));
1272
- }),
1273
- operators.shareReplay(1)
1274
- );
1275
- this.versionCache.set(hostname, discovery$);
1276
- return discovery$;
1277
- }
1278
- /**
1279
- * Clears the version cache for a specific hostname or all hostnames.
1280
- *
1281
- * @param hostname - Optional hostname to clear. If omitted, clears all cached versions.
1282
- */
1283
- clearCache(hostname) {
1284
- if (hostname) {
1285
- this.versionCache.delete(hostname);
1286
- } else {
1287
- this.versionCache.clear();
1288
- }
1289
- }
1290
- /**
1291
- * Performs the `fetch` with a 5-second `AbortController` timeout and inspects the
1292
- * *resolved* Response (fetch does not reject on non-2xx). Throws
1293
- * `VersionEndpointNotFoundError` on 404 and `InvalidVersionResponseError` on any
1294
- * other non-2xx or a body that is not an array of strings; lets `TypeError`
1295
- * (network) and `AbortError` (timeout) bubble to `classify`.
1296
- *
1297
- * The element-type check matters: a reachable server returning an array of
1298
- * non-strings (e.g. `[1, 2, 3]`) would otherwise reach `parseApiVersion`, whose
1299
- * `.match()` throws a `TypeError` on a non-string — which `classify` would then
1300
- * misfile as a network error. Validating here keeps it an `InvalidVersionResponseError`.
1301
- */
1302
- async fetchVersions(hostname) {
1303
- const url = `https://${hostname}/api/versions`;
1304
- const controller = new AbortController();
1305
- const timer2 = setTimeout(() => controller.abort(), discoveryTimeoutMs);
1306
- try {
1307
- const response = await fetch(url, { signal: controller.signal });
1308
- if (response.status === 404) {
1309
- throw new VersionEndpointNotFoundError(hostname);
1310
- }
1311
- if (!response.ok) {
1312
- throw new InvalidVersionResponseError(
1313
- hostname,
1314
- `HTTP ${String(response.status)}`
1315
- );
1316
- }
1317
- const body = await response.json();
1318
- if (!Array.isArray(body) || !body.every((v) => typeof v === "string")) {
1319
- throw new InvalidVersionResponseError(
1320
- hostname,
1321
- "Response was not an array of version strings"
1322
- );
1323
- }
1324
- return body;
1325
- } finally {
1326
- clearTimeout(timer2);
1327
- }
1328
- }
1329
- /**
1330
- * Parses, filters, and selects the latest compatible version from the raw response
1331
- * array. Throws the appropriate typed error when no valid/compatible version exists.
1332
- */
1333
- selectVersion(hostname, versionStrings) {
1334
- this.logger.info("Version discovery response received", {
1335
- hostname,
1336
- versionCount: versionStrings.length,
1337
- versions: versionStrings
1338
- });
1339
- const parsedVersions = versionStrings.map(parseApiVersion).filter((v) => v !== null);
1340
- if (parsedVersions.length === 0) {
1341
- this.logger.error("No valid versions in response", {
1342
- hostname,
1343
- versionStrings
1344
- });
1345
- throw new InvalidVersionResponseError(
1346
- hostname,
1347
- "No valid API versions found in response"
1348
- );
1349
- }
1350
- const compatibleVersions = filterCompatibleVersions(parsedVersions);
1351
- this.logger.info("Version compatibility check", {
1352
- hostname,
1353
- total: parsedVersions.length,
1354
- compatible: compatibleVersions.length,
1355
- supportedRange: {
1356
- min: apiVersionConfig.MIN_SUPPORTED_VERSION,
1357
- max: apiVersionConfig.MAX_SUPPORTED_VERSION
1358
- }
1359
- });
1360
- if (compatibleVersions.length === 0) {
1361
- const allTooOld = parsedVersions.every(
1362
- (v) => checkVersionCompatibility(v) === "too-old" /* TooOld */
1363
- );
1364
- const allTooNew = parsedVersions.every(
1365
- (v) => checkVersionCompatibility(v) === "too-new" /* TooNew */
1366
- );
1367
- const availableVersions = parsedVersions.map((v) => v.version);
1368
- if (allTooOld) {
1369
- this.logger.warn("All available versions too old", {
1370
- hostname,
1371
- availableVersions
1372
- });
1373
- throw new VersionTooOldError(hostname, availableVersions);
1374
- } else if (allTooNew) {
1375
- this.logger.warn("All available versions too new", {
1376
- hostname,
1377
- availableVersions
1378
- });
1379
- throw new VersionTooNewError(hostname, availableVersions);
1380
- } else {
1381
- this.logger.warn("No compatible versions found", {
1382
- hostname,
1383
- availableVersions
1384
- });
1385
- throw new NoCompatibleVersionsError(hostname, availableVersions);
1386
- }
1387
- }
1388
- const sortedVersions = compatibleVersions.sort(
1389
- (a, b) => compareVersions(b, a)
1390
- );
1391
- const selectedVersion = sortedVersions[0];
1392
- this.logger.info("Version selected", {
1393
- hostname,
1394
- selected: selectedVersion.version,
1395
- websocketPath: selectedVersion.websocketPath
1396
- });
1397
- return selectedVersion;
1398
- }
1399
- /**
1400
- * Maps a raw failure to a typed {@link VersionDiscoveryError}. Errors thrown by
1401
- * `fetchVersions`/`selectVersion` are already typed and pass through unchanged; a
1402
- * `fetch` `TypeError` becomes {@link VersionDiscoveryNetworkError} (the CORS/network
1403
- * sentinel), an `AbortError` becomes {@link VersionDiscoveryTimeoutError}, and any
1404
- * other failure (e.g. an unparseable body's `SyntaxError`) becomes
1405
- * {@link InvalidVersionResponseError}.
1406
- */
1407
- classify(error, hostname) {
1408
- if (error instanceof VersionDiscoveryError) {
1409
- return error;
1410
- }
1411
- if (hasErrorName(error, "AbortError")) {
1412
- this.logger.warn("Version discovery timeout", { hostname });
1413
- return new VersionDiscoveryTimeoutError(hostname);
1414
- }
1415
- if (error instanceof TypeError) {
1416
- this.logger.warn("Version discovery network error", {
1417
- hostname,
1418
- message: error.message
1419
- });
1420
- return new VersionDiscoveryNetworkError(hostname, error);
1421
- }
1422
- const reason = error instanceof Error ? error.message : "Unknown error";
1423
- this.logger.warn("Version discovery failed with unknown error", {
1424
- hostname,
1425
- reason
1426
- });
1427
- return new InvalidVersionResponseError(
1428
- hostname,
1429
- `Versioned API not available. This system may be running an older TrueNAS version (requires v25.10.0+). ${reason}`
1430
- );
1431
- }
1432
- };
1433
-
1434
- // src/factory.ts
1435
- async function createTrueNasClient(opts) {
1436
- const { uuid, hostnames, systemName } = opts;
1437
- const logger = opts.logger ?? noopLogger;
1438
- if (!hostnames || hostnames.length === 0) {
1439
- throw new Error(
1440
- `Cannot create client for system ${uuid}: hostnames array is empty`
1441
- );
1442
- }
1443
- const primaryHostname = hostnames[0];
1444
- const versionDiscovery = new VersionDiscovery(logger);
1445
- logger.info("Creating versioned API client", {
1446
- uuid: uuid.slice(0, 8),
1447
- hostname: primaryHostname,
1448
- systemName
1449
- });
1450
- let version;
1451
- try {
1452
- version = await rxjs.firstValueFrom(
1453
- versionDiscovery.discoverVersion(primaryHostname)
1454
- );
1455
- logger.info("API version discovered, instantiating client", {
1456
- uuid: uuid.slice(0, 8),
1457
- version: version.version,
1458
- websocketPath: version.websocketPath
1459
- });
1460
- } catch (error) {
1461
- const errorMessage = errorMessageOrDefault(error, "Unknown error");
1462
- if (!(error instanceof VersionDiscoveryNetworkError)) {
1463
- logger.error("Version discovery failed", {
1464
- uuid: uuid.slice(0, 8),
1465
- hostname: primaryHostname,
1466
- error: errorMessage,
1467
- errorType: error instanceof Error ? error.constructor.name : typeof error
1468
- });
1469
- throw error;
1470
- }
1471
- const fallbackVersionString = apiVersionConfig.FALLBACK_VERSION;
1472
- const fallbackVersion = parseApiVersion(fallbackVersionString);
1473
- if (!fallbackVersion) {
1474
- logger.error("Invalid fallback version configuration", {
1475
- uuid: uuid.slice(0, 8),
1476
- hostname: primaryHostname,
1477
- fallbackVersion: fallbackVersionString
1478
- });
1479
- throw error;
1480
- }
1481
- logger.warn(
1482
- "Version discovery failed with a network error (possible CORS or network issue), falling back to assumed version",
1483
- {
1484
- uuid: uuid.slice(0, 8),
1485
- hostname: primaryHostname,
1486
- fallbackVersion: fallbackVersionString,
1487
- originalError: errorMessage,
1488
- warning: "A network error has multiple causes (CORS, network down, DNS failure). The connection may still fail during the WebSocket handshake."
1489
- }
1490
- );
1491
- version = fallbackVersion;
1492
- }
1493
- return instantiateClientForVersion(version, opts, logger);
1494
- }
1495
- function instantiateClientForVersion(version, opts, logger) {
1496
- const { uuid, hostnames, enabled, systemName } = opts;
1497
- let versionKey;
1498
- if (version.year <= legacyCutoffYear) {
1499
- const monthPadded = version.minor.toString().padStart(2, "0");
1500
- versionKey = `${version.year.toString()}.${monthPadded}`;
1501
- } else {
1502
- versionKey = version.year.toString();
1503
- }
1504
- switch (versionKey) {
1505
- case "25.10":
1506
- logger.info("Instantiating TrueNasApiClientV2510", {
1507
- uuid: uuid.slice(0, 8),
1508
- version: version.version,
1509
- versionKey
1510
- });
1511
- return new TrueNasApiClientV2510(
1512
- uuid,
1513
- hostnames,
1514
- version,
1515
- enabled,
1516
- systemName,
1517
- logger
1518
- );
1519
- case "26":
1520
- logger.info("Instantiating TrueNasApiClientV26", {
1521
- uuid: uuid.slice(0, 8),
1522
- version: version.version,
1523
- versionKey
1524
- });
1525
- return new TrueNasApiClientV26(
1526
- uuid,
1527
- hostnames,
1528
- version,
1529
- enabled,
1530
- systemName,
1531
- logger
1532
- );
1533
- default:
1534
- logger.error("No client implementation for version", {
1535
- uuid: uuid.slice(0, 8),
1536
- version: version.version,
1537
- versionKey
1538
- });
1539
- throw new Error(
1540
- `No client implementation for API version ${version.version}. Supported versions: v25.10.x, v26.x.y. Version key: ${versionKey}`
1541
- );
1542
- }
1543
- }
1544
- function errorMessageOrDefault(error, fallback) {
1545
- if (error instanceof Error) {
1546
- return error.message;
1547
- }
1548
- if (typeof error === "object" && error !== null && "message" in error && typeof error.message === "string") {
1549
- return error.message;
1550
- }
1551
- return fallback;
1552
- }
1553
-
1554
- // src/generated/v25_04_0/index.ts
1555
- var v25_04_0_exports = {};
1556
- __export(v25_04_0_exports, {
1557
- Acltype: () => Acltype,
1558
- Action: () => Action,
1559
- AppContainerDetailsStateInput: () => AppContainerDetailsStateInput,
1560
- Authenticator: () => Authenticator,
1561
- Authmethod: () => Authmethod,
1562
- Basic: () => Basic,
1563
- Blocksize: () => Blocksize,
1564
- CloudBackupSnapshotItemType: () => CloudBackupSnapshotItemType,
1565
- CloudTaskAttributesEncryptionInput: () => CloudTaskAttributesEncryptionInput,
1566
- Credentials: () => Credentials,
1567
- DeviceGetInfoOtherTypeInput: () => DeviceGetInfoOtherTypeInput,
1568
- DockerStatusInfoStatusInput: () => DockerStatusInfoStatusInput,
1569
- Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput,
1570
- Encryption: () => Encryption,
1571
- Endpoint: () => Endpoint,
1572
- FilesystemDirEntryType: () => FilesystemDirEntryType,
1573
- Function: () => Function,
1574
- InitShutdownScriptCreateType: () => InitShutdownScriptCreateType,
1575
- InitShutdownScriptCreateTypeInput: () => InitShutdownScriptCreateTypeInput,
1576
- IscsiExtentCreateType: () => IscsiExtentCreateType,
1577
- IscsiExtentCreateTypeInput: () => IscsiExtentCreateTypeInput,
1578
- KeychainCredentialEntryType: () => KeychainCredentialEntryType,
1579
- KeychainCredentialEntryTypeInput: () => KeychainCredentialEntryTypeInput,
1580
- Level: () => Level,
1581
- Mode: () => Mode,
1582
- NFS4ACEType: () => NFS4ACEType,
1583
- NFS4ACETypeInput: () => NFS4ACETypeInput,
1584
- PoolScanStateInput: () => PoolScanStateInput,
1585
- Rpm: () => Rpm,
1586
- SMBEntryEncryptionInput: () => SMBEntryEncryptionInput,
1587
- STIGType: () => STIGType,
1588
- Source: () => Source,
1589
- State: () => State,
1590
- Status: () => Status,
1591
- Tag: () => Tag,
1592
- Unixcharset: () => Unixcharset,
1593
- Username: () => Username,
1594
- Vendor: () => Vendor,
1595
- When: () => When,
1596
- ZfsTierRewriteJobEntryStatusInput: () => ZfsTierRewriteJobEntryStatusInput
1597
- });
1598
-
1599
- // src/generated/v25_04_0/api-types.ts
1600
- var Acltype = {
1601
- Nfs4: "NFS4",
1602
- Posix1e: "POSIX1E"
1603
- };
1604
- var Action = {
1605
- Start: "START",
1606
- Stop: "STOP",
1607
- Pause: "PAUSE"
1608
- };
1609
- var AppContainerDetailsStateInput = {
1610
- Crashed: "crashed",
1611
- Created: "created",
1612
- Exited: "exited",
1613
- Running: "running",
1614
- Starting: "starting"
1615
- };
1616
- var Authenticator = {
1617
- Level1: "LEVEL_1",
1618
- Level2: "LEVEL_2"
1619
- };
1620
- var Authmethod = {
1621
- None: "NONE",
1622
- Chap: "CHAP",
1623
- ChapMutual: "CHAP_MUTUAL"
1624
- };
1625
- var Basic = {
1626
- Inherit: "INHERIT",
1627
- Noinherit: "NOINHERIT"
1628
- };
1629
- var Blocksize = {
1630
- "512": 512,
1631
- "1024": 1024,
1632
- "2048": 2048,
1633
- "4096": 4096
1634
- };
1635
- var CloudBackupSnapshotItemType = {
1636
- Dir: "dir",
1637
- File: "file"
1638
- };
1639
- var CloudTaskAttributesEncryptionInput = {
1640
- Null: null,
1641
- Aes256: "AES256"
1642
- };
1643
- var Credentials = {
1644
- UnixSocket: "UNIX_SOCKET",
1645
- LoginPassword: "LOGIN_PASSWORD",
1646
- LoginTwofactor: "LOGIN_TWOFACTOR",
1647
- LoginOnetimePassword: "LOGIN_ONETIME_PASSWORD",
1648
- ApiKey: "API_KEY",
1649
- Token: "TOKEN",
1650
- TruenasNode: "TRUENAS_NODE"
1651
- };
1652
- var DeviceGetInfoOtherTypeInput = {
1653
- Serial: "SERIAL",
1654
- Gpu: "GPU"
1655
- };
1656
- var DockerStatusInfoStatusInput = {
1657
- Pending: "PENDING",
1658
- Running: "RUNNING",
1659
- Stopped: "STOPPED",
1660
- Initializing: "INITIALIZING",
1661
- Stopping: "STOPPING",
1662
- Unconfigured: "UNCONFIGURED",
1663
- Failed: "FAILED",
1664
- Migrating: "MIGRATING",
1665
- MigrationFailed: "MIGRATION_FAILED"
1666
- };
1667
- var Enclosure2SetSlotStatusStatusInput = {
1668
- Clear: "CLEAR",
1669
- On: "ON",
1670
- Off: "OFF"
1671
- };
1672
- var Encryption = {
1673
- Default: "DEFAULT",
1674
- Negotiate: "NEGOTIATE",
1675
- Desired: "DESIRED",
1676
- Required: "REQUIRED"
1677
- };
1678
- var Endpoint = {
1679
- OvhEu: "ovh-eu",
1680
- OvhCa: "ovh-ca",
1681
- OvhUs: "ovh-us",
1682
- KimsufiEu: "kimsufi-eu",
1683
- KimsufiCa: "kimsufi-ca",
1684
- SoyoustartEu: "soyoustart-eu",
1685
- SoyoustartCa: "soyoustart-ca"
1686
- };
1687
- var FilesystemDirEntryType = {
1688
- Directory: "DIRECTORY",
1689
- File: "FILE",
1690
- Symlink: "SYMLINK",
1691
- Other: "OTHER"
1692
- };
1693
- var Function = {
1694
- Resilver: "RESILVER",
1695
- Scrub: "SCRUB"
1696
- };
1697
- var InitShutdownScriptCreateType = {
1698
- Command: "COMMAND",
1699
- Script: "SCRIPT"
1700
- };
1701
- var InitShutdownScriptCreateTypeInput = {
1702
- Command: "COMMAND",
1703
- Script: "SCRIPT"
1704
- };
1705
- var IscsiExtentCreateType = {
1706
- Disk: "DISK",
1707
- File: "FILE"
1708
- };
1709
- var IscsiExtentCreateTypeInput = {
1710
- Disk: "DISK",
1711
- File: "FILE"
1712
- };
1713
- var KeychainCredentialEntryType = {
1714
- SshKeyPair: "SSH_KEY_PAIR",
1715
- SshCredentials: "SSH_CREDENTIALS"
1716
- };
1717
- var KeychainCredentialEntryTypeInput = {
1718
- SshKeyPair: "SSH_KEY_PAIR",
1719
- SshCredentials: "SSH_CREDENTIALS"
1720
- };
1721
- var Level = {
1722
- Info: "INFO",
1723
- Notice: "NOTICE",
1724
- Warning: "WARNING",
1725
- Error: "ERROR",
1726
- Critical: "CRITICAL",
1727
- Alert: "ALERT",
1728
- Emergency: "EMERGENCY"
1729
- };
1730
- var Mode = {
1731
- Iscsi: "ISCSI",
1732
- Fc: "FC",
1733
- Both: "BOTH"
1734
- };
1735
- var NFS4ACEType = {
1736
- Allow: "ALLOW",
1737
- Deny: "DENY"
1738
- };
1739
- var NFS4ACETypeInput = {
1740
- Allow: "ALLOW",
1741
- Deny: "DENY"
1742
- };
1743
- var PoolScanStateInput = {
1744
- Scanning: "SCANNING",
1745
- Finished: "FINISHED",
1746
- Canceled: "CANCELED"
1747
- };
1748
- var Rpm = {
1749
- Unknown: "UNKNOWN",
1750
- Ssd: "SSD",
1751
- "5400": "5400",
1752
- "7200": "7200",
1753
- "10000": "10000",
1754
- "15000": "15000"
1755
- };
1756
- var SMBEntryEncryptionInput = {
1757
- Default: "DEFAULT",
1758
- Negotiate: "NEGOTIATE",
1759
- Desired: "DESIRED",
1760
- Required: "REQUIRED"
1761
- };
1762
- var Source = {
1763
- Local: "LOCAL",
1764
- Activedirectory: "ACTIVEDIRECTORY",
1765
- Ldap: "LDAP"
1766
- };
1767
- var State = {
1768
- Crashed: "crashed",
1769
- Created: "created",
1770
- Exited: "exited",
1771
- Running: "running",
1772
- Starting: "starting"
1773
- };
1774
- var Status = {
1775
- Pending: "PENDING",
1776
- Running: "RUNNING",
1777
- Stopped: "STOPPED",
1778
- Initializing: "INITIALIZING",
1779
- Stopping: "STOPPING",
1780
- Unconfigured: "UNCONFIGURED",
1781
- Failed: "FAILED"
1782
- };
1783
- var STIGType = {
1784
- "0": 0,
1785
- "1": 1
1786
- };
1787
- var Tag = {
1788
- Owner: "owner@",
1789
- Group: "group@",
1790
- Everyone: "everyone@",
1791
- User: "USER",
1792
- "GROUP": "GROUP"
1793
- };
1794
- var Unixcharset = {
1795
- Utf8: "UTF-8",
1796
- Gb2312: "GB2312",
1797
- HzGb2312: "HZ-GB-2312",
1798
- Cp1361: "CP1361",
1799
- Big5: "BIG5",
1800
- Big5hkscs: "BIG5HKSCS",
1801
- Cp037: "CP037",
1802
- Cp273: "CP273",
1803
- Cp424: "CP424",
1804
- Cp437: "CP437",
1805
- Cp500: "CP500",
1806
- Cp775: "CP775",
1807
- Cp850: "CP850",
1808
- Cp852: "CP852",
1809
- Cp855: "CP855",
1810
- Cp857: "CP857",
1811
- Cp858: "CP858",
1812
- Cp860: "CP860",
1813
- Cp861: "CP861",
1814
- Cp862: "CP862",
1815
- Cp863: "CP863",
1816
- Cp864: "CP864",
1817
- Cp865: "CP865",
1818
- Cp866: "CP866",
1819
- Cp869: "CP869",
1820
- Cp932: "CP932",
1821
- Cp949: "CP949",
1822
- Cp950: "CP950",
1823
- Cp1026: "CP1026",
1824
- Cp1125: "CP1125",
1825
- Cp1140: "CP1140",
1826
- Cp1250: "CP1250",
1827
- Cp1251: "CP1251",
1828
- Cp1252: "CP1252",
1829
- Cp1253: "CP1253",
1830
- Cp1254: "CP1254",
1831
- Cp1255: "CP1255",
1832
- Cp1256: "CP1256",
1833
- Cp1257: "CP1257",
1834
- Cp1258: "CP1258",
1835
- EucJis2004: "EUC_JIS_2004",
1836
- EucJisx0213: "EUC_JISX0213",
1837
- EucJp: "EUC_JP",
1838
- EucKr: "EUC_KR",
1839
- Gb18030: "GB18030",
1840
- Gbk: "GBK",
1841
- Hz: "HZ",
1842
- Iso2022Jp: "ISO2022_JP",
1843
- Iso2022Jp1: "ISO2022_JP_1",
1844
- Iso2022Jp2: "ISO2022_JP_2",
1845
- Iso2022Jp2004: "ISO2022_JP_2004",
1846
- Iso2022Jp3: "ISO2022_JP_3",
1847
- Iso2022JpExt: "ISO2022_JP_EXT",
1848
- Iso2022Kr: "ISO2022_KR",
1849
- Iso88591: "ISO8859_1",
1850
- Iso88592: "ISO8859_2",
1851
- Iso88593: "ISO8859_3",
1852
- Iso88594: "ISO8859_4",
1853
- Iso88595: "ISO8859_5",
1854
- Iso88596: "ISO8859_6",
1855
- Iso88597: "ISO8859_7",
1856
- Iso88598: "ISO8859_8",
1857
- Iso88599: "ISO8859_9",
1858
- Iso885910: "ISO8859_10",
1859
- Iso885911: "ISO8859_11",
1860
- Iso885913: "ISO8859_13",
1861
- Iso885914: "ISO8859_14",
1862
- Iso885915: "ISO8859_15",
1863
- Iso885916: "ISO8859_16",
1864
- Johab: "JOHAB",
1865
- Koi8R: "KOI8_R",
1866
- Kz1048: "KZ1048",
1867
- Latin1: "LATIN_1",
1868
- MacCyrillic: "MAC_CYRILLIC",
1869
- MacGreek: "MAC_GREEK",
1870
- MacIceland: "MAC_ICELAND",
1871
- MacLatin2: "MAC_LATIN2",
1872
- MacRoman: "MAC_ROMAN",
1873
- MacTurkish: "MAC_TURKISH",
1874
- Ptcp154: "PTCP154",
1875
- ShiftJis: "SHIFT_JIS",
1876
- ShiftJis2004: "SHIFT_JIS_2004",
1877
- ShiftJisx0213: "SHIFT_JISX0213",
1878
- Tis620: "TIS_620",
1879
- Utf16: "UTF_16",
1880
- Utf16Be: "UTF_16_BE",
1881
- Utf16Le: "UTF_16_LE"
1882
- };
1883
- var Username = {
1884
- Root: "root",
1885
- TruenasAdmin: "truenas_admin"
1886
- };
1887
- var Vendor = {
1888
- Nextcloud: "NEXTCLOUD",
1889
- Owncloud: "OWNCLOUD",
1890
- Sharepoint: "SHAREPOINT",
1891
- Other: "OTHER"
1892
- };
1893
- var When = {
1894
- Preinit: "PREINIT",
1895
- Postinit: "POSTINIT",
1896
- Shutdown: "SHUTDOWN"
1897
- };
1898
- var ZfsTierRewriteJobEntryStatusInput = {
1899
- Complete: "COMPLETE",
1900
- Running: "RUNNING",
1901
- Queued: "QUEUED",
1902
- Cancelled: "CANCELLED",
1903
- Stopped: "STOPPED",
1904
- Error: "ERROR"
1905
- };
1906
-
1907
- // src/generated/v25_04_1/index.ts
1908
- var v25_04_1_exports = {};
1909
- __export(v25_04_1_exports, {
1910
- Acltype: () => Acltype,
1911
- Action: () => Action,
1912
- AppContainerDetailsStateInput: () => AppContainerDetailsStateInput,
1913
- Authenticator: () => Authenticator,
1914
- Authmethod: () => Authmethod,
1915
- Basic: () => Basic,
1916
- Blocksize: () => Blocksize,
1917
- CloudBackupSnapshotItemType: () => CloudBackupSnapshotItemType,
1918
- CloudTaskAttributesEncryptionInput: () => CloudTaskAttributesEncryptionInput,
1919
- Credentials: () => Credentials,
1920
- DeviceGetInfoOtherTypeInput: () => DeviceGetInfoOtherTypeInput,
1921
- DockerStatusInfoStatusInput: () => DockerStatusInfoStatusInput,
1922
- Encryption: () => Encryption,
1923
- Endpoint: () => Endpoint,
1924
- FilesystemDirEntryType: () => FilesystemDirEntryType,
1925
- Function: () => Function,
1926
- InitShutdownScriptCreateType: () => InitShutdownScriptCreateType,
1927
- InitShutdownScriptCreateTypeInput: () => InitShutdownScriptCreateTypeInput,
1928
- IscsiExtentCreateType: () => IscsiExtentCreateType,
1929
- IscsiExtentCreateTypeInput: () => IscsiExtentCreateTypeInput,
1930
- KeychainCredentialEntryType: () => KeychainCredentialEntryType,
1931
- KeychainCredentialEntryTypeInput: () => KeychainCredentialEntryTypeInput,
1932
- Level: () => Level,
1933
- Mode: () => Mode,
1934
- NFS4ACEType: () => NFS4ACEType,
1935
- NFS4ACETypeInput: () => NFS4ACETypeInput,
1936
- PoolScanStateInput: () => PoolScanStateInput,
1937
- Rpm: () => Rpm,
1938
- SMBEntryEncryptionInput: () => SMBEntryEncryptionInput,
1939
- STIGType: () => STIGType,
1940
- Source: () => Source,
1941
- State: () => State,
1942
- Status: () => Status,
1943
- Tag: () => Tag,
1944
- Unixcharset: () => Unixcharset,
1945
- Username: () => Username,
1946
- Vendor: () => Vendor,
1947
- When: () => When,
1948
- ZfsTierRewriteJobEntryStatusInput: () => ZfsTierRewriteJobEntryStatusInput
1949
- });
1950
-
1951
- // src/generated/v25_04_2/index.ts
1952
- var v25_04_2_exports = {};
1953
- __export(v25_04_2_exports, {
1954
- Acltype: () => Acltype,
1955
- Action: () => Action,
1956
- AppContainerDetailsStateInput: () => AppContainerDetailsStateInput,
1957
- Authenticator: () => Authenticator,
1958
- Authmethod: () => Authmethod,
1959
- Basic: () => Basic,
1960
- Blocksize: () => Blocksize,
1961
- Bootloader: () => Bootloader,
1962
- CloudBackupSnapshotItemType: () => CloudBackupSnapshotItemType,
1963
- CloudTaskAttributesEncryptionInput: () => CloudTaskAttributesEncryptionInput,
1964
- Credentials: () => Credentials,
1965
- DeviceGetInfoOtherTypeInput: () => DeviceGetInfoOtherTypeInput,
1966
- DockerStatusInfoStatusInput: () => DockerStatusInfoStatusInput,
1967
- Encryption: () => Encryption,
1968
- Endpoint: () => Endpoint,
1969
- FilesystemDirEntryType: () => FilesystemDirEntryType,
1970
- Function: () => Function,
1971
- InitShutdownScriptCreateType: () => InitShutdownScriptCreateType,
1972
- InitShutdownScriptCreateTypeInput: () => InitShutdownScriptCreateTypeInput,
1973
- Iotype: () => Iotype,
1974
- IscsiExtentCreateType: () => IscsiExtentCreateType,
1975
- IscsiExtentCreateTypeInput: () => IscsiExtentCreateTypeInput,
1976
- KeychainCredentialEntryType: () => KeychainCredentialEntryType,
1977
- KeychainCredentialEntryTypeInput: () => KeychainCredentialEntryTypeInput,
1978
- Level: () => Level,
1979
- Mode: () => Mode,
1980
- NFS4ACEType: () => NFS4ACEType,
1981
- NFS4ACETypeInput: () => NFS4ACETypeInput,
1982
- PoolScanStateInput: () => PoolScanStateInput,
1983
- Resolution: () => Resolution,
1984
- Rpm: () => Rpm,
1985
- SMBEntryEncryptionInput: () => SMBEntryEncryptionInput,
1986
- STIGType: () => STIGType,
1987
- Source: () => Source,
1988
- State: () => State,
1989
- Status: () => Status,
1990
- Tag: () => Tag,
1991
- Time: () => Time,
1992
- Unixcharset: () => Unixcharset,
1993
- Username: () => Username,
1994
- VMDiskDeviceType: () => VMDiskDeviceType,
1995
- VMDiskDeviceTypeInput: () => VMDiskDeviceTypeInput,
1996
- Vendor: () => Vendor,
1997
- When: () => When,
1998
- ZfsTierRewriteJobEntryStatusInput: () => ZfsTierRewriteJobEntryStatusInput
1999
- });
2000
-
2001
- // src/generated/v25_04_2/api-types.ts
2002
- var Bootloader = {
2003
- UefiCsm: "UEFI_CSM",
2004
- Uefi: "UEFI"
2005
- };
2006
- var Iotype = {
2007
- Native: "NATIVE",
2008
- Threads: "THREADS",
2009
- IoUring: "IO_URING"
2010
- };
2011
- var Resolution = {
2012
- "1920x1200": "1920x1200",
2013
- "1920x1080": "1920x1080",
2014
- "1600x1200": "1600x1200",
2015
- "1600x900": "1600x900",
2016
- "1400x1050": "1400x1050",
2017
- "1280x1024": "1280x1024",
2018
- "1280x720": "1280x720",
2019
- "1024x768": "1024x768",
2020
- "800x600": "800x600",
2021
- "640x480": "640x480"
2022
- };
2023
- var Time = {
2024
- Local: "LOCAL",
2025
- Utc: "UTC"
2026
- };
2027
- var VMDiskDeviceType = {
2028
- Ahci: "AHCI",
2029
- Virtio: "VIRTIO"
2030
- };
2031
- var VMDiskDeviceTypeInput = {
2032
- Ahci: "AHCI",
2033
- Virtio: "VIRTIO"
2034
- };
2035
-
2036
870
  // src/generated/v25_10_0/index.ts
2037
871
  var v25_10_0_exports = {};
2038
872
  __export(v25_10_0_exports, {
@@ -2063,7 +897,7 @@ __export(v25_10_0_exports, {
2063
897
  DiskDetailsTypeInput: () => DiskDetailsTypeInput,
2064
898
  DiskWipeModeInput: () => DiskWipeModeInput,
2065
899
  DockerStatusInfoStatusInput: () => DockerStatusInfoStatusInput,
2066
- Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput2,
900
+ Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput,
2067
901
  Encryption: () => Encryption,
2068
902
  Endpoint: () => Endpoint,
2069
903
  Exec: () => Exec,
@@ -2163,6 +997,15 @@ var ACLTemplateEntryAcltypeInput = {
2163
997
  Nfs4: "NFS4",
2164
998
  Posix1e: "POSIX1E"
2165
999
  };
1000
+ var Acltype = {
1001
+ Nfs4: "NFS4",
1002
+ Posix1e: "POSIX1E"
1003
+ };
1004
+ var Action = {
1005
+ Start: "START",
1006
+ Stop: "STOP",
1007
+ Pause: "PAUSE"
1008
+ };
2166
1009
  var Advpowermgmt = {
2167
1010
  Disabled: "DISABLED",
2168
1011
  "1": "1",
@@ -2180,20 +1023,54 @@ var Algorithm = {
2180
1023
  Aes192Gcm: "AES-192-GCM",
2181
1024
  Aes256Gcm: "AES-256-GCM"
2182
1025
  };
1026
+ var AppContainerDetailsStateInput = {
1027
+ Crashed: "crashed",
1028
+ Created: "created",
1029
+ Exited: "exited",
1030
+ Running: "running",
1031
+ Starting: "starting"
1032
+ };
2183
1033
  var Atime = {
2184
1034
  On: "ON",
2185
1035
  Off: "OFF",
2186
1036
  Inherit: "INHERIT"
2187
1037
  };
1038
+ var Authenticator = {
1039
+ Level1: "LEVEL_1",
1040
+ Level2: "LEVEL_2"
1041
+ };
1042
+ var Authmethod = {
1043
+ None: "NONE",
1044
+ Chap: "CHAP",
1045
+ ChapMutual: "CHAP_MUTUAL"
1046
+ };
2188
1047
  var Autotrim = {
2189
1048
  On: "ON",
2190
1049
  Off: "OFF"
2191
1050
  };
1051
+ var Basic = {
1052
+ Inherit: "INHERIT",
1053
+ Noinherit: "NOINHERIT"
1054
+ };
1055
+ var Blocksize = {
1056
+ "512": 512,
1057
+ "1024": 1024,
1058
+ "2048": 2048,
1059
+ "4096": 4096
1060
+ };
1061
+ var Bootloader = {
1062
+ UefiCsm: "UEFI_CSM",
1063
+ Uefi: "UEFI"
1064
+ };
2192
1065
  var Casesensitivity = {
2193
1066
  Sensitive: "SENSITIVE",
2194
1067
  Insensitive: "INSENSITIVE",
2195
1068
  Inherit: "INHERIT"
2196
1069
  };
1070
+ var CloudBackupSnapshotItemType = {
1071
+ Dir: "dir",
1072
+ File: "file"
1073
+ };
2197
1074
  var CloudSyncCreateDirection = {
2198
1075
  Push: "PUSH",
2199
1076
  Pull: "PULL"
@@ -2202,6 +1079,10 @@ var CloudSyncCreateDirectionInput = {
2202
1079
  Push: "PUSH",
2203
1080
  Pull: "PULL"
2204
1081
  };
1082
+ var CloudTaskAttributesEncryptionInput = {
1083
+ Null: null,
1084
+ Aes256: "AES256"
1085
+ };
2205
1086
  var Code = {
2206
1087
  Normal: "NORMAL",
2207
1088
  Error: "ERROR"
@@ -2264,6 +1145,19 @@ var CorePingRemoteTypeInput = {
2264
1145
  Icmpv4: "ICMPV4",
2265
1146
  Icmpv6: "ICMPV6"
2266
1147
  };
1148
+ var Credentials = {
1149
+ UnixSocket: "UNIX_SOCKET",
1150
+ LoginPassword: "LOGIN_PASSWORD",
1151
+ LoginTwofactor: "LOGIN_TWOFACTOR",
1152
+ LoginOnetimePassword: "LOGIN_ONETIME_PASSWORD",
1153
+ ApiKey: "API_KEY",
1154
+ Token: "TOKEN",
1155
+ TruenasNode: "TRUENAS_NODE"
1156
+ };
1157
+ var DeviceGetInfoOtherTypeInput = {
1158
+ Serial: "SERIAL",
1159
+ Gpu: "GPU"
1160
+ };
2267
1161
  var DiskDetailsTypeInput = {
2268
1162
  Used: "USED",
2269
1163
  Unused: "UNUSED",
@@ -2274,11 +1168,37 @@ var DiskWipeModeInput = {
2274
1168
  Full: "FULL",
2275
1169
  FullRandom: "FULL_RANDOM"
2276
1170
  };
2277
- var Enclosure2SetSlotStatusStatusInput2 = {
1171
+ var DockerStatusInfoStatusInput = {
1172
+ Pending: "PENDING",
1173
+ Running: "RUNNING",
1174
+ Stopped: "STOPPED",
1175
+ Initializing: "INITIALIZING",
1176
+ Stopping: "STOPPING",
1177
+ Unconfigured: "UNCONFIGURED",
1178
+ Failed: "FAILED",
1179
+ Migrating: "MIGRATING",
1180
+ MigrationFailed: "MIGRATION_FAILED"
1181
+ };
1182
+ var Enclosure2SetSlotStatusStatusInput = {
2278
1183
  Clear: "CLEAR",
2279
1184
  On: "ON",
2280
1185
  Off: "OFF"
2281
1186
  };
1187
+ var Encryption = {
1188
+ Default: "DEFAULT",
1189
+ Negotiate: "NEGOTIATE",
1190
+ Desired: "DESIRED",
1191
+ Required: "REQUIRED"
1192
+ };
1193
+ var Endpoint = {
1194
+ OvhEu: "ovh-eu",
1195
+ OvhCa: "ovh-ca",
1196
+ OvhUs: "ovh-us",
1197
+ KimsufiEu: "kimsufi-eu",
1198
+ KimsufiCa: "kimsufi-ca",
1199
+ SoyoustartEu: "soyoustart-eu",
1200
+ SoyoustartCa: "soyoustart-ca"
1201
+ };
2282
1202
  var Exec = {
2283
1203
  On: "ON",
2284
1204
  Off: "OFF",
@@ -2289,6 +1209,16 @@ var Feature = {
2289
1209
  Fibrechannel: "FIBRECHANNEL",
2290
1210
  Vm: "VM"
2291
1211
  };
1212
+ var FilesystemDirEntryType = {
1213
+ Directory: "DIRECTORY",
1214
+ File: "FILE",
1215
+ Symlink: "SYMLINK",
1216
+ Other: "OTHER"
1217
+ };
1218
+ var Function = {
1219
+ Resilver: "RESILVER",
1220
+ Scrub: "SCRUB"
1221
+ };
2292
1222
  var GetDisplayDeviceType = {
2293
1223
  Spice: "SPICE",
2294
1224
  Vnc: "VNC"
@@ -2306,6 +1236,14 @@ var Hddstandby = {
2306
1236
  "300": "300",
2307
1237
  "330": "330"
2308
1238
  };
1239
+ var InitShutdownScriptCreateType = {
1240
+ Command: "COMMAND",
1241
+ Script: "SCRIPT"
1242
+ };
1243
+ var InitShutdownScriptCreateTypeInput = {
1244
+ Command: "COMMAND",
1245
+ Script: "SCRIPT"
1246
+ };
2309
1247
  var InterfaceCreateAliasTypeInput = {
2310
1248
  Inet: "INET",
2311
1249
  Inet6: "INET6"
@@ -2315,10 +1253,23 @@ var InterfaceCreateTypeInput = {
2315
1253
  LinkAggregation: "LINK_AGGREGATION",
2316
1254
  Vlan: "VLAN"
2317
1255
  };
1256
+ var Iotype = {
1257
+ Native: "NATIVE",
1258
+ Threads: "THREADS",
1259
+ IoUring: "IO_URING"
1260
+ };
2318
1261
  var IpmiChassisIdentifyVerb = {
2319
1262
  On: "ON",
2320
1263
  Off: "OFF"
2321
1264
  };
1265
+ var IscsiExtentCreateType = {
1266
+ Disk: "DISK",
1267
+ File: "FILE"
1268
+ };
1269
+ var IscsiExtentCreateTypeInput = {
1270
+ Disk: "DISK",
1271
+ File: "FILE"
1272
+ };
2322
1273
  var IscsiTargetCreateMode = {
2323
1274
  Iscsi: "ISCSI",
2324
1275
  Fc: "FC",
@@ -2329,6 +1280,23 @@ var IscsiTargetCreateModeInput = {
2329
1280
  Fc: "FC",
2330
1281
  Both: "BOTH"
2331
1282
  };
1283
+ var KeychainCredentialEntryType = {
1284
+ SshKeyPair: "SSH_KEY_PAIR",
1285
+ SshCredentials: "SSH_CREDENTIALS"
1286
+ };
1287
+ var KeychainCredentialEntryTypeInput = {
1288
+ SshKeyPair: "SSH_KEY_PAIR",
1289
+ SshCredentials: "SSH_CREDENTIALS"
1290
+ };
1291
+ var Level = {
1292
+ Info: "INFO",
1293
+ Notice: "NOTICE",
1294
+ Warning: "WARNING",
1295
+ Error: "ERROR",
1296
+ Critical: "CRITICAL",
1297
+ Alert: "ALERT",
1298
+ Emergency: "EMERGENCY"
1299
+ };
2332
1300
  var Name = {
2333
1301
  Cpu: "cpu",
2334
1302
  Cputemp: "cputemp",
@@ -2351,6 +1319,14 @@ var Name = {
2351
1319
  Upsload: "upsload",
2352
1320
  Upstemperature: "upstemperature"
2353
1321
  };
1322
+ var NFS4ACEType = {
1323
+ Allow: "ALLOW",
1324
+ Deny: "DENY"
1325
+ };
1326
+ var NFS4ACETypeInput = {
1327
+ Allow: "ALLOW",
1328
+ Deny: "DENY"
1329
+ };
2354
1330
  var Policy = {
2355
1331
  Immediately: "IMMEDIATELY",
2356
1332
  Hourly: "HOURLY",
@@ -2413,6 +1389,11 @@ var PoolDatasetDeleteResult = {
2413
1389
  Null: null,
2414
1390
  True: true
2415
1391
  };
1392
+ var PoolScanStateInput = {
1393
+ Scanning: "SCANNING",
1394
+ Finished: "FINISHED",
1395
+ Canceled: "CANCELED"
1396
+ };
2416
1397
  var Protocol = {
2417
1398
  Http: "HTTP",
2418
1399
  Https: "HTTPS"
@@ -2442,6 +1423,26 @@ var ReplicationCreateReadonlyInput = {
2442
1423
  Require: "REQUIRE",
2443
1424
  Ignore: "IGNORE"
2444
1425
  };
1426
+ var Resolution = {
1427
+ "1920x1200": "1920x1200",
1428
+ "1920x1080": "1920x1080",
1429
+ "1600x1200": "1600x1200",
1430
+ "1600x900": "1600x900",
1431
+ "1400x1050": "1400x1050",
1432
+ "1280x1024": "1280x1024",
1433
+ "1280x720": "1280x720",
1434
+ "1024x768": "1024x768",
1435
+ "800x600": "800x600",
1436
+ "640x480": "640x480"
1437
+ };
1438
+ var Rpm = {
1439
+ Unknown: "UNKNOWN",
1440
+ Ssd: "SSD",
1441
+ "5400": "5400",
1442
+ "7200": "7200",
1443
+ "10000": "10000",
1444
+ "15000": "15000"
1445
+ };
2445
1446
  var RsyncTaskCreateDirection = {
2446
1447
  Pull: "PULL",
2447
1448
  Push: "PUSH"
@@ -2505,6 +1506,12 @@ var Shutdown = {
2505
1506
  Lowbatt: "LOWBATT",
2506
1507
  Batt: "BATT"
2507
1508
  };
1509
+ var SMBEntryEncryptionInput = {
1510
+ Default: "DEFAULT",
1511
+ Negotiate: "NEGOTIATE",
1512
+ Desired: "DESIRED",
1513
+ Required: "REQUIRED"
1514
+ };
2508
1515
  var Snapdev = {
2509
1516
  Hidden: "HIDDEN",
2510
1517
  Visible: "VISIBLE",
@@ -2516,6 +1523,11 @@ var Snapdir = {
2516
1523
  Hidden: "HIDDEN",
2517
1524
  Inherit: "INHERIT"
2518
1525
  };
1526
+ var Source = {
1527
+ Local: "LOCAL",
1528
+ Activedirectory: "ACTIVEDIRECTORY",
1529
+ Ldap: "LDAP"
1530
+ };
2519
1531
  var SourceInput = {
2520
1532
  None: "NONE",
2521
1533
  Default: "DEFAULT",
@@ -2524,6 +1536,26 @@ var SourceInput = {
2524
1536
  Inherited: "INHERITED",
2525
1537
  Received: "RECEIVED"
2526
1538
  };
1539
+ var State = {
1540
+ Crashed: "crashed",
1541
+ Created: "created",
1542
+ Exited: "exited",
1543
+ Running: "running",
1544
+ Starting: "starting"
1545
+ };
1546
+ var Status = {
1547
+ Pending: "PENDING",
1548
+ Running: "RUNNING",
1549
+ Stopped: "STOPPED",
1550
+ Initializing: "INITIALIZING",
1551
+ Stopping: "STOPPING",
1552
+ Unconfigured: "UNCONFIGURED",
1553
+ Failed: "FAILED"
1554
+ };
1555
+ var STIGType = {
1556
+ "0": 0,
1557
+ "1": 1
1558
+ };
2527
1559
  var SupportNewTicketCommunityTypeInput = {
2528
1560
  Bug: "BUG",
2529
1561
  Feature: "FEATURE"
@@ -2558,11 +1590,22 @@ var SystemStateResult = {
2558
1590
  Ready: "READY",
2559
1591
  ShuttingDown: "SHUTTING_DOWN"
2560
1592
  };
1593
+ var Tag = {
1594
+ Owner: "owner@",
1595
+ Group: "group@",
1596
+ Everyone: "everyone@",
1597
+ User: "USER",
1598
+ "GROUP": "GROUP"
1599
+ };
2561
1600
  var Target = {
2562
1601
  Ws: "WS",
2563
1602
  Cli: "CLI",
2564
1603
  Rest: "REST"
2565
1604
  };
1605
+ var Time = {
1606
+ Local: "LOCAL",
1607
+ Utc: "UTC"
1608
+ };
2566
1609
  var Transport = {
2567
1610
  Ssh: "SSH",
2568
1611
  SshNetcat: "SSH+NETCAT",
@@ -2590,6 +1633,95 @@ var TunableCreateTypeInput = {
2590
1633
  Udev: "UDEV",
2591
1634
  Zfs: "ZFS"
2592
1635
  };
1636
+ var Unixcharset = {
1637
+ Utf8: "UTF-8",
1638
+ Gb2312: "GB2312",
1639
+ HzGb2312: "HZ-GB-2312",
1640
+ Cp1361: "CP1361",
1641
+ Big5: "BIG5",
1642
+ Big5hkscs: "BIG5HKSCS",
1643
+ Cp037: "CP037",
1644
+ Cp273: "CP273",
1645
+ Cp424: "CP424",
1646
+ Cp437: "CP437",
1647
+ Cp500: "CP500",
1648
+ Cp775: "CP775",
1649
+ Cp850: "CP850",
1650
+ Cp852: "CP852",
1651
+ Cp855: "CP855",
1652
+ Cp857: "CP857",
1653
+ Cp858: "CP858",
1654
+ Cp860: "CP860",
1655
+ Cp861: "CP861",
1656
+ Cp862: "CP862",
1657
+ Cp863: "CP863",
1658
+ Cp864: "CP864",
1659
+ Cp865: "CP865",
1660
+ Cp866: "CP866",
1661
+ Cp869: "CP869",
1662
+ Cp932: "CP932",
1663
+ Cp949: "CP949",
1664
+ Cp950: "CP950",
1665
+ Cp1026: "CP1026",
1666
+ Cp1125: "CP1125",
1667
+ Cp1140: "CP1140",
1668
+ Cp1250: "CP1250",
1669
+ Cp1251: "CP1251",
1670
+ Cp1252: "CP1252",
1671
+ Cp1253: "CP1253",
1672
+ Cp1254: "CP1254",
1673
+ Cp1255: "CP1255",
1674
+ Cp1256: "CP1256",
1675
+ Cp1257: "CP1257",
1676
+ Cp1258: "CP1258",
1677
+ EucJis2004: "EUC_JIS_2004",
1678
+ EucJisx0213: "EUC_JISX0213",
1679
+ EucJp: "EUC_JP",
1680
+ EucKr: "EUC_KR",
1681
+ Gb18030: "GB18030",
1682
+ Gbk: "GBK",
1683
+ Hz: "HZ",
1684
+ Iso2022Jp: "ISO2022_JP",
1685
+ Iso2022Jp1: "ISO2022_JP_1",
1686
+ Iso2022Jp2: "ISO2022_JP_2",
1687
+ Iso2022Jp2004: "ISO2022_JP_2004",
1688
+ Iso2022Jp3: "ISO2022_JP_3",
1689
+ Iso2022JpExt: "ISO2022_JP_EXT",
1690
+ Iso2022Kr: "ISO2022_KR",
1691
+ Iso88591: "ISO8859_1",
1692
+ Iso88592: "ISO8859_2",
1693
+ Iso88593: "ISO8859_3",
1694
+ Iso88594: "ISO8859_4",
1695
+ Iso88595: "ISO8859_5",
1696
+ Iso88596: "ISO8859_6",
1697
+ Iso88597: "ISO8859_7",
1698
+ Iso88598: "ISO8859_8",
1699
+ Iso88599: "ISO8859_9",
1700
+ Iso885910: "ISO8859_10",
1701
+ Iso885911: "ISO8859_11",
1702
+ Iso885913: "ISO8859_13",
1703
+ Iso885914: "ISO8859_14",
1704
+ Iso885915: "ISO8859_15",
1705
+ Iso885916: "ISO8859_16",
1706
+ Johab: "JOHAB",
1707
+ Koi8R: "KOI8_R",
1708
+ Kz1048: "KZ1048",
1709
+ Latin1: "LATIN_1",
1710
+ MacCyrillic: "MAC_CYRILLIC",
1711
+ MacGreek: "MAC_GREEK",
1712
+ MacIceland: "MAC_ICELAND",
1713
+ MacLatin2: "MAC_LATIN2",
1714
+ MacRoman: "MAC_ROMAN",
1715
+ MacTurkish: "MAC_TURKISH",
1716
+ Ptcp154: "PTCP154",
1717
+ ShiftJis: "SHIFT_JIS",
1718
+ ShiftJis2004: "SHIFT_JIS_2004",
1719
+ ShiftJisx0213: "SHIFT_JISX0213",
1720
+ Tis620: "TIS_620",
1721
+ Utf16: "UTF_16",
1722
+ Utf16Be: "UTF_16_BE",
1723
+ Utf16Le: "UTF_16_LE"
1724
+ };
2593
1725
  var UPSEntryMode = {
2594
1726
  Master: "MASTER",
2595
1727
  Slave: "SLAVE"
@@ -2598,6 +1730,24 @@ var UPSEntryModeInput = {
2598
1730
  Master: "MASTER",
2599
1731
  Slave: "SLAVE"
2600
1732
  };
1733
+ var Username = {
1734
+ Root: "root",
1735
+ TruenasAdmin: "truenas_admin"
1736
+ };
1737
+ var Vendor = {
1738
+ Nextcloud: "NEXTCLOUD",
1739
+ Owncloud: "OWNCLOUD",
1740
+ Sharepoint: "SHAREPOINT",
1741
+ Other: "OTHER"
1742
+ };
1743
+ var VMDiskDeviceType = {
1744
+ Ahci: "AHCI",
1745
+ Virtio: "VIRTIO"
1746
+ };
1747
+ var VMDiskDeviceTypeInput = {
1748
+ Ahci: "AHCI",
1749
+ Virtio: "VIRTIO"
1750
+ };
2601
1751
  var VMWareEntryStateStateInput = {
2602
1752
  Pending: "PENDING",
2603
1753
  Success: "SUCCESS",
@@ -2620,6 +1770,19 @@ var Volblocksize = {
2620
1770
  "64K": "64K",
2621
1771
  "128K": "128K"
2622
1772
  };
1773
+ var When = {
1774
+ Preinit: "PREINIT",
1775
+ Postinit: "POSTINIT",
1776
+ Shutdown: "SHUTDOWN"
1777
+ };
1778
+ var ZfsTierRewriteJobEntryStatusInput = {
1779
+ Complete: "COMPLETE",
1780
+ Running: "RUNNING",
1781
+ Queued: "QUEUED",
1782
+ Cancelled: "CANCELLED",
1783
+ Stopped: "STOPPED",
1784
+ Error: "ERROR"
1785
+ };
2623
1786
 
2624
1787
  // src/generated/v25_10_1/index.ts
2625
1788
  var v25_10_1_exports = {};
@@ -2652,7 +1815,7 @@ __export(v25_10_1_exports, {
2652
1815
  DiskWipeModeInput: () => DiskWipeModeInput,
2653
1816
  DockerStatusInfoStatus: () => DockerStatusInfoStatus,
2654
1817
  DockerStatusInfoStatusInput: () => DockerStatusInfoStatusInput,
2655
- Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput2,
1818
+ Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput,
2656
1819
  Encryption: () => Encryption,
2657
1820
  Endpoint: () => Endpoint,
2658
1821
  Exec: () => Exec,
@@ -2762,9 +1925,132 @@ var Purpose2 = {
2762
1925
  FcpShare: "FCP_SHARE"
2763
1926
  };
2764
1927
 
2765
- // src/generated/v25_10_2/index.ts
2766
- var v25_10_2_exports = {};
2767
- __export(v25_10_2_exports, {
1928
+ // src/generated/v25_10_2/index.ts
1929
+ var v25_10_2_exports = {};
1930
+ __export(v25_10_2_exports, {
1931
+ ACLTemplateEntryAcltypeInput: () => ACLTemplateEntryAcltypeInput,
1932
+ Aclmode: () => Aclmode,
1933
+ Acltype: () => Acltype,
1934
+ Action: () => Action,
1935
+ Advpowermgmt: () => Advpowermgmt,
1936
+ Algorithm: () => Algorithm,
1937
+ AppContainerDetailsStateInput: () => AppContainerDetailsStateInput,
1938
+ Atime: () => Atime,
1939
+ Authenticator: () => Authenticator,
1940
+ Authmethod: () => Authmethod,
1941
+ Autotrim: () => Autotrim,
1942
+ Basic: () => Basic,
1943
+ Blocksize: () => Blocksize,
1944
+ Bootloader: () => Bootloader,
1945
+ Casesensitivity: () => Casesensitivity,
1946
+ CloudBackupSnapshotItemType: () => CloudBackupSnapshotItemType,
1947
+ CloudSyncCreateDirection: () => CloudSyncCreateDirection,
1948
+ CloudSyncCreateDirectionInput: () => CloudSyncCreateDirectionInput,
1949
+ CloudTaskAttributesEncryptionInput: () => CloudTaskAttributesEncryptionInput,
1950
+ Code: () => Code,
1951
+ Compression: () => Compression,
1952
+ CorePingRemoteTypeInput: () => CorePingRemoteTypeInput,
1953
+ Credentials: () => Credentials,
1954
+ DeviceGetInfoOtherTypeInput: () => DeviceGetInfoOtherTypeInput,
1955
+ DiskDetailsTypeInput: () => DiskDetailsTypeInput,
1956
+ DiskWipeModeInput: () => DiskWipeModeInput,
1957
+ DockerStatusInfoStatus: () => DockerStatusInfoStatus,
1958
+ DockerStatusInfoStatusInput: () => DockerStatusInfoStatusInput,
1959
+ Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput,
1960
+ Encryption: () => Encryption,
1961
+ Endpoint: () => Endpoint,
1962
+ Exec: () => Exec,
1963
+ Feature: () => Feature,
1964
+ FilesystemDirEntryType: () => FilesystemDirEntryType,
1965
+ Function: () => Function,
1966
+ GetDisplayDeviceType: () => GetDisplayDeviceType,
1967
+ Hddstandby: () => Hddstandby,
1968
+ InitShutdownScriptCreateType: () => InitShutdownScriptCreateType,
1969
+ InitShutdownScriptCreateTypeInput: () => InitShutdownScriptCreateTypeInput,
1970
+ InterfaceCreateAliasTypeInput: () => InterfaceCreateAliasTypeInput,
1971
+ InterfaceCreateTypeInput: () => InterfaceCreateTypeInput,
1972
+ Iotype: () => Iotype,
1973
+ IpmiChassisIdentifyRequestVerb: () => IpmiChassisIdentifyRequestVerb,
1974
+ IscsiExtentCreateType: () => IscsiExtentCreateType,
1975
+ IscsiExtentCreateTypeInput: () => IscsiExtentCreateTypeInput,
1976
+ IscsiTargetCreateMode: () => IscsiTargetCreateMode,
1977
+ IscsiTargetCreateModeInput: () => IscsiTargetCreateModeInput,
1978
+ KeychainCredentialEntryType: () => KeychainCredentialEntryType,
1979
+ KeychainCredentialEntryTypeInput: () => KeychainCredentialEntryTypeInput,
1980
+ Level: () => Level,
1981
+ NFS4ACEType: () => NFS4ACEType,
1982
+ NFS4ACETypeInput: () => NFS4ACETypeInput,
1983
+ Name: () => Name,
1984
+ Policy: () => Policy,
1985
+ PoolCreateChecksum: () => PoolCreateChecksum,
1986
+ PoolCreateDeduplication: () => PoolCreateDeduplication,
1987
+ PoolCreateTopologyDataVdevDRAIDTypeInput: () => PoolCreateTopologyDataVdevDRAIDTypeInput,
1988
+ PoolDatasetCreateFilesystemAcltypeInput: () => PoolDatasetCreateFilesystemAcltypeInput,
1989
+ PoolDatasetCreateFilesystemChecksum: () => PoolDatasetCreateFilesystemChecksum,
1990
+ PoolDatasetCreateFilesystemDeduplication: () => PoolDatasetCreateFilesystemDeduplication,
1991
+ PoolDatasetCreateFilesystemReadonlyInput: () => PoolDatasetCreateFilesystemReadonlyInput,
1992
+ PoolDatasetDeleteResult: () => PoolDatasetDeleteResult,
1993
+ PoolScanStateInput: () => PoolScanStateInput,
1994
+ Protocol: () => Protocol,
1995
+ Purpose: () => Purpose2,
1996
+ Readonly: () => Readonly,
1997
+ ReplicationCountEligibleManualSnapshotsTransportInput: () => ReplicationCountEligibleManualSnapshotsTransportInput,
1998
+ ReplicationCreateReadonlyInput: () => ReplicationCreateReadonlyInput,
1999
+ Resolution: () => Resolution,
2000
+ Rpm: () => Rpm,
2001
+ RsyncTaskCreateDirection: () => RsyncTaskCreateDirection,
2002
+ RsyncTaskCreateDirectionInput: () => RsyncTaskCreateDirectionInput,
2003
+ RsyncTaskCreateMode: () => RsyncTaskCreateMode,
2004
+ RsyncTaskCreateModeInput: () => RsyncTaskCreateModeInput,
2005
+ SMBEntryEncryptionInput: () => SMBEntryEncryptionInput,
2006
+ STIGType: () => STIGType,
2007
+ Schema: () => Schema,
2008
+ Security: () => Security,
2009
+ Serialspeed: () => Serialspeed,
2010
+ ServiceControlVerb: () => ServiceControlVerb,
2011
+ Shutdown: () => Shutdown,
2012
+ Snapdev: () => Snapdev,
2013
+ Snapdir: () => Snapdir,
2014
+ Source: () => Source,
2015
+ SourceInput: () => SourceInput,
2016
+ State: () => State,
2017
+ SupportNewTicketCommunityTypeInput: () => SupportNewTicketCommunityTypeInput,
2018
+ Sync: () => Sync,
2019
+ SyslogServerTransportInput: () => SyslogServerTransportInput,
2020
+ Sysloglevel: () => Sysloglevel,
2021
+ SystemProductTypeResult: () => SystemProductTypeResult,
2022
+ SystemStateResult: () => SystemStateResult,
2023
+ Tag: () => Tag,
2024
+ Target: () => Target,
2025
+ Time: () => Time,
2026
+ Transport: () => Transport,
2027
+ TruecommandConfigChangedEventFieldsStatus: () => TruecommandConfigChangedEventFieldsStatus,
2028
+ TruecommandConfigChangedEventFieldsStatusInput: () => TruecommandConfigChangedEventFieldsStatusInput,
2029
+ TunableCreateType: () => TunableCreateType,
2030
+ TunableCreateTypeInput: () => TunableCreateTypeInput,
2031
+ UPSEntryMode: () => UPSEntryMode,
2032
+ UPSEntryModeInput: () => UPSEntryModeInput,
2033
+ Unixcharset: () => Unixcharset,
2034
+ Username: () => Username,
2035
+ VMDiskDeviceType: () => VMDiskDeviceType,
2036
+ VMDiskDeviceTypeInput: () => VMDiskDeviceTypeInput,
2037
+ VMWareEntryStateStateInput: () => VMWareEntryStateStateInput,
2038
+ VMWareMatchDatastoresWithDatasetsResultFilesystemType: () => VMWareMatchDatastoresWithDatasetsResultFilesystemType,
2039
+ Vendor: () => Vendor,
2040
+ Volblocksize: () => Volblocksize,
2041
+ When: () => When,
2042
+ ZfsTierRewriteJobEntryStatusInput: () => ZfsTierRewriteJobEntryStatusInput
2043
+ });
2044
+
2045
+ // src/generated/v25_10_2/api-types.ts
2046
+ var IpmiChassisIdentifyRequestVerb = {
2047
+ On: "ON",
2048
+ Off: "OFF"
2049
+ };
2050
+
2051
+ // src/generated/v25_10_3/index.ts
2052
+ var v25_10_3_exports = {};
2053
+ __export(v25_10_3_exports, {
2768
2054
  ACLTemplateEntryAcltypeInput: () => ACLTemplateEntryAcltypeInput,
2769
2055
  Aclmode: () => Aclmode,
2770
2056
  Acltype: () => Acltype,
@@ -2793,7 +2079,7 @@ __export(v25_10_2_exports, {
2793
2079
  DiskWipeModeInput: () => DiskWipeModeInput,
2794
2080
  DockerStatusInfoStatus: () => DockerStatusInfoStatus,
2795
2081
  DockerStatusInfoStatusInput: () => DockerStatusInfoStatusInput,
2796
- Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput2,
2082
+ Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput,
2797
2083
  Encryption: () => Encryption,
2798
2084
  Endpoint: () => Endpoint,
2799
2085
  Exec: () => Exec,
@@ -2879,15 +2165,9 @@ __export(v25_10_2_exports, {
2879
2165
  ZfsTierRewriteJobEntryStatusInput: () => ZfsTierRewriteJobEntryStatusInput
2880
2166
  });
2881
2167
 
2882
- // src/generated/v25_10_2/api-types.ts
2883
- var IpmiChassisIdentifyRequestVerb = {
2884
- On: "ON",
2885
- Off: "OFF"
2886
- };
2887
-
2888
- // src/generated/v25_10_3/index.ts
2889
- var v25_10_3_exports = {};
2890
- __export(v25_10_3_exports, {
2168
+ // src/generated/v25_10_4/index.ts
2169
+ var v25_10_4_exports = {};
2170
+ __export(v25_10_4_exports, {
2891
2171
  ACLTemplateEntryAcltypeInput: () => ACLTemplateEntryAcltypeInput,
2892
2172
  Aclmode: () => Aclmode,
2893
2173
  Acltype: () => Acltype,
@@ -2916,7 +2196,7 @@ __export(v25_10_3_exports, {
2916
2196
  DiskWipeModeInput: () => DiskWipeModeInput,
2917
2197
  DockerStatusInfoStatus: () => DockerStatusInfoStatus,
2918
2198
  DockerStatusInfoStatusInput: () => DockerStatusInfoStatusInput,
2919
- Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput2,
2199
+ Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput,
2920
2200
  Encryption: () => Encryption,
2921
2201
  Endpoint: () => Endpoint,
2922
2202
  Exec: () => Exec,
@@ -3002,9 +2282,9 @@ __export(v25_10_3_exports, {
3002
2282
  ZfsTierRewriteJobEntryStatusInput: () => ZfsTierRewriteJobEntryStatusInput
3003
2283
  });
3004
2284
 
3005
- // src/generated/v25_10_4/index.ts
3006
- var v25_10_4_exports = {};
3007
- __export(v25_10_4_exports, {
2285
+ // src/generated/v25_10_5/index.ts
2286
+ var v25_10_5_exports = {};
2287
+ __export(v25_10_5_exports, {
3008
2288
  ACLTemplateEntryAcltypeInput: () => ACLTemplateEntryAcltypeInput,
3009
2289
  Aclmode: () => Aclmode,
3010
2290
  Acltype: () => Acltype,
@@ -3033,7 +2313,7 @@ __export(v25_10_4_exports, {
3033
2313
  DiskWipeModeInput: () => DiskWipeModeInput,
3034
2314
  DockerStatusInfoStatus: () => DockerStatusInfoStatus,
3035
2315
  DockerStatusInfoStatusInput: () => DockerStatusInfoStatusInput,
3036
- Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput2,
2316
+ Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput,
3037
2317
  Encryption: () => Encryption,
3038
2318
  Endpoint: () => Endpoint,
3039
2319
  Exec: () => Exec,
@@ -3119,15 +2399,15 @@ __export(v25_10_4_exports, {
3119
2399
  ZfsTierRewriteJobEntryStatusInput: () => ZfsTierRewriteJobEntryStatusInput
3120
2400
  });
3121
2401
 
3122
- // src/generated/v25_10_5/index.ts
3123
- var v25_10_5_exports = {};
3124
- __export(v25_10_5_exports, {
2402
+ // src/generated/v26_0_0/index.ts
2403
+ var v26_0_0_exports = {};
2404
+ __export(v26_0_0_exports, {
3125
2405
  ACLTemplateEntryAcltypeInput: () => ACLTemplateEntryAcltypeInput,
3126
2406
  Aclmode: () => Aclmode,
3127
2407
  Acltype: () => Acltype,
3128
- Action: () => Action,
3129
2408
  Advpowermgmt: () => Advpowermgmt,
3130
2409
  Algorithm: () => Algorithm,
2410
+ AppContainerDetailsState: () => AppContainerDetailsState,
3131
2411
  AppContainerDetailsStateInput: () => AppContainerDetailsStateInput,
3132
2412
  Atime: () => Atime,
3133
2413
  Authenticator: () => Authenticator,
@@ -3143,6 +2423,10 @@ __export(v25_10_5_exports, {
3143
2423
  CloudTaskAttributesEncryptionInput: () => CloudTaskAttributesEncryptionInput,
3144
2424
  Code: () => Code,
3145
2425
  Compression: () => Compression,
2426
+ ContainerNICDeviceType: () => ContainerNICDeviceType,
2427
+ ContainerNICDeviceTypeInput: () => ContainerNICDeviceTypeInput,
2428
+ ContainerStatusState: () => ContainerStatusState,
2429
+ ContainerStatusStateInput: () => ContainerStatusStateInput,
3146
2430
  CorePingRemoteTypeInput: () => CorePingRemoteTypeInput,
3147
2431
  Credentials: () => Credentials,
3148
2432
  DeviceGetInfoOtherTypeInput: () => DeviceGetInfoOtherTypeInput,
@@ -3150,11 +2434,11 @@ __export(v25_10_5_exports, {
3150
2434
  DiskWipeModeInput: () => DiskWipeModeInput,
3151
2435
  DockerStatusInfoStatus: () => DockerStatusInfoStatus,
3152
2436
  DockerStatusInfoStatusInput: () => DockerStatusInfoStatusInput,
3153
- Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput2,
2437
+ Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput,
3154
2438
  Encryption: () => Encryption,
3155
2439
  Endpoint: () => Endpoint,
3156
2440
  Exec: () => Exec,
3157
- Feature: () => Feature,
2441
+ Feature: () => Feature2,
3158
2442
  FilesystemDirEntryType: () => FilesystemDirEntryType,
3159
2443
  Function: () => Function,
3160
2444
  GetDisplayDeviceType: () => GetDisplayDeviceType,
@@ -3163,6 +2447,7 @@ __export(v25_10_5_exports, {
3163
2447
  InitShutdownScriptCreateTypeInput: () => InitShutdownScriptCreateTypeInput,
3164
2448
  InterfaceCreateAliasTypeInput: () => InterfaceCreateAliasTypeInput,
3165
2449
  InterfaceCreateTypeInput: () => InterfaceCreateTypeInput,
2450
+ Interval: () => Interval,
3166
2451
  Iotype: () => Iotype,
3167
2452
  IpmiChassisIdentifyRequestVerb: () => IpmiChassisIdentifyRequestVerb,
3168
2453
  IscsiExtentCreateType: () => IscsiExtentCreateType,
@@ -3174,17 +2459,20 @@ __export(v25_10_5_exports, {
3174
2459
  Level: () => Level,
3175
2460
  NFS4ACEType: () => NFS4ACEType,
3176
2461
  NFS4ACETypeInput: () => NFS4ACETypeInput,
3177
- Name: () => Name,
2462
+ Name: () => Name2,
2463
+ Passkey: () => Passkey,
3178
2464
  Policy: () => Policy,
3179
2465
  PoolCreateChecksum: () => PoolCreateChecksum,
3180
2466
  PoolCreateDeduplication: () => PoolCreateDeduplication,
3181
- PoolCreateTopologyDataVdevDRAIDTypeInput: () => PoolCreateTopologyDataVdevDRAIDTypeInput,
2467
+ PoolCreateTopologyDedupVdevTypeInput: () => PoolCreateTopologyDedupVdevTypeInput,
3182
2468
  PoolDatasetCreateFilesystemAcltypeInput: () => PoolDatasetCreateFilesystemAcltypeInput,
3183
2469
  PoolDatasetCreateFilesystemChecksum: () => PoolDatasetCreateFilesystemChecksum,
3184
2470
  PoolDatasetCreateFilesystemDeduplication: () => PoolDatasetCreateFilesystemDeduplication,
3185
2471
  PoolDatasetCreateFilesystemReadonlyInput: () => PoolDatasetCreateFilesystemReadonlyInput,
3186
2472
  PoolDatasetDeleteResult: () => PoolDatasetDeleteResult,
2473
+ PoolScanState: () => PoolScanState,
3187
2474
  PoolScanStateInput: () => PoolScanStateInput,
2475
+ PoolScrubAction: () => PoolScrubAction,
3188
2476
  Protocol: () => Protocol,
3189
2477
  Purpose: () => Purpose2,
3190
2478
  Readonly: () => Readonly,
@@ -3201,13 +2489,13 @@ __export(v25_10_5_exports, {
3201
2489
  Schema: () => Schema,
3202
2490
  Security: () => Security,
3203
2491
  Serialspeed: () => Serialspeed,
2492
+ Service: () => Service,
3204
2493
  ServiceControlVerb: () => ServiceControlVerb,
3205
2494
  Shutdown: () => Shutdown,
3206
2495
  Snapdev: () => Snapdev,
3207
2496
  Snapdir: () => Snapdir,
3208
2497
  Source: () => Source,
3209
2498
  SourceInput: () => SourceInput,
3210
- State: () => State,
3211
2499
  SupportNewTicketCommunityTypeInput: () => SupportNewTicketCommunityTypeInput,
3212
2500
  Sync: () => Sync,
3213
2501
  SyslogServerTransportInput: () => SyslogServerTransportInput,
@@ -3233,12 +2521,109 @@ __export(v25_10_5_exports, {
3233
2521
  Vendor: () => Vendor,
3234
2522
  Volblocksize: () => Volblocksize,
3235
2523
  When: () => When,
3236
- ZfsTierRewriteJobEntryStatusInput: () => ZfsTierRewriteJobEntryStatusInput
2524
+ ZfsTierRewriteJobEntryStatus: () => ZfsTierRewriteJobEntryStatus,
2525
+ ZfsTierRewriteJobEntryStatusInput: () => ZfsTierRewriteJobEntryStatusInput,
2526
+ ZpoolScrubRunAction: () => ZpoolScrubRunAction
3237
2527
  });
3238
2528
 
3239
- // src/generated/v26_0_0/index.ts
3240
- var v26_0_0_exports = {};
3241
- __export(v26_0_0_exports, {
2529
+ // src/generated/v26_0_0/api-types.ts
2530
+ var AppContainerDetailsState = {
2531
+ Crashed: "crashed",
2532
+ Created: "created",
2533
+ Exited: "exited",
2534
+ Running: "running",
2535
+ Starting: "starting"
2536
+ };
2537
+ var ContainerNICDeviceType = {
2538
+ E1000: "E1000",
2539
+ Virtio: "VIRTIO"
2540
+ };
2541
+ var ContainerNICDeviceTypeInput = {
2542
+ E1000: "E1000",
2543
+ Virtio: "VIRTIO"
2544
+ };
2545
+ var ContainerStatusState = {
2546
+ Running: "RUNNING",
2547
+ Stopped: "STOPPED"
2548
+ };
2549
+ var ContainerStatusStateInput = {
2550
+ Running: "RUNNING",
2551
+ Stopped: "STOPPED"
2552
+ };
2553
+ var Feature2 = {
2554
+ Apps: "APPS",
2555
+ Dedup: "DEDUP",
2556
+ Fibrechannel: "FIBRECHANNEL",
2557
+ Sed: "SED",
2558
+ Support: "SUPPORT",
2559
+ Vms: "VMS",
2560
+ Zfstier: "ZFSTIER"
2561
+ };
2562
+ var Interval = {
2563
+ "30": 30,
2564
+ "60": 60
2565
+ };
2566
+ var Name2 = {
2567
+ Cpu: "cpu",
2568
+ Cputemp: "cputemp",
2569
+ Disk: "disk",
2570
+ Interface: "interface",
2571
+ Load: "load",
2572
+ Processes: "processes",
2573
+ Memory: "memory",
2574
+ Uptime: "uptime",
2575
+ Arcsize: "arcsize",
2576
+ Disktemp: "disktemp",
2577
+ Upscharge: "upscharge",
2578
+ Upsruntime: "upsruntime",
2579
+ Upsvoltage: "upsvoltage",
2580
+ Upscurrent: "upscurrent",
2581
+ Upsfrequency: "upsfrequency",
2582
+ Upsload: "upsload",
2583
+ Upstemperature: "upstemperature"
2584
+ };
2585
+ var Passkey = {
2586
+ Enabled: "ENABLED",
2587
+ Disabled: "DISABLED",
2588
+ Required: "REQUIRED"
2589
+ };
2590
+ var PoolCreateTopologyDedupVdevTypeInput = {
2591
+ Mirror: "MIRROR",
2592
+ Stripe: "STRIPE"
2593
+ };
2594
+ var PoolScanState = {
2595
+ Scanning: "SCANNING",
2596
+ Finished: "FINISHED",
2597
+ Canceled: "CANCELED"
2598
+ };
2599
+ var PoolScrubAction = {
2600
+ Start: "START",
2601
+ Stop: "STOP",
2602
+ Pause: "PAUSE"
2603
+ };
2604
+ var Service = {
2605
+ Middleware: "MIDDLEWARE",
2606
+ Smb: "SMB",
2607
+ Sudo: "SUDO",
2608
+ System: "SYSTEM"
2609
+ };
2610
+ var ZfsTierRewriteJobEntryStatus = {
2611
+ Complete: "COMPLETE",
2612
+ Running: "RUNNING",
2613
+ Queued: "QUEUED",
2614
+ Cancelled: "CANCELLED",
2615
+ Stopped: "STOPPED",
2616
+ Error: "ERROR"
2617
+ };
2618
+ var ZpoolScrubRunAction = {
2619
+ Start: "START",
2620
+ Pause: "PAUSE",
2621
+ Cancel: "CANCEL"
2622
+ };
2623
+
2624
+ // src/generated/v27_0_0/index.ts
2625
+ var v27_0_0_exports = {};
2626
+ __export(v27_0_0_exports, {
3242
2627
  ACLTemplateEntryAcltypeInput: () => ACLTemplateEntryAcltypeInput,
3243
2628
  Aclmode: () => Aclmode,
3244
2629
  Acltype: () => Acltype,
@@ -3271,7 +2656,7 @@ __export(v26_0_0_exports, {
3271
2656
  DiskWipeModeInput: () => DiskWipeModeInput,
3272
2657
  DockerStatusInfoStatus: () => DockerStatusInfoStatus,
3273
2658
  DockerStatusInfoStatusInput: () => DockerStatusInfoStatusInput,
3274
- Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput2,
2659
+ Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput,
3275
2660
  Encryption: () => Encryption,
3276
2661
  Endpoint: () => Endpoint,
3277
2662
  Exec: () => Exec,
@@ -3363,242 +2748,698 @@ __export(v26_0_0_exports, {
3363
2748
  ZpoolScrubRunAction: () => ZpoolScrubRunAction
3364
2749
  });
3365
2750
 
3366
- // src/generated/v26_0_0/api-types.ts
3367
- var AppContainerDetailsState = {
3368
- Crashed: "crashed",
3369
- Created: "created",
3370
- Exited: "exited",
3371
- Running: "running",
3372
- Starting: "starting"
3373
- };
3374
- var ContainerNICDeviceType = {
3375
- E1000: "E1000",
3376
- Virtio: "VIRTIO"
3377
- };
3378
- var ContainerNICDeviceTypeInput = {
3379
- E1000: "E1000",
3380
- Virtio: "VIRTIO"
3381
- };
3382
- var ContainerStatusState = {
3383
- Running: "RUNNING",
3384
- Stopped: "STOPPED"
2751
+ // src/generated/index.ts
2752
+ var SUPPORTED_API_VERSIONS = [
2753
+ "v25.10.0",
2754
+ "v25.10.1",
2755
+ "v25.10.2",
2756
+ "v25.10.3",
2757
+ "v25.10.4",
2758
+ "v25.10.5",
2759
+ "v26.0.0",
2760
+ "v27.0.0"
2761
+ ];
2762
+
2763
+ // src/config/api-version.config.ts
2764
+ var apiVersionConfig = {
2765
+ /**
2766
+ * Minimum supported API version. Systems below it are rejected.
2767
+ *
2768
+ * DERIVED, not declared. The client supports exactly the versions it ships
2769
+ * types for, so the oldest generated version *is* the minimum — there is no
2770
+ * second decision to make, and therefore nothing to keep in sync.
2771
+ *
2772
+ * To move the floor, change `--min-version` in the `generate:api` script in
2773
+ * package.json and regenerate; this follows on its own. Written as a literal
2774
+ * it would duplicate that value with nothing enforcing agreement, so raising
2775
+ * one and forgetting the other would silently keep generating types for
2776
+ * versions the client rejects.
2777
+ */
2778
+ MIN_SUPPORTED_VERSION: SUPPORTED_API_VERSIONS[0],
2779
+ /**
2780
+ * Maximum supported API version. Systems above it are rejected.
2781
+ *
2782
+ * NOT derived, deliberately. This should be the newest generated version by
2783
+ * the same argument as MIN, but `instantiateClientForVersion` only maps
2784
+ * `25.10` and `26` — a v27 system would pass the range check and then throw
2785
+ * on client selection. It moves to the newest generated version once a v27
2786
+ * client exists. Until then it lags on purpose, and the `satisfies` clause
2787
+ * below still pins it to a version that was actually generated.
2788
+ */
2789
+ MAX_SUPPORTED_VERSION: "v26.0.0",
2790
+ /**
2791
+ * Fallback version to use when version discovery fails due to CORS/network errors.
2792
+ * When /api/versions returns HTTP status 0 (CORS block, network down, etc.),
2793
+ * the system will attempt to connect using this version as a best-effort fallback.
2794
+ *
2795
+ * WARNING: Status 0 errors have multiple causes:
2796
+ * - CORS policy blocking the request
2797
+ * - Network disconnected
2798
+ * - DNS lookup failure
2799
+ * - Server unreachable
2800
+ *
2801
+ * Using this fallback means systems with genuine network issues will still
2802
+ * attempt connection (and fail during WebSocket handshake instead of immediately).
2803
+ */
2804
+ FALLBACK_VERSION: "v25.10.0"
2805
+ };
2806
+
2807
+ // src/types/api-version.type.ts
2808
+ var VersionCompatibility = /* @__PURE__ */ ((VersionCompatibility2) => {
2809
+ VersionCompatibility2["Compatible"] = "compatible";
2810
+ VersionCompatibility2["TooOld"] = "too-old";
2811
+ VersionCompatibility2["TooNew"] = "too-new";
2812
+ VersionCompatibility2["Invalid"] = "invalid";
2813
+ return VersionCompatibility2;
2814
+ })(VersionCompatibility || {});
2815
+
2816
+ // src/utils/api-version.utils.ts
2817
+ var legacyCutoffYear = 25;
2818
+ function parseApiVersion(versionString) {
2819
+ const regex = /^v(\d{2})\.(\d+)\.(\d+)$/;
2820
+ const match = versionString.match(regex);
2821
+ if (!match) {
2822
+ return null;
2823
+ }
2824
+ const [, yearStr, minorStr, patchStr] = match;
2825
+ const year = parseInt(yearStr, 10);
2826
+ const minor = parseInt(minorStr, 10);
2827
+ const patch = parseInt(patchStr, 10);
2828
+ if (year <= legacyCutoffYear) {
2829
+ if (minor < 1 || minor > 12) {
2830
+ return null;
2831
+ }
2832
+ } else if (year >= 26) {
2833
+ if (minor < 0 || minor > 99) {
2834
+ return null;
2835
+ }
2836
+ }
2837
+ return {
2838
+ version: versionString,
2839
+ year,
2840
+ minor,
2841
+ patch,
2842
+ websocketPath: `/api/${versionString}`
2843
+ };
2844
+ }
2845
+ function compareVersions(a, b) {
2846
+ if (a.year !== b.year) {
2847
+ return a.year - b.year;
2848
+ }
2849
+ if (a.minor !== b.minor) {
2850
+ return a.minor - b.minor;
2851
+ }
2852
+ return a.patch - b.patch;
2853
+ }
2854
+ function checkVersionCompatibility(version) {
2855
+ const minVersion = parseApiVersion(apiVersionConfig.MIN_SUPPORTED_VERSION);
2856
+ const maxVersion = parseApiVersion(apiVersionConfig.MAX_SUPPORTED_VERSION);
2857
+ if (!minVersion || !maxVersion) {
2858
+ return "invalid" /* Invalid */;
2859
+ }
2860
+ if (compareVersions(version, minVersion) < 0) {
2861
+ return "too-old" /* TooOld */;
2862
+ }
2863
+ if (compareVersions(version, maxVersion) > 0) {
2864
+ return "too-new" /* TooNew */;
2865
+ }
2866
+ return "compatible" /* Compatible */;
2867
+ }
2868
+ function isVersionSupported(version) {
2869
+ return checkVersionCompatibility(version) === "compatible" /* Compatible */;
2870
+ }
2871
+ function filterCompatibleVersions(versions) {
2872
+ return versions.filter(isVersionSupported);
2873
+ }
2874
+ function getWebSocketPath(version) {
2875
+ return version.websocketPath;
2876
+ }
2877
+
2878
+ // src/client/truenas-api-client.ts
2879
+ var TrueNasApiClient = class {
2880
+ constructor(uuid, hostnames, version, enabled, systemName, logger = noopLogger) {
2881
+ this.uuid = uuid;
2882
+ this.hostnames = hostnames;
2883
+ this.version = version;
2884
+ this.enabled = enabled;
2885
+ this.systemName = systemName;
2886
+ this.logger = logger;
2887
+ this.connection = this.createConnection();
2888
+ this.authenticator = this.createAuthenticator();
2889
+ this.api = this.createApi();
2890
+ this.ops = this.createOperations();
2891
+ }
2892
+ /**
2893
+ * Get current connection status.
2894
+ * @returns true if WebSocket is connected
2895
+ */
2896
+ get connected() {
2897
+ return this.connection.opened.getValue();
2898
+ }
2899
+ /**
2900
+ * Get current authentication status.
2901
+ * @returns true if authenticated with the system
2902
+ */
2903
+ get authenticated() {
2904
+ return this.authenticator.authenticated$.getValue();
2905
+ }
2906
+ /**
2907
+ * Close the WebSocket connection.
2908
+ * Connection will automatically retry if retry is enabled.
2909
+ */
2910
+ close() {
2911
+ this.connection.close();
2912
+ }
2913
+ /**
2914
+ * Factory method to create the WebSocket connection.
2915
+ * Override in subclasses to provide version-specific connection handling.
2916
+ */
2917
+ createConnection() {
2918
+ const websocketPath = getWebSocketPath(this.version);
2919
+ return new TrueNasConnection(
2920
+ this.enabled,
2921
+ this.hostnames,
2922
+ this.uuid,
2923
+ websocketPath,
2924
+ this.systemName,
2925
+ void 0,
2926
+ // retryDelay (use default)
2927
+ void 0,
2928
+ // maxRetry (use default)
2929
+ this.logger
2930
+ );
2931
+ }
2932
+ /**
2933
+ * Factory method to create the API handler.
2934
+ * Override in subclasses to provide version-specific API implementations.
2935
+ */
2936
+ createApi() {
2937
+ return new TrueNasApi(this.authenticator.authenticated$, this.connection);
2938
+ }
2939
+ /**
2940
+ * Factory method to create the authenticator.
2941
+ * Override in subclasses to provide version-specific authentication.
2942
+ */
2943
+ createAuthenticator() {
2944
+ return new TrueNasAuthenticator(this.connection);
2945
+ }
3385
2946
  };
3386
- var ContainerStatusStateInput = {
3387
- Running: "RUNNING",
3388
- Stopped: "STOPPED"
2947
+
2948
+ // src/client/truenas-api-client-v25-10.ts
2949
+ var TrueNasApiClientV2510 = class extends TrueNasApiClient {
2950
+ /**
2951
+ * Create v25.10-specific operation mappings
2952
+ *
2953
+ * virt.instance.* APIs return boolean (true) but emit job events via websocket.
2954
+ * We use callAndGetJobId to capture the job ID, then track the job.
2955
+ * All operations emit Job updates until the operation completes.
2956
+ */
2957
+ createOperations() {
2958
+ return {
2959
+ containerQuery: () => this.api.call("virt.instance.query" /* VirtualInstanceQuery */, [
2960
+ [["type", "=", "CONTAINER" /* Container */]]
2961
+ ]).pipe(rxjs.map((instances) => instances.map(this.toContainer))),
2962
+ containerStart: (id) => this.api.callAndGetJobId("virt.instance.start" /* VirtualInstanceStart */, [id]).pipe(rxjs.switchMap((jobId) => this.api.trackJob(jobId))),
2963
+ containerStop: (id, options) => this.api.callAndGetJobId("virt.instance.stop" /* VirtualInstanceStop */, [id, options]).pipe(rxjs.switchMap((jobId) => this.api.trackJob(jobId))),
2964
+ containerRestart: (id, options) => this.api.callAndGetJobId("virt.instance.restart" /* VirtualInstanceRestart */, [
2965
+ id,
2966
+ options
2967
+ ]).pipe(rxjs.switchMap((jobId) => this.api.trackJob(jobId)))
2968
+ };
2969
+ }
2970
+ /**
2971
+ * Transform VirtualInstanceQuery to unified Container type
2972
+ */
2973
+ toContainer(instance) {
2974
+ return {
2975
+ id: instance.id,
2976
+ name: instance.name,
2977
+ status: instance.status,
2978
+ autostart: instance.autostart,
2979
+ cpu: instance.cpu,
2980
+ memory: instance.memory,
2981
+ image: instance.image
2982
+ };
2983
+ }
3389
2984
  };
3390
- var Feature2 = {
3391
- Apps: "APPS",
3392
- Dedup: "DEDUP",
3393
- Fibrechannel: "FIBRECHANNEL",
3394
- Sed: "SED",
3395
- Support: "SUPPORT",
3396
- Vms: "VMS",
3397
- Zfstier: "ZFSTIER"
2985
+ var TrueNasApiClientV26 = class _TrueNasApiClientV26 extends TrueNasApiClient {
2986
+ /**
2987
+ * Map v26 status state string to AppState enum
2988
+ */
2989
+ static mapStatus(state) {
2990
+ switch (state.toUpperCase()) {
2991
+ case "RUNNING":
2992
+ return "RUNNING" /* Running */;
2993
+ case "STOPPED":
2994
+ return "STOPPED" /* Stopped */;
2995
+ case "STOPPING":
2996
+ return "STOPPING" /* Stopping */;
2997
+ default:
2998
+ return "STOPPED" /* Stopped */;
2999
+ }
3000
+ }
3001
+ /**
3002
+ * Create v26-specific operation mappings
3003
+ *
3004
+ * Operations return Observable<Job | null>:
3005
+ * - Async operations emit Job updates until complete
3006
+ * - Sync operations emit null once
3007
+ */
3008
+ createOperations() {
3009
+ return {
3010
+ containerQuery: () => this.api.call("container.query" /* ContainerQuery */, [[]]).pipe(rxjs.map((containers) => containers.map(this.toContainer))),
3011
+ // container.start is synchronous in v26.0.0 - emit null
3012
+ containerStart: (id) => this.api.call("container.start" /* ContainerStart */, [parseInt(id, 10)]).pipe(rxjs.map(() => null)),
3013
+ // container.stop emits job updates
3014
+ containerStop: (id, options) => this.api.callAndGetJobId("container.stop" /* ContainerStop */, [
3015
+ parseInt(id, 10),
3016
+ {
3017
+ force: options.force,
3018
+ force_after_timeout: options.force
3019
+ }
3020
+ ]).pipe(rxjs.switchMap((jobId) => this.api.trackJob(jobId))),
3021
+ // v26.0.0 doesn't have container.restart - chain stop + start
3022
+ // Emits Job updates during stop, then null when start completes
3023
+ containerRestart: (id, options) => {
3024
+ const numericId = parseInt(id, 10);
3025
+ return this.api.callAndGetJobId("container.stop" /* ContainerStop */, [
3026
+ numericId,
3027
+ {
3028
+ force: options.force,
3029
+ force_after_timeout: options.force
3030
+ }
3031
+ ]).pipe(
3032
+ // Track stop job until it completes
3033
+ rxjs.switchMap((stopJobId) => this.api.trackJob(stopJobId)),
3034
+ // Collect all job updates to ensure stop fully completes
3035
+ rxjs.toArray(),
3036
+ // Re-emit job updates, then call start after stop is done
3037
+ rxjs.switchMap(
3038
+ (jobUpdates) => rxjs.concat(
3039
+ rxjs.from(jobUpdates),
3040
+ this.api.call("container.start" /* ContainerStart */, [numericId]).pipe(rxjs.map(() => null))
3041
+ )
3042
+ )
3043
+ );
3044
+ }
3045
+ };
3046
+ }
3047
+ /**
3048
+ * Transform v26 ContainerQueryV26 to unified Container type
3049
+ */
3050
+ toContainer(container) {
3051
+ return {
3052
+ id: container.id.toString(),
3053
+ name: container.name,
3054
+ status: _TrueNasApiClientV26.mapStatus(container.status.state),
3055
+ autostart: container.autostart,
3056
+ description: container.description
3057
+ // cpu and memory are not available in v26 container.query
3058
+ // image is not available in v26 container.query
3059
+ };
3060
+ }
3398
3061
  };
3399
- var Interval = {
3400
- "30": 30,
3401
- "60": 60
3062
+
3063
+ // src/errors/version-discovery.errors.ts
3064
+ var VersionDiscoveryError = class extends Error {
3065
+ constructor(message, hostname) {
3066
+ super(message);
3067
+ this.hostname = hostname;
3068
+ this.name = this.constructor.name;
3069
+ Object.setPrototypeOf(this, new.target.prototype);
3070
+ }
3402
3071
  };
3403
- var Name2 = {
3404
- Cpu: "cpu",
3405
- Cputemp: "cputemp",
3406
- Disk: "disk",
3407
- Interface: "interface",
3408
- Load: "load",
3409
- Processes: "processes",
3410
- Memory: "memory",
3411
- Uptime: "uptime",
3412
- Arcsize: "arcsize",
3413
- Disktemp: "disktemp",
3414
- Upscharge: "upscharge",
3415
- Upsruntime: "upsruntime",
3416
- Upsvoltage: "upsvoltage",
3417
- Upscurrent: "upscurrent",
3418
- Upsfrequency: "upsfrequency",
3419
- Upsload: "upsload",
3420
- Upstemperature: "upstemperature"
3072
+ var VersionTooOldError = class extends VersionDiscoveryError {
3073
+ constructor(hostname, availableVersions, minRequired = apiVersionConfig.MIN_SUPPORTED_VERSION) {
3074
+ super(
3075
+ `System API version is too old. Minimum supported: ${minRequired}. Available versions: ${availableVersions.join(
3076
+ ", "
3077
+ )}`,
3078
+ hostname
3079
+ );
3080
+ this.availableVersions = availableVersions;
3081
+ this.minRequired = minRequired;
3082
+ }
3421
3083
  };
3422
- var Passkey = {
3423
- Enabled: "ENABLED",
3424
- Disabled: "DISABLED",
3425
- Required: "REQUIRED"
3084
+ var VersionTooNewError = class extends VersionDiscoveryError {
3085
+ constructor(hostname, availableVersions, maxSupported = apiVersionConfig.MAX_SUPPORTED_VERSION) {
3086
+ super(
3087
+ `System API version is too new. Maximum supported: ${maxSupported}. Available versions: ${availableVersions.join(
3088
+ ", "
3089
+ )}`,
3090
+ hostname
3091
+ );
3092
+ this.availableVersions = availableVersions;
3093
+ this.maxSupported = maxSupported;
3094
+ }
3426
3095
  };
3427
- var PoolCreateTopologyDedupVdevTypeInput = {
3428
- Mirror: "MIRROR",
3429
- Stripe: "STRIPE"
3096
+ var VersionEndpointNotFoundError = class extends VersionDiscoveryError {
3097
+ constructor(hostname, statusCode = 404) {
3098
+ super(
3099
+ `Version discovery endpoint not found: ${hostname} (HTTP ${String(
3100
+ statusCode
3101
+ )})`,
3102
+ hostname
3103
+ );
3104
+ this.statusCode = statusCode;
3105
+ }
3430
3106
  };
3431
- var PoolScanState = {
3432
- Scanning: "SCANNING",
3433
- Finished: "FINISHED",
3434
- Canceled: "CANCELED"
3107
+ var VersionDiscoveryTimeoutError = class extends VersionDiscoveryError {
3108
+ constructor(hostname, timeoutMs = 5e3) {
3109
+ super(
3110
+ `Cannot connect to system (timeout after ${String(
3111
+ timeoutMs
3112
+ )}ms): ${hostname}`,
3113
+ hostname
3114
+ );
3115
+ this.timeoutMs = timeoutMs;
3116
+ }
3435
3117
  };
3436
- var PoolScrubAction = {
3437
- Start: "START",
3438
- Stop: "STOP",
3439
- Pause: "PAUSE"
3118
+ var VersionDiscoveryNetworkError = class extends VersionDiscoveryError {
3119
+ constructor(hostname, originalError) {
3120
+ super(
3121
+ `Network error connecting to ${hostname}: ${originalError.message}`,
3122
+ hostname
3123
+ );
3124
+ this.originalError = originalError;
3125
+ }
3440
3126
  };
3441
- var Service = {
3442
- Middleware: "MIDDLEWARE",
3443
- Smb: "SMB",
3444
- Sudo: "SUDO",
3445
- System: "SYSTEM"
3127
+ var NoCompatibleVersionsError = class extends VersionDiscoveryError {
3128
+ constructor(hostname, availableVersions, supportedRange = {
3129
+ min: apiVersionConfig.MIN_SUPPORTED_VERSION,
3130
+ max: apiVersionConfig.MAX_SUPPORTED_VERSION
3131
+ }) {
3132
+ super(
3133
+ `No compatible API versions available. Supported: ${supportedRange.min} to ${supportedRange.max}. Available: ${availableVersions.join(", ")}`,
3134
+ hostname
3135
+ );
3136
+ this.availableVersions = availableVersions;
3137
+ this.supportedRange = supportedRange;
3138
+ }
3446
3139
  };
3447
- var ZfsTierRewriteJobEntryStatus = {
3448
- Complete: "COMPLETE",
3449
- Running: "RUNNING",
3450
- Queued: "QUEUED",
3451
- Cancelled: "CANCELLED",
3452
- Stopped: "STOPPED",
3453
- Error: "ERROR"
3140
+ var InvalidVersionResponseError = class extends VersionDiscoveryError {
3141
+ constructor(hostname, reason) {
3142
+ super(`Invalid API response format from ${hostname}: ${reason}`, hostname);
3143
+ this.reason = reason;
3144
+ }
3454
3145
  };
3455
- var ZpoolScrubRunAction = {
3456
- Start: "START",
3457
- Pause: "PAUSE",
3458
- Cancel: "CANCEL"
3146
+ var discoveryTimeoutMs = 5e3;
3147
+ function hasErrorName(error, expected) {
3148
+ return typeof error === "object" && error !== null && "name" in error && error.name === expected;
3149
+ }
3150
+ var VersionDiscovery = class {
3151
+ constructor(logger = noopLogger) {
3152
+ this.logger = logger;
3153
+ this.versionCache = /* @__PURE__ */ new Map();
3154
+ }
3155
+ /**
3156
+ * Discovers the API version for a given hostname.
3157
+ *
3158
+ * Makes a GET request to `https://{hostname}/api/versions` and returns the latest
3159
+ * compatible version. Results are cached per hostname; the cache entry is removed
3160
+ * on failure so the next call retries.
3161
+ *
3162
+ * @param hostname - The TrueNAS system hostname (e.g., "truenas.local")
3163
+ * @returns Observable that emits the selected ApiVersion
3164
+ * @throws VersionDiscoveryError subclasses for specific failure scenarios
3165
+ */
3166
+ discoverVersion(hostname) {
3167
+ const cached = this.versionCache.get(hostname);
3168
+ if (cached) {
3169
+ this.logger.info("Version discovery cache hit", { hostname });
3170
+ return cached;
3171
+ }
3172
+ const url = `https://${hostname}/api/versions`;
3173
+ this.logger.info("Starting version discovery", { hostname, url });
3174
+ const discovery$ = rxjs.defer(() => rxjs.from(this.fetchVersions(hostname))).pipe(
3175
+ operators.map((versionStrings) => this.selectVersion(hostname, versionStrings)),
3176
+ operators.catchError((error) => {
3177
+ this.versionCache.delete(hostname);
3178
+ this.logger.error("Version discovery failed", { hostname, error });
3179
+ return rxjs.throwError(() => this.classify(error, hostname));
3180
+ }),
3181
+ operators.shareReplay(1)
3182
+ );
3183
+ this.versionCache.set(hostname, discovery$);
3184
+ return discovery$;
3185
+ }
3186
+ /**
3187
+ * Clears the version cache for a specific hostname or all hostnames.
3188
+ *
3189
+ * @param hostname - Optional hostname to clear. If omitted, clears all cached versions.
3190
+ */
3191
+ clearCache(hostname) {
3192
+ if (hostname) {
3193
+ this.versionCache.delete(hostname);
3194
+ } else {
3195
+ this.versionCache.clear();
3196
+ }
3197
+ }
3198
+ /**
3199
+ * Performs the `fetch` with a 5-second `AbortController` timeout and inspects the
3200
+ * *resolved* Response (fetch does not reject on non-2xx). Throws
3201
+ * `VersionEndpointNotFoundError` on 404 and `InvalidVersionResponseError` on any
3202
+ * other non-2xx or a body that is not an array of strings; lets `TypeError`
3203
+ * (network) and `AbortError` (timeout) bubble to `classify`.
3204
+ *
3205
+ * The element-type check matters: a reachable server returning an array of
3206
+ * non-strings (e.g. `[1, 2, 3]`) would otherwise reach `parseApiVersion`, whose
3207
+ * `.match()` throws a `TypeError` on a non-string — which `classify` would then
3208
+ * misfile as a network error. Validating here keeps it an `InvalidVersionResponseError`.
3209
+ */
3210
+ async fetchVersions(hostname) {
3211
+ const url = `https://${hostname}/api/versions`;
3212
+ const controller = new AbortController();
3213
+ const timer2 = setTimeout(() => controller.abort(), discoveryTimeoutMs);
3214
+ try {
3215
+ const response = await fetch(url, { signal: controller.signal });
3216
+ if (response.status === 404) {
3217
+ throw new VersionEndpointNotFoundError(hostname);
3218
+ }
3219
+ if (!response.ok) {
3220
+ throw new InvalidVersionResponseError(
3221
+ hostname,
3222
+ `HTTP ${String(response.status)}`
3223
+ );
3224
+ }
3225
+ const body = await response.json();
3226
+ if (!Array.isArray(body) || !body.every((v) => typeof v === "string")) {
3227
+ throw new InvalidVersionResponseError(
3228
+ hostname,
3229
+ "Response was not an array of version strings"
3230
+ );
3231
+ }
3232
+ return body;
3233
+ } finally {
3234
+ clearTimeout(timer2);
3235
+ }
3236
+ }
3237
+ /**
3238
+ * Parses, filters, and selects the latest compatible version from the raw response
3239
+ * array. Throws the appropriate typed error when no valid/compatible version exists.
3240
+ */
3241
+ selectVersion(hostname, versionStrings) {
3242
+ this.logger.info("Version discovery response received", {
3243
+ hostname,
3244
+ versionCount: versionStrings.length,
3245
+ versions: versionStrings
3246
+ });
3247
+ const parsedVersions = versionStrings.map(parseApiVersion).filter((v) => v !== null);
3248
+ if (parsedVersions.length === 0) {
3249
+ this.logger.error("No valid versions in response", {
3250
+ hostname,
3251
+ versionStrings
3252
+ });
3253
+ throw new InvalidVersionResponseError(
3254
+ hostname,
3255
+ "No valid API versions found in response"
3256
+ );
3257
+ }
3258
+ const compatibleVersions = filterCompatibleVersions(parsedVersions);
3259
+ this.logger.info("Version compatibility check", {
3260
+ hostname,
3261
+ total: parsedVersions.length,
3262
+ compatible: compatibleVersions.length,
3263
+ supportedRange: {
3264
+ min: apiVersionConfig.MIN_SUPPORTED_VERSION,
3265
+ max: apiVersionConfig.MAX_SUPPORTED_VERSION
3266
+ }
3267
+ });
3268
+ if (compatibleVersions.length === 0) {
3269
+ const allTooOld = parsedVersions.every(
3270
+ (v) => checkVersionCompatibility(v) === "too-old" /* TooOld */
3271
+ );
3272
+ const allTooNew = parsedVersions.every(
3273
+ (v) => checkVersionCompatibility(v) === "too-new" /* TooNew */
3274
+ );
3275
+ const availableVersions = parsedVersions.map((v) => v.version);
3276
+ if (allTooOld) {
3277
+ this.logger.warn("All available versions too old", {
3278
+ hostname,
3279
+ availableVersions
3280
+ });
3281
+ throw new VersionTooOldError(hostname, availableVersions);
3282
+ } else if (allTooNew) {
3283
+ this.logger.warn("All available versions too new", {
3284
+ hostname,
3285
+ availableVersions
3286
+ });
3287
+ throw new VersionTooNewError(hostname, availableVersions);
3288
+ } else {
3289
+ this.logger.warn("No compatible versions found", {
3290
+ hostname,
3291
+ availableVersions
3292
+ });
3293
+ throw new NoCompatibleVersionsError(hostname, availableVersions);
3294
+ }
3295
+ }
3296
+ const sortedVersions = compatibleVersions.sort(
3297
+ (a, b) => compareVersions(b, a)
3298
+ );
3299
+ const selectedVersion = sortedVersions[0];
3300
+ this.logger.info("Version selected", {
3301
+ hostname,
3302
+ selected: selectedVersion.version,
3303
+ websocketPath: selectedVersion.websocketPath
3304
+ });
3305
+ return selectedVersion;
3306
+ }
3307
+ /**
3308
+ * Maps a raw failure to a typed {@link VersionDiscoveryError}. Errors thrown by
3309
+ * `fetchVersions`/`selectVersion` are already typed and pass through unchanged; a
3310
+ * `fetch` `TypeError` becomes {@link VersionDiscoveryNetworkError} (the CORS/network
3311
+ * sentinel), an `AbortError` becomes {@link VersionDiscoveryTimeoutError}, and any
3312
+ * other failure (e.g. an unparseable body's `SyntaxError`) becomes
3313
+ * {@link InvalidVersionResponseError}.
3314
+ */
3315
+ classify(error, hostname) {
3316
+ if (error instanceof VersionDiscoveryError) {
3317
+ return error;
3318
+ }
3319
+ if (hasErrorName(error, "AbortError")) {
3320
+ this.logger.warn("Version discovery timeout", { hostname });
3321
+ return new VersionDiscoveryTimeoutError(hostname);
3322
+ }
3323
+ if (error instanceof TypeError) {
3324
+ this.logger.warn("Version discovery network error", {
3325
+ hostname,
3326
+ message: error.message
3327
+ });
3328
+ return new VersionDiscoveryNetworkError(hostname, error);
3329
+ }
3330
+ const reason = error instanceof Error ? error.message : "Unknown error";
3331
+ this.logger.warn("Version discovery failed with unknown error", {
3332
+ hostname,
3333
+ reason
3334
+ });
3335
+ return new InvalidVersionResponseError(
3336
+ hostname,
3337
+ `Versioned API not available. This system may be running an older TrueNAS version (requires v25.10.0+). ${reason}`
3338
+ );
3339
+ }
3459
3340
  };
3460
3341
 
3461
- // src/generated/v27_0_0/index.ts
3462
- var v27_0_0_exports = {};
3463
- __export(v27_0_0_exports, {
3464
- ACLTemplateEntryAcltypeInput: () => ACLTemplateEntryAcltypeInput,
3465
- Aclmode: () => Aclmode,
3466
- Acltype: () => Acltype,
3467
- Advpowermgmt: () => Advpowermgmt,
3468
- Algorithm: () => Algorithm,
3469
- AppContainerDetailsState: () => AppContainerDetailsState,
3470
- AppContainerDetailsStateInput: () => AppContainerDetailsStateInput,
3471
- Atime: () => Atime,
3472
- Authenticator: () => Authenticator,
3473
- Authmethod: () => Authmethod,
3474
- Autotrim: () => Autotrim,
3475
- Basic: () => Basic,
3476
- Blocksize: () => Blocksize,
3477
- Bootloader: () => Bootloader,
3478
- Casesensitivity: () => Casesensitivity,
3479
- CloudBackupSnapshotItemType: () => CloudBackupSnapshotItemType,
3480
- CloudSyncCreateDirection: () => CloudSyncCreateDirection,
3481
- CloudSyncCreateDirectionInput: () => CloudSyncCreateDirectionInput,
3482
- CloudTaskAttributesEncryptionInput: () => CloudTaskAttributesEncryptionInput,
3483
- Code: () => Code,
3484
- Compression: () => Compression,
3485
- ContainerNICDeviceType: () => ContainerNICDeviceType,
3486
- ContainerNICDeviceTypeInput: () => ContainerNICDeviceTypeInput,
3487
- ContainerStatusState: () => ContainerStatusState,
3488
- ContainerStatusStateInput: () => ContainerStatusStateInput,
3489
- CorePingRemoteTypeInput: () => CorePingRemoteTypeInput,
3490
- Credentials: () => Credentials,
3491
- DeviceGetInfoOtherTypeInput: () => DeviceGetInfoOtherTypeInput,
3492
- DiskDetailsTypeInput: () => DiskDetailsTypeInput,
3493
- DiskWipeModeInput: () => DiskWipeModeInput,
3494
- DockerStatusInfoStatus: () => DockerStatusInfoStatus,
3495
- DockerStatusInfoStatusInput: () => DockerStatusInfoStatusInput,
3496
- Enclosure2SetSlotStatusStatusInput: () => Enclosure2SetSlotStatusStatusInput2,
3497
- Encryption: () => Encryption,
3498
- Endpoint: () => Endpoint,
3499
- Exec: () => Exec,
3500
- Feature: () => Feature2,
3501
- FilesystemDirEntryType: () => FilesystemDirEntryType,
3502
- Function: () => Function,
3503
- GetDisplayDeviceType: () => GetDisplayDeviceType,
3504
- Hddstandby: () => Hddstandby,
3505
- InitShutdownScriptCreateType: () => InitShutdownScriptCreateType,
3506
- InitShutdownScriptCreateTypeInput: () => InitShutdownScriptCreateTypeInput,
3507
- InterfaceCreateAliasTypeInput: () => InterfaceCreateAliasTypeInput,
3508
- InterfaceCreateTypeInput: () => InterfaceCreateTypeInput,
3509
- Interval: () => Interval,
3510
- Iotype: () => Iotype,
3511
- IpmiChassisIdentifyRequestVerb: () => IpmiChassisIdentifyRequestVerb,
3512
- IscsiExtentCreateType: () => IscsiExtentCreateType,
3513
- IscsiExtentCreateTypeInput: () => IscsiExtentCreateTypeInput,
3514
- IscsiTargetCreateMode: () => IscsiTargetCreateMode,
3515
- IscsiTargetCreateModeInput: () => IscsiTargetCreateModeInput,
3516
- KeychainCredentialEntryType: () => KeychainCredentialEntryType,
3517
- KeychainCredentialEntryTypeInput: () => KeychainCredentialEntryTypeInput,
3518
- Level: () => Level,
3519
- NFS4ACEType: () => NFS4ACEType,
3520
- NFS4ACETypeInput: () => NFS4ACETypeInput,
3521
- Name: () => Name2,
3522
- Passkey: () => Passkey,
3523
- Policy: () => Policy,
3524
- PoolCreateChecksum: () => PoolCreateChecksum,
3525
- PoolCreateDeduplication: () => PoolCreateDeduplication,
3526
- PoolCreateTopologyDedupVdevTypeInput: () => PoolCreateTopologyDedupVdevTypeInput,
3527
- PoolDatasetCreateFilesystemAcltypeInput: () => PoolDatasetCreateFilesystemAcltypeInput,
3528
- PoolDatasetCreateFilesystemChecksum: () => PoolDatasetCreateFilesystemChecksum,
3529
- PoolDatasetCreateFilesystemDeduplication: () => PoolDatasetCreateFilesystemDeduplication,
3530
- PoolDatasetCreateFilesystemReadonlyInput: () => PoolDatasetCreateFilesystemReadonlyInput,
3531
- PoolDatasetDeleteResult: () => PoolDatasetDeleteResult,
3532
- PoolScanState: () => PoolScanState,
3533
- PoolScanStateInput: () => PoolScanStateInput,
3534
- PoolScrubAction: () => PoolScrubAction,
3535
- Protocol: () => Protocol,
3536
- Purpose: () => Purpose2,
3537
- Readonly: () => Readonly,
3538
- ReplicationCountEligibleManualSnapshotsTransportInput: () => ReplicationCountEligibleManualSnapshotsTransportInput,
3539
- ReplicationCreateReadonlyInput: () => ReplicationCreateReadonlyInput,
3540
- Resolution: () => Resolution,
3541
- Rpm: () => Rpm,
3542
- RsyncTaskCreateDirection: () => RsyncTaskCreateDirection,
3543
- RsyncTaskCreateDirectionInput: () => RsyncTaskCreateDirectionInput,
3544
- RsyncTaskCreateMode: () => RsyncTaskCreateMode,
3545
- RsyncTaskCreateModeInput: () => RsyncTaskCreateModeInput,
3546
- SMBEntryEncryptionInput: () => SMBEntryEncryptionInput,
3547
- STIGType: () => STIGType,
3548
- Schema: () => Schema,
3549
- Security: () => Security,
3550
- Serialspeed: () => Serialspeed,
3551
- Service: () => Service,
3552
- ServiceControlVerb: () => ServiceControlVerb,
3553
- Shutdown: () => Shutdown,
3554
- Snapdev: () => Snapdev,
3555
- Snapdir: () => Snapdir,
3556
- Source: () => Source,
3557
- SourceInput: () => SourceInput,
3558
- SupportNewTicketCommunityTypeInput: () => SupportNewTicketCommunityTypeInput,
3559
- Sync: () => Sync,
3560
- SyslogServerTransportInput: () => SyslogServerTransportInput,
3561
- Sysloglevel: () => Sysloglevel,
3562
- SystemProductTypeResult: () => SystemProductTypeResult,
3563
- SystemStateResult: () => SystemStateResult,
3564
- Tag: () => Tag,
3565
- Target: () => Target,
3566
- Time: () => Time,
3567
- Transport: () => Transport,
3568
- TruecommandConfigChangedEventFieldsStatus: () => TruecommandConfigChangedEventFieldsStatus,
3569
- TruecommandConfigChangedEventFieldsStatusInput: () => TruecommandConfigChangedEventFieldsStatusInput,
3570
- TunableCreateType: () => TunableCreateType,
3571
- TunableCreateTypeInput: () => TunableCreateTypeInput,
3572
- UPSEntryMode: () => UPSEntryMode,
3573
- UPSEntryModeInput: () => UPSEntryModeInput,
3574
- Unixcharset: () => Unixcharset,
3575
- Username: () => Username,
3576
- VMDiskDeviceType: () => VMDiskDeviceType,
3577
- VMDiskDeviceTypeInput: () => VMDiskDeviceTypeInput,
3578
- VMWareEntryStateStateInput: () => VMWareEntryStateStateInput,
3579
- VMWareMatchDatastoresWithDatasetsResultFilesystemType: () => VMWareMatchDatastoresWithDatasetsResultFilesystemType,
3580
- Vendor: () => Vendor,
3581
- Volblocksize: () => Volblocksize,
3582
- When: () => When,
3583
- ZfsTierRewriteJobEntryStatus: () => ZfsTierRewriteJobEntryStatus,
3584
- ZfsTierRewriteJobEntryStatusInput: () => ZfsTierRewriteJobEntryStatusInput,
3585
- ZpoolScrubRunAction: () => ZpoolScrubRunAction
3586
- });
3587
-
3588
- // src/generated/index.ts
3589
- var SUPPORTED_API_VERSIONS = [
3590
- "v25.04.0",
3591
- "v25.04.1",
3592
- "v25.04.2",
3593
- "v25.10.0",
3594
- "v25.10.1",
3595
- "v25.10.2",
3596
- "v25.10.3",
3597
- "v25.10.4",
3598
- "v25.10.5",
3599
- "v26.0.0",
3600
- "v27.0.0"
3601
- ];
3342
+ // src/factory.ts
3343
+ async function createTrueNasClient(opts) {
3344
+ const { uuid, hostnames, systemName } = opts;
3345
+ const logger = opts.logger ?? noopLogger;
3346
+ if (!hostnames || hostnames.length === 0) {
3347
+ throw new Error(
3348
+ `Cannot create client for system ${uuid}: hostnames array is empty`
3349
+ );
3350
+ }
3351
+ const primaryHostname = hostnames[0];
3352
+ const versionDiscovery = new VersionDiscovery(logger);
3353
+ logger.info("Creating versioned API client", {
3354
+ uuid: uuid.slice(0, 8),
3355
+ hostname: primaryHostname,
3356
+ systemName
3357
+ });
3358
+ let version;
3359
+ try {
3360
+ version = await rxjs.firstValueFrom(
3361
+ versionDiscovery.discoverVersion(primaryHostname)
3362
+ );
3363
+ logger.info("API version discovered, instantiating client", {
3364
+ uuid: uuid.slice(0, 8),
3365
+ version: version.version,
3366
+ websocketPath: version.websocketPath
3367
+ });
3368
+ } catch (error) {
3369
+ const errorMessage = errorMessageOrDefault(error, "Unknown error");
3370
+ if (!(error instanceof VersionDiscoveryNetworkError)) {
3371
+ logger.error("Version discovery failed", {
3372
+ uuid: uuid.slice(0, 8),
3373
+ hostname: primaryHostname,
3374
+ error: errorMessage,
3375
+ errorType: error instanceof Error ? error.constructor.name : typeof error
3376
+ });
3377
+ throw error;
3378
+ }
3379
+ const fallbackVersionString = apiVersionConfig.FALLBACK_VERSION;
3380
+ const fallbackVersion = parseApiVersion(fallbackVersionString);
3381
+ if (!fallbackVersion) {
3382
+ logger.error("Invalid fallback version configuration", {
3383
+ uuid: uuid.slice(0, 8),
3384
+ hostname: primaryHostname,
3385
+ fallbackVersion: fallbackVersionString
3386
+ });
3387
+ throw error;
3388
+ }
3389
+ logger.warn(
3390
+ "Version discovery failed with a network error (possible CORS or network issue), falling back to assumed version",
3391
+ {
3392
+ uuid: uuid.slice(0, 8),
3393
+ hostname: primaryHostname,
3394
+ fallbackVersion: fallbackVersionString,
3395
+ originalError: errorMessage,
3396
+ warning: "A network error has multiple causes (CORS, network down, DNS failure). The connection may still fail during the WebSocket handshake."
3397
+ }
3398
+ );
3399
+ version = fallbackVersion;
3400
+ }
3401
+ return instantiateClientForVersion(version, opts, logger);
3402
+ }
3403
+ var CLIENT_BY_VERSION_KEY = {
3404
+ "25.10": TrueNasApiClientV2510,
3405
+ "26": TrueNasApiClientV26
3406
+ };
3407
+ function clientVersionKey(version) {
3408
+ if (version.year <= legacyCutoffYear) {
3409
+ return `${version.year.toString()}.${version.minor.toString().padStart(2, "0")}`;
3410
+ }
3411
+ return version.year.toString();
3412
+ }
3413
+ function instantiateClientForVersion(version, opts, logger) {
3414
+ const { uuid, hostnames, enabled, systemName } = opts;
3415
+ const versionKey = clientVersionKey(version);
3416
+ const Client = CLIENT_BY_VERSION_KEY[versionKey];
3417
+ if (!Client) {
3418
+ logger.error("No client implementation for version", {
3419
+ uuid: uuid.slice(0, 8),
3420
+ version: version.version,
3421
+ versionKey
3422
+ });
3423
+ throw new Error(
3424
+ `No client implementation for API version ${version.version}. Version keys with a client: ${Object.keys(CLIENT_BY_VERSION_KEY).join(", ")}. Version key: ${versionKey}`
3425
+ );
3426
+ }
3427
+ logger.info(`Instantiating ${Client.name}`, {
3428
+ uuid: uuid.slice(0, 8),
3429
+ version: version.version,
3430
+ versionKey
3431
+ });
3432
+ return new Client(uuid, hostnames, version, enabled, systemName, logger);
3433
+ }
3434
+ function errorMessageOrDefault(error, fallback) {
3435
+ if (error instanceof Error) {
3436
+ return error.message;
3437
+ }
3438
+ if (typeof error === "object" && error !== null && "message" in error && typeof error.message === "string") {
3439
+ return error.message;
3440
+ }
3441
+ return fallback;
3442
+ }
3602
3443
 
3603
3444
  exports.AuthError = AuthError;
3604
3445
  exports.AuthErrorCode = AuthErrorCode;
@@ -3623,9 +3464,6 @@ exports.consoleLogger = consoleLogger;
3623
3464
  exports.createTrueNasClient = createTrueNasClient;
3624
3465
  exports.getApiErrorMessage = getApiErrorMessage;
3625
3466
  exports.noopLogger = noopLogger;
3626
- exports.v25_04_0 = v25_04_0_exports;
3627
- exports.v25_04_1 = v25_04_1_exports;
3628
- exports.v25_04_2 = v25_04_2_exports;
3629
3467
  exports.v25_10_0 = v25_10_0_exports;
3630
3468
  exports.v25_10_1 = v25_10_1_exports;
3631
3469
  exports.v25_10_2 = v25_10_2_exports;