@kusinta/iot-schema 0.2.0-beta.3 → 0.2.0-beta.31

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 (60) hide show
  1. package/package.json +9 -1
  2. package/src/kusinta/iot/access/v1/acl_pb.d.ts +118 -2
  3. package/src/kusinta/iot/access/v1/acl_pb.js +20 -3
  4. package/src/kusinta/iot/access/v1/roles_pb.d.ts +119 -4
  5. package/src/kusinta/iot/access/v1/roles_pb.js +98 -5
  6. package/src/kusinta/iot/climate/v1/climate_pb.d.ts +726 -0
  7. package/src/kusinta/iot/climate/v1/climate_pb.js +142 -0
  8. package/src/kusinta/iot/common/v1/pairing_pb.d.ts +217 -0
  9. package/src/kusinta/iot/common/v1/pairing_pb.js +50 -0
  10. package/src/kusinta/iot/common/v1/types_pb.d.ts +175 -0
  11. package/src/kusinta/iot/common/v1/types_pb.js +70 -1
  12. package/src/kusinta/iot/connector/v1/connector_pb.d.ts +691 -2
  13. package/src/kusinta/iot/connector/v1/connector_pb.js +104 -13
  14. package/src/kusinta/iot/device/v1/cluster_state_pb.d.ts +44 -0
  15. package/src/kusinta/iot/device/v1/cluster_state_pb.js +1 -1
  16. package/src/kusinta/iot/device/v1/descriptor_pb.d.ts +22 -2
  17. package/src/kusinta/iot/device/v1/descriptor_pb.js +2 -1
  18. package/src/kusinta/iot/device/v1/device_event_pb.d.ts +87 -5
  19. package/src/kusinta/iot/device/v1/device_event_pb.js +1 -1
  20. package/src/kusinta/iot/device/v1/device_pb.d.ts +150 -6
  21. package/src/kusinta/iot/device/v1/device_pb.js +33 -2
  22. package/src/kusinta/iot/device/v1/matter_options_pb.d.ts +26 -0
  23. package/src/kusinta/iot/device/v1/matter_options_pb.js +31 -4
  24. package/src/kusinta/iot/device/v1/properties_pb.d.ts +14 -0
  25. package/src/kusinta/iot/device/v1/properties_pb.js +1 -1
  26. package/src/kusinta/iot/device/v1/property_update_pb.d.ts +3 -2
  27. package/src/kusinta/iot/link/v1/link_pb.d.ts +438 -0
  28. package/src/kusinta/iot/link/v1/link_pb.js +121 -0
  29. package/src/kusinta/iot/reporting/v1/reporting_pb.d.ts +1219 -0
  30. package/src/kusinta/iot/reporting/v1/reporting_pb.js +238 -0
  31. package/src/kusinta/iot/reporting/v1/reporting_service_pb.d.ts +63 -0
  32. package/src/kusinta/iot/reporting/v1/reporting_service_pb.js +24 -0
  33. package/src/kusinta/iot/signaling/v1/signaling_pb.d.ts +361 -7
  34. package/src/kusinta/iot/signaling/v1/signaling_pb.js +68 -4
  35. package/src/kusinta/iot/signaling/v1/signaling_service_pb.d.ts +24 -1
  36. package/src/kusinta/iot/signaling/v1/signaling_service_pb.js +1 -1
  37. package/src/kusinta/iot/space/v1/space_pb.d.ts +103 -2
  38. package/src/kusinta/iot/space/v1/space_pb.js +10 -1
  39. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.d.ts +162 -13
  40. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.js +8 -1
  41. package/src/kusinta/iot/vendor/lorawan/v1/lorawan_pb.d.ts +69 -0
  42. package/src/kusinta/iot/vendor/lorawan/v1/lorawan_pb.js +19 -0
  43. package/src/kusinta/iot/vendor/v1/vendor_options_pb.d.ts +25 -4
  44. package/src/kusinta/iot/vendor/v1/vendor_options_pb.js +28 -6
  45. package/src/kusinta/iot/webrtc/v1/app_token_pb.d.ts +45 -5
  46. package/src/kusinta/iot/webrtc/v1/app_token_pb.js +1 -1
  47. package/src/kusinta/iot/webrtc/v1/command_pb.d.ts +14 -0
  48. package/src/kusinta/iot/webrtc/v1/command_pb.js +1 -1
  49. package/src/kusinta/iot/webrtc/v1/device_state_pb.d.ts +179 -5
  50. package/src/kusinta/iot/webrtc/v1/device_state_pb.js +35 -6
  51. package/src/kusinta/iot/webrtc/v1/envelope_pb.d.ts +520 -3
  52. package/src/kusinta/iot/webrtc/v1/envelope_pb.js +65 -3
  53. package/src/kusinta/iot/webrtc/v1/invite_pb.d.ts +498 -0
  54. package/src/kusinta/iot/webrtc/v1/invite_pb.js +108 -0
  55. package/src/kusinta/iot/webrtc/v1/management_pb.d.ts +982 -12
  56. package/src/kusinta/iot/webrtc/v1/management_pb.js +132 -5
  57. package/src/kusinta/iot/webrtc/v1/members_pb.d.ts +328 -0
  58. package/src/kusinta/iot/webrtc/v1/members_pb.js +78 -0
  59. package/src/kusinta/iot/webrtc/v1/permission_push_pb.d.ts +66 -4
  60. package/src/kusinta/iot/webrtc/v1/permission_push_pb.js +10 -2
