@owine/unifi-network-mcp 2.14.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +235 -80
  3. package/dist/client.d.ts +13 -1
  4. package/dist/client.js +142 -16
  5. package/dist/config.d.ts +11 -0
  6. package/dist/config.js +102 -3
  7. package/dist/guard.d.ts +46 -0
  8. package/dist/guard.js +171 -0
  9. package/dist/index.js +15 -4
  10. package/dist/instructions.d.ts +9 -0
  11. package/dist/instructions.js +32 -0
  12. package/dist/tls.d.ts +14 -0
  13. package/dist/tls.js +58 -0
  14. package/dist/tools/acl.js +126 -53
  15. package/dist/tools/client-history.js +20 -10
  16. package/dist/tools/clients.js +14 -13
  17. package/dist/tools/devices.js +30 -29
  18. package/dist/tools/dns-policies.js +116 -69
  19. package/dist/tools/firewall.d.ts +2 -1
  20. package/dist/tools/firewall.js +245 -80
  21. package/dist/tools/hotspot.js +35 -28
  22. package/dist/tools/index.d.ts +13 -1
  23. package/dist/tools/index.js +63 -4
  24. package/dist/tools/networks.d.ts +2 -1
  25. package/dist/tools/networks.js +152 -58
  26. package/dist/tools/sites.js +3 -3
  27. package/dist/tools/supporting.js +31 -30
  28. package/dist/tools/switching.js +22 -21
  29. package/dist/tools/system.js +1 -1
  30. package/dist/tools/traffic-matching.d.ts +2 -1
  31. package/dist/tools/traffic-matching.js +31 -28
  32. package/dist/tools/wifi.js +228 -311
  33. package/dist/utils/full-put.d.ts +32 -0
  34. package/dist/utils/full-put.js +74 -0
  35. package/dist/utils/output-schemas.d.ts +77 -9
  36. package/dist/utils/output-schemas.js +106 -54
  37. package/dist/utils/params.d.ts +7 -0
  38. package/dist/utils/params.js +12 -0
  39. package/dist/utils/responses.d.ts +2 -0
  40. package/dist/utils/responses.js +28 -2
  41. package/dist/utils/safety.d.ts +35 -1
  42. package/dist/utils/safety.js +53 -3
  43. package/dist/utils/secrets.d.ts +24 -0
  44. package/dist/utils/secrets.js +92 -0
  45. package/dist/utils/wan-exposure.d.ts +69 -0
  46. package/dist/utils/wan-exposure.js +245 -0
  47. package/dist/write-log.d.ts +52 -0
  48. package/dist/write-log.js +178 -0
  49. package/dist/write-tools.d.ts +27 -0
  50. package/dist/write-tools.js +50 -0
  51. package/package.json +19 -15
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Read-merge-write support for UniFi's full-replacement PUT endpoints.
3
+ *
4
+ * Several Integration API PUTs (WiFi broadcasts, networks, firewall policies,
5
+ * ACL rules, DNS policies) replace the whole resource: required fields must all be present, and some
6
+ * optional fields carry meaning when omitted (a missing `dhcpGuarding`
7
+ * disables DHCP guarding; a missing `reportFlowEnabled` reverts to true). A
8
+ * sparse body therefore either fails or silently resets settings.
9
+ *
10
+ * Instead, tools GET the current resource, keep only the fields the PUT body
11
+ * documents (so read-only response fields like id/metadata never leak into the
12
+ * request), and overlay the caller's changes. `undefined` keeps the current
13
+ * value; `null` is sent as an explicit null, which the API uses to clear.
14
+ */
15
+ export type JsonObject = Record<string, unknown>;
16
+ export declare function asObject(value: unknown, what: string): JsonObject;
17
+ export declare function mergeForPut(current: JsonObject, updates: JsonObject, allowedFields: readonly string[]): JsonObject;
18
+ /** Fields the caller set that the target variant's PUT body does not accept. */
19
+ export declare function unsupportedFields(updates: JsonObject, allowedFields: readonly string[]): string[];
20
+ /** Required fields that are absent (undefined or null) from a request body. */
21
+ export declare function missingFields(body: JsonObject, requiredFields: readonly string[]): string[];
22
+ /** Copy only the defined entries, so optional inputs the caller skipped are not sent. */
23
+ export declare function definedEntries(values: JsonObject): JsonObject;
24
+ /**
25
+ * Run one read-merge-write cycle at a time per resource. Agents often split
26
+ * "rename X and enable logging" into parallel calls; unserialised, both read
27
+ * the old resource and the second PUT silently reverts the first change.
28
+ * The queue is per process and keyed on the exact path string, so every
29
+ * writer of a resource (including the firewall-policy PATCH) must lock the
30
+ * same path.
31
+ */
32
+ export declare function withResourceLock<T>(path: string, fn: () => Promise<T>): Promise<T>;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * Read-merge-write support for UniFi's full-replacement PUT endpoints.
4
+ *
5
+ * Several Integration API PUTs (WiFi broadcasts, networks, firewall policies,
6
+ * ACL rules, DNS policies) replace the whole resource: required fields must all be present, and some
7
+ * optional fields carry meaning when omitted (a missing `dhcpGuarding`
8
+ * disables DHCP guarding; a missing `reportFlowEnabled` reverts to true). A
9
+ * sparse body therefore either fails or silently resets settings.
10
+ *
11
+ * Instead, tools GET the current resource, keep only the fields the PUT body
12
+ * documents (so read-only response fields like id/metadata never leak into the
13
+ * request), and overlay the caller's changes. `undefined` keeps the current
14
+ * value; `null` is sent as an explicit null, which the API uses to clear.
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.asObject = asObject;
18
+ exports.mergeForPut = mergeForPut;
19
+ exports.unsupportedFields = unsupportedFields;
20
+ exports.missingFields = missingFields;
21
+ exports.definedEntries = definedEntries;
22
+ exports.withResourceLock = withResourceLock;
23
+ function asObject(value, what) {
24
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
25
+ throw new Error(`Expected ${what} to be a JSON object`);
26
+ }
27
+ return value;
28
+ }
29
+ function mergeForPut(current, updates, allowedFields) {
30
+ const body = {};
31
+ for (const field of allowedFields) {
32
+ if (current[field] !== undefined)
33
+ body[field] = current[field];
34
+ }
35
+ for (const [field, value] of Object.entries(updates)) {
36
+ if (value !== undefined && allowedFields.includes(field))
37
+ body[field] = value;
38
+ }
39
+ return body;
40
+ }
41
+ /** Fields the caller set that the target variant's PUT body does not accept. */
42
+ function unsupportedFields(updates, allowedFields) {
43
+ return Object.keys(updates).filter((field) => updates[field] !== undefined && !allowedFields.includes(field));
44
+ }
45
+ /** Required fields that are absent (undefined or null) from a request body. */
46
+ function missingFields(body, requiredFields) {
47
+ return requiredFields.filter((field) => body[field] === undefined || body[field] === null);
48
+ }
49
+ /** Copy only the defined entries, so optional inputs the caller skipped are not sent. */
50
+ function definedEntries(values) {
51
+ return Object.fromEntries(Object.entries(values).filter(([, value]) => value !== undefined));
52
+ }
53
+ const resourceQueues = new Map();
54
+ /**
55
+ * Run one read-merge-write cycle at a time per resource. Agents often split
56
+ * "rename X and enable logging" into parallel calls; unserialised, both read
57
+ * the old resource and the second PUT silently reverts the first change.
58
+ * The queue is per process and keyed on the exact path string, so every
59
+ * writer of a resource (including the firewall-policy PATCH) must lock the
60
+ * same path.
61
+ */
62
+ async function withResourceLock(path, fn) {
63
+ const previous = resourceQueues.get(path) ?? Promise.resolve();
64
+ const run = previous.then(fn);
65
+ const settled = run.then(() => undefined, () => undefined);
66
+ resourceQueues.set(path, settled);
67
+ try {
68
+ return await run;
69
+ }
70
+ finally {
71
+ if (resourceQueues.get(path) === settled)
72
+ resourceQueues.delete(path);
73
+ }
74
+ }
@@ -1,14 +1,33 @@
1
1
  /**
2
- * Output schemas for high-value read tools (loose strategy: every non-key
3
- * field optional, every nested object uses .passthrough() to allow
2
+ * Output schemas for every read tool, and for write tools whose response
3
+ * echoes the resource (loose strategy: every non-key
4
+ * field optional, every nested object uses .loose() to allow
4
5
  * firmware/hardware-specific fields to flow through unchanged).
5
6
  *
6
- * Verified against UniFi Network API 10.6.106. Where the docs collapse
7
+ * Verified against UniFi Network API 11.0.83. Where the docs collapse
7
8
  * nested arrays/objects (e.g. interfaces.ports[], radios[]), the schema
8
- * uses passthrough records so the contract doesn't lock to fields we
9
- * haven't verified.
9
+ * uses loose records so the contract doesn't lock to fields we
10
+ * haven't verified. Tools register these raw shapes, and registerAllTools()
11
+ * publishes each as a loose object (src/tools/index.ts), so fields a schema
12
+ * does not list never fail client-side validation.
10
13
  */
