@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
@@ -5,12 +5,14 @@
5
5
  import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
6
6
  import type { Message } from "@bufbuild/protobuf";
7
7
  import type { ConnectorId, DeviceId, GatewayId } from "../../identity/v1/identity_pb.js";
8
- import type { ConnectorTransport } from "../../common/v1/types_pb.js";
8
+ import type { ConnectorKind, ConnectorTransport } from "../../common/v1/types_pb.js";
9
9
  import type { Device } from "../../device/v1/device_pb.js";
10
+ import type { DeviceLink, LinkFunction, LinkState } from "../../link/v1/link_pb.js";
10
11
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
12
+ import type { AttributeWriteRequest, CommandError, DeviceCommand } from "../../webrtc/v1/command_pb.js";
13
+ import type { PairingErrorDetail, PairingWindow } from "../../common/v1/pairing_pb.js";
11
14
  import type { PropertyUpdateBatch } from "../../device/v1/property_update_pb.js";
12
15
  import type { DeviceEventBatch } from "../../device/v1/device_event_pb.js";
13
- import type { AttributeWriteRequest, DeviceCommand } from "../../webrtc/v1/command_pb.js";
14
16
 
15
17
  /**
16
18
  * Describes the file kusinta/iot/connector/v1/connector.proto.
@@ -27,6 +29,10 @@ export declare type ConnectorInfo = Message<"kusinta.iot.connector.v1.ConnectorI
27
29
  connectorId?: ConnectorId | undefined;
28
30
 
29
31
  /**
32
+ * User-facing and free-form — "HomeMatic hub", "LoRaWAN". An interface may show
33
+ * it; nothing ever matches on it. connector_id is the routing key; this is only
34
+ * a label for a person.
35
+ *
30
36
  * @generated from field: string display_name = 2;
31
37
  */
32
38
  displayName: string;
@@ -52,6 +58,54 @@ export declare type ConnectorInfo = Message<"kusinta.iot.connector.v1.ConnectorI
52
58
  * @generated from field: repeated uint32 supported_device_type_ids = 6;
53
59
  */
54
60
  supportedDeviceTypeIds: number[];
61
+
62
+ /**
63
+ * The connector opens a radio window on request: the app may offer the pairing
64
+ * flow and target webrtc.v1.StartPairing.connector_id at it. A connector whose
65
+ * devices are registered rather than paired (see supports_provisioning) sets this
66
+ * false.
67
+ *
68
+ * @generated from field: bool supports_pairing = 7;
69
+ */
70
+ supportsPairing: boolean;
71
+
72
+ /**
73
+ * The connector registers a device from credentials it is handed, rather than
74
+ * adopting one that joins during a window — the webrtc.v1.ProvisionDevice path.
75
+ * This is how the app knows to show a credential-entry flow instead of pairing,
76
+ * and ProvisionDevice.connector_id is targeted at a connector that declares it.
77
+ *
78
+ * @generated from field: bool supports_provisioning = 8;
79
+ */
80
+ supportsProvisioning: boolean;
81
+
82
+ /**
83
+ * The connector brokers device-to-device (hard) links: the link picker may offer
84
+ * them and can name the hub behind an otherwise-hidden candidate. Declared here
85
+ * rather than inferred from both devices reporting LINK_MODE_HARD, so it is a
86
+ * statement the connector makes rather than a guess the app assembles.
87
+ *
88
+ * @generated from field: bool brokers_links = 9;
89
+ */
90
+ brokersLinks: boolean;
91
+
92
+ /**
93
+ * Presentation only — an icon or a phrase; see common.v1.ConnectorKind for why it
94
+ * never gates behaviour. Unset is CONNECTOR_KIND_UNSPECIFIED, a generic hub.
95
+ *
96
+ * @generated from field: kusinta.iot.common.v1.ConnectorKind kind = 10;
97
+ */
98
+ kind: ConnectorKind;
99
+
100
+ /**
101
+ * Installer or operator detail — where the hub is, which building leg it serves.
102
+ * Kept off connector_id, whose identity contract routing depends on, and off
103
+ * display_name, which is the short label. Free-form, for a person; never matched
104
+ * on.
105
+ *
106
+ * @generated from field: string description = 11;
107
+ */
108
+ description: string;
55
109
  };
56
110
 
57
111
  /**
@@ -73,6 +127,22 @@ export declare type ConnectorHandshake = Message<"kusinta.iot.connector.v1.Conne
73
127
  * @generated from field: repeated kusinta.iot.device.v1.Device known_devices = 2;
74
128
  */
