@kusinta/iot-schema 0.2.0-beta.4 → 0.2.0-beta.40

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 (67) hide show
  1. package/package.json +12 -1
  2. package/src/kusinta/iot/access/v1/acl_pb.d.ts +119 -2
  3. package/src/kusinta/iot/access/v1/acl_pb.js +20 -3
  4. package/src/kusinta/iot/access/v1/roles_pb.d.ts +131 -4
  5. package/src/kusinta/iot/access/v1/roles_pb.js +110 -5
  6. package/src/kusinta/iot/accountlink/v1/account_link_pb.d.ts +583 -0
  7. package/src/kusinta/iot/accountlink/v1/account_link_pb.js +160 -0
  8. package/src/kusinta/iot/climate/v1/climate_pb.d.ts +1041 -0
  9. package/src/kusinta/iot/climate/v1/climate_pb.js +206 -0
  10. package/src/kusinta/iot/commissioning/v1/commissioning_pb.d.ts +1128 -0
  11. package/src/kusinta/iot/commissioning/v1/commissioning_pb.js +246 -0
  12. package/src/kusinta/iot/common/v1/pairing_pb.d.ts +217 -0
  13. package/src/kusinta/iot/common/v1/pairing_pb.js +50 -0
  14. package/src/kusinta/iot/common/v1/types_pb.d.ts +175 -0
  15. package/src/kusinta/iot/common/v1/types_pb.js +70 -1
  16. package/src/kusinta/iot/connector/v1/connector_pb.d.ts +691 -2
  17. package/src/kusinta/iot/connector/v1/connector_pb.js +104 -13
  18. package/src/kusinta/iot/device/v1/cluster_state_pb.d.ts +213 -1
  19. package/src/kusinta/iot/device/v1/cluster_state_pb.js +37 -2
  20. package/src/kusinta/iot/device/v1/descriptor_pb.d.ts +22 -2
  21. package/src/kusinta/iot/device/v1/descriptor_pb.js +2 -1
  22. package/src/kusinta/iot/device/v1/device_event_pb.d.ts +87 -5
  23. package/src/kusinta/iot/device/v1/device_event_pb.js +1 -1
  24. package/src/kusinta/iot/device/v1/device_pb.d.ts +164 -11
  25. package/src/kusinta/iot/device/v1/device_pb.js +33 -2
  26. package/src/kusinta/iot/device/v1/properties_pb.d.ts +26 -5
  27. package/src/kusinta/iot/device/v1/properties_pb.js +1 -1
  28. package/src/kusinta/iot/device/v1/property_update_pb.d.ts +28 -2
  29. package/src/kusinta/iot/device/v1/property_update_pb.js +2 -1
  30. package/src/kusinta/iot/heating/v1/heating_pb.d.ts +619 -0
  31. package/src/kusinta/iot/heating/v1/heating_pb.js +118 -0
  32. package/src/kusinta/iot/link/v1/link_pb.d.ts +438 -0
  33. package/src/kusinta/iot/link/v1/link_pb.js +121 -0
  34. package/src/kusinta/iot/registration/v1/registration_pb.d.ts +18 -0
  35. package/src/kusinta/iot/registration/v1/registration_pb.js +1 -1
  36. package/src/kusinta/iot/reporting/v1/reporting_pb.d.ts +1225 -0
  37. package/src/kusinta/iot/reporting/v1/reporting_pb.js +238 -0
  38. package/src/kusinta/iot/reporting/v1/reporting_service_pb.d.ts +63 -0
  39. package/src/kusinta/iot/reporting/v1/reporting_service_pb.js +24 -0
  40. package/src/kusinta/iot/signaling/v1/signaling_pb.d.ts +920 -7
  41. package/src/kusinta/iot/signaling/v1/signaling_pb.js +163 -4
  42. package/src/kusinta/iot/signaling/v1/signaling_service_pb.d.ts +24 -1
  43. package/src/kusinta/iot/signaling/v1/signaling_service_pb.js +1 -1
  44. package/src/kusinta/iot/space/v1/space_pb.d.ts +107 -2
  45. package/src/kusinta/iot/space/v1/space_pb.js +10 -1
  46. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.d.ts +19 -3
  47. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.js +1 -1
  48. package/src/kusinta/iot/vendor/lorawan/v1/lorawan_pb.d.ts +69 -0
  49. package/src/kusinta/iot/vendor/lorawan/v1/lorawan_pb.js +19 -0
  50. package/src/kusinta/iot/vendor/v1/vendor_options_pb.d.ts +4 -4
  51. package/src/kusinta/iot/vendor/v1/vendor_options_pb.js +4 -4
  52. package/src/kusinta/iot/webrtc/v1/app_token_pb.d.ts +48 -5
  53. package/src/kusinta/iot/webrtc/v1/app_token_pb.js +1 -1
  54. package/src/kusinta/iot/webrtc/v1/command_pb.d.ts +56 -0
  55. package/src/kusinta/iot/webrtc/v1/command_pb.js +1 -1
  56. package/src/kusinta/iot/webrtc/v1/device_state_pb.d.ts +179 -5
  57. package/src/kusinta/iot/webrtc/v1/device_state_pb.js +35 -6
  58. package/src/kusinta/iot/webrtc/v1/envelope_pb.d.ts +607 -3
  59. package/src/kusinta/iot/webrtc/v1/envelope_pb.js +68 -3
  60. package/src/kusinta/iot/webrtc/v1/invite_pb.d.ts +498 -0
  61. package/src/kusinta/iot/webrtc/v1/invite_pb.js +108 -0
  62. package/src/kusinta/iot/webrtc/v1/management_pb.d.ts +1687 -75
  63. package/src/kusinta/iot/webrtc/v1/management_pb.js +261 -5
  64. package/src/kusinta/iot/webrtc/v1/members_pb.d.ts +536 -0
  65. package/src/kusinta/iot/webrtc/v1/members_pb.js +113 -0
  66. package/src/kusinta/iot/webrtc/v1/permission_push_pb.d.ts +66 -4
  67. package/src/kusinta/iot/webrtc/v1/permission_push_pb.js +10 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kusinta/iot-schema",