11
14
  import { z } from "zod";
15
+ /**
16
+ * The outputSchema to publish for a tool: always a loose object, whether the
17
+ * tool passed a raw shape or a Zod object (the SDK accepts both). Wrapping a
18
+ * Zod object in z.looseObject() would build a broken schema that makes
19
+ * tools/list throw for every tool.
20
+ */
21
+ export declare function looseOutput(schema: z.ZodRawShape | z.ZodObject): z.ZodObject;
22
+ export declare function writeResult<T extends z.ZodRawShape>(shape: T): { -readonly [k in keyof { -readonly [P in keyof T]: T[P]; }]: z.ZodOptional<{ -readonly [P in keyof T]: T[P]; }[k]>; } & {
23
+ readonly dryRun: z.ZodOptional<z.ZodLiteral<true>>;
24
+ readonly wouldExecute: z.ZodOptional<z.ZodObject<{
25
+ method: z.ZodString;
26
+ path: z.ZodString;
27
+ body: z.ZodOptional<z.ZodUnknown>;
28
+ }, z.core.$loose>>;
29
+ readonly confirmationRequired: z.ZodOptional<z.ZodString>;
30
+ };
12
31
  export declare const getInfoOutputSchema: {
13
32
  applicationVersion: z.ZodOptional<z.ZodString>;
14
33
  };