@@ -67,11 +67,23 @@ export declare type AppTokenClaims = Message<"kusinta.iot.webrtc.v1.AppTokenClai
67
67
 
68
68
  /**
69
69
  * Custom claims.
70
- * A user may hold several roles at once (e.g. resident + gateway admin), so
71
- * this is a list. Carried in the JWT as an array of enum NAME strings
72
- * (e.g. ["ROLE_RESIDENT", "ROLE_GATEWAY_ADMIN"]), matching proto3 canonical
73
- * JSON enum encoding — not integer values. This keeps the claim
74
- * self-describing and aligns with text-typed role storage on the api-server.
70
+ * The roles the api-server holds for the user on this gateway: the service
71
+ * roles the gateway reported (reporting.v1.GatewayMember) other than
72
+ * ROLE_GATEWAY_ADMIN, and ROLE_GATEWAY_ADMIN for whoever registered the
73
+ * gateway. A resident's token names none. Carried in the JWT as an array of
74
+ * enum NAME strings (e.g. ["ROLE_TECHNICIAN"]), not integer values. The
75
+ * issuer writes the claim even when it names no role ([]), and a validator
76
+ * refuses a token without it.
77
+ *
78
+ * The gateway authorises from the roles it holds itself, and takes from
79
+ * this claim ROLE_GATEWAY_ADMIN alone. So the api-server MUST set
80
+ * ROLE_GATEWAY_ADMIN here only for the administrator who registered the
81
+ * gateway, never because the gateway reported someone as one: the gateway
82
+ * holds those itself, and a copy in a token would outlive their demotion
83
+ * until the token expired. A gateway that holds roles itself must be
84
+ * deployed before an api-server issues tokens under this rule, since a
85
+ * gateway that authorised from this claim would find residents and
86
+ * reported service roles missing.
75
87
  *
76
88
  * @generated from field: repeated kusinta.iot.access.v1.Role roles = 6;
77
89
  */
@@ -105,6 +117,34 @@ export declare type AppTokenClaims = Message<"kusinta.iot.webrtc.v1.AppTokenClai
105
117
  * @generated from field: kusinta.iot.webrtc.v1.Confirmation cnf = 7;
106
118
  */
107
119
  cnf?: Confirmation | undefined;
120
+
121
+ /**
122
+ * The user's display name as the identity provider holds it, or empty. The issuer MUST
123
+ * take it from the provider's display-name claim alone and send it empty rather than
124
+ * fall back to a username, an email address or any other field, since a username is an
125
+ * email address wherever accounts log in by email. The gateway records it only to name the
126
+ * user to the people who may see who they are (MemberDetail.name, ServiceParty.names),
127
+ * and treats it as self-chosen: it removes control and format characters (bidirectional
128
+ * overrides among them) and keeps at most 80 Unicode code points. A validator accepts a
129
+ * token without it. Carried in the JWT as "name".
130
+ *
131
+ * @generated from field: string name = 8;
132
+ */
133
+ name: string;
134
+
135
+ /**
136
+ * The verified email address of the account, or empty. The issuer sets it for a user who
137
+ * is staff (access.v1.Role, STAFF) on the token's gateway as the member report stands
138
+ * (reporting.v1.GatewayMember), the registering administrator included, when the identity
139
+ * provider marks their address verified. It MUST be empty for anyone else, and for an
140
+ * address not marked verified. The gateway MUST keep it only while the user holds a
141
+ * staff role, and use it only to tell staff apart to whoever may list every member
142
+ * (MemberDetail.email). A validator accepts a token without it. Carried in the JWT as
143
+ * "email".
144
+ *
145
+ * @generated from field: string email = 9;
146
+ */
147
+ email: string;
108
148
  };
109
149
 
110
150
  /**
@@ -10,7 +10,7 @@ import { file_kusinta_iot_access_v1_roles } from "../../access/v1/roles_pb.js";
10
10
  * Describes the file kusinta/iot/webrtc/v1/app_token.proto.
11
11
  */
12
12
  export const file_kusinta_iot_webrtc_v1_app_token = /*@__PURE__*/
13
- fileDesc("CiVrdXNpbnRhL2lvdC93ZWJydGMvdjEvYXBwX3Rva2VuLnByb3RvEhVrdXNpbnRhLmlvdC53ZWJydGMudjEi5wEKDkFwcFRva2VuQ2xhaW1zEgsKA2lzcxgBIAEoCRILCgNhdWQYAiABKAkSCwoDc3ViGAMgASgJEicKA2lhdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASJwoDZXhwGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIqCgVyb2xlcxgGIAMoDjIbLmt1c2ludGEuaW90LmFjY2Vzcy52MS5Sb2xlEjAKA2NuZhgHIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db25maXJtYXRpb24iIAoMQ29uZmlybWF0aW9uEhAKCHg1dF9zMjU2GAEgASgJQgJIAWIGcHJvdG8z", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_roles]);
13
+ fileDesc("CiVrdXNpbnRhL2lvdC93ZWJydGMvdjEvYXBwX3Rva2VuLnByb3RvEhVrdXNpbnRhLmlvdC53ZWJydGMudjEihAIKDkFwcFRva2VuQ2xhaW1zEgsKA2lzcxgBIAEoCRILCgNhdWQYAiABKAkSCwoDc3ViGAMgASgJEicKA2lhdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASJwoDZXhwGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIqCgVyb2xlcxgGIAMoDjIbLmt1c2ludGEuaW90LmFjY2Vzcy52MS5Sb2xlEjAKA2NuZhgHIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db25maXJtYXRpb24SDAoEbmFtZRgIIAEoCRINCgVlbWFpbBgJIAEoCSIgCgxDb25maXJtYXRpb24SEAoIeDV0X3MyNTYYASABKAlCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_roles]);
14
14
 
15
15
  /**
16
16
  * Describes the message kusinta.iot.webrtc.v1.AppTokenClaims.
@@ -304,6 +304,20 @@ export declare type CommandError = Message<"kusinta.iot.webrtc.v1.CommandError">
304
304
  * @generated from field: kusinta.iot.webrtc.v1.CommandErrorCode code = 3;
305
305
  */
306
306
  code: CommandErrorCode;
307
+
308
+ /**
309
+ * Structured detail for the app, beside `code`. Mirrors GatewayError.metadata.
310
+ *
311
+ * "reason": a stable, machine-readable code the app may branch on — a reason
312
+ * such as a setting being governed by the device's room.
313
+ * "detail": one sentence the app may show the user.
314
+ *
315
+ * `message` stays log-only; anything meant for a user goes here. Empty means the
316
+ * producer has nothing to add beyond `code`.
317
+ *
318
+ * @generated from field: map<string, string> metadata = 4;
319
+ */
320
+ metadata: { [key: string]: string };
307
321
  };