75
129
  knownDevices: Device[];
130
+
131
+ /**
132
+ * Every link the hub currently holds, reported the way known_devices is.
133
+ *
134
+ * Links are hub state, not gateway state: they outlive a connector restart and
135
+ * can be changed by anyone with access to the hub. The gateway's records are a
136
+ * statement of intent that can drift, so the handshake is the moment to
137
+ * reconcile them against what is really there. A link in the gateway's records
138
+ * and not here has gone; one here and not in the records was made elsewhere.
139
+ *
140
+ * Empty means "states nothing" — a connector that does not model linking is not
141
+ * asserting that no links exist.
142
+ *
143
+ * @generated from field: repeated kusinta.iot.link.v1.DeviceLink known_links = 3;
144
+ */
145
+ knownLinks: DeviceLink[];
76
146
  };
77
147
 
78
148
  /**
@@ -81,6 +151,163 @@ export declare type ConnectorHandshake = Message<"kusinta.iot.connector.v1.Conne
81
151
  */
82
152
  export declare const ConnectorHandshakeSchema: GenMessage<ConnectorHandshake>;
83
153
 
154
+ /**
155
+ * Asks the connector to make a link, gateway to connector.
156
+ *
157
+ * Names two devices and a function; resolving that into whatever set of
158
+ * underlying connections the hub needs is the connector's work. It is expected to
159
+ * build the set atomically and roll back a partial one, because a half-built set
160
+ * is a link that lists as healthy and carries nothing.
161
+ *
162
+ * The connector is also expected to repair whatever the operation disturbs. On at
163
+ * least one vendor, both making and removing a link leaves the receiving device
164
+ * in a state it was not in before, with settings that must be captured
165
+ * beforehand and put back after.
166
+ *
167
+ * @generated from message kusinta.iot.connector.v1.CreateLink
168
+ */
169
+ export declare type CreateLink = Message<"kusinta.iot.connector.v1.CreateLink"> & {
170
+ /**
171
+ * assigned by the gateway, echoed in the result
172
+ *
173
+ * @generated from field: string link_id = 1;
174
+ */
175
+ linkId: string;
176
+
177
+ /**
178
+ * @generated from field: kusinta.iot.identity.v1.DeviceId sender = 2;
179
+ */
180
+ sender?: DeviceId | undefined;
181
+
182
+ /**
183
+ * @generated from field: kusinta.iot.identity.v1.DeviceId receiver = 3;
184
+ */
185
+ receiver?: DeviceId | undefined;
186
+
187
+ /**
188
+ * @generated from field: kusinta.iot.link.v1.LinkFunction function = 4;
189
+ */
190
+ function: LinkFunction;
191
+ };
192
+
193
+ /**
194
+ * Describes the message kusinta.iot.connector.v1.CreateLink.
195
+ * Use `create(CreateLinkSchema)` to create a new message.
196
+ */
197
+ export declare const CreateLinkSchema: GenMessage<CreateLink>;
198
+
199
+ /**
200
+ * Asks the connector to remove a link it previously made.
201
+ *
202
+ * @generated from message kusinta.iot.connector.v1.RemoveLink
203
+ */
204
+ export declare type RemoveLink = Message<"kusinta.iot.connector.v1.RemoveLink"> & {
205
+ /**
206
+ * @generated from field: string link_id = 1;
207
+ */
208
+ linkId: string;
209
+
210
+ /**
211
+ * @generated from field: kusinta.iot.identity.v1.DeviceId sender = 2;
212
+ */
213
+ sender?: DeviceId | undefined;
214
+
215
+ /**
216
+ * @generated from field: kusinta.iot.identity.v1.DeviceId receiver = 3;
217
+ */
218
+ receiver?: DeviceId | undefined;
219
+
220
+ /**
221
+ * @generated from field: kusinta.iot.link.v1.LinkFunction function = 4;
222
+ */
223
+ function: LinkFunction;
224
+ };
225
+
226
+ /**
227
+ * Describes the message kusinta.iot.connector.v1.RemoveLink.
228
+ * Use `create(RemoveLinkSchema)` to create a new message.
229
+ */
230
+ export declare const RemoveLinkSchema: GenMessage<RemoveLink>;
231
+
232
+ /**
233
+ * Asks the connector what links the hub holds, for reconciliation outside a
234
+ * handshake.
235
+ *
236
+ * @generated from message kusinta.iot.connector.v1.ListLinks
237
+ */
238
+ export declare type ListLinks = Message<"kusinta.iot.connector.v1.ListLinks"> & {
239
+ /**
240
+ * Unset asks for every link the hub holds.
241
+ *
242
+ * @generated from field: kusinta.iot.identity.v1.DeviceId device_id = 1;
243
+ */
244
+ deviceId?: DeviceId | undefined;
245
+ };
246
+
247
+ /**
248
+ * Describes the message kusinta.iot.connector.v1.ListLinks.
249
+ * Use `create(ListLinksSchema)` to create a new message.
250
+ */
251
+ export declare const ListLinksSchema: GenMessage<ListLinks>;
252
+
253
+ /**
254
+ * What became of a CreateLink or RemoveLink, connector to gateway.
255
+ *
256
+ * Reports the link's observed state rather than merely whether the call was
257
+ * accepted. A hub will report a link as present and healthy while the devices
258
+ * ignore it, so "the request did not fail" is not the same claim as "the link is
259
+ * carrying" and must not be encoded as though it were.
260
+ *
261
+ * @generated from message kusinta.iot.connector.v1.LinkResult
262
+ */
263
+ export declare type LinkResult = Message<"kusinta.iot.connector.v1.LinkResult"> & {
264
+ /**
265
+ * @generated from field: string link_id = 1;
266
+ */
267
+ linkId: string;
268
+
269
+ /**
270
+ * @generated from field: bool success = 2;
271
+ */
272
+ success: boolean;
273
+
274
+ /**
275
+ * @generated from field: kusinta.iot.link.v1.LinkState state = 3;
276
+ */
277
+ state: LinkState;
278
+
279
+ /**
280
+ * Why not, when success is false. For a person; never parsed.
281
+ *
282
+ * @generated from field: string detail = 4;
283
+ */
284
+ detail: string;
285
+ };
286
+
287
+ /**
288
+ * Describes the message kusinta.iot.connector.v1.LinkResult.
289
+ * Use `create(LinkResultSchema)` to create a new message.
290
+ */
291
+ export declare const LinkResultSchema: GenMessage<LinkResult>;
292
+
293
+ /**
294
+ * Every link the hub holds, connector to gateway, in reply to ListLinks.
295
+ *
296
+ * @generated from message kusinta.iot.connector.v1.LinksReported
297
+ */
298
+ export declare type LinksReported = Message<"kusinta.iot.connector.v1.LinksReported"> & {
299
+ /**
300
+ * @generated from field: repeated kusinta.iot.link.v1.DeviceLink links = 1;
301
+ */
302
+ links: DeviceLink[];
303
+ };
304
+
305
+ /**
306
+ * Describes the message kusinta.iot.connector.v1.LinksReported.
307
+ * Use `create(LinksReportedSchema)` to create a new message.
308
+ */
309
+ export declare const LinksReportedSchema: GenMessage<LinksReported>;
310
+
84
311
  /**
85
312
  * @generated from message kusinta.iot.connector.v1.HandshakeAck
86
313
  */