@@ -40,6 +59,7 @@ export declare const networkOutputSchema: {
40
59
  ipv6Configuration: z.ZodOptional<z.ZodUnknown>;
41
60
  metadata: z.ZodOptional<z.ZodObject<{
42
61
  origin: z.ZodOptional<z.ZodString>;
62
+ configurable: z.ZodOptional<z.ZodBoolean>;
43
63
  }, z.core.$loose>>;
44
64
  };
45
65
  export declare const listNetworksOutputSchema: {
@@ -64,6 +84,7 @@ export declare const listNetworksOutputSchema: {
64
84
  ipv6Configuration: z.ZodOptional<z.ZodUnknown>;
65
85
  metadata: z.ZodOptional<z.ZodObject<{
66
86
  origin: z.ZodOptional<z.ZodString>;
87
+ configurable: z.ZodOptional<z.ZodBoolean>;
67
88
  }, z.core.$loose>>;
68
89
  }, z.core.$loose>>;
69
90
  };
@@ -129,6 +150,7 @@ export declare const firewallZoneOutputSchema: {
129
150
  networkIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
130
151
  metadata: z.ZodOptional<z.ZodObject<{
131
152
  origin: z.ZodOptional<z.ZodString>;
153
+ configurable: z.ZodOptional<z.ZodBoolean>;
132
154
  }, z.core.$loose>>;
133
155
  };
134
156
  export declare const listFirewallZonesOutputSchema: {
@@ -142,6 +164,7 @@ export declare const listFirewallZonesOutputSchema: {
142
164
  networkIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
143
165
  metadata: z.ZodOptional<z.ZodObject<{
144
166
  origin: z.ZodOptional<z.ZodString>;
167
+ configurable: z.ZodOptional<z.ZodBoolean>;
145
168
  }, z.core.$loose>>;
146
169
  }, z.core.$loose>>;
147
170
  };