308
322
 
309
323
  /**
@@ -14,7 +14,7 @@ import { file_kusinta_iot_webrtc_v1_setpoint_mode } from "./setpoint_mode_pb.js"
14
14
  * Describes the file kusinta/iot/webrtc/v1/command.proto.
15
15
  */
16
16
  export const file_kusinta_iot_webrtc_v1_command = /*@__PURE__*/
17
- fileDesc("CiNrdXNpbnRhL2lvdC93ZWJydGMvdjEvY29tbWFuZC5wcm90bxIVa3VzaW50YS5pb3Qud2VicnRjLnYxInwKGFRoZXJtb3N0YXRTZXRwb2ludFBhcmFtcxI8CgRtb2RlGAEgASgOMikua3VzaW50YS5pb3Qud2VicnRjLnYxLlNldHBvaW50QWRqdXN0TW9kZUgAiAEBEg4KBmFtb3VudBgCIAEoEToJuLUYgQTAtRgAQgcKBV9tb2RlIkYKEkxldmVsQ29udHJvbFBhcmFtcxINCgVsZXZlbBgBIAEoDRIXCg90cmFuc2l0aW9uX3RpbWUYAiABKA06CLi1GAjAtRgAIisKC09uT2ZmUGFyYW1zOgS4tRgGSgQIARACSgQIAhADUgJvblIGdG9nZ2xlIkEKGFdpbmRvd0NvdmVyaW5nTGlmdFBhcmFtcxIaChJsaWZ0X3BlcmNlbnQxMDB0aHMYASABKA06Cbi1GIICwLUYBSI7Cg5Eb29yTG9ja1BhcmFtcxIQCghwaW5fY29kZRgCIAEoCToFuLUYgQJKBAgBEAJSCmxvY2tfc3RhdGUikgUKDURldmljZUNvbW1hbmQSEgoKcmVxdWVzdF9pZBgBIAEoCRI0CglkZXZpY2VfaWQYAiABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIUCgxjb21tYW5kX25hbWUYBCABKAkSEgoKY2x1c3Rlcl9pZBgMIAEoDRIeChFtYXR0ZXJfY29tbWFuZF9pZBgNIAEoDUgBiAEBEhgKC2VuZHBvaW50X2lkGAsgASgNSAKIAQESTgoTdGhlcm1vc3RhdF9zZXRwb2ludBgFIAEoCzIvLmt1c2ludGEuaW90LndlYnJ0Yy52MS5UaGVybW9zdGF0U2V0cG9pbnRQYXJhbXNIABJCCg1sZXZlbF9jb250cm9sGAYgASgLMikua3VzaW50YS5pb3Qud2VicnRjLnYxLkxldmVsQ29udHJvbFBhcmFtc0gAEjQKBm9uX29mZhgHIAEoCzIiLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Pbk9mZlBhcmFtc0gAEk8KFHdpbmRvd19jb3ZlcmluZ19saWZ0GAggASgLMi8ua3VzaW50YS5pb3Qud2VicnRjLnYxLldpbmRvd0NvdmVyaW5nTGlmdFBhcmFtc0gAEjoKCWRvb3JfbG9jaxgJIAEoCzIlLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Eb29yTG9ja1BhcmFtc0gAEhEKB3Jhd190bHYYYyABKAxIAEIMCgpwYXJhbWV0ZXJzQhQKEl9tYXR0ZXJfY29tbWFuZF9pZEIOCgxfZW5kcG9pbnRfaWRKBAgDEARKBAgKEAtSDmNsdXN0ZXJfaWRfaGV4Uhl0aGVybW9zdGF0X3NldHBvaW50X3dyaXRlIlwKDENvbW1hbmRFcnJvchIPCgdtZXNzYWdlGAIgASgJEjUKBGNvZGUYAyABKA4yJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29tbWFuZEVycm9yQ29kZUoECAEQAiLeAQoNQ29tbWFuZFJlc3VsdBISCgpyZXF1ZXN0X2lkGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSMgoFZXJyb3IYAyABKAsyIy5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29tbWFuZEVycm9yEjAKDGNvbXBsZXRlZF9hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMwoKc2V0dGxlc19ieRgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAIgBAUINCgtfc2V0dGxlc19ieSLMAQoVQXR0cmlidXRlV3JpdGVSZXF1ZXN0EhIKCnJlcXVlc3RfaWQYASABKAkSNAoJZGV2aWNlX2lkGAIgASgLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWQSMwoGdGFyZ2V0GAMgASgLMiMua3VzaW50YS5pb3QuYWNjZXNzLnYxLkF0dHJpYnV0ZVJlZhI0CgV2YWx1ZRgEIAEoCzIlLmt1c2ludGEuaW90LmRldmljZS52MS5BdHRyaWJ1dGVWYWx1ZSq/AgoQQ29tbWFuZEVycm9yQ29kZRIiCh5DT01NQU5EX0VSUk9SX0NPREVfVU5TUEVDSUZJRUQQABIjCh9DT01NQU5EX0VSUk9SX0NPREVfTk9UX0VOVElUTEVEEAESKgomQ09NTUFORF9FUlJPUl9DT0RFX0NPTlNUUkFJTlRfVklPTEFURUQQAhImCiJDT01NQU5EX0VSUk9SX0NPREVfSU5WQUxJRF9DT01NQU5EEAMSIgoeQ09NTUFORF9FUlJPUl9DT0RFX1VOUkVBQ0hBQkxFEAQSHgoaQ09NTUFORF9FUlJPUl9DT0RFX1RJTUVPVVQQBRIpCiVDT01NQU5EX0VSUk9SX0NPREVfUkVKRUNURURfQllfREVWSUNFEAYSHwobQ09NTUFORF9FUlJPUl9DT0RFX0lOVEVSTkFMEAdCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_device_v1_cluster_state, file_kusinta_iot_device_v1_matter_options, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_webrtc_v1_setpoint_mode]);
17
+ fileDesc("CiNrdXNpbnRhL2lvdC93ZWJydGMvdjEvY29tbWFuZC5wcm90bxIVa3VzaW50YS5pb3Qud2VicnRjLnYxInwKGFRoZXJtb3N0YXRTZXRwb2ludFBhcmFtcxI8CgRtb2RlGAEgASgOMikua3VzaW50YS5pb3Qud2VicnRjLnYxLlNldHBvaW50QWRqdXN0TW9kZUgAiAEBEg4KBmFtb3VudBgCIAEoEToJuLUYgQTAtRgAQgcKBV9tb2RlIkYKEkxldmVsQ29udHJvbFBhcmFtcxINCgVsZXZlbBgBIAEoDRIXCg90cmFuc2l0aW9uX3RpbWUYAiABKA06CLi1GAjAtRgAIisKC09uT2ZmUGFyYW1zOgS4tRgGSgQIARACSgQIAhADUgJvblIGdG9nZ2xlIkEKGFdpbmRvd0NvdmVyaW5nTGlmdFBhcmFtcxIaChJsaWZ0X3BlcmNlbnQxMDB0aHMYASABKA06Cbi1GIICwLUYBSI7Cg5Eb29yTG9ja1BhcmFtcxIQCghwaW5fY29kZRgCIAEoCToFuLUYgQJKBAgBEAJSCmxvY2tfc3RhdGUikgUKDURldmljZUNvbW1hbmQSEgoKcmVxdWVzdF9pZBgBIAEoCRI0CglkZXZpY2VfaWQYAiABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIUCgxjb21tYW5kX25hbWUYBCABKAkSEgoKY2x1c3Rlcl9pZBgMIAEoDRIeChFtYXR0ZXJfY29tbWFuZF9pZBgNIAEoDUgBiAEBEhgKC2VuZHBvaW50X2lkGAsgASgNSAKIAQESTgoTdGhlcm1vc3RhdF9zZXRwb2ludBgFIAEoCzIvLmt1c2ludGEuaW90LndlYnJ0Yy52MS5UaGVybW9zdGF0U2V0cG9pbnRQYXJhbXNIABJCCg1sZXZlbF9jb250cm9sGAYgASgLMikua3VzaW50YS5pb3Qud2VicnRjLnYxLkxldmVsQ29udHJvbFBhcmFtc0gAEjQKBm9uX29mZhgHIAEoCzIiLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Pbk9mZlBhcmFtc0gAEk8KFHdpbmRvd19jb3ZlcmluZ19saWZ0GAggASgLMi8ua3VzaW50YS5pb3Qud2VicnRjLnYxLldpbmRvd0NvdmVyaW5nTGlmdFBhcmFtc0gAEjoKCWRvb3JfbG9jaxgJIAEoCzIlLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Eb29yTG9ja1BhcmFtc0gAEhEKB3Jhd190bHYYYyABKAxIAEIMCgpwYXJhbWV0ZXJzQhQKEl9tYXR0ZXJfY29tbWFuZF9pZEIOCgxfZW5kcG9pbnRfaWRKBAgDEARKBAgKEAtSDmNsdXN0ZXJfaWRfaGV4Uhl0aGVybW9zdGF0X3NldHBvaW50X3dyaXRlItIBCgxDb21tYW5kRXJyb3ISDwoHbWVzc2FnZRgCIAEoCRI1CgRjb2RlGAMgASgOMicua3VzaW50YS5pb3Qud2VicnRjLnYxLkNvbW1hbmRFcnJvckNvZGUSQwoIbWV0YWRhdGEYBCADKAsyMS5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29tbWFuZEVycm9yLk1ldGFkYXRhRW50cnkaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBSgQIARACIt4BCg1Db21tYW5kUmVzdWx0EhIKCnJlcXVlc3RfaWQYASABKAkSDwoHc3VjY2VzcxgCIAEoCBIyCgVlcnJvchgDIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db21tYW5kRXJyb3ISMAoMY29tcGxldGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIzCgpzZXR0bGVzX2J5GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAiAEBQg0KC19zZXR0bGVzX2J5IswBChVBdHRyaWJ1dGVXcml0ZVJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRI0CglkZXZpY2VfaWQYAiABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIzCgZ0YXJnZXQYAyABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmEjQKBXZhbHVlGAQgASgLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlKr8CChBDb21tYW5kRXJyb3JDb2RlEiIKHkNPTU1BTkRfRVJST1JfQ09ERV9VTlNQRUNJRklFRBAAEiMKH0NPTU1BTkRfRVJST1JfQ09ERV9OT1RfRU5USVRMRUQQARIqCiZDT01NQU5EX0VSUk9SX0NPREVfQ09OU1RSQUlOVF9WSU9MQVRFRBACEiYKIkNPTU1BTkRfRVJST1JfQ09ERV9JTlZBTElEX0NPTU1BTkQQAxIiCh5DT01NQU5EX0VSUk9SX0NPREVfVU5SRUFDSEFCTEUQBBIeChpDT01NQU5EX0VSUk9SX0NPREVfVElNRU9VVBAFEikKJUNPTU1BTkRfRVJST1JfQ09ERV9SRUpFQ1RFRF9CWV9ERVZJQ0UQBhIfChtDT01NQU5EX0VSUk9SX0NPREVfSU5URVJOQUwQB0ICSAFiBnByb3RvMw", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_device_v1_cluster_state, file_kusinta_iot_device_v1_matter_options, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_webrtc_v1_setpoint_mode]);
18
18
 
