@kusinta/iot-schema 0.2.0-beta.19 → 0.2.0-beta.20

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.
@@ -90,6 +90,13 @@ export declare const IceCandidateSchema: GenMessage<IceCandidate>;
90
90
  * Never an acknowledgement. A heartbeat answers no message and must not be
91
91
  * treated as confirming one.
92
92
  *
93
+ * On GatewayConnect it also lets the api-server judge whether the gateway is
94
+ * present. A gateway is present while its stream is open, and never lets it
95
+ * carry nothing for more than 30 seconds: a heartbeat fills any longer silence.
96
+ * A stream that has carried nothing for 90 seconds may be taken as gone, even
97
+ * when the transport has not yet said so. That is the gateway's presence and
98
+ * nothing more: a present gateway may still have lost its devices.
99
+ *
93
100
  * @generated from message kusinta.iot.signaling.v1.HeartBeat
94
101
  */
95
102
  export declare type HeartBeat = Message<"kusinta.iot.signaling.v1.HeartBeat"> & {
@@ -6,6 +6,7 @@ import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
6
6
  import type { Message } from "@bufbuild/protobuf";
7
7
  import type { DeviceId, GatewayId, SpaceId, TenantId, UserId } from "../../identity/v1/identity_pb.js";
8
8
  import type { SpaceType } from "../../common/v1/types_pb.js";
9
+ import type { MembershipRelation } from "../../access/v1/roles_pb.js";
9
10
 
10
11
  /**
11
12
  * Describes the file kusinta/iot/space/v1/space.proto.
@@ -51,19 +52,27 @@ export declare type Space = Message<"kusinta.iot.space.v1.Space"> & {
51
52
  parentSpaceId?: SpaceId | undefined;
52
53
 
53
54
  /**
55
+ * Filtered to the spaces the caller reaches, as device_ids is.
56
+ *
54
57
  * @generated from field: repeated kusinta.iot.identity.v1.SpaceId sub_space_ids = 7;
55
58
  */
56
59
  subSpaceIds: SpaceId[];
57
60
 
58
61
  /**
62
+ * Filtered to the devices the caller may see (see webrtc.v1.SpaceTree): for service, no
63
+ * device a resident owns.
64
+ *
59
65
  * @generated from field: repeated kusinta.iot.identity.v1.DeviceId device_ids = 8;
60
66
  */
61
67
  deviceIds: DeviceId[];
62
68
 
63
69
  /**
64
- * only for APARTMENT
70
+ * Superseded by members, which can say that more than one person lives in an apartment,
71
+ * and how each member stands to the space. A gateway leaves it unset, so a client that
72
+ * still reads it sees no resident anywhere; read members instead.
65
73
  *
66
- * @generated from field: kusinta.iot.identity.v1.UserId resident_user_id = 9;
74
+ * @generated from field: kusinta.iot.identity.v1.UserId resident_user_id = 9 [deprecated = true];
75
+ * @deprecated
67
76
  */
68
77
  residentUserId?: UserId | undefined;
69
78
 
@@ -86,6 +95,34 @@ export declare type Space = Message<"kusinta.iot.space.v1.Space"> & {
86
95
  * @generated from field: string time_zone = 12;
87
96
  */
88
97
  timeZone: string;
98
+
99
+ /**
100
+ * Who is filed directly on this space, and how each stands to it. Members of a space
101
+ * above it are listed there, not here.
102
+ *
103
+ * Filled according to who asks, since a membership list says who lives where:
104
+ *
105
+ * * a caller holding ROLE_PROPERTY_OWNER or ROLE_GATEWAY_ADMIN who reaches the space
106
+ * sees every member — for a home they see as service, as it stood at the last
107
+ * quarter hour, so that a move in or out is not timed by polling;
108
+ * * a resident of an apartment sees every member filed on it or on its rooms — who they
109
+ * live with, and anyone filed on their home as service, since being filed on a home
110
+ * is an act on it its residents should see. Service reach from a building or floor
111
+ * above is not listed; webrtc.v1.PrivacyDisclosure tells them what kinds of party
112
+ * hold it, without naming anyone;
113
+ * * anyone else sees none, residents of a building or floor included.
114
+ *
115
+ * @generated from field: repeated kusinta.iot.space.v1.SpaceMember members = 13;
116
+ */
117
+ members: SpaceMember[];
118
+
119
+ /**
120
+ * Set when members are not listed to this caller, so that an empty list is not read as
121
+ * nobody being filed here.
122
+ *
123
+ * @generated from field: bool members_withheld = 14;
124
+ */
125
+ membersWithheld: boolean;
89
126
  };
90
127
 
91
128
  /**
@@ -94,3 +131,26 @@ export declare type Space = Message<"kusinta.iot.space.v1.Space"> & {
94
131
  */
95
132
  export declare const SpaceSchema: GenMessage<Space>;
96
133
 
134
+ /**
135
+ * One membership of a space.
136
+ *
137
+ * @generated from message kusinta.iot.space.v1.SpaceMember
138
+ */
139
+ export declare type SpaceMember = Message<"kusinta.iot.space.v1.SpaceMember"> & {
140
+ /**
141
+ * @generated from field: kusinta.iot.identity.v1.UserId user_id = 1;
142
+ */
143
+ userId?: UserId | undefined;
144
+
145
+ /**
146
+ * @generated from field: kusinta.iot.access.v1.MembershipRelation relation = 2;
147
+ */
148
+ relation: MembershipRelation;
149
+ };
150
+
151
+ /**
152
+ * Describes the message kusinta.iot.space.v1.SpaceMember.
153
+ * Use `create(SpaceMemberSchema)` to create a new message.
154
+ */
155
+ export declare const SpaceMemberSchema: GenMessage<SpaceMember>;
156
+
@@ -3,6 +3,7 @@
3
3
  /* eslint-disable */
4
4
 
5
5
  import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
6
+ import { file_kusinta_iot_access_v1_roles } from "../../access/v1/roles_pb.js";
6
7
  import { file_kusinta_iot_common_v1_types } from "../../common/v1/types_pb.js";
7
8
  import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identity_pb.js";
8
9
 
@@ -10,7 +11,7 @@ import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identit
10
11
  * Describes the file kusinta/iot/space/v1/space.proto.
11
12
  */
12
13
  export const file_kusinta_iot_space_v1_space = /*@__PURE__*/
13
- fileDesc("CiBrdXNpbnRhL2lvdC9zcGFjZS92MS9zcGFjZS5wcm90bxIUa3VzaW50YS5pb3Quc3BhY2UudjEiigQKBVNwYWNlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBI0CgpzcGFjZV90eXBlGAIgASgOMiAua3VzaW50YS5pb3QuY29tbW9uLnYxLlNwYWNlVHlwZRIMCgRuYW1lGAMgASgJEhMKC2Rlc2NyaXB0aW9uGAQgASgJEg0KBWZsb29yGAUgASgFEjkKD3BhcmVudF9zcGFjZV9pZBgGIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSNwoNc3ViX3NwYWNlX2lkcxgHIAMoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSNQoKZGV2aWNlX2lkcxgIIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjkKEHJlc2lkZW50X3VzZXJfaWQYCSABKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWQSNAoJdGVuYW50X2lkGAogASgLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVGVuYW50SWQSNgoKZ2F0ZXdheV9pZBgLIAEoCzIiLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkdhdGV3YXlJZBIRCgl0aW1lX3pvbmUYDCABKAlCAkgBYgZwcm90bzM", [file_kusinta_iot_common_v1_types, file_kusinta_iot_identity_v1_identity]);
14
+ fileDesc("CiBrdXNpbnRhL2lvdC9zcGFjZS92MS9zcGFjZS5wcm90bxIUa3VzaW50YS5pb3Quc3BhY2UudjEi3AQKBVNwYWNlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBI0CgpzcGFjZV90eXBlGAIgASgOMiAua3VzaW50YS5pb3QuY29tbW9uLnYxLlNwYWNlVHlwZRIMCgRuYW1lGAMgASgJEhMKC2Rlc2NyaXB0aW9uGAQgASgJEg0KBWZsb29yGAUgASgFEjkKD3BhcmVudF9zcGFjZV9pZBgGIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSNwoNc3ViX3NwYWNlX2lkcxgHIAMoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSNQoKZGV2aWNlX2lkcxgIIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEj0KEHJlc2lkZW50X3VzZXJfaWQYCSABKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWRCAhgBEjQKCXRlbmFudF9pZBgKIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlRlbmFudElkEjYKCmdhdGV3YXlfaWQYCyABKAsyIi5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5HYXRld2F5SWQSEQoJdGltZV96b25lGAwgASgJEjIKB21lbWJlcnMYDSADKAsyIS5rdXNpbnRhLmlvdC5zcGFjZS52MS5TcGFjZU1lbWJlchIYChBtZW1iZXJzX3dpdGhoZWxkGA4gASgIInwKC1NwYWNlTWVtYmVyEjAKB3VzZXJfaWQYASABKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWQSOwoIcmVsYXRpb24YAiABKA4yKS5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuTWVtYmVyc2hpcFJlbGF0aW9uQgJIAWIGcHJvdG8z", [file_kusinta_iot_access_v1_roles, file_kusinta_iot_common_v1_types, file_kusinta_iot_identity_v1_identity]);
14
15
 
15
16
  /**
16
17
  * Describes the message kusinta.iot.space.v1.Space.
@@ -19,3 +20,10 @@ export const file_kusinta_iot_space_v1_space = /*@__PURE__*/
19
20
  export const SpaceSchema = /*@__PURE__*/
20
21
  messageDesc(file_kusinta_iot_space_v1_space, 0);
21
22
 
23
+ /**
24
+ * Describes the message kusinta.iot.space.v1.SpaceMember.
25
+ * Use `create(SpaceMemberSchema)` to create a new message.
26
+ */
27
+ export const SpaceMemberSchema = /*@__PURE__*/
28
+ messageDesc(file_kusinta_iot_space_v1_space, 1);
29
+
@@ -2,13 +2,13 @@
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";
11
10
  import type { DeviceId } from "../../identity/v1/identity_pb.js";
11
+ import type { PropertyUpdate } from "../../device/v1/property_update_pb.js";
12
12
 
13
13
  /**
14
14
  * Describes the file kusinta/iot/webrtc/v1/device_state.proto.
@@ -16,7 +16,9 @@ import type { DeviceId } from "../../identity/v1/identity_pb.js";
16
16
  export declare const file_kusinta_iot_webrtc_v1_device_state: GenFile;
17
17
 
18
18
  /**
19
- * Full device state sent to the app on initial WebRTC connection.
19
+ * Full device state sent to the app on initial WebRTC connection. Devices the recipient sees
20
+ * as service are as they stood at the last quarter hour, less any since taken away, each
21
+ * with its ServiceStatus.
20
22
  *
21
23
  * @generated from message kusinta.iot.webrtc.v1.DeviceStateSnapshot
22
24
  */
@@ -35,6 +37,15 @@ export declare type DeviceStateSnapshot = Message<"kusinta.iot.webrtc.v1.DeviceS
35
37
  * @generated from field: google.protobuf.Timestamp snapshotted_at = 3;
36
38
  */
37
39
  snapshottedAt?: Timestamp | undefined;
40
+
41
+ /**
42
+ * One for every device the recipient sees, as last evaluated (see ServiceStatus). A device
43
+ * the recipient began to see since the last quarter hour — or began to see as its
44
+ * resident — has none until the next.
45
+ *
46
+ * @generated from field: repeated kusinta.iot.webrtc.v1.ServiceStatus service_statuses = 4;
47
+ */
48
+ serviceStatuses: ServiceStatus[];
38
49
  };