@@ -157,10 +180,12 @@ export declare const firewallPolicyOutputSchema: {
157
180
  ipsecFilter: z.ZodOptional<z.ZodUnknown>;
158
181
  schedule: z.ZodOptional<z.ZodUnknown>;
159
182
  loggingEnabled: z.ZodOptional<z.ZodBoolean>;
183
+ reportFlowEnabled: z.ZodOptional<z.ZodBoolean>;
160
184
  index: z.ZodOptional<z.ZodNumber>;
161
185
  description: z.ZodOptional<z.ZodString>;
162
186
  metadata: z.ZodOptional<z.ZodObject<{
163
187
  origin: z.ZodOptional<z.ZodString>;
188
+ configurable: z.ZodOptional<z.ZodBoolean>;
164
189
  }, z.core.$loose>>;
165
190
  };
166
191
  export declare const listFirewallPoliciesOutputSchema: {
@@ -180,10 +205,12 @@ export declare const listFirewallPoliciesOutputSchema: {
180
205
  ipsecFilter: z.ZodOptional<z.ZodUnknown>;
181
206
  schedule: z.ZodOptional<z.ZodUnknown>;
182
207
  loggingEnabled: z.ZodOptional<z.ZodBoolean>;
208
+ reportFlowEnabled: z.ZodOptional<z.ZodBoolean>;
183
209
  index: z.ZodOptional<z.ZodNumber>;
184
210
  description: z.ZodOptional<z.ZodString>;
185
211
  metadata: z.ZodOptional<z.ZodObject<{
186
212
  origin: z.ZodOptional<z.ZodString>;
213
+ configurable: z.ZodOptional<z.ZodBoolean>;
187
214
  }, z.core.$loose>>;
188
215
  }, z.core.$loose>>;
189
216
  };
@@ -199,14 +226,15 @@ export declare const aclRuleOutputSchema: {
199
226
  name: z.ZodOptional<z.ZodString>;
200
227
  enabled: z.ZodOptional<z.ZodBoolean>;
201
228
  action: z.ZodOptional<z.ZodString>;
202
- description: z.ZodOptional<z.ZodString>;
203
- protocolFilter: z.ZodOptional<z.ZodArray<z.ZodString>>;
229
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
230
+ protocolFilter: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>;
204
231
  sourceFilter: z.ZodOptional<z.ZodUnknown>;
205
232
  destinationFilter: z.ZodOptional<z.ZodUnknown>;
206
233
  enforcingDeviceFilter: z.ZodOptional<z.ZodUnknown>;
207
234
  index: z.ZodOptional<z.ZodNumber>;
208
235
  metadata: z.ZodOptional<z.ZodObject<{
209
236
  origin: z.ZodOptional<z.ZodString>;
237
+ configurable: z.ZodOptional<z.ZodBoolean>;
210
238
  }, z.core.$loose>>;
211
239
  };
212
240
  export declare const listAclRulesOutputSchema: {
@@ -220,14 +248,15 @@ export declare const listAclRulesOutputSchema: {
220
248
  name: z.ZodOptional<z.ZodString>;
221
249
  enabled: z.ZodOptional<z.ZodBoolean>;
222
250
  action: z.ZodOptional<z.ZodString>;
223
- description: z.ZodOptional<z.ZodString>;
224
- protocolFilter: z.ZodOptional<z.ZodArray<z.ZodString>>;
251
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
252
+ protocolFilter: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>;
225
253
  sourceFilter: z.ZodOptional<z.ZodUnknown>;
226
254
  destinationFilter: z.ZodOptional<z.ZodUnknown>;
227
255
  enforcingDeviceFilter: z.ZodOptional<z.ZodUnknown>;
228
256
  index: z.ZodOptional<z.ZodNumber>;
229
257
  metadata: z.ZodOptional<z.ZodObject<{
230
258
  origin: z.ZodOptional<z.ZodString>;
259
+ configurable: z.ZodOptional<z.ZodBoolean>;
231
260
  }, z.core.$loose>>;
232
261
  }, z.core.$loose>>;
233
262
  };
@@ -243,6 +272,7 @@ export declare const switchStackOutputSchema: {
243
272
  lags: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
244
273
  metadata: z.ZodOptional<z.ZodObject<{
245
274
  origin: z.ZodOptional<z.ZodString>;
275
+ configurable: z.ZodOptional<z.ZodBoolean>;
246
276
  }, z.core.$loose>>;
247
277
  };