19
19
  /**
20
20
  * Describes the message kusinta.iot.webrtc.v1.ThermostatSetpointParams.
@@ -2,13 +2,14 @@
2
2
  // @generated from file kusinta/iot/webrtc/v1/device_state.proto (package kusinta.iot.webrtc.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 { Device } from "../../device/v1/device_pb.js";
8
8
  import type { EffectivePermissions } from "../../access/v1/acl_pb.js";
9
9
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
10
- import type { PropertyUpdate } from "../../device/v1/property_update_pb.js";
10
+ import type { SessionRoles } from "./permission_push_pb.js";
11
11
  import type { DeviceId } from "../../identity/v1/identity_pb.js";
12
+ import type { PropertyUpdate } from "../../device/v1/property_update_pb.js";
12
13
 
13
14
  /**
14
15
  * Describes the file kusinta/iot/webrtc/v1/device_state.proto.
@@ -16,7 +17,9 @@ import type { DeviceId } from "../../identity/v1/identity_pb.js";
16
17
  export declare const file_kusinta_iot_webrtc_v1_device_state: GenFile;
17
18
 
18
19
  /**
19
- * Full device state sent to the app on initial WebRTC connection.
20
+ * Full device state sent to the app on initial WebRTC connection. Devices the recipient sees
21
+ * as service are as they are now, by description only, each with its ServiceStatus once
22
+ * one has been evaluated for them (see service_statuses).
20
23
  *
21
24
  * @generated from message kusinta.iot.webrtc.v1.DeviceStateSnapshot
22
25
  */
