@kusinta/iot-schema 0.2.0-beta.1 → 0.2.0-beta.11

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 (40) hide show
  1. package/package.json +8 -1
  2. package/src/kusinta/iot/access/v1/acl_pb.d.ts +130 -0
  3. package/src/kusinta/iot/access/v1/acl_pb.js +19 -5
  4. package/src/kusinta/iot/access/v1/roles_pb.d.ts +80 -14
  5. package/src/kusinta/iot/access/v1/roles_pb.js +33 -1
  6. package/src/kusinta/iot/common/v1/pairing_pb.d.ts +201 -0
  7. package/src/kusinta/iot/common/v1/pairing_pb.js +50 -0
  8. package/src/kusinta/iot/common/v1/types_pb.d.ts +34 -0
  9. package/src/kusinta/iot/common/v1/types_pb.js +22 -1
  10. package/src/kusinta/iot/connector/v1/connector_pb.d.ts +476 -7
  11. package/src/kusinta/iot/connector/v1/connector_pb.js +70 -12
  12. package/src/kusinta/iot/device/v1/cluster_state_pb.d.ts +25 -0
  13. package/src/kusinta/iot/device/v1/cluster_state_pb.js +1 -1
  14. package/src/kusinta/iot/device/v1/descriptor_pb.d.ts +16 -1
  15. package/src/kusinta/iot/device/v1/descriptor_pb.js +2 -1
  16. package/src/kusinta/iot/device/v1/device_pb.d.ts +34 -3
  17. package/src/kusinta/iot/device/v1/device_pb.js +1 -1
  18. package/src/kusinta/iot/device/v1/matter_options_pb.d.ts +26 -0
  19. package/src/kusinta/iot/device/v1/matter_options_pb.js +31 -4
  20. package/src/kusinta/iot/device/v1/properties_pb.d.ts +14 -0
  21. package/src/kusinta/iot/device/v1/properties_pb.js +1 -1
  22. package/src/kusinta/iot/link/v1/link_pb.d.ts +419 -0
  23. package/src/kusinta/iot/link/v1/link_pb.js +121 -0
  24. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.d.ts +162 -13
  25. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.js +8 -1
  26. package/src/kusinta/iot/vendor/lorawan/v1/lorawan_pb.d.ts +69 -0
  27. package/src/kusinta/iot/vendor/lorawan/v1/lorawan_pb.js +19 -0
  28. package/src/kusinta/iot/vendor/v1/vendor_options_pb.d.ts +21 -0
  29. package/src/kusinta/iot/vendor/v1/vendor_options_pb.js +24 -2
  30. package/src/kusinta/iot/webrtc/v1/command_pb.d.ts +14 -6
  31. package/src/kusinta/iot/webrtc/v1/command_pb.js +2 -1
  32. package/src/kusinta/iot/webrtc/v1/device_state_pb.d.ts +12 -6
  33. package/src/kusinta/iot/webrtc/v1/device_state_pb.js +5 -5
  34. package/src/kusinta/iot/webrtc/v1/envelope_pb.d.ts +339 -5
  35. package/src/kusinta/iot/webrtc/v1/envelope_pb.js +48 -3
  36. package/src/kusinta/iot/webrtc/v1/management_pb.d.ts +246 -3
  37. package/src/kusinta/iot/webrtc/v1/management_pb.js +42 -5
  38. package/src/kusinta/iot/webrtc/v1/permission_push_pb.js +2 -2
  39. package/src/kusinta/iot/webrtc/v1/setpoint_mode_pb.d.ts +63 -0
  40. package/src/kusinta/iot/webrtc/v1/setpoint_mode_pb.js +45 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kusinta/iot-schema",
3
- "version": "0.2.0-beta.1",
3
+ "version": "0.2.0-beta.11",
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,14 +21,20 @@
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
+ "./link": "./src/kusinta/iot/link/v1/link_pb.js",
26
29
  "./connector": "./src/kusinta/iot/connector/v1/connector_pb.js",
27
30
  "./connector/service": "./src/kusinta/iot/connector/v1/connector_service_pb.js",
28
31
  "./webrtc": "./src/kusinta/iot/webrtc/v1/envelope_pb.js",
29
32
  "./webrtc/app-token": "./src/kusinta/iot/webrtc/v1/app_token_pb.js",
33
+ "./webrtc/command": "./src/kusinta/iot/webrtc/v1/command_pb.js",
34
+ "./webrtc/device-state": "./src/kusinta/iot/webrtc/v1/device_state_pb.js",
30
35
  "./webrtc/management": "./src/kusinta/iot/webrtc/v1/management_pb.js",
36
+ "./webrtc/permission-push": "./src/kusinta/iot/webrtc/v1/permission_push_pb.js",
37
+ "./webrtc/setpoint-mode": "./src/kusinta/iot/webrtc/v1/setpoint_mode_pb.js",
31
38
  "./registration": "./src/kusinta/iot/registration/v1/registration_pb.js",
32
39
  "./registration/service": "./src/kusinta/iot/registration/v1/registration_service_pb.js",
33
40
  "./signaling": "./src/kusinta/iot/signaling/v1/signaling_pb.js",
@@ -86,6 +86,77 @@ export declare type AttributeRef = Message<"kusinta.iot.access.v1.AttributeRef">
86
86
  */
87
87
  export declare const AttributeRefSchema: GenMessage<AttributeRef>;
88
88
 