248
278
  export declare const listSwitchStacksOutputSchema: {
@@ -259,6 +289,7 @@ export declare const listSwitchStacksOutputSchema: {
259
289
  lags: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
260
290
  metadata: z.ZodOptional<z.ZodObject<{
261
291
  origin: z.ZodOptional<z.ZodString>;
292
+ configurable: z.ZodOptional<z.ZodBoolean>;
262
293
  }, z.core.$loose>>;
263
294
  }, z.core.$loose>>;
264
295
  };
@@ -269,6 +300,7 @@ export declare const mcLagDomainOutputSchema: {
269
300
  lags: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
270
301
  metadata: z.ZodOptional<z.ZodObject<{
271
302
  origin: z.ZodOptional<z.ZodString>;
303
+ configurable: z.ZodOptional<z.ZodBoolean>;
272
304
  }, z.core.$loose>>;
273
305
  };
274
306
  export declare const listMcLagDomainsOutputSchema: {
@@ -283,6 +315,7 @@ export declare const listMcLagDomainsOutputSchema: {
283
315
  lags: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
284
316
  metadata: z.ZodOptional<z.ZodObject<{
285
317
  origin: z.ZodOptional<z.ZodString>;
318
+ configurable: z.ZodOptional<z.ZodBoolean>;
286
319
  }, z.core.$loose>>;
287
320
  }, z.core.$loose>>;
288
321
  };
@@ -295,6 +328,7 @@ export declare const lagOutputSchema: {
295
328
  }, z.core.$loose>>>;
296
329
  metadata: z.ZodOptional<z.ZodObject<{
297
330
  origin: z.ZodOptional<z.ZodString>;
331
+ configurable: z.ZodOptional<z.ZodBoolean>;
298
332
  }, z.core.$loose>>;
299
333
  };
300
334
  export declare const listLagsOutputSchema: {
@@ -311,6 +345,7 @@ export declare const listLagsOutputSchema: {
311
345
  }, z.core.$loose>>>;
312
346
  metadata: z.ZodOptional<z.ZodObject<{
313
347
  origin: z.ZodOptional<z.ZodString>;
348
+ configurable: z.ZodOptional<z.ZodBoolean>;
314
349
  }, z.core.$loose>>;
315
350
  }, z.core.$loose>>;
316
351
  };
@@ -321,8 +356,20 @@ export declare const dnsPolicyOutputSchema: {
321
356
  domain: z.ZodOptional<z.ZodString>;
322
357
  ipv4Address: z.ZodOptional<z.ZodString>;
323
358
  ttlSeconds: z.ZodOptional<z.ZodNumber>;
359
+ ipv6Address: z.ZodOptional<z.ZodNullable<z.ZodString>>;
360
+ targetDomain: z.ZodOptional<z.ZodNullable<z.ZodString>>;
361
+ mailServerDomain: z.ZodOptional<z.ZodNullable<z.ZodString>>;
362
+ text: z.ZodOptional<z.ZodNullable<z.ZodString>>;
363
+ serverDomain: z.ZodOptional<z.ZodNullable<z.ZodString>>;
364
+ service: z.ZodOptional<z.ZodNullable<z.ZodString>>;
365
+ protocol: z.ZodOptional<z.ZodNullable<z.ZodString>>;
366
+ port: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
367
+ priority: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
368
+ weight: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
369
+ ipAddress: z.ZodOptional<z.ZodNullable<z.ZodString>>;
324
370
  metadata: z.ZodOptional<z.ZodObject<{
325
371
  origin: z.ZodOptional<z.ZodString>;
372
+ configurable: z.ZodOptional<z.ZodBoolean>;
326
373
  }, z.core.$loose>>;
327
374
  };