3
- "version": "0.2.0-beta.4",
3
+ "version": "0.2.0-beta.40",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "files": ["src"],
@@ -10,6 +10,7 @@
10
10
  },
11
11
  "exports": {
12
12
  "./common": "./src/kusinta/iot/common/v1/types_pb.js",
13
+ "./common/pairing": "./src/kusinta/iot/common/v1/pairing_pb.js",
13
14
  "./identity": "./src/kusinta/iot/identity/v1/identity_pb.js",
14
15
  "./device": "./src/kusinta/iot/device/v1/device_pb.js",
15
16
  "./device/descriptor": "./src/kusinta/iot/device/v1/descriptor_pb.js",
@@ -20,20 +21,30 @@
20
21
  "./device/event": "./src/kusinta/iot/device/v1/device_event_pb.js",
21
22
  "./vendor/options": "./src/kusinta/iot/vendor/v1/vendor_options_pb.js",
22
23
  "./vendor/homematic": "./src/kusinta/iot/vendor/homematic/v1/homematic_pb.js",
24
+ "./vendor/lorawan": "./src/kusinta/iot/vendor/lorawan/v1/lorawan_pb.js",
23
25
  "./space": "./src/kusinta/iot/space/v1/space_pb.js",
24
26
  "./access": "./src/kusinta/iot/access/v1/acl_pb.js",
25
27
  "./access/roles": "./src/kusinta/iot/access/v1/roles_pb.js",
28
+ "./account-link": "./src/kusinta/iot/accountlink/v1/account_link_pb.js",
29
+ "./link": "./src/kusinta/iot/link/v1/link_pb.js",
30
+ "./climate": "./src/kusinta/iot/climate/v1/climate_pb.js",
31
+ "./commissioning": "./src/kusinta/iot/commissioning/v1/commissioning_pb.js",
32
+ "./heating": "./src/kusinta/iot/heating/v1/heating_pb.js",
26
33
  "./connector": "./src/kusinta/iot/connector/v1/connector_pb.js",
27
34
  "./connector/service": "./src/kusinta/iot/connector/v1/connector_service_pb.js",
28
35
  "./webrtc": "./src/kusinta/iot/webrtc/v1/envelope_pb.js",
29
36
  "./webrtc/app-token": "./src/kusinta/iot/webrtc/v1/app_token_pb.js",
30
37
  "./webrtc/command": "./src/kusinta/iot/webrtc/v1/command_pb.js",
31
38
  "./webrtc/device-state": "./src/kusinta/iot/webrtc/v1/device_state_pb.js",
39
+ "./webrtc/invite": "./src/kusinta/iot/webrtc/v1/invite_pb.js",
40
+ "./webrtc/members": "./src/kusinta/iot/webrtc/v1/members_pb.js",
32
41
  "./webrtc/management": "./src/kusinta/iot/webrtc/v1/management_pb.js",
33
42
  "./webrtc/permission-push": "./src/kusinta/iot/webrtc/v1/permission_push_pb.js",
34
43
  "./webrtc/setpoint-mode": "./src/kusinta/iot/webrtc/v1/setpoint_mode_pb.js",
35
44
  "./registration": "./src/kusinta/iot/registration/v1/registration_pb.js",
36
45
  "./registration/service": "./src/kusinta/iot/registration/v1/registration_service_pb.js",
46
+ "./reporting": "./src/kusinta/iot/reporting/v1/reporting_pb.js",
47
+ "./reporting/service": "./src/kusinta/iot/reporting/v1/reporting_service_pb.js",
37
48
  "./signaling": "./src/kusinta/iot/signaling/v1/signaling_pb.js",
38
49
  "./signaling/service": "./src/kusinta/iot/signaling/v1/signaling_service_pb.js"
39
50
  },
@@ -2,10 +2,10 @@
2
2
  // @generated from file kusinta/iot/access/v1/acl.proto (package kusinta.iot.access.v1, syntax proto3)
3
3
  /* eslint-disable */
4
4
 
5
- import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
5
+ import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
6
6
  import type { Message } from "@bufbuild/protobuf";
7
7
  import type { DeviceId, GatewayId, UserId } from "../../identity/v1/identity_pb.js";
8
- import type { PermissionAction, Role } from "./roles_pb.js";
8
+ import type { MembershipRelation, PermissionAction, Role } from "./roles_pb.js";
9
9
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
10
10
 
11
11
  /**
@@ -304,6 +304,25 @@ export declare type DeviceAcl = Message<"kusinta.iot.access.v1.DeviceAcl"> & {
304
304
  * @generated from field: repeated kusinta.iot.access.v1.EventRef allowed_event_refs = 10;
305
305
  */
306
306
  allowedEventRefs: EventRef[];
307
+
308
+ /**
309
+ * How the user stands to the home this device is filed in, where that shaped this ACL.
310
+ * See MembershipRelation in roles.proto.
311
+ *
312
+ * SERVICE: the user sees this building device in someone's home as service, whatever
313
+ * relation their membership records. They hold no action on it — allowed_actions is empty
314
+ * — and are sent no reading or event of it. The Device they are sent carries its
315
+ * description only: its endpoints with their device types and implemented lists, and no
316
+ * property value. What keeps it working comes as a webrtc.v1.ServiceStatus instead. An
317
+ * app should show its readings as withheld, not missing. RESIDENT: the user lives in the
318
+ * home the device is filed in, whether or not they also own it. UNSPECIFIED: neither
319
+ * applies — the device is not in a home, or the user reaches it only by owning it.
320
+ *
321
+ * Descriptive, like role: allowed_actions and the ref lists are what is enforced.
322
+ *
323
+ * @generated from field: kusinta.iot.access.v1.MembershipRelation relation = 11;
324
+ */
325
+ relation: MembershipRelation;
307
326
  };
308
327
 
309
328
  /**
@@ -361,3 +380,101 @@ export declare type EffectivePermissions = Message<"kusinta.iot.access.v1.Effect
361
380
  */