39
50
 
40
51
  /**
@@ -43,6 +54,123 @@ export declare type DeviceStateSnapshot = Message<"kusinta.iot.webrtc.v1.DeviceS
43
54
  */
44
55
  export declare const DeviceStateSnapshotSchema: GenMessage<DeviceStateSnapshot>;
45
56
 
57
+ /**
58
+ * What keeps a device working, as the gateway judges it, and nothing that describes the
59
+ * people around it. Sent for every device a recipient sees, so that an app reads a
60
+ * device's problems from one place whatever its view. To a recipient whose
61
+ * DeviceAcl.relation is SERVICE it is all they get of the device's state, beside its
62
+ * description-only Device: they hold no action on
63
+ * it and are sent no PropertyReport or DeviceEvent for it (see
64
+ * access.v1.MembershipRelation).
65
+ *
66
+ * Evaluated by the gateway at each quarter hour (:00, :15, :30, :45 UTC) from what it holds
67
+ * then, and pushed in ServiceStatusChanged when it differs from what the recipient was last
68
+ * sent. Between quarter hours nothing here changes, so polling learns nothing more. A
69
+ * change still says the device was heard within that quarter hour, and nothing finer.
70
+ *
71
+ * @generated from message kusinta.iot.webrtc.v1.ServiceStatus
72
+ */
73
+ export declare type ServiceStatus = Message<"kusinta.iot.webrtc.v1.ServiceStatus"> & {
74
+ /**
75
+ * @generated from field: kusinta.iot.identity.v1.DeviceId device_id = 1;
76
+ */
77
+ deviceId?: DeviceId | undefined;
78
+
79
+ /**
80
+ * Always set. The quarter hour at which the status took its current value, but never
81
+ * earlier than the start of the recipient's current, unbroken stretch of seeing the
82
+ * device, nor, for a resident, than their current residency — each start taken at the
83
+ * first quarter hour at or after it. When that start moves because the recipient becomes
84
+ * a resident, the app drops the status it held and is sent one again from the new start at
85
+ * the next quarter hour. These quarter hours, and the moment a device is
86
+ * taken away, are the only times service is given of a device in a home (see
87
+ * access.v1.MembershipRelation). Pushed and in a
88
+ * snapshot alike, so an unchanged status carries the same as_of however it arrived.
89
+ *
90
+ * @generated from field: google.protobuf.Timestamp as_of = 2;
91
+ */
92
+ asOf?: Timestamp | undefined;
93
+
94
+ /**
95
+ * @generated from field: bool reachable = 3;
96
+ */
97
+ reachable: boolean;
98
+
99
+ /**
100
+ * While unreachable, the quarter hour at which the gateway found it so — not when it was
101
+ * last heard, which for a device that reports on change is when it was last used — and,
102
+ * like as_of, never earlier than those starts. Unset while reachable.
103
+ *
104
+ * @generated from field: google.protobuf.Timestamp unreachable_since = 4;
105
+ */
106
+ unreachableSince?: Timestamp | undefined;
107
+
108
+ /**
109
+ * Remaining charge, rounded up to a multiple of ten — 4 % is sent as 10, and 0 only when
110
+ * the device reports none left. Absent for a device that does not report one.
111
+ *
112
+ * @generated from field: optional uint32 battery_percent = 5;
113
+ */
114
+ batteryPercent?: number | undefined;
115
+
116
+ /**
117
+ * battery_low: the device reports its charge low or critical (Matter Power Source
118
+ * BatChargeLevel, or a vendor's low-battery flag). battery_replacement_needed: it reports
119
+ * that its battery must be replaced. Each is set on its own report alone.
120
+ *
121
+ * @generated from field: bool battery_low = 6;
122
+ */
123
+ batteryLow: boolean;
124
+
125
+ /**
126
+ * @generated from field: bool battery_replacement_needed = 7;
127
+ */
128
+ batteryReplacementNeeded: boolean;
129
+
130
+ /**
131
+ * A device.v1.RadioQuality number, travelling as a uint32 as every enum-valued reading
132
+ * does. Absent: the device does not report one.
133
+ *
134
+ * @generated from field: optional uint32 radio_quality = 8;
135
+ */
136
+ radioQuality?: number | undefined;
137
+
138
+ /**
139
+ * Faults the device reports now, each listed once. Empty: none. A fault can follow from
140
+ * what someone did — a casing opened — and service learns that within the quarter hour;
141
+ * that much fault reporting discloses.
142
+ *
143
+ * @generated from field: repeated kusinta.iot.webrtc.v1.ServiceFault faults = 9;
144
+ */
145
+ faults: ServiceFault[];
146
+ };
147
+
148
+ /**
149
+ * Describes the message kusinta.iot.webrtc.v1.ServiceStatus.
150
+ * Use `create(ServiceStatusSchema)` to create a new message.
151
+ */
152
+ export declare const ServiceStatusSchema: GenMessage<ServiceStatus>;
153
+
154
+ /**
155
+ * The service statuses that changed at a quarter hour, gateway → app. Apply each as an
156
+ * upsert keyed on device_id. Sent for every device the recipient sees, without a
157
+ * subscription: a service view holds no SUBSCRIBE, and needs none for this.
158
+ *
159
+ * @generated from message kusinta.iot.webrtc.v1.ServiceStatusChanged
160
+ */
161
+ export declare type ServiceStatusChanged = Message<"kusinta.iot.webrtc.v1.ServiceStatusChanged"> & {
162
+ /**
163
+ * @generated from field: repeated kusinta.iot.webrtc.v1.ServiceStatus statuses = 1;
164
+ */
165
+ statuses: ServiceStatus[];
166
+ };
167
+
168
+ /**
169
+ * Describes the message kusinta.iot.webrtc.v1.ServiceStatusChanged.
170
+ * Use `create(ServiceStatusChangedSchema)` to create a new message.
171
+ */
172
+ export declare const ServiceStatusChangedSchema: GenMessage<ServiceStatusChanged>;
173
+
46
174
  /**
47
175
  * One attribute reading streamed to the app as it happens — Matter's Report Data Action,
48
176
  * for a single attribute.
@@ -78,7 +206,9 @@ export declare const PropertyReportSchema: GenMessage<PropertyReport>;
78
206
  *
79
207
  * Carries the full Device, descriptor plus current typed properties, so the app can
80
208
  * render it without a follow-up read — the same payload DeviceStateSnapshot gives
81
- * per device.
209
+ * per device. To a recipient who sees it as service, the Device carries its description
210
+ * only, as in a snapshot, and is sent at the next quarter hour (see
211
+ * access.v1.DeviceAcl.relation).
82
212
  *
83
213
  * Apply as an upsert keyed on descriptor.device_id, never as an insert: a device can
84
214
  * be in the snapshot and then announced, or announced twice across a connector
@@ -106,11 +236,15 @@ export declare const DeviceAddedSchema: GenMessage<DeviceAdded>;
106
236
 
107
237
  /**
108
238
  * A device is gone, because its connector said so via connector.v1.DeviceRemoval.
239
+ * To a recipient who sees it as service, sent at once, as the removal from their
240
+ * permissions is (see LivePermissionUpdate) — if they were shown the device; otherwise not
241
+ * at all.
109
242
  *
110
243
  * A connector disconnecting is NOT a removal: an ordinary reconnect wipes the
111
244
  * device→connector route while every device still exists, and treating that as a
112
245
  * removal makes the whole UI flap. Unreachability is a separate signal — read
113
- * device.v1.Device.last_seen for that.
246
+ * ServiceStatus.reachable for that, which every recipient gets; device.v1.Device.last_seen
247
+ * may be unset.
114
248
  *
115
249
  * @generated from message kusinta.iot.webrtc.v1.DeviceRemoved
116
250
  */