@@ -35,6 +38,23 @@ export declare type DeviceStateSnapshot = Message<"kusinta.iot.webrtc.v1.DeviceS
35
38
  * @generated from field: google.protobuf.Timestamp snapshotted_at = 3;
36
39
  */
37
40
  snapshottedAt?: Timestamp | undefined;
41
+
42
+ /**
43
+ * One for every device the recipient sees, as last evaluated (see ServiceStatus). A device
44
+ * the recipient began to see since the last quarter hour — or began to see as its
45
+ * resident — has none until the next.
46
+ *
47
+ * @generated from field: repeated kusinta.iot.webrtc.v1.ServiceStatus service_statuses = 4;
48
+ */
49
+ serviceStatuses: ServiceStatus[];
50
+
51
+ /**
52
+ * The roles the gateway holds for the session as it opens (see SessionRoles). Every
53
+ * LivePermissionUpdate after it carries them again.
54
+ *
55
+ * @generated from field: kusinta.iot.webrtc.v1.SessionRoles session_roles = 5;
56
+ */
57
+ sessionRoles?: SessionRoles | undefined;
38
58
  };
39
59
 
40
60
  /**
@@ -43,6 +63,123 @@ export declare type DeviceStateSnapshot = Message<"kusinta.iot.webrtc.v1.DeviceS
43
63
  */
44
64
  export declare const DeviceStateSnapshotSchema: GenMessage<DeviceStateSnapshot>;
45
65
 