89
+ /**
90
+ * CommandRef names one command on one endpoint, for DeviceAcl.allowed_command_refs.
91
+ *
92
+ * A separate type from AttributeRef because attributes and commands are numbered
93
+ * independently within a cluster: On/Off (0x0006) has an attribute 0x0000 (OnOff) and a
94
+ * command 0x0000 (Off) that have nothing to do with each other. Putting a command ID in a
95
+ * field named attribute_id would be the same class of ambiguity this schema removed when
96
+ * it made addressing numeric.
97
+ *
98
+ * @generated from message kusinta.iot.access.v1.CommandRef
99
+ */
100
+ export declare type CommandRef = Message<"kusinta.iot.access.v1.CommandRef"> & {
101
+ /**
102
+ * @generated from field: uint32 cluster_id = 1;
103
+ */
104
+ clusterId: number;
105
+
106
+ /**
107
+ * @generated from field: uint32 matter_command_id = 2;
108
+ */
109
+ matterCommandId: number;
110
+
111
+ /**
112
+ * Which endpoint. Required on a grant, for the same reason as AttributeRef.endpoint_id:
113
+ * all four channels of a 4-channel actuator accept the same command on the same cluster,
114
+ * so a ref without one cannot tell channel 1 from channel 3.
115
+ *
116
+ * @generated from field: optional uint32 endpoint_id = 3;
117
+ */
118
+ endpointId?: number | undefined;
119
+ };
120
+
121
+ /**
122
+ * Describes the message kusinta.iot.access.v1.CommandRef.
123
+ * Use `create(CommandRefSchema)` to create a new message.
124
+ */
125
+ export declare const CommandRefSchema: GenMessage<CommandRef>;
126
+
127
+ /**
128
+ * EventRef names one event on one endpoint, for DeviceAcl.allowed_event_refs.
129
+ *
130
+ * Events are numbered independently of attributes and commands within a cluster, so this
131
+ * is a third type rather than a reuse. On Door Lock (0x0101), the LockState attribute and
132
+ * the lock-operation event are different elements answering different questions: what the
133
+ * lock's state is, and who changed it.
134
+ *
135
+ * @generated from message kusinta.iot.access.v1.EventRef
136
+ */
137
+ export declare type EventRef = Message<"kusinta.iot.access.v1.EventRef"> & {
138
+ /**
139
+ * @generated from field: uint32 cluster_id = 1;
140
+ */
141
+ clusterId: number;
142
+
143
+ /**
144
+ * @generated from field: uint32 event_id = 2;
145
+ */
146
+ eventId: number;
147
+
148
+ /**
149
+ * @generated from field: optional uint32 endpoint_id = 3;
150
+ */
151
+ endpointId?: number | undefined;
152
+ };
153
+
154
+ /**
155
+ * Describes the message kusinta.iot.access.v1.EventRef.
156
+ * Use `create(EventRefSchema)` to create a new message.
157
+ */
158
+ export declare const EventRefSchema: GenMessage<EventRef>;
159
+
89
160
  /**
90
161
  * PropertyConstraint bounds a single Matter cluster attribute.
91
162
  * MaxHeatSetpointLimit and MinHeatSetpointLimit are actual Matter Thermostat cluster
@@ -155,6 +226,14 @@ export declare type DeviceAcl = Message<"kusinta.iot.access.v1.DeviceAcl"> & {
155
226
  userId?: UserId | undefined;
156
227
 
157
228
  /**
229
+ * The user's role AS RESOLVED FOR THIS DEVICE. A gateway-wide role is a ceiling on the
230
+ * kinds of action a user may perform; reach — which devices — is decided separately by
231
+ * filing. This field is what the two produced together for this one device, so it may
232
+ * differ from any single role the user's token carries. See roles.proto.
233
+ *
234
+ * Descriptive. allowed_actions and the ref lists below are what a consumer enforces
235
+ * against; this says which relationship produced them.
236
+ *
158
237
  * @generated from field: kusinta.iot.access.v1.Role role = 3;
159
238
  */
160
239
  role: Role;
@@ -192,6 +271,39 @@ export declare type DeviceAcl = Message<"kusinta.iot.access.v1.DeviceAcl"> & {
192
271
  * @generated from field: repeated kusinta.iot.access.v1.PropertyConstraint property_constraints = 6;
193
272
  */
194
273
  propertyConstraints: PropertyConstraint[];
274
+
275
+ /**
276
+ * Narrows PERMISSION_ACTION_INVOKE to particular commands. Empty = every command the
277
+ * device accepts, matching allowed_attribute_refs — it is a filter, and an empty filter
278
+ * narrows nothing. It grants nothing on its own: without INVOKE in allowed_actions, no
279
+ * command is permitted however this list reads.
280
+ *
281
+ * Without it INVOKE is all-or-nothing, and that is the operation that moves hardware —
282
+ * a grant covering a thermostat setpoint would equally cover UnlockDoor on a device
283
+ * exposing both.
284
+ *
285
+ * A ref present with no endpoint_id is INVALID and MUST be rejected.
286
+ *
287
+ * @generated from field: repeated kusinta.iot.access.v1.CommandRef allowed_command_refs = 9;
288
+ */
289
+ allowedCommandRefs: CommandRef[];
290
+
291
+ /**
292
+ * Which events this user may receive. Empty = NONE.
293
+ *
294
+ * The opposite default to the two lists above, deliberately. Attributes and commands are
295
+ * a device's operating surface; events are its journal, and a journal discloses who did
296
+ * what and when. Reaching that must be an explicit grant, never something a user gets by
297
+ * holding SUBSCRIBE for ordinary readings.
298
+ *
299
+ * Requires PERMISSION_ACTION_SUBSCRIBE as well: the action says a standing stream is
300
+ * permitted, this list says which events travel on it.
301
+ *
302
+ * A ref present with no endpoint_id is INVALID and MUST be rejected.
303
+ *
304
+ * @generated from field: repeated kusinta.iot.access.v1.EventRef allowed_event_refs = 10;
305
+ */
306
+ allowedEventRefs: EventRef[];
195
307
  };