@@ -134,3 +268,34 @@ export declare type DeviceRemoved = Message<"kusinta.iot.webrtc.v1.DeviceRemoved
134
268
  */
135
269
  export declare const DeviceRemovedSchema: GenMessage<DeviceRemoved>;
136
270
 
271
+ /**
272
+ * A fault a device reports about itself, as service sees it.
273
+ *
274
+ * @generated from enum kusinta.iot.webrtc.v1.ServiceFault
275
+ */
276
+ export enum ServiceFault {
277
+ /**
278
+ * @generated from enum value: SERVICE_FAULT_UNSPECIFIED = 0;
279
+ */
280
+ UNSPECIFIED = 0,
281
+
282
+ /**
283
+ * An error the device reports in its own operation.
284
+ *
285
+ * @generated from enum value: SERVICE_FAULT_ERROR = 1;
286
+ */
287
+ ERROR = 1,
288
+
289
+ /**
290
+ * Its casing was opened or it was taken off its mount.
291
+ *
292
+ * @generated from enum value: SERVICE_FAULT_TAMPER = 2;
293
+ */
294
+ TAMPER = 2,
295
+ }
296
+
297
+ /**
298
+ * Describes the enum kusinta.iot.webrtc.v1.ServiceFault.
299
+ */
300
+ export declare const ServiceFaultSchema: GenEnum<ServiceFault>;
301
+
@@ -2,7 +2,7 @@
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
7
  import { file_kusinta_iot_access_v1_acl } from "../../access/v1/acl_pb.js";
8
8
  import { file_kusinta_iot_device_v1_device } from "../../device/v1/device_pb.js";
@@ -13,7 +13,7 @@ import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identit
13
13
  * Describes the file kusinta/iot/webrtc/v1/device_state.proto.
14
14
  */
15
15
  export const file_kusinta_iot_webrtc_v1_device_state = /*@__PURE__*/
16
- fileDesc("CihrdXNpbnRhL2lvdC93ZWJydGMvdjEvZGV2aWNlX3N0YXRlLnByb3RvEhVrdXNpbnRhLmlvdC53ZWJydGMudjEiuwEKE0RldmljZVN0YXRlU25hcHNob3QSLgoHZGV2aWNlcxgBIAMoCzIdLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2USQAoLcGVybWlzc2lvbnMYAiABKAsyKy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuRWZmZWN0aXZlUGVybWlzc2lvbnMSMgoOc25hcHNob3R0ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIoEBCg5Qcm9wZXJ0eVJlcG9ydBI1CgZ1cGRhdGUYASABKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuUHJvcGVydHlVcGRhdGUSOAoUZ2F0ZXdheV9wcm9jZXNzZWRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIjwKC0RldmljZUFkZGVkEi0KBmRldmljZRgBIAEoCzIdLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2UiVQoNRGV2aWNlUmVtb3ZlZBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIOCgZyZWFzb24YAiABKAlCAkgBYgZwcm90bzM", [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]);
16
+ fileDesc("CihrdXNpbnRhL2lvdC93ZWJydGMvdjEvZGV2aWNlX3N0YXRlLnByb3RvEhVrdXNpbnRhLmlvdC53ZWJydGMudjEi+wEKE0RldmljZVN0YXRlU25hcHNob3QSLgoHZGV2aWNlcxgBIAMoCzIdLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2USQAoLcGVybWlzc2lvbnMYAiABKAsyKy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuRWZmZWN0aXZlUGVybWlzc2lvbnMSMgoOc25hcHNob3R0ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEj4KEHNlcnZpY2Vfc3RhdHVzZXMYBCADKAsyJC5rdXNpbnRhLmlvdC53ZWJydGMudjEuU2VydmljZVN0YXR1cyKIAwoNU2VydmljZVN0YXR1cxI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIpCgVhc19vZhgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEQoJcmVhY2hhYmxlGAMgASgIEjUKEXVucmVhY2hhYmxlX3NpbmNlGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIcCg9iYXR0ZXJ5X3BlcmNlbnQYBSABKA1IAIgBARITCgtiYXR0ZXJ5X2xvdxgGIAEoCBIiChpiYXR0ZXJ5X3JlcGxhY2VtZW50X25lZWRlZBgHIAEoCBIaCg1yYWRpb19xdWFsaXR5GAggASgNSAGIAQESMwoGZmF1bHRzGAkgAygOMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLlNlcnZpY2VGYXVsdEISChBfYmF0dGVyeV9wZXJjZW50QhAKDl9yYWRpb19xdWFsaXR5Ik4KFFNlcnZpY2VTdGF0dXNDaGFuZ2VkEjYKCHN0YXR1c2VzGAEgAygLMiQua3VzaW50YS5pb3Qud2VicnRjLnYxLlNlcnZpY2VTdGF0dXMigQEKDlByb3BlcnR5UmVwb3J0EjUKBnVwZGF0ZRgBIAEoCzIlLmt1c2ludGEuaW90LmRldmljZS52MS5Qcm9wZXJ0eVVwZGF0ZRI4ChRnYXRld2F5X3Byb2Nlc3NlZF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiPAoLRGV2aWNlQWRkZWQSLQoGZGV2aWNlGAEgASgLMh0ua3VzaW50YS5pb3QuZGV2aWNlLnYxLkRldmljZSJVCg1EZXZpY2VSZW1vdmVkEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEg4KBnJlYXNvbhgCIAEoCSpgCgxTZXJ2aWNlRmF1bHQSHQoZU0VSVklDRV9GQVVMVF9VTlNQRUNJRklFRBAAEhcKE1NFUlZJQ0VfRkFVTFRfRVJST1IQARIYChRTRVJWSUNFX0ZBVUxUX1RBTVBFUhACQgJIAWIGcHJvdG8z", [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]);
17
17
 