66
+ /**
67
+ * What keeps a device working, as the gateway judges it, and nothing that describes the
68
+ * people around it. Sent for every device a recipient sees, so that an app reads a
69
+ * device's problems from one place whatever its view. To a recipient whose
70
+ * DeviceAcl.relation is SERVICE it is all they get of the device's state, beside its
71
+ * description-only Device: they hold no action on
72
+ * it and are sent no PropertyReport or DeviceEvent for it (see
73
+ * access.v1.MembershipRelation).
74
+ *
75
+ * Evaluated by the gateway at each quarter hour (:00, :15, :30, :45 UTC) from what it holds
76
+ * then, and pushed in ServiceStatusChanged when it differs from what the recipient was last
77
+ * sent. Between quarter hours nothing here changes, so polling learns nothing more. A
78
+ * change still says the device was heard within that quarter hour, and nothing finer.
79
+ *
80
+ * @generated from message kusinta.iot.webrtc.v1.ServiceStatus
81
+ */
82
+ export declare type ServiceStatus = Message<"kusinta.iot.webrtc.v1.ServiceStatus"> & {
83
+ /**
84
+ * @generated from field: kusinta.iot.identity.v1.DeviceId device_id = 1;
85
+ */
86
+ deviceId?: DeviceId | undefined;
87
+
88
+ /**
89
+ * Always set. The quarter hour at which the status took its current value, but never
90
+ * earlier than the start of the recipient's current, unbroken stretch of seeing the
91
+ * device, nor, for a resident, than their current residency — each start taken at the
92
+ * first quarter hour at or after it. When that start moves because the recipient becomes
93
+ * a resident, the app drops the status it held and is sent one again from the new start at
94
+ * the next quarter hour. These quarter hours, and the moments a device appears to service,
95
+ * changes and is taken away, which they see as they happen, are the only times service is
96
+ * given of a device in a home (see access.v1.MembershipRelation). Pushed and in a
97
+ * snapshot alike, so an unchanged status carries the same as_of however it arrived.
98
+ *
99
+ * @generated from field: google.protobuf.Timestamp as_of = 2;
100
+ */
101
+ asOf?: Timestamp | undefined;
102
+
103
+ /**
104
+ * @generated from field: bool reachable = 3;
105
+ */
106
+ reachable: boolean;
107
+
108
+ /**
109
+ * While unreachable, the quarter hour at which the gateway found it so — not when it was
110
+ * last heard, which for a device that reports on change is when it was last used — and,
111
+ * like as_of, never earlier than those starts. Unset while reachable.
112
+ *
113
+ * @generated from field: google.protobuf.Timestamp unreachable_since = 4;
114
+ */
115
+ unreachableSince?: Timestamp | undefined;
116
+
117
+ /**
118
+ * Remaining charge, rounded up to a multiple of ten — 4 % is sent as 10, and 0 only when
119
+ * the device reports none left. Absent for a device that does not report one.
120
+ *
121
+ * @generated from field: optional uint32 battery_percent = 5;
122
+ */
123
+ batteryPercent?: number | undefined;
124
+
125
+ /**
126
+ * battery_low: the device reports its charge low or critical (Matter Power Source
127
+ * BatChargeLevel, or a vendor's low-battery flag). battery_replacement_needed: it reports
128
+ * that its battery must be replaced. Each is set on its own report alone.
129
+ *
130
+ * @generated from field: bool battery_low = 6;
131
+ */
132
+ batteryLow: boolean;
133
+
134
+ /**
135
+ * @generated from field: bool battery_replacement_needed = 7;
136
+ */
137
+ batteryReplacementNeeded: boolean;
138
+
139
+ /**
140
+ * A device.v1.RadioQuality number, travelling as a uint32 as every enum-valued reading
141
+ * does. Absent: the device does not report one.
142
+ *
143
+ * @generated from field: optional uint32 radio_quality = 8;
144
+ */
145
+ radioQuality?: number | undefined;
146
+
147
+ /**
148
+ * Faults the device reports now, each listed once. Empty: none. A fault can follow from
149
+ * what someone did — a casing opened — and service learns that within the quarter hour;
150
+ * that much fault reporting discloses.
151
+ *
152
+ * @generated from field: repeated kusinta.iot.webrtc.v1.ServiceFault faults = 9;
153
+ */
154
+ faults: ServiceFault[];
155
+ };
156
+
157
+ /**
158
+ * Describes the message kusinta.iot.webrtc.v1.ServiceStatus.
159
+ * Use `create(ServiceStatusSchema)` to create a new message.
160
+ */
161
+ export declare const ServiceStatusSchema: GenMessage<ServiceStatus>;
162
+
163
+ /**
164
+ * The service statuses that changed at a quarter hour, gateway → app. Apply each as an
165
+ * upsert keyed on device_id. Sent for every device the recipient sees, without a
166
+ * subscription: a service view holds no SUBSCRIBE, and needs none for this.
167
+ *
168
+ * @generated from message kusinta.iot.webrtc.v1.ServiceStatusChanged
169
+ */
170
+ export declare type ServiceStatusChanged = Message<"kusinta.iot.webrtc.v1.ServiceStatusChanged"> & {
171
+ /**
172
+ * @generated from field: repeated kusinta.iot.webrtc.v1.ServiceStatus statuses = 1;
173
+ */
174
+ statuses: ServiceStatus[];
175
+ };
176
+
177
+ /**
178
+ * Describes the message kusinta.iot.webrtc.v1.ServiceStatusChanged.
179
+ * Use `create(ServiceStatusChangedSchema)` to create a new message.
180
+ */
181
+ export declare const ServiceStatusChangedSchema: GenMessage<ServiceStatusChanged>;
182
+
46
183
  /**
47
184
  * One attribute reading streamed to the app as it happens — Matter's Report Data Action,
48
185
  * for a single attribute.
@@ -78,7 +215,9 @@ export declare const PropertyReportSchema: GenMessage<PropertyReport>;
78
215
  *
79
216
  * Carries the full Device, descriptor plus current typed properties, so the app can
80
217
  * render it without a follow-up read — the same payload DeviceStateSnapshot gives
81
- * per device.
218
+ * per device. To a recipient who sees it as service, the Device carries its description
219
+ * only, as in a snapshot, and is sent as it appears; its ServiceStatus follows from the
220
+ * next quarter hour (see access.v1.DeviceAcl.relation).
82
221
  *
83
222
  * Apply as an upsert keyed on descriptor.device_id, never as an insert: a device can
84
223
  * be in the snapshot and then announced, or announced twice across a connector
@@ -106,11 +245,15 @@ export declare const DeviceAddedSchema: GenMessage<DeviceAdded>;
106
245
 
107
246
  /**
108
247
  * A device is gone, because its connector said so via connector.v1.DeviceRemoval.
248
+ * To a recipient who sees it as service, sent at once, as the removal from their
249
+ * permissions is (see LivePermissionUpdate) — if they were shown the device; otherwise not
250
+ * at all.
109
251
  *
110
252
  * A connector disconnecting is NOT a removal: an ordinary reconnect wipes the
111
253
  * device→connector route while every device still exists, and treating that as a
112
254
  * removal makes the whole UI flap. Unreachability is a separate signal — read
113
- * device.v1.Device.last_seen for that.
255
+ * ServiceStatus.reachable for that, which every recipient gets; device.v1.Device.last_seen
256
+ * may be unset.
114
257
  *
115
258
  * @generated from message kusinta.iot.webrtc.v1.DeviceRemoved
116
259
  */