@@ -122,6 +349,25 @@ export declare type DeviceAnnouncement = Message<"kusinta.iot.connector.v1.Devic
122
349
  * @generated from field: kusinta.iot.device.v1.Device device = 2;
123
350
  */
124
351
  device?: Device | undefined;
352
+
353
+ /**
354
+ * The pairing request this device arrived for, empty for a device that arrived on its own.
355
+ *
356
+ * This field is the whole attribution mechanism. A connector is the only party that knows
357
+ * when its own hub was accepting devices, so it decides whether an arrival belongs to a
358
+ * request and says so here.
359
+ *
360
+ * Set it only when the arrival was actually checked. An arrival that fails the check is
361
+ * still announced — the device exists and has joined — but with this empty, which files it
362
+ * as belonging to nobody rather than to the wrong person.
363
+ *
364
+ * This is EnterPairingMode.request_id, minted per connector, and NOT an app message id:
365
+ * whoever forwards the outcome to the app has to map it back. The name avoids `in_reply_to`
366
+ * for that reason, which everywhere else in this schema means the app's own message id.
367
+ *
368
+ * @generated from field: string pairing_request_id = 3;
369
+ */
370
+ pairingRequestId: string;
125
371
  };
126
372
 
127
373
  /**
@@ -196,6 +442,15 @@ export declare type UnsubscribeDevice = Message<"kusinta.iot.connector.v1.Unsubs
196
442
  export declare const UnsubscribeDeviceSchema: GenMessage<UnsubscribeDevice>;
197
443
 
198
444
  /**
445
+ * Session-level error, gateway → connector. NOT how a command or a write fails: that is
446
+ * an ordinary ConnectorCommandResult with success = false and a typed CommandError, and
447
+ * one operation failing says nothing about the session, which continues.
448
+ *
449
+ * code stays a free-form string here, unlike webrtc.v1.GatewayError's closed
450
+ * GatewayErrorCode and unlike the CommandError below. A connector is versioned on its own
451
+ * schedule and one may be a third party's, so the set of things that can go wrong between
452
+ * a gateway and a connector is not closed the way the app leg's is.
453
+ *
199
454
  * @generated from message kusinta.iot.connector.v1.GatewayError
200
455
  */