362
381
  export declare const EffectivePermissionsSchema: GenMessage<EffectivePermissions>;
363
382
 
383
+ /**
384
+ * What service sees of a home, as a resident is told it in webrtc.v1.PrivacyDisclosure.
385
+ * Each names part of a webrtc.v1.ServiceStatus, of a device's description, of how the
386
+ * home is set up, or of who lives there; with the climate summary the disclosure names
387
+ * separately, nothing else of the home reaches service.
388
+ *
389
+ * @generated from enum kusinta.iot.access.v1.ServiceSignal
390
+ */
391
+ export enum ServiceSignal {
392
+ /**
393
+ * @generated from enum value: SERVICE_SIGNAL_UNSPECIFIED = 0;
394
+ */
395
+ UNSPECIFIED = 0,
396
+
397
+ /**
398
+ * Whether the device is reachable, and since which quarter hour it has not been.
399
+ *
400
+ * @generated from enum value: SERVICE_SIGNAL_REACHABILITY = 1;
401
+ */
402
+ REACHABILITY = 1,
403
+
404
+ /**
405
+ * Its remaining charge in steps of ten, and low-battery and replacement warnings.
406
+ *
407
+ * @generated from enum value: SERVICE_SIGNAL_BATTERY = 2;
408
+ */
409
+ BATTERY = 2,
410
+
411
+ /**
412
+ * How good its radio link is.
413
+ *
414
+ * @generated from enum value: SERVICE_SIGNAL_RADIO_LINK = 3;
415
+ */
416
+ RADIO_LINK = 3,
417
+
418
+ /**
419
+ * Its firmware version: DeviceDescriptor.software_version_string, sent to service.
420
+ *
421
+ * @generated from enum value: SERVICE_SIGNAL_FIRMWARE = 4;
422
+ */
423
+ FIRMWARE = 4,
424
+
425
+ /**
426
+ * Faults it reports about itself: errors and tampering. Not configuration it has yet to
427
+ * take, which would show when its residents changed a setting.
428
+ *
429
+ * @generated from enum value: SERVICE_SIGNAL_FAULT = 5;
430
+ */
431
+ FAULT = 5,
432
+
433
+ /**
434
+ * What the device is — its description, every field of device.v1.DeviceDescriptor but
435
+ * claimed_at: type, name, vendor, product, serial number, versions, ownership, lifecycle
436
+ * and connector; its endpoints and what each supports — and where it is filed. A
437
+ * bridged_by naming a device the recipient may not see, such as a bridge a resident owns,
438
+ * is unset. Always disclosed together with FIRMWARE, whose
439
+ * version it carries. Not when it was claimed: the only times service is given of a
440
+ * device are the quarter hours of its webrtc.v1.ServiceStatus, and the moments it appears
441
+ * to them, changes and is taken away from them, which they see as they happen.
442
+ *
443
+ * @generated from enum value: SERVICE_SIGNAL_FILING = 6;
444
+ */
445
+ FILING = 6,
446
+
447
+ /**
448
+ * How the home is set up: the apartment and its rooms, their names and descriptions, the
449
+ * rooms' limits, and the building's sensors in them.
450
+ *
451
+ * @generated from enum value: SERVICE_SIGNAL_ROOM_SETUP = 7;
452
+ */
453
+ ROOM_SETUP = 7,
454
+
455
+ /**
456
+ * Which of the building's devices are linked to which, for what, and whether device to
457
+ * device or through the gateway — not how a link is set or what it is doing. A link shows
458
+ * as it is made and as it is removed, and changes for service at no other time.
459
+ *
460
+ * @generated from enum value: SERVICE_SIGNAL_LINKS = 8;
461
+ */
462
+ LINKS = 8,
463
+
464
+ /**
465
+ * Who is filed on the home, and how, as space.v1.Space.members tells it to a caller who
466
+ * does not live there: each residency under its own residency id and since when, never
467
+ * who holds it (MembershipRelation, RESIDENCY IDS); service, and memberships recorded
468
+ * with no relation, by user id, and staff among them by name. Shown to the property owner
469
+ * and the gateway administrator only, not to every party with service reach.
470
+ *
471
+ * @generated from enum value: SERVICE_SIGNAL_RESIDENTS = 9;
472
+ */
473
+ RESIDENTS = 9,
474
+ }
475
+
476
+ /**
477
+ * Describes the enum kusinta.iot.access.v1.ServiceSignal.
478
+ */
479
+ export declare const ServiceSignalSchema: GenEnum<ServiceSignal>;
480
+
@@ -2,16 +2,16 @@
2
2
  // @generated from file kusinta/iot/access/v1/acl.proto (package kusinta.iot.access.v1, syntax proto3)
3
3
  /* eslint-disable */
4
4
 