@@ -134,3 +277,34 @@ export declare type DeviceRemoved = Message<"kusinta.iot.webrtc.v1.DeviceRemoved
134
277
  */
135
278
  export declare const DeviceRemovedSchema: GenMessage<DeviceRemoved>;
136
279
 
280
+ /**
281
+ * A fault a device reports about itself, as service sees it.
282
+ *
283
+ * @generated from enum kusinta.iot.webrtc.v1.ServiceFault
284
+ */
285
+ export enum ServiceFault {
286
+ /**
287
+ * @generated from enum value: SERVICE_FAULT_UNSPECIFIED = 0;
288
+ */
289
+ UNSPECIFIED = 0,
290
+
291
+ /**
292
+ * An error the device reports in its own operation.
293
+ *
294
+ * @generated from enum value: SERVICE_FAULT_ERROR = 1;
295
+ */
296
+ ERROR = 1,
297
+
298
+ /**
299
+ * Its casing was opened or it was taken off its mount.
300
+ *
301
+ * @generated from enum value: SERVICE_FAULT_TAMPER = 2;
302
+ */
303
+ TAMPER = 2,
304
+ }
305
+
306
+ /**
307
+ * Describes the enum kusinta.iot.webrtc.v1.ServiceFault.
308
+ */
309
+ export declare const ServiceFaultSchema: GenEnum<ServiceFault>;
310
+
@@ -2,18 +2,19 @@
2
2
  // @generated from file kusinta/iot/webrtc/v1/device_state.proto (package kusinta.iot.webrtc.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_access_v1_acl } from "../../access/v1/acl_pb.js";
7
8
  import { file_kusinta_iot_device_v1_device } from "../../device/v1/device_pb.js";
8
9
  import { file_kusinta_iot_device_v1_property_update } from "../../device/v1/property_update_pb.js";
9
- import { file_kusinta_iot_access_v1_acl } from "../../access/v1/acl_pb.js";
10
10
  import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identity_pb.js";
11
+ import { file_kusinta_iot_webrtc_v1_permission_push } from "./permission_push_pb.js";
11
12
 
12
13
  /**
13
14
  * Describes the file kusinta/iot/webrtc/v1/device_state.proto.
14
15
  */
15
16
  export const file_kusinta_iot_webrtc_v1_device_state = /*@__PURE__*/