196
308
 
197
309
  /**
@@ -201,6 +313,24 @@ export declare type DeviceAcl = Message<"kusinta.iot.access.v1.DeviceAcl"> & {
201
313
  export declare const DeviceAclSchema: GenMessage<DeviceAcl>;
202
314
 
203
315
  /**
316
+ * Every DeviceAcl in force for one user on one gateway, at valid_at.
317
+ *
318
+ * ADVISORY WHEN SENT TO AN APP. The gateway is the sole authority and enforces every
319
+ * read, write, invoke and subscription against its own copy, whether or not the app has
320
+ * one. This is disclosed so an app can RENDER honestly — grey out a control the user may
321
+ * not invoke, clamp a setpoint slider to a PropertyConstraint, hide a device — instead of
322
+ * offering an action and discovering the refusal.
323
+ *
324
+ * Two mistakes this exists to prevent. An app MUST still handle refusal: this snapshot can
325
+ * be stale, and it is not a promise. A gateway MUST NOT treat having sent it as having
326
+ * enforced anything.
327
+ *
328
+ * It discloses only the recipient's own permissions. It says nothing about what any other
329
+ * user holds.
330
+ *
331
+ * Sent whole rather than as a delta, in webrtc.v1.DeviceStateSnapshot at connect and in
332
+ * webrtc.v1.LivePermissionUpdate when it changes.
333
+ *
204
334
  * @generated from message kusinta.iot.access.v1.EffectivePermissions
205
335
  */