201
456
  export declare type GatewayError = Message<"kusinta.iot.connector.v1.GatewayError"> & {
@@ -210,7 +465,7 @@ export declare type GatewayError = Message<"kusinta.iot.connector.v1.GatewayErro
210
465
  message: string;
211
466
 
212
467
  /**
213
- * non-empty if the error answers a command or a write
468
+ * non-empty if the error refers to a specific request
214
469
  *
215
470
  * @generated from field: string request_id = 3;
216
471
  */
@@ -245,14 +500,53 @@ export declare type ConnectorCommandResult = Message<"kusinta.iot.connector.v1.C
245
500
  success: boolean;
246
501
 
247
502
  /**
248
- * @generated from field: kusinta.iot.connector.v1.GatewayError error = 3;
503
+ * @generated from field: google.protobuf.Timestamp completed_at = 4;
249
504
  */
250
- error?: GatewayError | undefined;
505
+ completedAt?: Timestamp | undefined;
251
506
 
252
507
  /**
253
- * @generated from field: google.protobuf.Timestamp completed_at = 4;
508
+ * Why it failed, in the same closed vocabulary the app is eventually given. The gateway
509
+ * forwards this into webrtc.v1.CommandResult.error unchanged; it does not translate.
510
+ *
511
+ * Shared rather than mirrored on purpose. The free-form string this replaces left every
512
+ * connector to invent its own spellings ("TIMEOUT", "UNSUPPORTED_MODE") and the gateway
513
+ * to keep a mapping table that silently fell behind whenever a connector coined a new
514
+ * one — which is the drift a closed vocabulary exists to prevent.
515
+ *
516
+ * A connector produces the subset it can actually observe: REJECTED_BY_DEVICE,
517
+ * UNREACHABLE, TIMEOUT, INVALID_COMMAND, INTERNAL. NOT_ENTITLED and
518
+ * CONSTRAINT_VIOLATED are the gateway's, decided before a command is forwarded at all;
519
+ * a connector never sees the caller's permissions and must not claim to.
520
+ *
521
+ * Rollout note: a connector whose schema predates this sends nothing on field 5 and the
522
+ * gateway reads UNSPECIFIED. Set success = false with no code and the meaning is "it
523
+ * failed, reason unstated" — which is what the string codes amounted to anyway.
524
+ *
525
+ * @generated from field: kusinta.iot.webrtc.v1.CommandError error = 5;
254
526
  */
255
- completedAt?: Timestamp | undefined;
527
+ error?: CommandError | undefined;
528
+
529
+ /**
530
+ * When this connector's own optimistic window closes: by this time the value has either
531
+ * been confirmed by the device or restored, and either way the connector will have
532
+ * published a PropertyUpdate saying so.
533
+ *
534
+ * Set it when the connector applied the value optimistically and runs a rollback timer
535
+ * of its own — a downstream device with a known, device-specific timeout. The gateway
536
+ * carries it into webrtc.v1.CommandResult.settles_by instead of applying a fixed guess:
537
+ * the connector is the only party that knows the timer, and a gateway-side constant
538
+ * chasing it is the same hardcoded-window problem one level up.
539
+ *
540
+ * Absent means no claim — either the connector confirms synchronously, or it cannot
541
+ * state a bound. Absent is NOT "settles immediately", and the gateway is free to fall
542
+ * back to a deadline of its own when nothing is stated here.
543
+ *
544
+ * This bounds the wait; it does not label the values that arrive. Which update was the
545
+ * optimistic one is device.v1.PropertyUpdate.provenance.
546
+ *
547
+ * @generated from field: optional google.protobuf.Timestamp settles_by = 6;
548
+ */
549
+ settlesBy?: Timestamp | undefined;
256
550
  };