18
18
  /**
19
19
  * Describes the message kusinta.iot.webrtc.v1.DeviceStateSnapshot.
@@ -22,24 +22,52 @@ export const file_kusinta_iot_webrtc_v1_device_state = /*@__PURE__*/
22
22
  export const DeviceStateSnapshotSchema = /*@__PURE__*/
23
23
  messageDesc(file_kusinta_iot_webrtc_v1_device_state, 0);
24
24
 
25
+ /**
26
+ * Describes the message kusinta.iot.webrtc.v1.ServiceStatus.
27
+ * Use `create(ServiceStatusSchema)` to create a new message.
28
+ */
29
+ export const ServiceStatusSchema = /*@__PURE__*/
30
+ messageDesc(file_kusinta_iot_webrtc_v1_device_state, 1);
31
+
32
+ /**
33
+ * Describes the message kusinta.iot.webrtc.v1.ServiceStatusChanged.
34
+ * Use `create(ServiceStatusChangedSchema)` to create a new message.
35
+ */
36
+ export const ServiceStatusChangedSchema = /*@__PURE__*/
37
+ messageDesc(file_kusinta_iot_webrtc_v1_device_state, 2);
38
+
25
39
  /**
26
40
  * Describes the message kusinta.iot.webrtc.v1.PropertyReport.
27
41
  * Use `create(PropertyReportSchema)` to create a new message.
28
42
  */
29
43
  export const PropertyReportSchema = /*@__PURE__*/
30
- messageDesc(file_kusinta_iot_webrtc_v1_device_state, 1);
44
+ messageDesc(file_kusinta_iot_webrtc_v1_device_state, 3);
31
45
 
32
46
  /**
33
47
  * Describes the message kusinta.iot.webrtc.v1.DeviceAdded.
34
48
  * Use `create(DeviceAddedSchema)` to create a new message.
35
49
  */
36
50
  export const DeviceAddedSchema = /*@__PURE__*/
37
- messageDesc(file_kusinta_iot_webrtc_v1_device_state, 2);
51
+ messageDesc(file_kusinta_iot_webrtc_v1_device_state, 4);
38
52
 
39
53
  /**
40
54
  * Describes the message kusinta.iot.webrtc.v1.DeviceRemoved.
41
55
  * Use `create(DeviceRemovedSchema)` to create a new message.
42
56
  */
43
57
  export const DeviceRemovedSchema = /*@__PURE__*/
44
- messageDesc(file_kusinta_iot_webrtc_v1_device_state, 3);
58
+ messageDesc(file_kusinta_iot_webrtc_v1_device_state, 5);
59
+
60
+ /**
61
+ * Describes the enum kusinta.iot.webrtc.v1.ServiceFault.
62
+ */
63
+ export const ServiceFaultSchema = /*@__PURE__*/
64
+ enumDesc(file_kusinta_iot_webrtc_v1_device_state, 0);
65
+
66
+ /**
67
+ * A fault a device reports about itself, as service sees it.
68
+ *
69
+ * @generated from enum kusinta.iot.webrtc.v1.ServiceFault
70
+ */
71
+ export const ServiceFault = /*@__PURE__*/
72
+ tsEnum(ServiceFaultSchema);
45
73
 
@@ -7,13 +7,13 @@ import type { Message } from "@bufbuild/protobuf";
7
7
  import type { ConnectorId, DeviceId, SpaceId } from "../../identity/v1/identity_pb.js";
8
8
  import type { AttributeRef } from "../../access/v1/acl_pb.js";
9
9
  import type { Space } from "../../space/v1/space_pb.js";
10
- import type { ManagementAck, ManagementRequest, SpaceTree } from "./management_pb.js";
10
+ import type { ManagementAck, ManagementRequest, PrivacyDisclosure, SpaceTree } from "./management_pb.js";
11
11
  import type { DeviceLink, DeviceLinkList } from "../../link/v1/link_pb.js";
12
- import type { ClimateMode, RoomClimate, RoomClimateList, RoomHistory } from "../../climate/v1/climate_pb.js";
12
+ import type { ApartmentClimateSummary, ClimateMode, RoomClimate, RoomClimateList, RoomHistory } from "../../climate/v1/climate_pb.js";
13
13
  import type { PairingErrorDetail, PairingWindow } from "../../common/v1/pairing_pb.js";
14
14
  import type { ConnectorKind, DeviceOwnershipType } from "../../common/v1/types_pb.js";
15
15
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
16
- import type { DeviceAdded, DeviceRemoved, DeviceStateSnapshot, PropertyReport } from "./device_state_pb.js";
16
+ import type { DeviceAdded, DeviceRemoved, DeviceStateSnapshot, PropertyReport, ServiceStatusChanged } from "./device_state_pb.js";
17
17
  import type { LivePermissionUpdate } from "./permission_push_pb.js";
18
18
  import type { AttributeWriteRequest, CommandResult, DeviceCommand } from "./command_pb.js";
19
19
  import type { DeviceEventBatch } from "../../device/v1/device_event_pb.js";
@@ -344,6 +344,22 @@ export declare type ManagementResult = Message<"kusinta.iot.webrtc.v1.Management
344
344
  */
345
345
  value: RoomHistory;
346
346
  case: "roomHistory";
347
+ } | {
348
+ /**
349
+ * get_privacy_disclosure
350
+ *
351
+ * @generated from field: kusinta.iot.webrtc.v1.PrivacyDisclosure privacy_disclosure = 9;
352
+ */
353
+ value: PrivacyDisclosure;
354
+ case: "privacyDisclosure";
355
+ } | {
356
+ /**
357
+ * get_apartment_climate_summary
358
+ *
359
+ * @generated from field: kusinta.iot.climate.v1.ApartmentClimateSummary apartment_climate_summary = 10;
360
+ */
361
+ value: ApartmentClimateSummary;
362
+ case: "apartmentClimateSummary";
347
363
  } | { case: undefined; value?: undefined };
348
364
  };
349
365
 
@@ -392,7 +408,8 @@ export declare type StartPairing = Message<"kusinta.iot.webrtc.v1.StartPairing">
392
408
  window?: PairingWindow | undefined;
393
409
 
