@truenas/api-client 1.0.2 → 1.0.4

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