257
551
 
258
552
  /**
@@ -261,6 +555,127 @@ export declare type ConnectorCommandResult = Message<"kusinta.iot.connector.v1.C
261
555
  */
262
556
  export declare const ConnectorCommandResultSchema: GenMessage<ConnectorCommandResult>;
263
557
 
558
+ /**
559
+ * Tells a connector to accept new devices for a while, gateway → connector.
560
+ *
561
+ * Named for what the connector does rather than for what the app asked. The two legs are
562
+ * named differently on purpose: the app starts one pairing, and the gateway may put several
563
+ * connectors into pairing mode to serve it.
564
+ *
565
+ * @generated from message kusinta.iot.connector.v1.EnterPairingMode
566
+ */
567
+ export declare type EnterPairingMode = Message<"kusinta.iot.connector.v1.EnterPairingMode"> & {
568
+ /**
569
+ * echoed on PairingModeResult, PairingModeEnded and the announcement
570
+ *
571
+ * @generated from field: string request_id = 1;
572
+ */
573
+ requestId: string;
574
+
575
+ /**
576
+ * How long, which device, how many. See PairingWindow — and clamp the duration again here.
577
+ * A connector is the last thing standing between a number on the wire and a radio that
578
+ * accepts anything nearby for that long.
579
+ *
580
+ * @generated from field: kusinta.iot.common.v1.PairingWindow window = 2;
581
+ */
582
+ window?: PairingWindow | undefined;
583
+ };
584
+
585
+ /**
586
+ * Describes the message kusinta.iot.connector.v1.EnterPairingMode.
587
+ * Use `create(EnterPairingModeSchema)` to create a new message.
588
+ */
589
+ export declare const EnterPairingModeSchema: GenMessage<EnterPairingMode>;
590
+
591
+ /**
592
+ * A connector's answer to EnterPairingMode: whether the window opened, and nothing more.
593
+ *
594
+ * The same accept-now-report-later split as ConnectorCommandResult, for the same reason — a
595
+ * connector that waited for a device to wake before answering would blow every deadline
596
+ * above it. What the window produced arrives later, as PairingModeEnded.
597
+ *
598
+ * @generated from message kusinta.iot.connector.v1.PairingModeResult
599
+ */
600
+ export declare type PairingModeResult = Message<"kusinta.iot.connector.v1.PairingModeResult"> & {
601
+ /**
602
+ * @generated from field: string request_id = 1;
603
+ */
604
+ requestId: string;
605
+
606
+ /**
607
+ * @generated from field: bool accepted = 2;
608
+ */
609
+ accepted: boolean;
610
+
611
+ /**
612
+ * Why the window did not open. Only what a connector can observe at this point:
613
+ * CONNECTOR_UNAVAILABLE, INTERNAL. NOT_ENTITLED and ALREADY_IN_PROGRESS are the gateway's,
614
+ * decided before this message is sent, and a connector must not claim them.
615
+ *
616
+ * @generated from field: kusinta.iot.common.v1.PairingErrorDetail error = 3;
617
+ */
618
+ error?: PairingErrorDetail | undefined;
619
+
620
+ /**
621
+ * When the window closes, if it opened. Lets the gateway expire its own record against the
622
+ * connector's clock rather than a guess — the connector is the party that clamped it.
623
+ *
624
+ * @generated from field: google.protobuf.Timestamp expires_at = 4;
625
+ */
626
+ expiresAt?: Timestamp | undefined;
627
+ };
628
+
629
+ /**
630
+ * Describes the message kusinta.iot.connector.v1.PairingModeResult.
631
+ * Use `create(PairingModeResultSchema)` to create a new message.
632
+ */
633
+ export declare const PairingModeResultSchema: GenMessage<PairingModeResult>;
634
+
635
+ /**
636
+ * What the window produced, connector → gateway, sent once when it closes.
637
+ *
638
+ * Without this the connector has no way to report anything it learned after the window
639
+ * opened: a device that joined and cannot be modelled, or one that joined and was not the
640
+ * device the hint named. Neither can travel on a DeviceAnnouncement — the first has nothing
641
+ * announceable, and the second is announced but unattributed, which says a device arrived
642
+ * and not why it was refused.
643
+ *
644
+ * It also gives a batch window a definite end. Counting announcements cannot distinguish
645
+ * "three of five so far" from "three of five, and that is all".
646
+ *
647
+ * @generated from message kusinta.iot.connector.v1.PairingModeEnded
648
+ */
649
+ export declare type PairingModeEnded = Message<"kusinta.iot.connector.v1.PairingModeEnded"> & {
650
+ /**
651
+ * @generated from field: string request_id = 1;
652
+ */
653
+ requestId: string;
654
+
655
+ /**
656
+ * How many arrivals this connector attributed to the request. The gateway can count the
657
+ * announcements it received, but only the connector knows it has stopped.
658
+ *
659
+ * @generated from field: uint32 devices_attributed = 2;
660
+ */
661
+ devicesAttributed: number;
662
+
663
+ /**
664
+ * Why it produced fewer than asked for, absent when it produced them all. DEVICE_UNUSABLE
665
+ * and WRONG_DEVICE are reported here and should name the device in the message, since that
666
+ * is the only place a user learns which device is now sitting on their hub.
667
+ *
668
+ * @generated from field: kusinta.iot.common.v1.PairingErrorDetail error = 3;
669
+ */
670
+ error?: PairingErrorDetail | undefined;
671
+ };
672
+
673
+ /**
674
+ * Describes the message kusinta.iot.connector.v1.PairingModeEnded.
675
+ * Use `create(PairingModeEndedSchema)` to create a new message.
676
+ */
677
+ export declare const PairingModeEndedSchema: GenMessage<PairingModeEnded>;
678
+
264
679
  /**
265
680
  * @generated from message kusinta.iot.connector.v1.SessionRequest
266
681
  */