16
- fileDesc("CihrdXNpbnRhL2lvdC93ZWJydGMvdjEvZGV2aWNlX3N0YXRlLnByb3RvEhVrdXNpbnRhLmlvdC53ZWJydGMudjEiuwEKE0RldmljZVN0YXRlU25hcHNob3QSLgoHZGV2aWNlcxgBIAMoCzIdLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2USQAoLcGVybWlzc2lvbnMYAiABKAsyKy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuRWZmZWN0aXZlUGVybWlzc2lvbnMSMgoOc25hcHNob3R0ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIoEBCg5Qcm9wZXJ0eVJlcG9ydBI1CgZ1cGRhdGUYASABKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuUHJvcGVydHlVcGRhdGUSOAoUZ2F0ZXdheV9wcm9jZXNzZWRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIjwKC0RldmljZUFkZGVkEi0KBmRldmljZRgBIAEoCzIdLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2UiVQoNRGV2aWNlUmVtb3ZlZBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIOCgZyZWFzb24YAiABKAlCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_device_v1_device, file_kusinta_iot_device_v1_property_update, file_kusinta_iot_access_v1_acl, file_kusinta_iot_identity_v1_identity]);
17
+ fileDesc("CihrdXNpbnRhL2lvdC93ZWJydGMvdjEvZGV2aWNlX3N0YXRlLnByb3RvEhVrdXNpbnRhLmlvdC53ZWJydGMudjEitwIKE0RldmljZVN0YXRlU25hcHNob3QSLgoHZGV2aWNlcxgBIAMoCzIdLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2USQAoLcGVybWlzc2lvbnMYAiABKAsyKy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuRWZmZWN0aXZlUGVybWlzc2lvbnMSMgoOc25hcHNob3R0ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEj4KEHNlcnZpY2Vfc3RhdHVzZXMYBCADKAsyJC5rdXNpbnRhLmlvdC53ZWJydGMudjEuU2VydmljZVN0YXR1cxI6Cg1zZXNzaW9uX3JvbGVzGAUgASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLlNlc3Npb25Sb2xlcyKIAwoNU2VydmljZVN0YXR1cxI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIpCgVhc19vZhgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEQoJcmVhY2hhYmxlGAMgASgIEjUKEXVucmVhY2hhYmxlX3NpbmNlGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIcCg9iYXR0ZXJ5X3BlcmNlbnQYBSABKA1IAIgBARITCgtiYXR0ZXJ5X2xvdxgGIAEoCBIiChpiYXR0ZXJ5X3JlcGxhY2VtZW50X25lZWRlZBgHIAEoCBIaCg1yYWRpb19xdWFsaXR5GAggASgNSAGIAQESMwoGZmF1bHRzGAkgAygOMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLlNlcnZpY2VGYXVsdEISChBfYmF0dGVyeV9wZXJjZW50QhAKDl9yYWRpb19xdWFsaXR5Ik4KFFNlcnZpY2VTdGF0dXNDaGFuZ2VkEjYKCHN0YXR1c2VzGAEgAygLMiQua3VzaW50YS5pb3Qud2VicnRjLnYxLlNlcnZpY2VTdGF0dXMigQEKDlByb3BlcnR5UmVwb3J0EjUKBnVwZGF0ZRgBIAEoCzIlLmt1c2ludGEuaW90LmRldmljZS52MS5Qcm9wZXJ0eVVwZGF0ZRI4ChRnYXRld2F5X3Byb2Nlc3NlZF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiPAoLRGV2aWNlQWRkZWQSLQoGZGV2aWNlGAEgASgLMh0ua3VzaW50YS5pb3QuZGV2aWNlLnYxLkRldmljZSJVCg1EZXZpY2VSZW1vdmVkEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEg4KBnJlYXNvbhgCIAEoCSpgCgxTZXJ2aWNlRmF1bHQSHQoZU0VSVklDRV9GQVVMVF9VTlNQRUNJRklFRBAAEhcKE1NFUlZJQ0VfRkFVTFRfRVJST1IQARIYChRTRVJWSUNFX0ZBVUxUX1RBTVBFUhACQgJIAWIGcHJvdG8z", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_device_v1_device, file_kusinta_iot_device_v1_property_update, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_webrtc_v1_permission_push]);
17
18
 
18
19
  /**
19
20
  * Describes the message kusinta.iot.webrtc.v1.DeviceStateSnapshot.
@@ -22,24 +23,52 @@ export const file_kusinta_iot_webrtc_v1_device_state = /*@__PURE__*/
22
23
  export const DeviceStateSnapshotSchema = /*@__PURE__*/
23
24
  messageDesc(file_kusinta_iot_webrtc_v1_device_state, 0);
24
25
 
26
+ /**
27
+ * Describes the message kusinta.iot.webrtc.v1.ServiceStatus.
28
+ * Use `create(ServiceStatusSchema)` to create a new message.
29
+ */
30
+ export const ServiceStatusSchema = /*@__PURE__*/
31
+ messageDesc(file_kusinta_iot_webrtc_v1_device_state, 1);
32
+
33
+ /**
34
+ * Describes the message kusinta.iot.webrtc.v1.ServiceStatusChanged.
35
+ * Use `create(ServiceStatusChangedSchema)` to create a new message.
36
+ */
37
+ export const ServiceStatusChangedSchema = /*@__PURE__*/
38
+ messageDesc(file_kusinta_iot_webrtc_v1_device_state, 2);
39
+
25
40
  /**
26
41
  * Describes the message kusinta.iot.webrtc.v1.PropertyReport.
27
42
  * Use `create(PropertyReportSchema)` to create a new message.
28
43
  */
29
44
  export const PropertyReportSchema = /*@__PURE__*/
30
- messageDesc(file_kusinta_iot_webrtc_v1_device_state, 1);
45
+ messageDesc(file_kusinta_iot_webrtc_v1_device_state, 3);
31
46
 
32
47
  /**
33
48
  * Describes the message kusinta.iot.webrtc.v1.DeviceAdded.
34
49
  * Use `create(DeviceAddedSchema)` to create a new message.
35
50
  */
36
51
  export const DeviceAddedSchema = /*@__PURE__*/
37
- messageDesc(file_kusinta_iot_webrtc_v1_device_state, 2);
52
+ messageDesc(file_kusinta_iot_webrtc_v1_device_state, 4);
38
53
 
39
54
  /**
40
55
  * Describes the message kusinta.iot.webrtc.v1.DeviceRemoved.
41
56
  * Use `create(DeviceRemovedSchema)` to create a new message.
42
57
  */
43
58
  export const DeviceRemovedSchema = /*@__PURE__*/
44
- messageDesc(file_kusinta_iot_webrtc_v1_device_state, 3);
59
+ messageDesc(file_kusinta_iot_webrtc_v1_device_state, 5);
60
+
61
+ /**
62
+ * Describes the enum kusinta.iot.webrtc.v1.ServiceFault.
63
+ */
64
+ export const ServiceFaultSchema = /*@__PURE__*/
65
+ enumDesc(file_kusinta_iot_webrtc_v1_device_state, 0);
66
+
67
+ /**
68
+ * A fault a device reports about itself, as service sees it.
69
+ *
70
+ * @generated from enum kusinta.iot.webrtc.v1.ServiceFault
71
+ */
72
+ export const ServiceFault = /*@__PURE__*/
73
+ tsEnum(ServiceFaultSchema);
45
74