206
336
  export declare type EffectivePermissions = Message<"kusinta.iot.access.v1.EffectivePermissions"> & {
@@ -4,14 +4,14 @@
4
4
 
5
5
  import { fileDesc, messageDesc } 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("Ch9rdXNpbnRhL2lvdC9hY2Nlc3MvdjEvYWNsLnByb3RvEhVrdXNpbnRhLmlvdC5hY2Nlc3MudjEirgEKDEF0dHJpYnV0ZVJlZhIWCg5hdHRyaWJ1dGVfbmFtZRgBIAEoCRISCgpjbHVzdGVyX2lkGAIgASgNEhQKDGF0dHJpYnV0ZV9pZBgEIAEoDRIYCgtlbmRwb2ludF9pZBgDIAEoDUgAiAEBEh0KEHZlbmRvcl9leHRlbnNpb24YBSABKAlIAYgBAUIOCgxfZW5kcG9pbnRfaWRCEwoRX3ZlbmRvcl9leHRlbnNpb24i5wEKElByb3BlcnR5Q29uc3RyYWludBI2CglhdHRyaWJ1dGUYCCABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmEhEKB2ludF9tYXgYAiABKBFIABIRCgdpbnRfbWluGAMgASgRSAASEgoIdWludF9tYXgYBCABKA1IABISCgh1aW50X21pbhgFIAEoDUgAQgwKCmNvbnN0cmFpbnRKBAgBEAJKBAgGEAdKBAgHEAhSDmF0dHJpYnV0ZV9uYW1lUg5jbHVzdGVyX2lkX2hleFILZW5kcG9pbnRfaWQiiAMKCURldmljZUFjbBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIwCgd1c2VyX2lkGAIgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEikKBHJvbGUYAyABKA4yGy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuUm9sZRJACg9hbGxvd2VkX2FjdGlvbnMYBCADKA4yJy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuUGVybWlzc2lvbkFjdGlvbhJDChZhbGxvd2VkX2F0dHJpYnV0ZV9yZWZzGAcgAygLMiMua3VzaW50YS5pb3QuYWNjZXNzLnYxLkF0dHJpYnV0ZVJlZhJHChRwcm9wZXJ0eV9jb25zdHJhaW50cxgGIAMoCzIpLmt1c2ludGEuaW90LmFjY2Vzcy52MS5Qcm9wZXJ0eUNvbnN0cmFpbnRKBAgFEAZSEmFsbG93ZWRfYXR0cmlidXRlcyLlAQoURWZmZWN0aXZlUGVybWlzc2lvbnMSMAoHdXNlcl9pZBgBIAEoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZBI2CgpnYXRld2F5X2lkGAIgASgLMiIua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuR2F0ZXdheUlkEjUKC2RldmljZV9hY2xzGAMgAygLMiAua3VzaW50YS5pb3QuYWNjZXNzLnYxLkRldmljZUFjbBIsCgh2YWxpZF9hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_access_v1_roles]);
14
+ fileDesc("Ch9rdXNpbnRhL2lvdC9hY2Nlc3MvdjEvYWNsLnByb3RvEhVrdXNpbnRhLmlvdC5hY2Nlc3MudjEirgEKDEF0dHJpYnV0ZVJlZhIWCg5hdHRyaWJ1dGVfbmFtZRgBIAEoCRISCgpjbHVzdGVyX2lkGAIgASgNEhQKDGF0dHJpYnV0ZV9pZBgEIAEoDRIYCgtlbmRwb2ludF9pZBgDIAEoDUgAiAEBEh0KEHZlbmRvcl9leHRlbnNpb24YBSABKAlIAYgBAUIOCgxfZW5kcG9pbnRfaWRCEwoRX3ZlbmRvcl9leHRlbnNpb24iZQoKQ29tbWFuZFJlZhISCgpjbHVzdGVyX2lkGAEgASgNEhkKEW1hdHRlcl9jb21tYW5kX2lkGAIgASgNEhgKC2VuZHBvaW50X2lkGAMgASgNSACIAQFCDgoMX2VuZHBvaW50X2lkIloKCEV2ZW50UmVmEhIKCmNsdXN0ZXJfaWQYASABKA0SEAoIZXZlbnRfaWQYAiABKA0SGAoLZW5kcG9pbnRfaWQYAyABKA1IAIgBAUIOCgxfZW5kcG9pbnRfaWQi5wEKElByb3BlcnR5Q29uc3RyYWludBI2CglhdHRyaWJ1dGUYCCABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmEhEKB2ludF9tYXgYAiABKBFIABIRCgdpbnRfbWluGAMgASgRSAASEgoIdWludF9tYXgYBCABKA1IABISCgh1aW50X21pbhgFIAEoDUgAQgwKCmNvbnN0cmFpbnRKBAgBEAJKBAgGEAdKBAgHEAhSDmF0dHJpYnV0ZV9uYW1lUg5jbHVzdGVyX2lkX2hleFILZW5kcG9pbnRfaWQihgQKCURldmljZUFjbBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIwCgd1c2VyX2lkGAIgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEikKBHJvbGUYAyABKA4yGy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuUm9sZRJACg9hbGxvd2VkX2FjdGlvbnMYBCADKA4yJy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuUGVybWlzc2lvbkFjdGlvbhJDChZhbGxvd2VkX2F0dHJpYnV0ZV9yZWZzGAcgAygLMiMua3VzaW50YS5pb3QuYWNjZXNzLnYxLkF0dHJpYnV0ZVJlZhJHChRwcm9wZXJ0eV9jb25zdHJhaW50cxgGIAMoCzIpLmt1c2ludGEuaW90LmFjY2Vzcy52MS5Qcm9wZXJ0eUNvbnN0cmFpbnQSPwoUYWxsb3dlZF9jb21tYW5kX3JlZnMYCSADKAsyIS5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQ29tbWFuZFJlZhI7ChJhbGxvd2VkX2V2ZW50X3JlZnMYCiADKAsyHy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuRXZlbnRSZWZKBAgFEAZSEmFsbG93ZWRfYXR0cmlidXRlcyLlAQoURWZmZWN0aXZlUGVybWlzc2lvbnMSMAoHdXNlcl9pZBgBIAEoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZBI2CgpnYXRld2F5X2lkGAIgASgLMiIua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuR2F0ZXdheUlkEjUKC2RldmljZV9hY2xzGAMgAygLMiAua3VzaW50YS5pb3QuYWNjZXNzLnYxLkRldmljZUFjbBIsCgh2YWxpZF9hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCAkgBYgZwcm90bzM", [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.
@@ -20,24 +20,38 @@ export const file_kusinta_iot_access_v1_acl = /*@__PURE__*/
20
20
  export const AttributeRefSchema = /*@__PURE__*/
21
21
  messageDesc(file_kusinta_iot_access_v1_acl, 0);
22
22
 
23
+ /**
24
+ * Describes the message kusinta.iot.access.v1.CommandRef.
25
+ * Use `create(CommandRefSchema)` to create a new message.
26
+ */
27
+ export const CommandRefSchema = /*@__PURE__*/
28
+ messageDesc(file_kusinta_iot_access_v1_acl, 1);
29
+
30
+ /**
31
+ * Describes the message kusinta.iot.access.v1.EventRef.
32
+ * Use `create(EventRefSchema)` to create a new message.
33
+ */
34
+ export const EventRefSchema = /*@__PURE__*/
35
+ messageDesc(file_kusinta_iot_access_v1_acl, 2);
36
+
23
37
  /**
24
38
  * Describes the message kusinta.iot.access.v1.PropertyConstraint.
25
39
  * Use `create(PropertyConstraintSchema)` to create a new message.
26
40
  */
27
41
  export const PropertyConstraintSchema = /*@__PURE__*/
28
- messageDesc(file_kusinta_iot_access_v1_acl, 1);
42
+ messageDesc(file_kusinta_iot_access_v1_acl, 3);
29
43
 
30
44
  /**
31
45
  * Describes the message kusinta.iot.access.v1.DeviceAcl.
32
46
  * Use `create(DeviceAclSchema)` to create a new message.
33
47
  */
34
48
  export const DeviceAclSchema = /*@__PURE__*/
35
- messageDesc(file_kusinta_iot_access_v1_acl, 2);
49
+ messageDesc(file_kusinta_iot_access_v1_acl, 4);
36
50
 
37
51
  /**
38
52
  * Describes the message kusinta.iot.access.v1.EffectivePermissions.
39
53
  * Use `create(EffectivePermissionsSchema)` to create a new message.
40
54
  */
41
55
  export const EffectivePermissionsSchema = /*@__PURE__*/
42
- messageDesc(file_kusinta_iot_access_v1_acl, 3);
56
+ messageDesc(file_kusinta_iot_access_v1_acl, 5);
43
57
 
@@ -10,6 +10,32 @@ import type { GenEnum, GenFile } from "@bufbuild/protobuf/codegenv2";
10
10
  export declare const file_kusinta_iot_access_v1_roles: GenFile;
11
11
 
12
12
  /**
13
+ * What kind of party a user is, gateway-wide.
14
+ *
15
+ * A role is a CEILING on the kinds of action a user may perform anywhere on this gateway.
16
+ * It is not reach: it says nothing about WHICH devices the user may act on. Reach is
17
+ * decided by filing — which spaces the user holds, and which devices are in them — and
18
+ * the two are independent. A role must never be read as reach, and reach must never be
19
+ * read as permission to act.
20
+ *
21
+ * The gateway resolves the two together into DeviceAcl.allowed_actions, per device. A
22
+ * role narrows what may appear there; it does not put anything there on its own.
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.
28
+ *
29
+ * UNORDERED. These are categories, not levels: a technician is not "more than" a
30
+ * resident, and there is no >= comparison to make between them. Anything needing a graded
31
+ * comparison — Matter's View/Operate/Manage/Administer, say — would be a separate concept
32
+ * and is deliberately not modelled here.
33
+ *
34
+ * A role is a ceiling rather than a floor, so it may be WIDENED per device by facts the
35
+ * role does not know: a user who owns a device may hold actions on it that their
36
+ * gateway-wide role alone would not grant. That widening is the gateway's to apply and is
37
+ * visible to the app only in the resolved DeviceAcl.
38
+ *
13
39
  * @generated from enum kusinta.iot.access.v1.Role
14
40
  */
15
41
  export enum Role {
@@ -19,21 +45,31 @@ export enum Role {
19
45
  UNSPECIFIED = 0,
20
46
 
21
47
  /**
48
+ * Lives with the devices. Operates what is in the spaces they hold.
49
+ *
22
50
  * @generated from enum value: ROLE_RESIDENT = 1;
23
51
  */
24
52
  RESIDENT = 1,
25
53
 
26
54
  /**
55
+ * Owns the property the devices are installed in. Sets the bounds residents operate
56
+ * within — see PropertyConstraint in acl.proto.
57
+ *
27
58
  * @generated from enum value: ROLE_PROPERTY_OWNER = 2;
28
59
  */
29
60
  PROPERTY_OWNER = 2,
30
61
 
31
62
  /**
63
+ * Installs and services devices. Present for the work, not for the tenancy.
64
+ *
32
65
  * @generated from enum value: ROLE_TECHNICIAN = 3;
33
66
  */
34
67
  TECHNICIAN = 3,
35
68
 
36
69
  /**
70
+ * Administers this gateway itself. The one role that also affects reach: some devices
71
+ * are visible only to a session holding it.
72
+ *
37
73
  * @generated from enum value: ROLE_GATEWAY_ADMIN = 4;
38
74
  */
39
75
  GATEWAY_ADMIN = 4,
@@ -49,6 +85,12 @@ export declare const RoleSchema: GenEnum<Role>;
49
85
  * names an operation that exists on the app leg, so a grant can be checked against the
50
86
  * message that arrived.
51
87
  *
88
+ * The action says HOW data is reached. WHICH elements it reaches is a separate question,
89
+ * answered by the ref lists on DeviceAcl — allowed_attribute_refs, allowed_command_refs
90
+ * and allowed_event_refs. Keeping the two apart is deliberate: attributes, commands and
91
+ * events are addressed by three different ID spaces, and folding "which kind of element"
92
+ * into the action verb would make the action mean two things at once.
93
+ *
52
94
  * @generated from enum kusinta.iot.access.v1.PermissionAction
53
95
  */
54
96
  export enum PermissionAction {
@@ -64,37 +106,61 @@ export enum PermissionAction {
64
106
  UNSPECIFIED = 0,
65
107
 
66
108
  /**
67
- * Read an attribute once, on demand: webrtc.v1.PropertyReadRequest.
109
+ * Read an element once, on demand: webrtc.v1.PropertyReadRequest.
68
110
  *
69
111
  * @generated from enum value: PERMISSION_ACTION_READ = 1;
70
112
  */
71
113
  READ = 1,
72
114
 
73
115
  /**
74
- * Write an attribute directly.
116
+ * Write an attribute to a value: webrtc.v1.AttributeWriteRequest, carried on
117
+ * AppMessage.attribute_write and forwarded to a connector as
118
+ * SessionResponse.execute_attribute_write.
119
+ *
120
+ * MUST be enforced separately from INVOKE. Writing an attribute and invoking a command
121
+ * are different operations in Matter carrying different authority: a user who may
122
+ * toggle a light is not thereby a user who may rewrite its attributes. An earlier form
123
+ * of this schema routed an absolute setpoint through DeviceCommand, which made INVOKE
124
+ * imply WRITE and left the distinction unenforceable — that is the mistake
125
+ * AttributeWriteRequest exists to undo, and checking INVOKE for a write would reinstate
126
+ * it.
75
127
  *
76
- * NOTE: no message on the app leg does this. AppMessage carries handshake, command,
77
- * read_request, ping, subscribe, unsubscribe and management — nothing that writes an
78
- * attribute, so the only thing that changes a device is a DeviceCommand, which is
79
- * INVOKE. This value therefore authorizes an operation that does not yet exist. It is
80
- * kept rather than reserved because a direct attribute write is a plausible addition
81
- * and burning the number would gain nothing; until then, granting it grants nothing.
128
+ * A relative adjust is NOT a write. Thermostat SetpointRaiseLower is a genuine Matter
129
+ * command and needs INVOKE; setting an absolute value needs WRITE.
82
130
  *
83
131
  * @generated from enum value: PERMISSION_ACTION_WRITE = 2;
84
132
  */
85
133
  WRITE = 2,
86
134
 
87
135
  /**
88
- * Receive attribute changes as they happen: webrtc.v1.AppMessage.subscribe and the
89
- * DevicePropertyEvent stream that follows. Distinct from READ — observing is a standing
90
- * interest in a device, not a single question about it.
136
+ * Hold a standing stream of a device's reports: webrtc.v1.AppMessage.subscribe, and the
137
+ * PropertyReport and DeviceEventBatch that follow.
91
138
  *
92
- * @generated from enum value: PERMISSION_ACTION_OBSERVE = 3;
139
+ * Covers BOTH attribute reports and events, as a Matter subscription does — one
140
+ * subscription carries attribute paths and event paths together. Which of them actually
141
+ * arrives is decided by allowed_attribute_refs and allowed_event_refs, not by this
142
+ * action. Note their emptiness rules differ: attributes default to all, events to none.
143
+ *
144
+ * NOT a privacy boundary. Anyone who may READ an element can poll it, so withholding
145
+ * SUBSCRIBE while granting READ hides nothing — it only costs the app round trips. Treat
146
+ * it as a RESOURCE control: bandwidth, battery, and how many standing streams a gateway
147
+ * will carry. Do not use it to protect data; use the ref lists for that.
148
+ *
149
+ * Was PERMISSION_ACTION_OBSERVE. Renamed because "observe" reads as a kind of access
150
+ * distinct from reading, which it is not — it is the same access held open.
151
+ *
152
+ * @generated from enum value: PERMISSION_ACTION_SUBSCRIBE = 3;
93
153
  */
94
- OBSERVE = 3,
154
+ SUBSCRIBE = 3,
95
155
 
96
156
  /**
97
- * Send a webrtc.v1.DeviceCommand. This is the action that moves hardware.
157
+ * Invoke a command on a cluster: webrtc.v1.DeviceCommand. This is the action that moves
158
+ * hardware.
159
+ *
160
+ * Commands are named by (cluster_id, matter_command_id), a different ID space from
161
+ * attributes — On/Off cluster 0x0006 has an attribute 0x0000 and a command 0x0000 that
162
+ * are unrelated. So allowed_attribute_refs cannot narrow this; allowed_command_refs is
163
+ * what does.
98
164
  *
99
165
  * @generated from enum value: PERMISSION_ACTION_INVOKE = 4;
100
166
  */
@@ -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("CiFrdXNpbnRhL2lvdC9hY2Nlc3MvdjEvcm9sZXMucHJvdG8SFWt1c2ludGEuaW90LmFjY2Vzcy52MSp1CgRSb2xlEhQKEFJPTEVfVU5TUEVDSUZJRUQQABIRCg1ST0xFX1JFU0lERU5UEAESFwoTUk9MRV9QUk9QRVJUWV9PV05FUhACEhMKD1JPTEVfVEVDSE5JQ0lBThADEhYKElJPTEVfR0FURVdBWV9BRE1JThAEKqsBChBQZXJtaXNzaW9uQWN0aW9uEiEKHVBFUk1JU1NJT05fQUNUSU9OX1VOU1BFQ0lGSUVEEAASGgoWUEVSTUlTU0lPTl9BQ1RJT05fUkVBRBABEhsKF1BFUk1JU1NJT05fQUNUSU9OX1dSSVRFEAISHQoZUEVSTUlTU0lPTl9BQ1RJT05fT0JTRVJWRRADEhwKGFBFUk1JU1NJT05fQUNUSU9OX0lOVk9LRRAEQgJIAWIGcHJvdG8z");
11
+ fileDesc("CiFrdXNpbnRhL2lvdC9hY2Nlc3MvdjEvcm9sZXMucHJvdG8SFWt1c2ludGEuaW90LmFjY2Vzcy52MSp1CgRSb2xlEhQKEFJPTEVfVU5TUEVDSUZJRUQQABIRCg1ST0xFX1JFU0lERU5UEAESFwoTUk9MRV9QUk9QRVJUWV9PV05FUhACEhMKD1JPTEVfVEVDSE5JQ0lBThADEhYKElJPTEVfR0FURVdBWV9BRE1JThAEKq0BChBQZXJtaXNzaW9uQWN0aW9uEiEKHVBFUk1JU1NJT05fQUNUSU9OX1VOU1BFQ0lGSUVEEAASGgoWUEVSTUlTU0lPTl9BQ1RJT05fUkVBRBABEhsKF1BFUk1JU1NJT05fQUNUSU9OX1dSSVRFEAISHwobUEVSTUlTU0lPTl9BQ1RJT05fU1VCU0NSSUJFEAMSHAoYUEVSTUlTU0lPTl9BQ1RJT05fSU5WT0tFEARCAkgBYgZwcm90bzM");
12
12
 
13
13
  /**
14
14
  * Describes the enum kusinta.iot.access.v1.Role.
@@ -17,6 +17,32 @@ export const RoleSchema = /*@__PURE__*/
17
17
  enumDesc(file_kusinta_iot_access_v1_roles, 0);
18
18
 
19
19
  /**
20
+ * What kind of party a user is, gateway-wide.
21
+ *
22
+ * A role is a CEILING on the kinds of action a user may perform anywhere on this gateway.
23
+ * It is not reach: it says nothing about WHICH devices the user may act on. Reach is
24
+ * decided by filing — which spaces the user holds, and which devices are in them — and
25
+ * the two are independent. A role must never be read as reach, and reach must never be
26
+ * read as permission to act.
27
+ *
28
+ * The gateway resolves the two together into DeviceAcl.allowed_actions, per device. A
29
+ * role narrows what may appear there; it does not put anything there on its own.
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.
35
+ *
36
+ * UNORDERED. These are categories, not levels: a technician is not "more than" a
37
+ * resident, and there is no >= comparison to make between them. Anything needing a graded
38
+ * comparison — Matter's View/Operate/Manage/Administer, say — would be a separate concept
39
+ * and is deliberately not modelled here.
40
+ *
41
+ * A role is a ceiling rather than a floor, so it may be WIDENED per device by facts the
42
+ * role does not know: a user who owns a device may hold actions on it that their
43
+ * gateway-wide role alone would not grant. That widening is the gateway's to apply and is
44
+ * visible to the app only in the resolved DeviceAcl.
45
+ *
20
46
  * @generated from enum kusinta.iot.access.v1.Role
21
47
  */
22
48
  export const Role = /*@__PURE__*/
@@ -33,6 +59,12 @@ export const PermissionActionSchema = /*@__PURE__*/
33
59
  * names an operation that exists on the app leg, so a grant can be checked against the
34
60
  * message that arrived.
35
61
  *
62
+ * The action says HOW data is reached. WHICH elements it reaches is a separate question,
63
+ * answered by the ref lists on DeviceAcl — allowed_attribute_refs, allowed_command_refs
64
+ * and allowed_event_refs. Keeping the two apart is deliberate: attributes, commands and
65
+ * events are addressed by three different ID spaces, and folding "which kind of element"
66
+ * into the action verb would make the action mean two things at once.
67
+ *
36
68
  * @generated from enum kusinta.iot.access.v1.PermissionAction
37
69
  */
38
70
  export const PermissionAction = /*@__PURE__*/
@@ -0,0 +1,201 @@
1
+ // @generated by protoc-gen-es v2.12.0 with parameter "target=js+dts,import_extension=js"
2
+ // @generated from file kusinta/iot/common/v1/pairing.proto (package kusinta.iot.common.v1, syntax proto3)
3
+ /* eslint-disable */
4
+
5
+ import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
6
+ import type { Message } from "@bufbuild/protobuf";
7
+
8
+ /**
9
+ * Describes the file kusinta/iot/common/v1/pairing.proto.
10
+ */
11
+ export declare const file_kusinta_iot_common_v1_pairing: GenFile;
12
+
13
+ /**
14
+ * A pairing failure and what can be said about it, the pairing counterpart of CommandError.
15
+ *
16
+ * The message matters more here than elsewhere: DEVICE_UNUSABLE is the code a user is most
17
+ * likely to see and least able to act on, and naming the device that joined is the whole
18
+ * difference between "something went wrong" and "this hub does not support that model yet".
19
+ *
20
+ * @generated from message kusinta.iot.common.v1.PairingErrorDetail
21
+ */
22
+ export declare type PairingErrorDetail = Message<"kusinta.iot.common.v1.PairingErrorDetail"> & {
23
+ /**
24
+ * @generated from field: kusinta.iot.common.v1.PairingError code = 1;
25
+ */
26
+ code: PairingError;
27
+
28
+ /**
29
+ * human-readable; may name the device, its model, or the fault
30
+ *
31
+ * @generated from field: string message = 2;
32
+ */
33
+ message: string;
34
+ };
35
+
36
+ /**
37
+ * Describes the message kusinta.iot.common.v1.PairingErrorDetail.
38
+ * Use `create(PairingErrorDetailSchema)` to create a new message.
39
+ */
40
+ export declare const PairingErrorDetailSchema: GenMessage<PairingErrorDetail>;
41
+
42
+ /**
43
+ * How long a hub accepts new devices, and which it will take.
44
+ *
45
+ * One message on both legs rather than the same three fields declared twice: the clamp rule
46
+ * and the meaning of a hint are the sort of thing that is written once and then diverges,
47
+ * and the two copies had already begun to.
48
+ *
49
+ * @generated from message kusinta.iot.common.v1.PairingWindow
50
+ */
51
+ export declare type PairingWindow = Message<"kusinta.iot.common.v1.PairingWindow"> & {
52
+ /**
53
+ * How long to accept arrivals. Whoever forwards this clamps it, and so does whoever acts
54
+ * on it: a window is an interval during which anything nearby can join, so its length is a
55
+ * security parameter rather than purely the caller's to choose.
56
+ *
57
+ * Absent means "no preference, use the default" — distinct from a caller asking for zero.
58
+ *
59
+ * @generated from field: optional uint32 duration_seconds = 1;
60
+ */
61
+ durationSeconds?: number | undefined;
62
+
63
+ /**
64
+ * The identifier printed on the device being paired, where the technology has one that is
65
+ * legible and the person is holding it. Free-form: what is printed differs per technology,
66
+ * and nothing between the app and the hub interprets it.
67
+ *
68
+ * Setting it changes the mechanism, not just the accuracy. The hub is restricted to that
69
+ * device and the arrival is verified against this value, so an arrival is attributed on
70
+ * identity. Leaving it empty opens the window to anything nearby, and attribution falls
71
+ * back to the arrival being the only one — which is why one window may be open at a time.
72
+ *
73
+ * Verification is not optional where this is set. A restriction can silently fail to take,
74
+ * and an arrival attributed on a restriction that did not hold is the wrong device in
75
+ * someone's home.
76
+ *
77
+ * @generated from field: string device_hint = 2;
78
+ */
79
+ deviceHint: string;
80
+
81
+ /**
82
+ * How many arrivals this one window may attribute. Absent means one.
83
+ *
84
+ * A batch suits commissioning, where devices are paired in a row and become a building's
85
+ * rather than any person's. It does not suit a caller whose pairing mints personal
86
+ * ownership.
87
+ *
88
+ * Ignored where device_hint is set, and narrowed to one rather than refused: a hint names
89
+ * one device, so a window restricted to it can never produce a second arrival to attribute.
90
+ * The combination is meaningless rather than dangerous, and there is no honest code in
91
+ * PairingError for "your request contradicted itself" — refusing it would mean answering a
92
+ * malformed request with an entitlement decision that was never made.
93
+ *
94
+ * @generated from field: optional uint32 max_devices = 3;
95
+ */
96
+ maxDevices?: number | undefined;
97
+ };
98
+
99
+ /**
100
+ * Describes the message kusinta.iot.common.v1.PairingWindow.
101
+ * Use `create(PairingWindowSchema)` to create a new message.
102
+ */
103
+ export declare const PairingWindowSchema: GenMessage<PairingWindow>;
104
+
105
+ /**
106
+ * Why a pairing attempt did not produce a device, in one vocabulary both the app and a
107
+ * connector speak.
108
+ *
109
+ * Shared rather than mirrored, for the reason CommandError's comment gives: mirrored enums
110
+ * leave every connector inventing its own spellings and something in the middle keeping a
111
+ * translation table that silently falls behind. A connector produces the subset it can
112
+ * observe; the gateway produces the rest and passes a connector's value through unchanged.
113
+ *
114
+ * Every value answers one question: *what should the client do now?* A code that does not
115
+ * change the answer does not need to exist, which is why "the device is on the hub and
116
+ * unusable" is one value and not two.
117
+ *
118
+ * @generated from enum kusinta.iot.common.v1.PairingError
119
+ */
120
+ export enum PairingError {
121
+ /**
122
+ * Sender set no code, or sent one this client's schema does not know.
123
+ *
124
+ * This must stay the safe reading. A client decodes every value added after its build as
125
+ * UNSPECIFIED, so the sensible handling is "it did not work, offering a retry is
126
+ * reasonable" — and no value below is so dangerous that reading it this way misleads.
127
+ *
128
+ * @generated from enum value: PAIRING_ERROR_UNSPECIFIED = 0;
129
+ */
130
+ UNSPECIFIED = 0,
131
+
132
+ /**
133
+ * The caller may not pair here. Permanent for this caller: stop, and say so.
134
+ *
135
+ * @generated from enum value: PAIRING_ERROR_NOT_ENTITLED = 1;
136
+ */
137
+ NOT_ENTITLED = 1,
138
+
139
+ /**
140
+ * A pairing window is already open, and only one may be. Retrying after it closes is the
141
+ * right response; retrying at once is not.
142
+ *
143
+ * The exclusivity is not incidental. Where a request names no device, the only thing
144
+ * attributing an arrival to a requester is that theirs was the one window open.
145
+ *
146
+ * @generated from enum value: PAIRING_ERROR_ALREADY_IN_PROGRESS = 2;
147
+ */
148
+ ALREADY_IN_PROGRESS = 2,
149
+
150
+ /**
151
+ * The connector could not be reached, or refused to open its window. Transient.
152
+ *
153
+ * @generated from enum value: PAIRING_ERROR_CONNECTOR_UNAVAILABLE = 3;
154
+ */
155
+ CONNECTOR_UNAVAILABLE = 3,
156
+
157
+ /**
158
+ * The window closed with nothing paired: no device was put into pairing mode, or it was
159
+ * out of range, or its batteries are flat. The ordinary outcome of a user who walked away,
160
+ * so the useful response is to say what to do and offer another go, not to report a fault.
161
+ *
162
+ * @generated from enum value: PAIRING_ERROR_NO_DEVICE_APPEARED = 4;
163
+ */
164
+ NO_DEVICE_APPEARED = 4,
165
+
166
+ /**
167
+ * A device joined the hub and cannot be presented — the connector has no model for it, or
168
+ * could not assemble a complete description of it.
169
+ *
170
+ * One value rather than two, because the client does the same thing either way: stop, do
171
+ * not retry, and tell the user there is now an unusable device on their hub. Which of the
172
+ * two it was belongs in PairingErrorDetail.message, where it can name the device.
173
+ *
174
+ * It stays joined deliberately. A later connector release that models it adopts it with
175
+ * nobody returning to the hardware, where removing it would need someone standing there.
176
+ *
177
+ * @generated from enum value: PAIRING_ERROR_DEVICE_UNUSABLE = 5;
178
+ */
179
+ DEVICE_UNUSABLE = 5,
180
+
181
+ /**
182
+ * A device joined that is not the one the request named. The connector checked the arrival
183
+ * against the identifier it was given and they did not match, so it was not attributed.
184
+ *
185
+ * @generated from enum value: PAIRING_ERROR_WRONG_DEVICE = 6;
186
+ */
187
+ WRONG_DEVICE = 6,
188
+
189
+ /**
190
+ * A fault on the gateway's or the connector's own side. Not the caller's doing.
191
+ *
192
+ * @generated from enum value: PAIRING_ERROR_INTERNAL = 7;
193
+ */
194
+ INTERNAL = 7,
195
+ }
196
+
197
+ /**
198
+ * Describes the enum kusinta.iot.common.v1.PairingError.
199
+ */
200
+ export declare const PairingErrorSchema: GenEnum<PairingError>;
201
+