@@ -320,6 +735,30 @@ export declare type SessionRequest = Message<"kusinta.iot.connector.v1.SessionRe
320
735
  */
321
736
  value: DeviceEventBatch;
322
737
  case: "deviceEvents";
738
+ } | {
739
+ /**
740
+ * @generated from field: kusinta.iot.connector.v1.PairingModeResult pairing_mode_result = 10;
741
+ */
742
+ value: PairingModeResult;
743
+ case: "pairingModeResult";
744
+ } | {
745
+ /**
746
+ * @generated from field: kusinta.iot.connector.v1.PairingModeEnded pairing_mode_ended = 11;
747
+ */
748
+ value: PairingModeEnded;
749
+ case: "pairingModeEnded";
750
+ } | {
751
+ /**
752
+ * @generated from field: kusinta.iot.connector.v1.LinkResult link_result = 12;
753
+ */
754
+ value: LinkResult;
755
+ case: "linkResult";
756
+ } | {
757
+ /**
758
+ * @generated from field: kusinta.iot.connector.v1.LinksReported links_reported = 13;
759
+ */
760
+ value: LinksReported;
761
+ case: "linksReported";
323
762
  } | { case: undefined; value?: undefined };
324
763
  };
325
764
 
@@ -385,6 +824,36 @@ export declare type SessionResponse = Message<"kusinta.iot.connector.v1.SessionR
385
824
  */
386
825
  value: AttributeWriteRequest;
387
826
  case: "executeAttributeWrite";
827
+ } | {
828
+ /**
829
+ * The connector-leg half of the pairing flow. See EnterPairingMode.
830
+ *
831
+ * @generated from field: kusinta.iot.connector.v1.EnterPairingMode enter_pairing_mode = 10;
832
+ */
833
+ value: EnterPairingMode;
834
+ case: "enterPairingMode";
835
+ } | {
836
+ /**
837
+ * The link operations. Separate cases rather than one with a verb, so a
838
+ * connector that models none of them fails to match rather than having to
839
+ * decode a request it cannot serve.
840
+ *
841
+ * @generated from field: kusinta.iot.connector.v1.CreateLink create_link = 11;
842
+ */
843
+ value: CreateLink;
844
+ case: "createLink";
845
+ } | {
846
+ /**
847
+ * @generated from field: kusinta.iot.connector.v1.RemoveLink remove_link = 12;
848
+ */
849
+ value: RemoveLink;
850
+ case: "removeLink";
851
+ } | {
852
+ /**
853
+ * @generated from field: kusinta.iot.connector.v1.ListLinks list_links = 13;
854
+ */
855
+ value: ListLinks;
856
+ case: "listLinks";
388
857
  } | { case: undefined; value?: undefined };
389
858
  };
390
859