328
375
  export declare const listDnsPoliciesOutputSchema: {
@@ -337,8 +384,20 @@ export declare const listDnsPoliciesOutputSchema: {
337
384
  domain: z.ZodOptional<z.ZodString>;
338
385
  ipv4Address: z.ZodOptional<z.ZodString>;
339
386
  ttlSeconds: z.ZodOptional<z.ZodNumber>;
387
+ ipv6Address: z.ZodOptional<z.ZodNullable<z.ZodString>>;
388
+ targetDomain: z.ZodOptional<z.ZodNullable<z.ZodString>>;
389
+ mailServerDomain: z.ZodOptional<z.ZodNullable<z.ZodString>>;
390
+ text: z.ZodOptional<z.ZodNullable<z.ZodString>>;
391
+ serverDomain: z.ZodOptional<z.ZodNullable<z.ZodString>>;
392
+ service: z.ZodOptional<z.ZodNullable<z.ZodString>>;
393
+ protocol: z.ZodOptional<z.ZodNullable<z.ZodString>>;
394
+ port: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
395
+ priority: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
396
+ weight: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
397
+ ipAddress: z.ZodOptional<z.ZodNullable<z.ZodString>>;
340
398
  metadata: z.ZodOptional<z.ZodObject<{
341
399
  origin: z.ZodOptional<z.ZodString>;
400
+ configurable: z.ZodOptional<z.ZodBoolean>;
342
401
  }, z.core.$loose>>;
343
402
  }, z.core.$loose>>;
344
403
  };
@@ -349,6 +408,7 @@ export declare const trafficMatchingListOutputSchema: {
349
408
  items: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
350
409
  metadata: z.ZodOptional<z.ZodObject<{
351
410
  origin: z.ZodOptional<z.ZodString>;
411
+ configurable: z.ZodOptional<z.ZodBoolean>;
352
412
  }, z.core.$loose>>;
353
413
  };
354
414
  export declare const listTrafficMatchingListsOutputSchema: {
@@ -363,6 +423,7 @@ export declare const listTrafficMatchingListsOutputSchema: {
363
423
  items: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
364
424
  metadata: z.ZodOptional<z.ZodObject<{
365
425
  origin: z.ZodOptional<z.ZodString>;
426
+ configurable: z.ZodOptional<z.ZodBoolean>;
366
427
  }, z.core.$loose>>;
367
428
  }, z.core.$loose>>;
368
429
  };
@@ -495,6 +556,7 @@ export declare const listWifiOutputSchema: {
495
556
  broadcastingDeviceFilter: z.ZodOptional<z.ZodUnknown>;
496
557
  metadata: z.ZodOptional<z.ZodObject<{
497
558
  origin: z.ZodOptional<z.ZodString>;
559
+ configurable: z.ZodOptional<z.ZodBoolean>;
498
560
  }, z.core.$loose>>;
499
561
  }, z.core.$loose>>;
500
562
  };
@@ -512,6 +574,7 @@ export declare const getWifiOutputSchema: {
512
574
  broadcastingDeviceFilter: z.ZodOptional<z.ZodUnknown>;
513
575
  metadata: z.ZodOptional<z.ZodObject<{
514
576
  origin: z.ZodOptional<z.ZodString>;
577
+ configurable: z.ZodOptional<z.ZodBoolean>;
515
578
  }, z.core.$loose>>;
516
579
  };
517
580
  export declare const listWansOutputSchema: {
@@ -536,6 +599,7 @@ export declare const listVpnServersOutputSchema: {
536
599
  enabled: z.ZodOptional<z.ZodBoolean>;
537
600
  metadata: z.ZodOptional<z.ZodObject<{
538
601
  origin: z.ZodOptional<z.ZodString>;
602
+ configurable: z.ZodOptional<z.ZodBoolean>;
539
603
  }, z.core.$loose>>;
540
604
  }, z.core.$loose>>;
541
605
  };
@@ -559,6 +623,7 @@ export declare const listRadiusProfilesOutputSchema: {
559
623
  name: z.ZodOptional<z.ZodString>;
560
624
  metadata: z.ZodOptional<z.ZodObject<{
561
625
  origin: z.ZodOptional<z.ZodString>;
626
+ configurable: z.ZodOptional<z.ZodBoolean>;
562
627
  }, z.core.$loose>>;
563
628
  }, z.core.$loose>>;
564
629
  };
@@ -663,6 +728,9 @@ export declare const listClientHistoryOutputSchema: {
663
728
  status: z.ZodOptional<z.ZodString>;
664
729
  }, z.core.$loose>>;
665
730
  readonly count: z.ZodNumber;
731
+ readonly totalCount: z.ZodNumber;
732
+ readonly limit: z.ZodNumber;
733
+ readonly truncated: z.ZodBoolean;
666
734
  readonly withinHours: z.ZodNumber;
667
735
  readonly coverage: z.ZodString;
668
736
  };