5
- import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
5
+ import { enumDesc, fileDesc, messageDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
6
6
  import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
7
- import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identity_pb.js";
8
7
  import { file_kusinta_iot_access_v1_roles } from "./roles_pb.js";
8
+ import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identity_pb.js";
9
9
 
10
10
  /**
11
11
  * Describes the file kusinta/iot/access/v1/acl.proto.
12
12
  */
13
13
  export const file_kusinta_iot_access_v1_acl = /*@__PURE__*/
14
- fileDesc("Ch9rdXNpbnRhL2lvdC9hY2Nlc3MvdjEvYWNsLnByb3RvEhVrdXNpbnRhLmlvdC5hY2Nlc3MudjEirgEKDEF0dHJpYnV0ZVJlZhIWCg5hdHRyaWJ1dGVfbmFtZRgBIAEoCRISCgpjbHVzdGVyX2lkGAIgASgNEhQKDGF0dHJpYnV0ZV9pZBgEIAEoDRIYCgtlbmRwb2ludF9pZBgDIAEoDUgAiAEBEh0KEHZlbmRvcl9leHRlbnNpb24YBSABKAlIAYgBAUIOCgxfZW5kcG9pbnRfaWRCEwoRX3ZlbmRvcl9leHRlbnNpb24iZQoKQ29tbWFuZFJlZhISCgpjbHVzdGVyX2lkGAEgASgNEhkKEW1hdHRlcl9jb21tYW5kX2lkGAIgASgNEhgKC2VuZHBvaW50X2lkGAMgASgNSACIAQFCDgoMX2VuZHBvaW50X2lkIloKCEV2ZW50UmVmEhIKCmNsdXN0ZXJfaWQYASABKA0SEAoIZXZlbnRfaWQYAiABKA0SGAoLZW5kcG9pbnRfaWQYAyABKA1IAIgBAUIOCgxfZW5kcG9pbnRfaWQi5wEKElByb3BlcnR5Q29uc3RyYWludBI2CglhdHRyaWJ1dGUYCCABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmEhEKB2ludF9tYXgYAiABKBFIABIRCgdpbnRfbWluGAMgASgRSAASEgoIdWludF9tYXgYBCABKA1IABISCgh1aW50X21pbhgFIAEoDUgAQgwKCmNvbnN0cmFpbnRKBAgBEAJKBAgGEAdKBAgHEAhSDmF0dHJpYnV0ZV9uYW1lUg5jbHVzdGVyX2lkX2hleFILZW5kcG9pbnRfaWQihgQKCURldmljZUFjbBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIwCgd1c2VyX2lkGAIgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEikKBHJvbGUYAyABKA4yGy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuUm9sZRJACg9hbGxvd2VkX2FjdGlvbnMYBCADKA4yJy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuUGVybWlzc2lvbkFjdGlvbhJDChZhbGxvd2VkX2F0dHJpYnV0ZV9yZWZzGAcgAygLMiMua3VzaW50YS5pb3QuYWNjZXNzLnYxLkF0dHJpYnV0ZVJlZhJHChRwcm9wZXJ0eV9jb25zdHJhaW50cxgGIAMoCzIpLmt1c2ludGEuaW90LmFjY2Vzcy52MS5Qcm9wZXJ0eUNvbnN0cmFpbnQSPwoUYWxsb3dlZF9jb21tYW5kX3JlZnMYCSADKAsyIS5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQ29tbWFuZFJlZhI7ChJhbGxvd2VkX2V2ZW50X3JlZnMYCiADKAsyHy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuRXZlbnRSZWZKBAgFEAZSEmFsbG93ZWRfYXR0cmlidXRlcyLlAQoURWZmZWN0aXZlUGVybWlzc2lvbnMSMAoHdXNlcl9pZBgBIAEoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZBI2CgpnYXRld2F5X2lkGAIgASgLMiIua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuR2F0ZXdheUlkEjUKC2RldmljZV9hY2xzGAMgAygLMiAua3VzaW50YS5pb3QuYWNjZXNzLnYxLkRldmljZUFjbBIsCgh2YWxpZF9hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_access_v1_roles]);
14
+ fileDesc("Ch9rdXNpbnRhL2lvdC9hY2Nlc3MvdjEvYWNsLnByb3RvEhVrdXNpbnRhLmlvdC5hY2Nlc3MudjEirgEKDEF0dHJpYnV0ZVJlZhIWCg5hdHRyaWJ1dGVfbmFtZRgBIAEoCRISCgpjbHVzdGVyX2lkGAIgASgNEhQKDGF0dHJpYnV0ZV9pZBgEIAEoDRIYCgtlbmRwb2ludF9pZBgDIAEoDUgAiAEBEh0KEHZlbmRvcl9leHRlbnNpb24YBSABKAlIAYgBAUIOCgxfZW5kcG9pbnRfaWRCEwoRX3ZlbmRvcl9leHRlbnNpb24iZQoKQ29tbWFuZFJlZhISCgpjbHVzdGVyX2lkGAEgASgNEhkKEW1hdHRlcl9jb21tYW5kX2lkGAIgASgNEhgKC2VuZHBvaW50X2lkGAMgASgNSACIAQFCDgoMX2VuZHBvaW50X2lkIloKCEV2ZW50UmVmEhIKCmNsdXN0ZXJfaWQYASABKA0SEAoIZXZlbnRfaWQYAiABKA0SGAoLZW5kcG9pbnRfaWQYAyABKA1IAIgBAUIOCgxfZW5kcG9pbnRfaWQi5wEKElByb3BlcnR5Q29uc3RyYWludBI2CglhdHRyaWJ1dGUYCCABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmEhEKB2ludF9tYXgYAiABKBFIABIRCgdpbnRfbWluGAMgASgRSAASEgoIdWludF9tYXgYBCABKA1IABISCgh1aW50X21pbhgFIAEoDUgAQgwKCmNvbnN0cmFpbnRKBAgBEAJKBAgGEAdKBAgHEAhSDmF0dHJpYnV0ZV9uYW1lUg5jbHVzdGVyX2lkX2hleFILZW5kcG9pbnRfaWQiwwQKCURldmljZUFjbBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIwCgd1c2VyX2lkGAIgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEikKBHJvbGUYAyABKA4yGy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuUm9sZRJACg9hbGxvd2VkX2FjdGlvbnMYBCADKA4yJy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuUGVybWlzc2lvbkFjdGlvbhJDChZhbGxvd2VkX2F0dHJpYnV0ZV9yZWZzGAcgAygLMiMua3VzaW50YS5pb3QuYWNjZXNzLnYxLkF0dHJpYnV0ZVJlZhJHChRwcm9wZXJ0eV9jb25zdHJhaW50cxgGIAMoCzIpLmt1c2ludGEuaW90LmFjY2Vzcy52MS5Qcm9wZXJ0eUNvbnN0cmFpbnQSPwoUYWxsb3dlZF9jb21tYW5kX3JlZnMYCSADKAsyIS5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQ29tbWFuZFJlZhI7ChJhbGxvd2VkX2V2ZW50X3JlZnMYCiADKAsyHy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuRXZlbnRSZWYSOwoIcmVsYXRpb24YCyABKA4yKS5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuTWVtYmVyc2hpcFJlbGF0aW9uSgQIBRAGUhJhbGxvd2VkX2F0dHJpYnV0ZXMi5QEKFEVmZmVjdGl2ZVBlcm1pc3Npb25zEjAKB3VzZXJfaWQYASABKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWQSNgoKZ2F0ZXdheV9pZBgCIAEoCzIiLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkdhdGV3YXlJZBI1CgtkZXZpY2VfYWNscxgDIAMoCzIgLmt1c2ludGEuaW90LmFjY2Vzcy52MS5EZXZpY2VBY2wSLAoIdmFsaWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wKrQCCg1TZXJ2aWNlU2lnbmFsEh4KGlNFUlZJQ0VfU0lHTkFMX1VOU1BFQ0lGSUVEEAASHwobU0VSVklDRV9TSUdOQUxfUkVBQ0hBQklMSVRZEAESGgoWU0VSVklDRV9TSUdOQUxfQkFUVEVSWRACEh0KGVNFUlZJQ0VfU0lHTkFMX1JBRElPX0xJTksQAxIbChdTRVJWSUNFX1NJR05BTF9GSVJNV0FSRRAEEhgKFFNFUlZJQ0VfU0lHTkFMX0ZBVUxUEAUSGQoVU0VSVklDRV9TSUdOQUxfRklMSU5HEAYSHQoZU0VSVklDRV9TSUdOQUxfUk9PTV9TRVRVUBAHEhgKFFNFUlZJQ0VfU0lHTkFMX0xJTktTEAgSHAoYU0VSVklDRV9TSUdOQUxfUkVTSURFTlRTEAlCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_roles, file_kusinta_iot_identity_v1_identity]);
15
15
 
16
16
  /**
17
17
  * Describes the message kusinta.iot.access.v1.AttributeRef.
@@ -55,3 +55,20 @@ export const DeviceAclSchema = /*@__PURE__*/
55
55
  export const EffectivePermissionsSchema = /*@__PURE__*/
56
56
  messageDesc(file_kusinta_iot_access_v1_acl, 5);
57
57
 
58
+ /**
59
+ * Describes the enum kusinta.iot.access.v1.ServiceSignal.
60
+ */
61
+ export const ServiceSignalSchema = /*@__PURE__*/
62
+ enumDesc(file_kusinta_iot_access_v1_acl, 0);
63
+
64
+ /**
65
+ * What service sees of a home, as a resident is told it in webrtc.v1.PrivacyDisclosure.
66
+ * Each names part of a webrtc.v1.ServiceStatus, of a device's description, of how the
67
+ * home is set up, or of who lives there; with the climate summary the disclosure names
68
+ * separately, nothing else of the home reaches service.
69
+ *
70
+ * @generated from enum kusinta.iot.access.v1.ServiceSignal
71
+ */
72
+ export const ServiceSignal = /*@__PURE__*/
73
+ tsEnum(ServiceSignalSchema);
74
+
@@ -21,10 +21,13 @@ export declare const file_kusinta_iot_access_v1_roles: GenFile;
21
21
  * The gateway resolves the two together into DeviceAcl.allowed_actions, per device. A
22
22
  * role narrows what may appear there; it does not put anything there on its own.
23
23
  *
24
- * Carried in the app's token as webrtc.v1.AppTokenClaims.roles, as an array of proto3
25
- * canonical enum NAME strings (e.g. ["ROLE_RESIDENT", "ROLE_GATEWAY_ADMIN"]) rather than
26
- * integers, so the claim stays self-describing. A user may hold several at once and the
27
- * effective ceiling is their union.
24
+ * The building-server gateway holds each user's roles itself and authorises from what it
25
+ * holds. The one role it cannot know is the administration of the organisation that owns it,
26
+ * which the api-server keeps: that one it takes from the app's token
27
+ * (webrtc.v1.AppTokenClaims.roles), and the api-server tells it who those administrators are
28
+ * (signaling.v1.VouchedAdministrators), which can end that administration but never grant it. The api-server learns the rest from the gateway
29
+ * (reporting.v1.GatewayMember). A user may hold several at once and the effective ceiling is
30
+ * their union.
28
31
  *
29
32
  * UNORDERED. These are categories, not levels: a technician is not "more than" a
30
33
  * resident, and there is no >= comparison to make between them. Anything needing a graded
@@ -36,6 +39,15 @@ export declare const file_kusinta_iot_access_v1_roles: GenFile;
36
39
  * gateway-wide role alone would not grant. That widening is the gateway's to apply and is
37
40
  * visible to the app only in the resolved DeviceAcl.
38
41
  *
42
+ * STAFF. A user who holds ROLE_TECHNICIAN, ROLE_PROPERTY_OWNER or ROLE_GATEWAY_ADMIN on a
43
+ * gateway is staff there: they serve the building rather than live in it. Wherever this
44
+ * schema says "staff" or "a staff member" it means exactly that, as the gateway holds roles,
45
+ * every vouched administrator included; holding ROLE_RESIDENT besides changes nothing. The
46
+ * term carries one rule about people: staff are named to whoever may list every member; a
47
+ * resident is named only to the people they live with; and where anyone lives is told by
48
+ * user id only to their own household, and to anyone else only under a residency id
49
+ * (MembershipRelation, RESIDENCY IDS).
50
+ *
39
51
  * @generated from enum kusinta.iot.access.v1.Role
40
52
  */
41
53
  export enum Role {
@@ -172,3 +184,118 @@ export enum PermissionAction {
172
184
  */
173
185
  export declare const PermissionActionSchema: GenEnum<PermissionAction>;
174
186
 
187
+ /**
188
+ * How a member stands to a space they are filed in. Held per membership — set by
189
+ * webrtc.v1.AssignUserToSpace — unlike Role, which is gateway-wide. The two are independent:
190
+ * a technician who lives in an apartment is filed on it as RESIDENT, and a resident who
191
+ * looks after a building's plant room is filed there as SERVICE. RESIDENT is refused on a
192
+ * room: a home's residents live in all of it.
193
+ *
194
+ * A HOME is an apartment and the rooms in it. What a user learns of a home depends on how
195
+ * they reach it; where several apply, the first wins:
196
+ *
197
+ * * As its resident — RESIDENT on the apartment. They see and operate everything filed
198
+ * in it, and its history from the start of their current residency, never before: a new
199
+ * tenant does not read the previous one's, nor learn when or by whom anything was
200
+ * changed before they moved in: every time from before that a home's rooms and devices
201
+ * carry — a reading's timestamp included — is unset for them, save a
202
+ * webrtc.v1.ServiceStatus, which always carries its times and so gives none before the first
203
+ * quarter hour of their residency, from that quarter hour on.
204
+ * * As service — SERVICE on the apartment, a room in it, or a building or floor above it,
205
+ * or as the gateway's administrator. Of the building's own devices in what they reach of
206
+ * the home — any
207
+ * device no person owns — they see what each is and a webrtc.v1.ServiceStatus,
208
+ * evaluated each quarter hour, and no reading, event or time of the device itself; they
209
+ * operate none of them. Of what they reach of the home — from the room they are filed
210
+ * on, or all of it — they see how its rooms are set up, with
211
+ * RoomClimate.state_withheld marking what is not shown, and its links with
212
+ * DeviceLink.details_withheld; modes on a home are not sent to them at all. Service
213
+ * that reaches the apartment itself also gets its climate summary over the disclosed
214
+ * period. What they newly see of the home reaches them as it happens; what they lose,
215
+ * at once.
216
+ * * Not at all — RESIDENT on a building or floor above it. Living in a building is not
217
+ * living in every apartment in it.
218
+ *
219
+ * What was recorded while a room or device was in a home stays with the home after it
220
+ * leaves: its history, and the times and people it carries from then, are never given to
221
+ * whoever reaches it later.
222
+ *
223
+ * A residency starts when a user is assigned RESIDENT on an apartment while not already its
224
+ * resident — a membership recorded with no relation included, so its holder starts afresh —
225
+ * and ends with any other change to that membership. Assigning RESIDENT to a resident
226
+ * changes nothing. A space becoming an apartment starts the residency of each RESIDENT
227
+ * member on it, and ceasing to be one ends it — though it releases no device: what is no
228
+ * longer a home holds nobody's devices for a next tenant. A device in a space becoming an
229
+ * apartment, owned by someone who is not to be its resident, is taken out of that space.
230
+ *
231
+ * A device filed in a home counts as in the home wherever else it is also filed, a device a
232
+ * resident owns included: reaching it through another space shows it to nobody. A link
233
+ * never joins a device in a home to one outside it. Outside homes the relation changes
234
+ * nothing: what is filed there is visible to whoever reaches it. A device owned as RESIDENT
235
+ * is the exception everywhere, whoever owns it: it is visible to its owner and the RESIDENT
236
+ * members filed on the space it is filed in — for a device in a home, the home's residents
237
+ * alone, wherever else it is filed; never those who merely reach a space from above — and
238
+ * to nobody else. An owner who stops living in the home it is filed in gives it up: it is
239
+ * released, with no owner, and stays filed in the home alone, as one of the building's own
240
+ * devices there. A device given up so, or released, then appears to service as any device
241
+ * newly in the home does, as it happens; that much a release shows.
242
+ *
243
+ * Who may change a home's members, move its spaces or file devices into and out of it is
244
+ * restricted by the gateway, and a refused caller gets NOT_ENTITLED. This keeps a home's
245
+ * life — its readings, history and modes — from anyone but its residents by default; those
246
+ * who service the building get the service view above and no more. It does not keep the
247
+ * property owner or the administrator out by force — they hold the building's filing
248
+ * authority and the gateway itself — but it makes their seeing in a deliberate act on the
249
+ * home, such as filing themselves on it, rather than something handed out by default. They
250
+ * remove a resident who moves out, so they are shown every residency, and since when
251
+ * (webrtc.v1.ListGatewayMembers), but never who holds it (see RESIDENCY IDS).
252
+ *
253
+ * RESIDENCY IDS. To a caller who does not live in the home, a RESIDENT membership is told
254
+ * only under its residency id: an id the gateway mints for that residency alone, when it
255
+ * begins, holds for as long as it lasts unbroken, and never reuses. It is opaque, begins
256
+ * with "residency:", and is never a user's id or derived from one, so nothing told under it
257
+ * ties the residency to a name, a role or another membership — and nothing changes it when
258
+ * the person who holds it becomes staff or stops being staff (Role, STAFF). A relation
259
+ * change, or the residency ending, ends its id. The people of the home see one another
260
+ * under their user ids. Where a request below names a member, it says whether a residency
261
+ * id may stand for one; a request that does not say so refuses one as INVALID_REQUEST, so
262
+ * that no user is ever made under one.
263
+ *
264
+ * A membership recorded with no relation, made before relations existed, sees no more than
265
+ * either relation would where it is held: on an apartment or a room, a home as service; on a
266
+ * building or floor, no home at all. It is listed with UNSPECIFIED so that it can be found
267
+ * and assigned again.
268
+ *
269
+ * @generated from enum kusinta.iot.access.v1.MembershipRelation
270
+ */
271
+ export enum MembershipRelation {
272
+ /**
273
+ * Names no relation. Invalid on a request, and refused rather than defaulted: which of
274
+ * the two a member is decides what they see of someone's home, and that must never be
275
+ * decided by an omission.
276
+ *
277
+ * @generated from enum value: MEMBERSHIP_RELATION_UNSPECIFIED = 0;
278
+ */
279
+ UNSPECIFIED = 0,
280
+
281
+ /**
282
+ * Lives there.
283
+ *
284
+ * @generated from enum value: MEMBERSHIP_RELATION_RESIDENT = 1;
285
+ */
286
+ RESIDENT = 1,
287
+
288
+ /**
289
+ * Is there for the building rather than to live in it: its owner's people, a technician,
290
+ * the gateway's administrator.
291
+ *
292
+ * @generated from enum value: MEMBERSHIP_RELATION_SERVICE = 2;
293
+ */
294
+ SERVICE = 2,
295
+ }
296
+
297
+ /**
298
+ * Describes the enum kusinta.iot.access.v1.MembershipRelation.
299
+ */
300
+ export declare const MembershipRelationSchema: GenEnum<MembershipRelation>;
301
+
@@ -8,7 +8,7 @@ import { enumDesc, fileDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
8
8
  * Describes the file kusinta/iot/access/v1/roles.proto.
9
9
  */
10
10
  export const file_kusinta_iot_access_v1_roles = /*@__PURE__*/
11
- fileDesc("CiFrdXNpbnRhL2lvdC9hY2Nlc3MvdjEvcm9sZXMucHJvdG8SFWt1c2ludGEuaW90LmFjY2Vzcy52MSp1CgRSb2xlEhQKEFJPTEVfVU5TUEVDSUZJRUQQABIRCg1ST0xFX1JFU0lERU5UEAESFwoTUk9MRV9QUk9QRVJUWV9PV05FUhACEhMKD1JPTEVfVEVDSE5JQ0lBThADEhYKElJPTEVfR0FURVdBWV9BRE1JThAEKq0BChBQZXJtaXNzaW9uQWN0aW9uEiEKHVBFUk1JU1NJT05fQUNUSU9OX1VOU1BFQ0lGSUVEEAASGgoWUEVSTUlTU0lPTl9BQ1RJT05fUkVBRBABEhsKF1BFUk1JU1NJT05fQUNUSU9OX1dSSVRFEAISHwobUEVSTUlTU0lPTl9BQ1RJT05fU1VCU0NSSUJFEAMSHAoYUEVSTUlTU0lPTl9BQ1RJT05fSU5WT0tFEARCAkgBYgZwcm90bzM");
11
+ fileDesc("CiFrdXNpbnRhL2lvdC9hY2Nlc3MvdjEvcm9sZXMucHJvdG8SFWt1c2ludGEuaW90LmFjY2Vzcy52MSp1CgRSb2xlEhQKEFJPTEVfVU5TUEVDSUZJRUQQABIRCg1ST0xFX1JFU0lERU5UEAESFwoTUk9MRV9QUk9QRVJUWV9PV05FUhACEhMKD1JPTEVfVEVDSE5JQ0lBThADEhYKElJPTEVfR0FURVdBWV9BRE1JThAEKq0BChBQZXJtaXNzaW9uQWN0aW9uEiEKHVBFUk1JU1NJT05fQUNUSU9OX1VOU1BFQ0lGSUVEEAASGgoWUEVSTUlTU0lPTl9BQ1RJT05fUkVBRBABEhsKF1BFUk1JU1NJT05fQUNUSU9OX1dSSVRFEAISHwobUEVSTUlTU0lPTl9BQ1RJT05fU1VCU0NSSUJFEAMSHAoYUEVSTUlTU0lPTl9BQ1RJT05fSU5WT0tFEAQqfAoSTWVtYmVyc2hpcFJlbGF0aW9uEiMKH01FTUJFUlNISVBfUkVMQVRJT05fVU5TUEVDSUZJRUQQABIgChxNRU1CRVJTSElQX1JFTEFUSU9OX1JFU0lERU5UEAESHwobTUVNQkVSU0hJUF9SRUxBVElPTl9TRVJWSUNFEAJCAkgBYgZwcm90bzM");
12
12
 
13
13
  /**
14
14
  * Describes the enum kusinta.iot.access.v1.Role.
@@ -28,10 +28,13 @@ export const RoleSchema = /*@__PURE__*/
28
28
  * The gateway resolves the two together into DeviceAcl.allowed_actions, per device. A
29
29
  * role narrows what may appear there; it does not put anything there on its own.
30
30
  *
31
- * Carried in the app's token as webrtc.v1.AppTokenClaims.roles, as an array of proto3
32
- * canonical enum NAME strings (e.g. ["ROLE_RESIDENT", "ROLE_GATEWAY_ADMIN"]) rather than
33
- * integers, so the claim stays self-describing. A user may hold several at once and the
34
- * effective ceiling is their union.
31
+ * The building-server gateway holds each user's roles itself and authorises from what it
32
+ * holds. The one role it cannot know is the administration of the organisation that owns it,
33
+ * which the api-server keeps: that one it takes from the app's token
34
+ * (webrtc.v1.AppTokenClaims.roles), and the api-server tells it who those administrators are
35
+ * (signaling.v1.VouchedAdministrators), which can end that administration but never grant it. The api-server learns the rest from the gateway
36
+ * (reporting.v1.GatewayMember). A user may hold several at once and the effective ceiling is
37
+ * their union.
35
38
  *
36
39
  * UNORDERED. These are categories, not levels: a technician is not "more than" a
37
40
  * resident, and there is no >= comparison to make between them. Anything needing a graded
@@ -43,6 +46,15 @@ export const RoleSchema = /*@__PURE__*/
43
46
  * gateway-wide role alone would not grant. That widening is the gateway's to apply and is
44
47
  * visible to the app only in the resolved DeviceAcl.
45
48
  *
49
+ * STAFF. A user who holds ROLE_TECHNICIAN, ROLE_PROPERTY_OWNER or ROLE_GATEWAY_ADMIN on a
50
+ * gateway is staff there: they serve the building rather than live in it. Wherever this
51
+ * schema says "staff" or "a staff member" it means exactly that, as the gateway holds roles,
52
+ * every vouched administrator included; holding ROLE_RESIDENT besides changes nothing. The
53
+ * term carries one rule about people: staff are named to whoever may list every member; a
54
+ * resident is named only to the people they live with; and where anyone lives is told by
55
+ * user id only to their own household, and to anyone else only under a residency id
56
+ * (MembershipRelation, RESIDENCY IDS).
57
+ *
46
58
  * @generated from enum kusinta.iot.access.v1.Role
47
59
  */
48
60
  export const Role = /*@__PURE__*/
@@ -70,3 +82,96 @@ export const PermissionActionSchema = /*@__PURE__*/
70
82
  export const PermissionAction = /*@__PURE__*/
71
83
  tsEnum(PermissionActionSchema);
72
84
 
85
+ /**
86
+ * Describes the enum kusinta.iot.access.v1.MembershipRelation.
87
+ */
88
+ export const MembershipRelationSchema = /*@__PURE__*/
89
+ enumDesc(file_kusinta_iot_access_v1_roles, 2);
90
+
91
+ /**
92
+ * How a member stands to a space they are filed in. Held per membership — set by
93
+ * webrtc.v1.AssignUserToSpace — unlike Role, which is gateway-wide. The two are independent:
94
+ * a technician who lives in an apartment is filed on it as RESIDENT, and a resident who
95
+ * looks after a building's plant room is filed there as SERVICE. RESIDENT is refused on a
96
+ * room: a home's residents live in all of it.
97
+ *
98
+ * A HOME is an apartment and the rooms in it. What a user learns of a home depends on how
99
+ * they reach it; where several apply, the first wins:
100
+ *
101
+ * * As its resident — RESIDENT on the apartment. They see and operate everything filed
102
+ * in it, and its history from the start of their current residency, never before: a new
103
+ * tenant does not read the previous one's, nor learn when or by whom anything was
104
+ * changed before they moved in: every time from before that a home's rooms and devices
105
+ * carry — a reading's timestamp included — is unset for them, save a
106
+ * webrtc.v1.ServiceStatus, which always carries its times and so gives none before the first
107
+ * quarter hour of their residency, from that quarter hour on.
108
+ * * As service — SERVICE on the apartment, a room in it, or a building or floor above it,
109
+ * or as the gateway's administrator. Of the building's own devices in what they reach of
110
+ * the home — any
111
+ * device no person owns — they see what each is and a webrtc.v1.ServiceStatus,
112
+ * evaluated each quarter hour, and no reading, event or time of the device itself; they
113
+ * operate none of them. Of what they reach of the home — from the room they are filed
114
+ * on, or all of it — they see how its rooms are set up, with
115
+ * RoomClimate.state_withheld marking what is not shown, and its links with
116
+ * DeviceLink.details_withheld; modes on a home are not sent to them at all. Service
117
+ * that reaches the apartment itself also gets its climate summary over the disclosed
118
+ * period. What they newly see of the home reaches them as it happens; what they lose,
119
+ * at once.
120
+ * * Not at all — RESIDENT on a building or floor above it. Living in a building is not
121
+ * living in every apartment in it.
122
+ *
123
+ * What was recorded while a room or device was in a home stays with the home after it
124
+ * leaves: its history, and the times and people it carries from then, are never given to
125
+ * whoever reaches it later.
126
+ *
127
+ * A residency starts when a user is assigned RESIDENT on an apartment while not already its
128
+ * resident — a membership recorded with no relation included, so its holder starts afresh —
129
+ * and ends with any other change to that membership. Assigning RESIDENT to a resident
130
+ * changes nothing. A space becoming an apartment starts the residency of each RESIDENT
131
+ * member on it, and ceasing to be one ends it — though it releases no device: what is no
132
+ * longer a home holds nobody's devices for a next tenant. A device in a space becoming an
133
+ * apartment, owned by someone who is not to be its resident, is taken out of that space.
134
+ *
135
+ * A device filed in a home counts as in the home wherever else it is also filed, a device a
136
+ * resident owns included: reaching it through another space shows it to nobody. A link
137
+ * never joins a device in a home to one outside it. Outside homes the relation changes
138
+ * nothing: what is filed there is visible to whoever reaches it. A device owned as RESIDENT
139
+ * is the exception everywhere, whoever owns it: it is visible to its owner and the RESIDENT
140
+ * members filed on the space it is filed in — for a device in a home, the home's residents
141
+ * alone, wherever else it is filed; never those who merely reach a space from above — and
142
+ * to nobody else. An owner who stops living in the home it is filed in gives it up: it is
143
+ * released, with no owner, and stays filed in the home alone, as one of the building's own
144
+ * devices there. A device given up so, or released, then appears to service as any device
145
+ * newly in the home does, as it happens; that much a release shows.
146
+ *
147
+ * Who may change a home's members, move its spaces or file devices into and out of it is
148
+ * restricted by the gateway, and a refused caller gets NOT_ENTITLED. This keeps a home's
149
+ * life — its readings, history and modes — from anyone but its residents by default; those
150
+ * who service the building get the service view above and no more. It does not keep the
151
+ * property owner or the administrator out by force — they hold the building's filing
152
+ * authority and the gateway itself — but it makes their seeing in a deliberate act on the
153
+ * home, such as filing themselves on it, rather than something handed out by default. They
154
+ * remove a resident who moves out, so they are shown every residency, and since when
155
+ * (webrtc.v1.ListGatewayMembers), but never who holds it (see RESIDENCY IDS).
156
+ *
157
+ * RESIDENCY IDS. To a caller who does not live in the home, a RESIDENT membership is told
158
+ * only under its residency id: an id the gateway mints for that residency alone, when it
159
+ * begins, holds for as long as it lasts unbroken, and never reuses. It is opaque, begins
160
+ * with "residency:", and is never a user's id or derived from one, so nothing told under it
161
+ * ties the residency to a name, a role or another membership — and nothing changes it when
162
+ * the person who holds it becomes staff or stops being staff (Role, STAFF). A relation
163
+ * change, or the residency ending, ends its id. The people of the home see one another
164
+ * under their user ids. Where a request below names a member, it says whether a residency
165
+ * id may stand for one; a request that does not say so refuses one as INVALID_REQUEST, so
166
+ * that no user is ever made under one.
167
+ *
168
+ * A membership recorded with no relation, made before relations existed, sees no more than
169
+ * either relation would where it is held: on an apartment or a room, a home as service; on a
170
+ * building or floor, no home at all. It is listed with UNSPECIFIED so that it can be found
171
+ * and assigned again.
172
+ *
173
+ * @generated from enum kusinta.iot.access.v1.MembershipRelation
174
+ */
175
+ export const MembershipRelation = /*@__PURE__*/
176
+ tsEnum(MembershipRelationSchema);
177
+