394
410
  /**
395
- * Where to file the device once it arrives.
411
+ * Where to file the device once it arrives. Into a home only as PlaceDeviceInSpace
412
+ * allows.
396
413
  *
397
414
  * Optional, and the two cases differ. A caller pairing a device of their own must name a
398
415
  * space they reach, so it is theirs and placed on arrival rather than sitting unfiled and
@@ -468,7 +485,8 @@ export declare const PairingStartedSchema: GenMessage<PairingStarted>;
468
485
  * One message per request, not per device: a batch window attributes several, and a client
469
486
  * given one message each has nothing telling it the window is over and no defined moment to
470
487
  * stop waiting. The devices are listed here; each also arrives as an ordinary DeviceAdded
471
- * as it appears, so a client may show them as they come and use this to finish.
488
+ * as it appears — for a device the caller sees as service, at the next quarter hour — so a
489
+ * client may show them as they come and use this to finish.
472
490
  *
473
491
  * An error and a non-empty device list are not exclusive. A batch of five that attributed
474
492
  * three and then expired reports both — three devices and NO_DEVICE_APPEARED — because
@@ -521,7 +539,12 @@ export declare const PairingFinishedSchema: GenMessage<PairingFinished>;
521
539
  * again whenever its state moves.
522
540
  *
523
541
  * Sent only for links the recipient is entitled to see. An unfiltered one would say
524
- * which devices exist and how they are arranged, to somebody entitled to neither.
542
+ * which devices exist and how they are arranged, to somebody entitled to neither. A link
543
+ * with an end in a home is not pushed to a recipient who sees it as service when it is made
544
+ * or changes — when its residents make one is theirs to know; service reads a home's links
545
+ * by ListDeviceLinks, where a new one appears from the next quarter hour. Its removal is
546
+ * pushed to them at once, with details_withheld, as every loss is — to those whose view
547
+ * held it at a quarter hour since it was made, and to nobody else.
525
548
  *
526
549
  * @generated from message kusinta.iot.webrtc.v1.LinkChanged
527
550
  */
@@ -539,7 +562,9 @@ export declare type LinkChanged = Message<"kusinta.iot.webrtc.v1.LinkChanged"> &
539
562
  * and repair.
540
563
  *
541
564
  * `link` still carries the whole link when this is set, so the app can name what
542
- * went rather than only its id.
565
+ * went rather than only its id — as much of it as the recipient was shown, so with
566
+ * details_withheld to one who saw it as service. To such a recipient it means the link is
567
+ * gone from their view, which need not mean it is gone.
543
568
  *
544
569
  * @generated from field: bool removed = 2;
545
570
  */
@@ -652,8 +677,11 @@ export declare const ConnectorsAnnouncedSchema: GenMessage<ConnectorsAnnounced>;
652
677
  /**
653
678
  * A room's climate changed, gateway → app: its target, what set it, what it is being
654
679
  * held at, its condition. Apply as an upsert keyed on room.space_id. Sent only for rooms
655
- * the recipient may see, and whenever any field moves — a knob turned by hand shows up
656
- * here without the app asking.
680
+ * the recipient may see, and whenever any field the recipient is sent moves — a knob
681
+ * turned by hand shows up here without the app asking. To a recipient who sees the room
682
+ * as service, what is new is sent at the next quarter hour and what is lost at once. A
683
+ * recipient who is sent the room with state_withheld is therefore not sent it when only
684
+ * withheld fields move.
657
685
  *
658
686
  * @generated from message kusinta.iot.webrtc.v1.RoomClimateChanged
659
687
  */
@@ -672,7 +700,9 @@ export declare const RoomClimateChangedSchema: GenMessage<RoomClimateChanged>;
672
700
 
673
701
  /**
674
702
  * A mode on a space was switched on, changed or ended, gateway → app. `ended` rather than
675
- * kind UNSPECIFIED, so an app can still name the mode that finished.
703
+ * kind UNSPECIFIED, so an app can still name the mode that finished. A mode on an
704
+ * apartment or a room in one is sent to its residents only — whether a home stands empty
705
+ * is theirs to know; one on any other space, to whoever reaches it.
676
706
  *
677
707
  * @generated from message kusinta.iot.webrtc.v1.ClimateModeChanged
678
708
  */
@@ -824,6 +854,12 @@ export declare type GatewayMessage = Message<"kusinta.iot.webrtc.v1.GatewayMessa
824
854
  */
825
855
  value: ClimateModeChanged;
826
856
  case: "climateModeChanged";
857
+ } | {
858
+ /**
859
+ * @generated from field: kusinta.iot.webrtc.v1.ServiceStatusChanged service_status_changed = 23;
860
+ */
861
+ value: ServiceStatusChanged;
862
+ case: "serviceStatusChanged";
827
863
  } | { case: undefined; value?: undefined };
828
864
  };
829
865
 
@@ -21,7 +21,7 @@ import { file_kusinta_iot_webrtc_v1_permission_push } from "./permission_push_pb
21
21
  * Describes the file kusinta/iot/webrtc/v1/envelope.proto.
22
22
  */
23
23
  export const file_kusinta_iot_webrtc_v1_envelope = /*@__PURE__*/
24
- fileDesc("CiRrdXNpbnRhL2lvdC93ZWJydGMvdjEvZW52ZWxvcGUucHJvdG8SFWt1c2ludGEuaW90LndlYnJ0Yy52MSIGCgRQaW5nIgYKBFBvbmciIwoRSGFuZHNoYWtlUmVqZWN0ZWQSDgoGcmVhc29uGAEgASgJIlwKDEFwcEhhbmRzaGFrZRILCgNqd3QYASABKAkSPwoUc3Vic2NyaWJlX2RldmljZV9pZHMYAiADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJJChBTdWJzY3JpYmVEZXZpY2VzEjUKCmRldmljZV9pZHMYASADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJLChJVbnN1YnNjcmliZURldmljZXMSNQoKZGV2aWNlX2lkcxgBIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkIpMBChNSZWZ1c2VkU3Vic2NyaXB0aW9uEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjUKBGNvZGUYAiABKA4yJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuR2F0ZXdheUVycm9yQ29kZRIPCgdtZXNzYWdlGAMgASgJIpoBCg9TdWJzY3JpcHRpb25BY2sSEwoLaW5fcmVwbHlfdG8YASABKAkSNQoKc3Vic2NyaWJlZBgCIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjsKB3JlZnVzZWQYAyADKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVmdXNlZFN1YnNjcmlwdGlvbiLRAQoTUHJvcGVydHlSZWFkUmVxdWVzdBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIzCgZ0YXJnZXQYByABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmSgQIAhAHUg5hdHRyaWJ1dGVfbmFtZVIOY2x1c3Rlcl9pZF9oZXhSCmNsdXN0ZXJfaWRSC2VuZHBvaW50X2lkUhB2ZW5kb3JfZXh0ZW5zaW9uIswBCgxHYXRld2F5RXJyb3ISNQoEY29kZRgBIAEoDjInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5HYXRld2F5RXJyb3JDb2RlEg8KB21lc3NhZ2UYAiABKAkSQwoIbWV0YWRhdGEYAyADKAsyMS5rdXNpbnRhLmlvdC53ZWJydGMudjEuR2F0ZXdheUVycm9yLk1ldGFkYXRhRW50cnkaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIrcDChBNYW5hZ2VtZW50UmVzdWx0EhMKC2luX3JlcGx5X3RvGAEgASgJEjQKBWVycm9yGAIgASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLkdhdGV3YXlFcnJvckgAEiwKBXNwYWNlGAMgASgLMhsua3VzaW50YS5pb3Quc3BhY2UudjEuU3BhY2VIABI2CgpzcGFjZV90cmVlGAQgASgLMiAua3VzaW50YS5pb3Qud2VicnRjLnYxLlNwYWNlVHJlZUgAEjMKA2FjaxgFIAEoCzIkLmt1c2ludGEuaW90LndlYnJ0Yy52MS5NYW5hZ2VtZW50QWNrSAASNAoFbGlua3MYBiABKAsyIy5rdXNpbnRhLmlvdC5saW5rLnYxLkRldmljZUxpbmtMaXN0SAASQAoNcm9vbV9jbGltYXRlcxgHIAEoCzInLmt1c2ludGEuaW90LmNsaW1hdGUudjEuUm9vbUNsaW1hdGVMaXN0SAASOwoMcm9vbV9oaXN0b3J5GAggASgLMiMua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5Sb29tSGlzdG9yeUgAQggKBnJlc3VsdCL7AQoMU3RhcnRQYWlyaW5nEjoKDGNvbm5lY3Rvcl9pZBgBIAEoCzIkLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkNvbm5lY3RvcklkEjQKBndpbmRvdxgCIAEoCzIkLmt1c2ludGEuaW90LmNvbW1vbi52MS5QYWlyaW5nV2luZG93EjoKEGluaXRpYWxfc3BhY2VfaWQYAyABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEj0KCW93bmVyc2hpcBgEIAEoDjIqLmt1c2ludGEuaW90LmNvbW1vbi52MS5EZXZpY2VPd25lcnNoaXBUeXBlIo8BCg5QYWlyaW5nU3RhcnRlZBITCgtpbl9yZXBseV90bxgBIAEoCRIuCgpleHBpcmVzX2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI4CgVlcnJvchgDIAEoCzIpLmt1c2ludGEuaW90LmNvbW1vbi52MS5QYWlyaW5nRXJyb3JEZXRhaWwilwEKD1BhaXJpbmdGaW5pc2hlZBITCgtpbl9yZXBseV90bxgBIAEoCRI1CgpkZXZpY2VfaWRzGAIgAygLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWQSOAoFZXJyb3IYAyABKAsyKS5rdXNpbnRhLmlvdC5jb21tb24udjEuUGFpcmluZ0Vycm9yRGV0YWlsIk0KC0xpbmtDaGFuZ2VkEi0KBGxpbmsYASABKAsyHy5rdXNpbnRhLmlvdC5saW5rLnYxLkRldmljZUxpbmsSDwoHcmVtb3ZlZBgCIAEoCCKjAgoTQ29ubmVjdG9yRGVzY3JpcHRvchI6Cgxjb25uZWN0b3JfaWQYASABKAsyJC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Db25uZWN0b3JJZBIUCgxkaXNwbGF5X25hbWUYAiABKAkSIQoZc3VwcG9ydGVkX2RldmljZV90eXBlX2lkcxgDIAMoDRIYChBzdXBwb3J0c19wYWlyaW5nGAQgASgIEh0KFXN1cHBvcnRzX3Byb3Zpc2lvbmluZxgFIAEoCBIVCg1icm9rZXJzX2xpbmtzGAYgASgIEjIKBGtpbmQYByABKA4yJC5rdXNpbnRhLmlvdC5jb21tb24udjEuQ29ubmVjdG9yS2luZBITCgtkZXNjcmlwdGlvbhgIIAEoCSJVChNDb25uZWN0b3JzQW5ub3VuY2VkEj4KCmNvbm5lY3RvcnMYASADKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29ubmVjdG9yRGVzY3JpcHRvciJHChJSb29tQ2xpbWF0ZUNoYW5nZWQSMQoEcm9vbRgBIAEoCzIjLmt1c2ludGEuaW90LmNsaW1hdGUudjEuUm9vbUNsaW1hdGUiVgoSQ2xpbWF0ZU1vZGVDaGFuZ2VkEjEKBG1vZGUYASABKAsyIy5rdXNpbnRhLmlvdC5jbGltYXRlLnYxLkNsaW1hdGVNb2RlEg0KBWVuZGVkGAIgASgIIrkKCg5HYXRld2F5TWVzc2FnZRISCgptZXNzYWdlX2lkGAEgASgJEisKB3NlbnRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEkQKDnN0YXRlX3NuYXBzaG90GAMgASgLMioua3VzaW50YS5pb3Qud2VicnRjLnYxLkRldmljZVN0YXRlU25hcHNob3RIABJACg9wcm9wZXJ0eV9yZXBvcnQYBCABKAsyJS5rdXNpbnRhLmlvdC53ZWJydGMudjEuUHJvcGVydHlSZXBvcnRIABJIChFwZXJtaXNzaW9uX3VwZGF0ZRgFIAEoCzIrLmt1c2ludGEuaW90LndlYnJ0Yy52MS5MaXZlUGVybWlzc2lvblVwZGF0ZUgAEj4KDmNvbW1hbmRfcmVzdWx0GAYgASgLMiQua3VzaW50YS5pb3Qud2VicnRjLnYxLkNvbW1hbmRSZXN1bHRIABIrCgRwb25nGAggASgLMhsua3VzaW50YS5pb3Qud2VicnRjLnYxLlBvbmdIABJGChJoYW5kc2hha2VfcmVqZWN0ZWQYCSABKAsyKC5rdXNpbnRhLmlvdC53ZWJydGMudjEuSGFuZHNoYWtlUmVqZWN0ZWRIABI0CgVlcnJvchgKIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5HYXRld2F5RXJyb3JIABJCChBzdWJzY3JpcHRpb25fYWNrGAsgASgLMiYua3VzaW50YS5pb3Qud2VicnRjLnYxLlN1YnNjcmlwdGlvbkFja0gAEjoKDGRldmljZV9hZGRlZBgMIAEoCzIiLmt1c2ludGEuaW90LndlYnJ0Yy52MS5EZXZpY2VBZGRlZEgAEj4KDmRldmljZV9yZW1vdmVkGA0gASgLMiQua3VzaW50YS5pb3Qud2VicnRjLnYxLkRldmljZVJlbW92ZWRIABJEChFtYW5hZ2VtZW50X3Jlc3VsdBgOIAEoCzInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5NYW5hZ2VtZW50UmVzdWx0SAASQAoNZGV2aWNlX2V2ZW50cxgQIAEoCzInLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2VFdmVudEJhdGNoSAASQAoPcGFpcmluZ19zdGFydGVkGBEgASgLMiUua3VzaW50YS5pb3Qud2VicnRjLnYxLlBhaXJpbmdTdGFydGVkSAASQgoQcGFpcmluZ19maW5pc2hlZBgSIAEoCzImLmt1c2ludGEuaW90LndlYnJ0Yy52MS5QYWlyaW5nRmluaXNoZWRIABI6CgxsaW5rX2NoYW5nZWQYEyABKAsyIi5rdXNpbnRhLmlvdC53ZWJydGMudjEuTGlua0NoYW5nZWRIABJKChRjb25uZWN0b3JzX2Fubm91bmNlZBgUIAEoCzIqLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db25uZWN0b3JzQW5ub3VuY2VkSAASSQoUcm9vbV9jbGltYXRlX2NoYW5nZWQYFSABKAsyKS5rdXNpbnRhLmlvdC53ZWJydGMudjEuUm9vbUNsaW1hdGVDaGFuZ2VkSAASSQoUY2xpbWF0ZV9tb2RlX2NoYW5nZWQYFiABKAsyKS5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ2xpbWF0ZU1vZGVDaGFuZ2VkSABCCQoHcGF5bG9hZEoECA8QEEoECAcQCFIWYXR0cmlidXRlX3dyaXRlX3Jlc3VsdFIOcHJvcGVydHlfZXZlbnQigwUKCkFwcE1lc3NhZ2USEgoKbWVzc2FnZV9pZBgBIAEoCRIrCgdzZW50X2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI4CgloYW5kc2hha2UYAyABKAsyIy5rdXNpbnRhLmlvdC53ZWJydGMudjEuQXBwSGFuZHNoYWtlSAASNwoHY29tbWFuZBgEIAEoCzIkLmt1c2ludGEuaW90LndlYnJ0Yy52MS5EZXZpY2VDb21tYW5kSAASQgoMcmVhZF9yZXF1ZXN0GAUgASgLMioua3VzaW50YS5pb3Qud2VicnRjLnYxLlByb3BlcnR5UmVhZFJlcXVlc3RIABIrCgRwaW5nGAYgASgLMhsua3VzaW50YS5pb3Qud2VicnRjLnYxLlBpbmdIABI8CglzdWJzY3JpYmUYByABKAsyJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuU3Vic2NyaWJlRGV2aWNlc0gAEkAKC3Vuc3Vic2NyaWJlGAggASgLMikua3VzaW50YS5pb3Qud2VicnRjLnYxLlVuc3Vic2NyaWJlRGV2aWNlc0gAEj4KCm1hbmFnZW1lbnQYCSABKAsyKC5rdXNpbnRhLmlvdC53ZWJydGMudjEuTWFuYWdlbWVudFJlcXVlc3RIABJHCg9hdHRyaWJ1dGVfd3JpdGUYCiABKAsyLC5rdXNpbnRhLmlvdC53ZWJydGMudjEuQXR0cmlidXRlV3JpdGVSZXF1ZXN0SAASPAoNc3RhcnRfcGFpcmluZxgLIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5TdGFydFBhaXJpbmdIAEIJCgdwYXlsb2FkKvYBChBHYXRld2F5RXJyb3JDb2RlEiIKHkdBVEVXQVlfRVJST1JfQ09ERV9VTlNQRUNJRklFRBAAEiMKH0dBVEVXQVlfRVJST1JfQ09ERV9OT1RfRU5USVRMRUQQARImCiJHQVRFV0FZX0VSUk9SX0NPREVfSU5WQUxJRF9SRVFVRVNUEAISIgoeR0FURVdBWV9FUlJPUl9DT0RFX1VOQVZBSUxBQkxFEAMSHwobR0FURVdBWV9FUlJPUl9DT0RFX0lOVEVSTkFMEAQSLAooR0FURVdBWV9FUlJPUl9DT0RFX1NFU1NJT05fTElNSVRfUkVBQ0hFRBAFQgJIAWIGcHJvdG8z", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_climate_v1_climate, file_kusinta_iot_common_v1_pairing, file_kusinta_iot_common_v1_types, file_kusinta_iot_device_v1_device_event, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_link_v1_link, file_kusinta_iot_space_v1_space, file_kusinta_iot_webrtc_v1_command, file_kusinta_iot_webrtc_v1_device_state, file_kusinta_iot_webrtc_v1_management, file_kusinta_iot_webrtc_v1_permission_push]);
24
+ fileDesc("CiRrdXNpbnRhL2lvdC93ZWJydGMvdjEvZW52ZWxvcGUucHJvdG8SFWt1c2ludGEuaW90LndlYnJ0Yy52MSIGCgRQaW5nIgYKBFBvbmciIwoRSGFuZHNoYWtlUmVqZWN0ZWQSDgoGcmVhc29uGAEgASgJIlwKDEFwcEhhbmRzaGFrZRILCgNqd3QYASABKAkSPwoUc3Vic2NyaWJlX2RldmljZV9pZHMYAiADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJJChBTdWJzY3JpYmVEZXZpY2VzEjUKCmRldmljZV9pZHMYASADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJLChJVbnN1YnNjcmliZURldmljZXMSNQoKZGV2aWNlX2lkcxgBIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkIpMBChNSZWZ1c2VkU3Vic2NyaXB0aW9uEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjUKBGNvZGUYAiABKA4yJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuR2F0ZXdheUVycm9yQ29kZRIPCgdtZXNzYWdlGAMgASgJIpoBCg9TdWJzY3JpcHRpb25BY2sSEwoLaW5fcmVwbHlfdG8YASABKAkSNQoKc3Vic2NyaWJlZBgCIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjsKB3JlZnVzZWQYAyADKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVmdXNlZFN1YnNjcmlwdGlvbiLRAQoTUHJvcGVydHlSZWFkUmVxdWVzdBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIzCgZ0YXJnZXQYByABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmSgQIAhAHUg5hdHRyaWJ1dGVfbmFtZVIOY2x1c3Rlcl9pZF9oZXhSCmNsdXN0ZXJfaWRSC2VuZHBvaW50X2lkUhB2ZW5kb3JfZXh0ZW5zaW9uIswBCgxHYXRld2F5RXJyb3ISNQoEY29kZRgBIAEoDjInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5HYXRld2F5RXJyb3JDb2RlEg8KB21lc3NhZ2UYAiABKAkSQwoIbWV0YWRhdGEYAyADKAsyMS5rdXNpbnRhLmlvdC53ZWJydGMudjEuR2F0ZXdheUVycm9yLk1ldGFkYXRhRW50cnkaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBItUEChBNYW5hZ2VtZW50UmVzdWx0EhMKC2luX3JlcGx5X3RvGAEgASgJEjQKBWVycm9yGAIgASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLkdhdGV3YXlFcnJvckgAEiwKBXNwYWNlGAMgASgLMhsua3VzaW50YS5pb3Quc3BhY2UudjEuU3BhY2VIABI2CgpzcGFjZV90cmVlGAQgASgLMiAua3VzaW50YS5pb3Qud2VicnRjLnYxLlNwYWNlVHJlZUgAEjMKA2FjaxgFIAEoCzIkLmt1c2ludGEuaW90LndlYnJ0Yy52MS5NYW5hZ2VtZW50QWNrSAASNAoFbGlua3MYBiABKAsyIy5rdXNpbnRhLmlvdC5saW5rLnYxLkRldmljZUxpbmtMaXN0SAASQAoNcm9vbV9jbGltYXRlcxgHIAEoCzInLmt1c2ludGEuaW90LmNsaW1hdGUudjEuUm9vbUNsaW1hdGVMaXN0SAASOwoMcm9vbV9oaXN0b3J5GAggASgLMiMua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5Sb29tSGlzdG9yeUgAEkYKEnByaXZhY3lfZGlzY2xvc3VyZRgJIAEoCzIoLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Qcml2YWN5RGlzY2xvc3VyZUgAElQKGWFwYXJ0bWVudF9jbGltYXRlX3N1bW1hcnkYCiABKAsyLy5rdXNpbnRhLmlvdC5jbGltYXRlLnYxLkFwYXJ0bWVudENsaW1hdGVTdW1tYXJ5SABCCAoGcmVzdWx0IvsBCgxTdGFydFBhaXJpbmcSOgoMY29ubmVjdG9yX2lkGAEgASgLMiQua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuQ29ubmVjdG9ySWQSNAoGd2luZG93GAIgASgLMiQua3VzaW50YS5pb3QuY29tbW9uLnYxLlBhaXJpbmdXaW5kb3cSOgoQaW5pdGlhbF9zcGFjZV9pZBgDIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSPQoJb3duZXJzaGlwGAQgASgOMioua3VzaW50YS5pb3QuY29tbW9uLnYxLkRldmljZU93bmVyc2hpcFR5cGUijwEKDlBhaXJpbmdTdGFydGVkEhMKC2luX3JlcGx5X3RvGAEgASgJEi4KCmV4cGlyZXNfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjgKBWVycm9yGAMgASgLMikua3VzaW50YS5pb3QuY29tbW9uLnYxLlBhaXJpbmdFcnJvckRldGFpbCKXAQoPUGFpcmluZ0ZpbmlzaGVkEhMKC2luX3JlcGx5X3RvGAEgASgJEjUKCmRldmljZV9pZHMYAiADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBI4CgVlcnJvchgDIAEoCzIpLmt1c2ludGEuaW90LmNvbW1vbi52MS5QYWlyaW5nRXJyb3JEZXRhaWwiTQoLTGlua0NoYW5nZWQSLQoEbGluaxgBIAEoCzIfLmt1c2ludGEuaW90LmxpbmsudjEuRGV2aWNlTGluaxIPCgdyZW1vdmVkGAIgASgIIqMCChNDb25uZWN0b3JEZXNjcmlwdG9yEjoKDGNvbm5lY3Rvcl9pZBgBIAEoCzIkLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkNvbm5lY3RvcklkEhQKDGRpc3BsYXlfbmFtZRgCIAEoCRIhChlzdXBwb3J0ZWRfZGV2aWNlX3R5cGVfaWRzGAMgAygNEhgKEHN1cHBvcnRzX3BhaXJpbmcYBCABKAgSHQoVc3VwcG9ydHNfcHJvdmlzaW9uaW5nGAUgASgIEhUKDWJyb2tlcnNfbGlua3MYBiABKAgSMgoEa2luZBgHIAEoDjIkLmt1c2ludGEuaW90LmNvbW1vbi52MS5Db25uZWN0b3JLaW5kEhMKC2Rlc2NyaXB0aW9uGAggASgJIlUKE0Nvbm5lY3RvcnNBbm5vdW5jZWQSPgoKY29ubmVjdG9ycxgBIAMoCzIqLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db25uZWN0b3JEZXNjcmlwdG9yIkcKElJvb21DbGltYXRlQ2hhbmdlZBIxCgRyb29tGAEgASgLMiMua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5Sb29tQ2xpbWF0ZSJWChJDbGltYXRlTW9kZUNoYW5nZWQSMQoEbW9kZRgBIAEoCzIjLmt1c2ludGEuaW90LmNsaW1hdGUudjEuQ2xpbWF0ZU1vZGUSDQoFZW5kZWQYAiABKAgiiAsKDkdhdGV3YXlNZXNzYWdlEhIKCm1lc3NhZ2VfaWQYASABKAkSKwoHc2VudF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASRAoOc3RhdGVfc25hcHNob3QYAyABKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuRGV2aWNlU3RhdGVTbmFwc2hvdEgAEkAKD3Byb3BlcnR5X3JlcG9ydBgEIAEoCzIlLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Qcm9wZXJ0eVJlcG9ydEgAEkgKEXBlcm1pc3Npb25fdXBkYXRlGAUgASgLMisua3VzaW50YS5pb3Qud2VicnRjLnYxLkxpdmVQZXJtaXNzaW9uVXBkYXRlSAASPgoOY29tbWFuZF9yZXN1bHQYBiABKAsyJC5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29tbWFuZFJlc3VsdEgAEisKBHBvbmcYCCABKAsyGy5rdXNpbnRhLmlvdC53ZWJydGMudjEuUG9uZ0gAEkYKEmhhbmRzaGFrZV9yZWplY3RlZBgJIAEoCzIoLmt1c2ludGEuaW90LndlYnJ0Yy52MS5IYW5kc2hha2VSZWplY3RlZEgAEjQKBWVycm9yGAogASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLkdhdGV3YXlFcnJvckgAEkIKEHN1YnNjcmlwdGlvbl9hY2sYCyABKAsyJi5rdXNpbnRhLmlvdC53ZWJydGMudjEuU3Vic2NyaXB0aW9uQWNrSAASOgoMZGV2aWNlX2FkZGVkGAwgASgLMiIua3VzaW50YS5pb3Qud2VicnRjLnYxLkRldmljZUFkZGVkSAASPgoOZGV2aWNlX3JlbW92ZWQYDSABKAsyJC5rdXNpbnRhLmlvdC53ZWJydGMudjEuRGV2aWNlUmVtb3ZlZEgAEkQKEW1hbmFnZW1lbnRfcmVzdWx0GA4gASgLMicua3VzaW50YS5pb3Qud2VicnRjLnYxLk1hbmFnZW1lbnRSZXN1bHRIABJACg1kZXZpY2VfZXZlbnRzGBAgASgLMicua3VzaW50YS5pb3QuZGV2aWNlLnYxLkRldmljZUV2ZW50QmF0Y2hIABJACg9wYWlyaW5nX3N0YXJ0ZWQYESABKAsyJS5rdXNpbnRhLmlvdC53ZWJydGMudjEuUGFpcmluZ1N0YXJ0ZWRIABJCChBwYWlyaW5nX2ZpbmlzaGVkGBIgASgLMiYua3VzaW50YS5pb3Qud2VicnRjLnYxLlBhaXJpbmdGaW5pc2hlZEgAEjoKDGxpbmtfY2hhbmdlZBgTIAEoCzIiLmt1c2ludGEuaW90LndlYnJ0Yy52MS5MaW5rQ2hhbmdlZEgAEkoKFGNvbm5lY3RvcnNfYW5ub3VuY2VkGBQgASgLMioua3VzaW50YS5pb3Qud2VicnRjLnYxLkNvbm5lY3RvcnNBbm5vdW5jZWRIABJJChRyb29tX2NsaW1hdGVfY2hhbmdlZBgVIAEoCzIpLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Sb29tQ2xpbWF0ZUNoYW5nZWRIABJJChRjbGltYXRlX21vZGVfY2hhbmdlZBgWIAEoCzIpLmt1c2ludGEuaW90LndlYnJ0Yy52MS5DbGltYXRlTW9kZUNoYW5nZWRIABJNChZzZXJ2aWNlX3N0YXR1c19jaGFuZ2VkGBcgASgLMisua3VzaW50YS5pb3Qud2VicnRjLnYxLlNlcnZpY2VTdGF0dXNDaGFuZ2VkSABCCQoHcGF5bG9hZEoECA8QEEoECAcQCFIWYXR0cmlidXRlX3dyaXRlX3Jlc3VsdFIOcHJvcGVydHlfZXZlbnQigwUKCkFwcE1lc3NhZ2USEgoKbWVzc2FnZV9pZBgBIAEoCRIrCgdzZW50X2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI4CgloYW5kc2hha2UYAyABKAsyIy5rdXNpbnRhLmlvdC53ZWJydGMudjEuQXBwSGFuZHNoYWtlSAASNwoHY29tbWFuZBgEIAEoCzIkLmt1c2ludGEuaW90LndlYnJ0Yy52MS5EZXZpY2VDb21tYW5kSAASQgoMcmVhZF9yZXF1ZXN0GAUgASgLMioua3VzaW50YS5pb3Qud2VicnRjLnYxLlByb3BlcnR5UmVhZFJlcXVlc3RIABIrCgRwaW5nGAYgASgLMhsua3VzaW50YS5pb3Qud2VicnRjLnYxLlBpbmdIABI8CglzdWJzY3JpYmUYByABKAsyJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuU3Vic2NyaWJlRGV2aWNlc0gAEkAKC3Vuc3Vic2NyaWJlGAggASgLMikua3VzaW50YS5pb3Qud2VicnRjLnYxLlVuc3Vic2NyaWJlRGV2aWNlc0gAEj4KCm1hbmFnZW1lbnQYCSABKAsyKC5rdXNpbnRhLmlvdC53ZWJydGMudjEuTWFuYWdlbWVudFJlcXVlc3RIABJHCg9hdHRyaWJ1dGVfd3JpdGUYCiABKAsyLC5rdXNpbnRhLmlvdC53ZWJydGMudjEuQXR0cmlidXRlV3JpdGVSZXF1ZXN0SAASPAoNc3RhcnRfcGFpcmluZxgLIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5TdGFydFBhaXJpbmdIAEIJCgdwYXlsb2FkKvYBChBHYXRld2F5RXJyb3JDb2RlEiIKHkdBVEVXQVlfRVJST1JfQ09ERV9VTlNQRUNJRklFRBAAEiMKH0dBVEVXQVlfRVJST1JfQ09ERV9OT1RfRU5USVRMRUQQARImCiJHQVRFV0FZX0VSUk9SX0NPREVfSU5WQUxJRF9SRVFVRVNUEAISIgoeR0FURVdBWV9FUlJPUl9DT0RFX1VOQVZBSUxBQkxFEAMSHwobR0FURVdBWV9FUlJPUl9DT0RFX0lOVEVSTkFMEAQSLAooR0FURVdBWV9FUlJPUl9DT0RFX1NFU1NJT05fTElNSVRfUkVBQ0hFRBAFQgJIAWIGcHJvdG8z", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_climate_v1_climate, file_kusinta_iot_common_v1_pairing, file_kusinta_iot_common_v1_types, file_kusinta_iot_device_v1_device_event, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_link_v1_link, file_kusinta_iot_space_v1_space, file_kusinta_iot_webrtc_v1_command, file_kusinta_iot_webrtc_v1_device_state, file_kusinta_iot_webrtc_v1_management, file_kusinta_iot_webrtc_v1_permission_push]);
25
25
 
26
26
  /**
27
27
  * Describes the message kusinta.iot.webrtc.v1.Ping.