@kusinta/iot-schema 0.2.0-beta.5 → 0.2.0-beta.51

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 (69) hide show
  1. package/package.json +42 -28
  2. package/src/kusinta/iot/access/v1/acl_pb.d.ts +138 -2
  3. package/src/kusinta/iot/access/v1/acl_pb.js +19 -2
  4. package/src/kusinta/iot/access/v1/roles_pb.d.ts +160 -4
  5. package/src/kusinta/iot/access/v1/roles_pb.js +128 -5
  6. package/src/kusinta/iot/accountlink/v1/account_link_pb.d.ts +591 -0
  7. package/src/kusinta/iot/accountlink/v1/account_link_pb.js +160 -0
  8. package/src/kusinta/iot/climate/v1/climate_pb.d.ts +1495 -0
  9. package/src/kusinta/iot/climate/v1/climate_pb.js +278 -0
  10. package/src/kusinta/iot/commissioning/v1/commissioning_pb.d.ts +1359 -0
  11. package/src/kusinta/iot/commissioning/v1/commissioning_pb.js +282 -0
  12. package/src/kusinta/iot/common/v1/pairing_pb.d.ts +219 -0
  13. package/src/kusinta/iot/common/v1/pairing_pb.js +50 -0
  14. package/src/kusinta/iot/common/v1/types_pb.d.ts +235 -0
  15. package/src/kusinta/iot/common/v1/types_pb.js +84 -2
  16. package/src/kusinta/iot/connector/v1/connector_pb.d.ts +874 -3
  17. package/src/kusinta/iot/connector/v1/connector_pb.js +126 -13
  18. package/src/kusinta/iot/device/v1/cluster_state_pb.d.ts +213 -1
  19. package/src/kusinta/iot/device/v1/cluster_state_pb.js +37 -2
  20. package/src/kusinta/iot/device/v1/descriptor_pb.d.ts +32 -4
  21. package/src/kusinta/iot/device/v1/descriptor_pb.js +2 -1
  22. package/src/kusinta/iot/device/v1/device_event_pb.d.ts +89 -5
  23. package/src/kusinta/iot/device/v1/device_event_pb.js +1 -1
  24. package/src/kusinta/iot/device/v1/device_pb.d.ts +426 -11
  25. package/src/kusinta/iot/device/v1/device_pb.js +74 -2
  26. package/src/kusinta/iot/device/v1/properties_pb.d.ts +26 -5
  27. package/src/kusinta/iot/device/v1/properties_pb.js +1 -1
  28. package/src/kusinta/iot/device/v1/property_update_pb.d.ts +42 -2
  29. package/src/kusinta/iot/device/v1/property_update_pb.js +2 -1
  30. package/src/kusinta/iot/heating/v1/heating_pb.d.ts +656 -0
  31. package/src/kusinta/iot/heating/v1/heating_pb.js +119 -0
  32. package/src/kusinta/iot/link/v1/link_pb.d.ts +438 -0
  33. package/src/kusinta/iot/link/v1/link_pb.js +121 -0
  34. package/src/kusinta/iot/registration/v1/registration_pb.d.ts +18 -0
  35. package/src/kusinta/iot/registration/v1/registration_pb.js +1 -1
  36. package/src/kusinta/iot/reporting/v1/reporting_pb.d.ts +1251 -0
  37. package/src/kusinta/iot/reporting/v1/reporting_pb.js +238 -0
  38. package/src/kusinta/iot/reporting/v1/reporting_service_pb.d.ts +63 -0
  39. package/src/kusinta/iot/reporting/v1/reporting_service_pb.js +24 -0
  40. package/src/kusinta/iot/signaling/v1/signaling_pb.d.ts +939 -7
  41. package/src/kusinta/iot/signaling/v1/signaling_pb.js +163 -4
  42. package/src/kusinta/iot/signaling/v1/signaling_service_pb.d.ts +24 -1
  43. package/src/kusinta/iot/signaling/v1/signaling_service_pb.js +1 -1
  44. package/src/kusinta/iot/space/v1/space_pb.d.ts +146 -2
  45. package/src/kusinta/iot/space/v1/space_pb.js +10 -1
  46. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.d.ts +15 -0
  47. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.js +1 -1
  48. package/src/kusinta/iot/vendor/lorawan/v1/lorawan_pb.d.ts +69 -0
  49. package/src/kusinta/iot/vendor/lorawan/v1/lorawan_pb.js +19 -0
  50. package/src/kusinta/iot/vendor/v1/vendor_options_pb.d.ts +5 -4
  51. package/src/kusinta/iot/vendor/v1/vendor_options_pb.js +5 -4
  52. package/src/kusinta/iot/webrtc/v1/app_token_pb.d.ts +48 -5
  53. package/src/kusinta/iot/webrtc/v1/app_token_pb.js +1 -1
  54. package/src/kusinta/iot/webrtc/v1/command_pb.d.ts +56 -0
  55. package/src/kusinta/iot/webrtc/v1/command_pb.js +1 -1
  56. package/src/kusinta/iot/webrtc/v1/device_state_pb.d.ts +179 -5
  57. package/src/kusinta/iot/webrtc/v1/device_state_pb.js +34 -5
  58. package/src/kusinta/iot/webrtc/v1/envelope_pb.d.ts +732 -3
  59. package/src/kusinta/iot/webrtc/v1/envelope_pb.js +84 -4
  60. package/src/kusinta/iot/webrtc/v1/household_pb.d.ts +612 -0
  61. package/src/kusinta/iot/webrtc/v1/household_pb.js +134 -0
  62. package/src/kusinta/iot/webrtc/v1/invite_pb.d.ts +502 -0
  63. package/src/kusinta/iot/webrtc/v1/invite_pb.js +108 -0
  64. package/src/kusinta/iot/webrtc/v1/management_pb.d.ts +2183 -76
  65. package/src/kusinta/iot/webrtc/v1/management_pb.js +311 -5
  66. package/src/kusinta/iot/webrtc/v1/members_pb.d.ts +582 -0
  67. package/src/kusinta/iot/webrtc/v1/members_pb.js +113 -0
  68. package/src/kusinta/iot/webrtc/v1/permission_push_pb.d.ts +66 -4
  69. package/src/kusinta/iot/webrtc/v1/permission_push_pb.js +9 -1
@@ -4,12 +4,22 @@
4
4
 
5
5
  import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
6
6
  import type { Message } from "@bufbuild/protobuf";
7
- import type { DeviceId } from "../../identity/v1/identity_pb.js";
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
+ import type { DeviceLink, DeviceLinkList } from "../../link/v1/link_pb.js";
12
+ import type { ApartmentClimateSummary, ClimateMode, RoomClimate, RoomClimateList, RoomHistory } from "../../climate/v1/climate_pb.js";
13
+ import type { IssuedInvite, SpaceInvites } from "./invite_pb.js";
14
+ import type { GatewayMembers, PromotionRequests } from "./members_pb.js";
15
+ import type { HeatingLayout, HeatingRecord } from "../../heating/v1/heating_pb.js";
16
+ import type { AccountLinkNonce, AccountLinks } from "../../accountlink/v1/account_link_pb.js";
17
+ import type { CommissioningGrant, CommissioningGrants, CommissioningProfile, CommissioningRecord, CommissioningTest, HomeSetups } from "../../commissioning/v1/commissioning_pb.js";
18
+ import type { ClimateHistoryCleared, HouseholdExport, HouseholdHandover, HouseholdHandovers } from "./household_pb.js";
19
+ import type { PairingErrorDetail, PairingWindow } from "../../common/v1/pairing_pb.js";
20
+ import type { BackendHealth, ConnectorKind, DeviceOwnershipType } from "../../common/v1/types_pb.js";
11
21
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
12
- import type { DeviceAdded, DeviceRemoved, DeviceStateSnapshot, PropertyReport } from "./device_state_pb.js";
22
+ import type { DeviceAdded, DeviceRemoved, DeviceStateSnapshot, PropertyReport, ServiceStatusChanged } from "./device_state_pb.js";
13
23
  import type { LivePermissionUpdate } from "./permission_push_pb.js";
14
24
  import type { AttributeWriteRequest, CommandResult, DeviceCommand } from "./command_pb.js";
15
25
  import type { DeviceEventBatch } from "../../device/v1/device_event_pb.js";
@@ -44,13 +54,26 @@ export declare type Pong = Message<"kusinta.iot.webrtc.v1.Pong"> & {
44
54
  export declare const PongSchema: GenMessage<Pong>;
45
55
 
46
56
  /**
57
+ * The gateway refused the session's handshake, gateway → app; the session ends.
58
+ *
47
59
  * @generated from message kusinta.iot.webrtc.v1.HandshakeRejected
48
60
  */
49
61
  export declare type HandshakeRejected = Message<"kusinta.iot.webrtc.v1.HandshakeRejected"> & {
50
62
  /**
63
+ * For logs and debugging only, in the gateway's words. An app MUST NOT show it to a user: it
64
+ * names the refusal by code, in its user's language.
65
+ *
51
66
  * @generated from field: string reason = 1;
52
67
  */
53
68
  reason: string;
69
+
70
+ /**
71
+ * Why, as a closed list. Rollout note: a gateway that predates this field sends reason alone,
72
+ * which an app reads as UNSPECIFIED.
73
+ *
74
+ * @generated from field: kusinta.iot.webrtc.v1.HandshakeRejectReason code = 2;
75
+ */
76
+ code: HandshakeRejectReason;
54
77
  };
55
78
 
56
79
  /**
@@ -316,6 +339,176 @@ export declare type ManagementResult = Message<"kusinta.iot.webrtc.v1.Management
316
339
  */
317
340
  value: ManagementAck;
318
341
  case: "ack";
342
+ } | {
343
+ /**
344
+ * list_device_links
345
+ *
346
+ * @generated from field: kusinta.iot.link.v1.DeviceLinkList links = 6;
347
+ */
348
+ value: DeviceLinkList;
349
+ case: "links";
350
+ } | {
351
+ /**
352
+ * list_room_climates
353
+ *
354
+ * @generated from field: kusinta.iot.climate.v1.RoomClimateList room_climates = 7;
355
+ */
356
+ value: RoomClimateList;
357
+ case: "roomClimates";
358
+ } | {
359
+ /**
360
+ * get_room_history
361
+ *
362
+ * @generated from field: kusinta.iot.climate.v1.RoomHistory room_history = 8;
363
+ */
364
+ value: RoomHistory;
365
+ case: "roomHistory";
366
+ } | {
367
+ /**
368
+ * get_privacy_disclosure
369
+ *
370
+ * @generated from field: kusinta.iot.webrtc.v1.PrivacyDisclosure privacy_disclosure = 9;
371
+ */
372
+ value: PrivacyDisclosure;
373
+ case: "privacyDisclosure";
374
+ } | {
375
+ /**
376
+ * get_apartment_climate_summary
377
+ *
378
+ * @generated from field: kusinta.iot.climate.v1.ApartmentClimateSummary apartment_climate_summary = 10;
379
+ */
380
+ value: ApartmentClimateSummary;
381
+ case: "apartmentClimateSummary";
382
+ } | {
383
+ /**
384
+ * create_invite, resend_invite
385
+ *
386
+ * @generated from field: kusinta.iot.webrtc.v1.IssuedInvite issued_invite = 11;
387
+ */
388
+ value: IssuedInvite;
389
+ case: "issuedInvite";
390
+ } | {
391
+ /**
392
+ * list_space_invites
393
+ *
394
+ * @generated from field: kusinta.iot.webrtc.v1.SpaceInvites space_invites = 12;
395
+ */
396
+ value: SpaceInvites;
397
+ case: "spaceInvites";
398
+ } | {
399
+ /**
400
+ * list_gateway_members
401
+ *
402
+ * @generated from field: kusinta.iot.webrtc.v1.GatewayMembers gateway_members = 13;
403
+ */
404
+ value: GatewayMembers;
405
+ case: "gatewayMembers";
406
+ } | {
407
+ /**
408
+ * list_promotion_requests
409
+ *
410
+ * @generated from field: kusinta.iot.webrtc.v1.PromotionRequests promotion_requests = 14;
411
+ */
412
+ value: PromotionRequests;
413
+ case: "promotionRequests";
414
+ } | {
415
+ /**
416
+ * list_heating
417
+ *
418
+ * @generated from field: kusinta.iot.heating.v1.HeatingLayout heating_layout = 15;
419
+ */
420
+ value: HeatingLayout;
421
+ case: "heatingLayout";
422
+ } | {
423
+ /**
424
+ * put_heating_plant, put_heating_circuit, put_floor_zone, put_comfort_load,
425
+ * set_comfort_windows
426
+ *
427
+ * @generated from field: kusinta.iot.heating.v1.HeatingRecord heating_record = 16;
428
+ */
429
+ value: HeatingRecord;
430
+ case: "heatingRecord";
431
+ } | {
432
+ /**
433
+ * request_account_link_nonce
434
+ *
435
+ * @generated from field: kusinta.iot.accountlink.v1.AccountLinkNonce account_link_nonce = 17;
436
+ */
437
+ value: AccountLinkNonce;
438
+ case: "accountLinkNonce";
439
+ } | {
440
+ /**
441
+ * list_account_links
442
+ *
443
+ * @generated from field: kusinta.iot.accountlink.v1.AccountLinks account_links = 18;
444
+ */
445
+ value: AccountLinks;
446
+ case: "accountLinks";
447
+ } | {
448
+ /**
449
+ * list_commissioning
450
+ *
451
+ * @generated from field: kusinta.iot.commissioning.v1.CommissioningProfile commissioning_profile = 19;
452
+ */
453
+ value: CommissioningProfile;
454
+ case: "commissioningProfile";
455
+ } | {
456
+ /**
457
+ * put_commissioning_fact, put_house_template, run_commissioning_test,
458
+ * conclude_commissioning_test
459
+ *
460
+ * @generated from field: kusinta.iot.commissioning.v1.CommissioningRecord commissioning_record = 20;
461
+ */
462
+ value: CommissioningRecord;
463
+ case: "commissioningRecord";
464
+ } | {
465
+ /**
466
+ * list_home_setups
467
+ *
468
+ * @generated from field: kusinta.iot.commissioning.v1.HomeSetups home_setups = 21;
469
+ */
470
+ value: HomeSetups;
471
+ case: "homeSetups";
472
+ } | {
473
+ /**
474
+ * request_commissioning_grant, answer_commissioning_grant (granted)
475
+ *
476
+ * @generated from field: kusinta.iot.commissioning.v1.CommissioningGrant commissioning_grant = 22;
477
+ */
478
+ value: CommissioningGrant;
479
+ case: "commissioningGrant";
480
+ } | {
481
+ /**
482
+ * list_commissioning_grants
483
+ *
484
+ * @generated from field: kusinta.iot.commissioning.v1.CommissioningGrants commissioning_grants = 23;
485
+ */
486
+ value: CommissioningGrants;
487
+ case: "commissioningGrants";
488
+ } | {
489
+ /**
490
+ * start_household_handover
491
+ *
492
+ * @generated from field: kusinta.iot.webrtc.v1.HouseholdHandover household_handover = 24;
493
+ */
494
+ value: HouseholdHandover;
495
+ case: "householdHandover";
496
+ } | {
497
+ /**
498
+ * list_household_handovers
499
+ *
500
+ * @generated from field: kusinta.iot.webrtc.v1.HouseholdHandovers household_handovers = 25;
501
+ */
502
+ value: HouseholdHandovers;
503
+ case: "householdHandovers";
504
+ } | {
505
+ /**
506
+ * export_household_data
507
+ *
508
+ * @generated from field: kusinta.iot.webrtc.v1.HouseholdExport household_export = 26;
509
+ */
510
+ value: HouseholdExport;
511
+ case: "householdExport";
319
512
  } | { case: undefined; value?: undefined };
320
513
  };
321
514
 
@@ -325,9 +518,385 @@ export declare type ManagementResult = Message<"kusinta.iot.webrtc.v1.Management
325
518
  */
326
519
  export declare const ManagementResultSchema: GenMessage<ManagementResult>;
327
520
 
521
+ /**
522
+ * Asks the gateway to put a connector into pairing mode, so a device joined during the
523
+ * window becomes the caller's rather than belonging to nobody.
524
+ *
525
+ * A payload case of its own rather than a ManagementRequest. Those are gated on a target —
526
+ * a space, a device — and that is the justification for keeping them behind one wrapper.
527
+ * A connector is not a target the caller must reach the way a space is, so this is
528
+ * authorized against the caller's role and nothing else — but it must still name the
529
+ * connector to open (see connector_id), never every connector at once.
530
+ *
531
+ * Answered twice, and the two answers say different things at different times.
532
+ * PairingStarted reports whether the window opened; PairingFinished reports what came of
533
+ * it, seconds or minutes later, once someone has pressed a button on hardware that may be
534
+ * asleep or out of range.
535
+ *
536
+ * @generated from message kusinta.iot.webrtc.v1.StartPairing
537
+ */
538
+ export declare type StartPairing = Message<"kusinta.iot.webrtc.v1.StartPairing"> & {
539
+ /**
540
+ * Which connector to open. Required: pairing always targets exactly one connector,
541
+ * picked from the connector enumeration (see ConnectorsAnnounced and
542
+ * ConnectorInfo.supports_pairing). An untargeted request is refused with
543
+ * PairingError.CONNECTOR_REQUIRED, never fanned out across every hub — so that no
544
+ * client can open every radio at once, and so a device is paired onto the specific hub
545
+ * that will broker its links. The field is a message, so proto cannot mark it required;
546
+ * the gateway enforces it.
547
+ *
548
+ * @generated from field: kusinta.iot.identity.v1.ConnectorId connector_id = 1;
549
+ */
550
+ connectorId?: ConnectorId | undefined;
551
+
552
+ /**
553
+ * How long, which device, how many. See PairingWindow.
554
+ *
555
+ * @generated from field: kusinta.iot.common.v1.PairingWindow window = 2;
556
+ */
557
+ window?: PairingWindow | undefined;
558
+
559
+ /**
560
+ * Where to file the device once it arrives. Into a home only as PlaceDeviceInSpace
561
+ * allows.
562
+ *
563
+ * Optional, and the two cases differ. A caller pairing a device of their own must name a
564
+ * space they reach, so it is theirs and placed on arrival rather than sitting unfiled and
565
+ * invisible to them. A caller commissioning for a building may leave it unset: a building
566
+ * is commissioned before its spaces are recorded, and an unfiled device is visible to the
567
+ * administrator, who is the person doing the pairing.
568
+ *
569
+ * @generated from field: kusinta.iot.identity.v1.SpaceId initial_space_id = 3;
570
+ */
571
+ initialSpaceId?: SpaceId | undefined;
572
+
573
+ /**
574
+ * What the device should become. Unset lets the gateway decide from the caller's role,
575
+ * which is the reading that scales: someone commissioning fifty devices for a building
576
+ * should not come to own fifty devices because a field defaulted.
577
+ *
578
+ * The gateway refuses an ownership the caller may not confer, and never mints ownership
579
+ * for a third party — handing a device to someone else is a transfer, a separate operation
580
+ * with its own authority.
581
+ *
582
+ * @generated from field: kusinta.iot.common.v1.DeviceOwnershipType ownership = 4;
583
+ */
584
+ ownership: DeviceOwnershipType;
585
+ };
586
+
587
+ /**
588
+ * Describes the message kusinta.iot.webrtc.v1.StartPairing.
589
+ * Use `create(StartPairingSchema)` to create a new message.
590
+ */
591
+ export declare const StartPairingSchema: GenMessage<StartPairing>;
592
+
593
+ /**
594
+ * Whether the pairing window opened, gateway → app. The first of two answers to a
595
+ * StartPairing.
596
+ *
597
+ * @generated from message kusinta.iot.webrtc.v1.PairingStarted
598
+ */
599
+ export declare type PairingStarted = Message<"kusinta.iot.webrtc.v1.PairingStarted"> & {
600
+ /**
601
+ * AppMessage.message_id of the StartPairing
602
+ *
603
+ * @generated from field: string in_reply_to = 1;
604
+ */
605
+ inReplyTo: string;
606
+
607
+ /**
608
+ * When the window closes. Present when it opened, and this is the value to count down
609
+ * from — not the duration that was asked for, which both the gateway and the connector
610
+ * clamp. A countdown run on the request rather than on this one disagrees with the hub.
611
+ *
612
+ * @generated from field: google.protobuf.Timestamp expires_at = 2;
613
+ */
614
+ expiresAt?: Timestamp | undefined;
615
+
616
+ /**
617
+ * Why it did not open. Present instead of expires_at.
618
+ *
619
+ * @generated from field: kusinta.iot.common.v1.PairingErrorDetail error = 3;
620
+ */
621
+ error?: PairingErrorDetail | undefined;
622
+ };
623
+
624
+ /**
625
+ * Describes the message kusinta.iot.webrtc.v1.PairingStarted.
626
+ * Use `create(PairingStartedSchema)` to create a new message.
627
+ */
628
+ export declare const PairingStartedSchema: GenMessage<PairingStarted>;
629
+
630
+ /**
631
+ * What the pairing window produced, gateway → app. The second and last answer, sent once
632
+ * when the window closes.
633
+ *
634
+ * One message per request, not per device: a batch window attributes several, and a client
635
+ * given one message each has nothing telling it the window is over and no defined moment to
636
+ * stop waiting. The devices are listed here; each also arrives as an ordinary DeviceAdded
637
+ * as it appears, so a client may show them as they come and use this to finish.
638
+ *
639
+ * An error and a non-empty device list are not exclusive. A batch of five that attributed
640
+ * three and then expired reports both — three devices and NO_DEVICE_APPEARED — because
641
+ * "some worked" and "the window ran out" are both true and a user needs to be told both.
642
+ *
643
+ * @generated from message kusinta.iot.webrtc.v1.PairingFinished
644
+ */
645
+ export declare type PairingFinished = Message<"kusinta.iot.webrtc.v1.PairingFinished"> & {
646
+ /**
647
+ * AppMessage.message_id of the StartPairing
648
+ *
649
+ * @generated from field: string in_reply_to = 1;
650
+ */
651
+ inReplyTo: string;
652
+
653
+ /**
654
+ * @generated from field: repeated kusinta.iot.identity.v1.DeviceId device_ids = 2;
655
+ */
656
+ deviceIds: DeviceId[];
657
+
658
+ /**
659
+ * Why the window produced fewer devices than asked for, absent when it produced them all.
660
+ * Note this is not always a failure of the request: a window that simply expired unused
661
+ * ends here too, and is the ordinary result of a user changing their mind.
662
+ *
663
+ * @generated from field: kusinta.iot.common.v1.PairingErrorDetail error = 3;
664
+ */
665
+ error?: PairingErrorDetail | undefined;
666
+ };
667
+
668
+ /**
669
+ * Describes the message kusinta.iot.webrtc.v1.PairingFinished.
670
+ * Use `create(PairingFinishedSchema)` to create a new message.
671
+ */
672
+ export declare const PairingFinishedSchema: GenMessage<PairingFinished>;
673
+
328
674
  /**
329
675
  * GatewayMessage: gateway → app
676
+ * A link between two devices has changed, gateway to app.
677
+ *
678
+ * Sent without being asked for, like device_added, and for the same reason: a link's
679
+ * state is not settled when it is made. A hub accepting a link is not the two devices
680
+ * honouring it, and a link that was carrying stops when its sender goes quiet — so the
681
+ * interesting transitions all happen long after the request that created it was
682
+ * answered. Without this an app can only learn by listing every link again and
683
+ * diffing, which means a room that has quietly stopped following its wall thermostat
684
+ * looks correct until somebody reloads.
685
+ *
686
+ * Apply as an upsert keyed on link.link_id, never as an insert: the same link is sent
687
+ * again whenever its state moves.
688
+ *
689
+ * Sent only for links the recipient is entitled to see. An unfiltered one would say
690
+ * which devices exist and how they are arranged, to somebody entitled to neither. A link
691
+ * with an end in a home reaches a recipient who sees it as service with details_withheld,
692
+ * and is pushed to them only when it appears and when it is removed — never for anything
693
+ * else, its state and settings included, which are not theirs to see. Its removal is pushed
694
+ * to them at once, as every loss is — to those who were shown it, and to nobody else.
695
+ *
696
+ * @generated from message kusinta.iot.webrtc.v1.LinkChanged
697
+ */
698
+ export declare type LinkChanged = Message<"kusinta.iot.webrtc.v1.LinkChanged"> & {
699
+ /**
700
+ * @generated from field: kusinta.iot.link.v1.DeviceLink link = 1;
701
+ */
702
+ link?: DeviceLink | undefined;
703
+
704
+ /**
705
+ * The link is gone, rather than merely not carrying. Distinct from a BROKEN state
706
+ * because the two need opposite responses: a removal is finished business, while a
707
+ * link that has stopped carrying is a fault worth showing somebody. Announcing a
708
+ * deletion as BROKEN would leave every removed link looking like something to go
709
+ * and repair.
710
+ *
711
+ * `link` still carries the whole link when this is set, so the app can name what
712
+ * went rather than only its id — as much of it as the recipient was shown, so with
713
+ * details_withheld to one who saw it as service. To such a recipient it means the link is
714
+ * gone from their view, which need not mean it is gone.
715
+ *
716
+ * @generated from field: bool removed = 2;
717
+ */
718
+ removed: boolean;
719
+ };
720
+
721
+ /**
722
+ * Describes the message kusinta.iot.webrtc.v1.LinkChanged.
723
+ * Use `create(LinkChangedSchema)` to create a new message.
724
+ */
725
+ export declare const LinkChangedSchema: GenMessage<LinkChanged>;
726
+
727
+ /**
728
+ * One connected connector, described for the app, gateway → app.
729
+ *
730
+ * Deliberately not connector.v1.ConnectorInfo: that carries transport and endpoint,
731
+ * which are the gateway↔connector wiring and no business of the app. This is the
732
+ * app-facing projection — who the connector is and what it can do — and nothing
733
+ * about how the gateway reaches it.
734
+ *
735
+ * @generated from message kusinta.iot.webrtc.v1.ConnectorDescriptor
736
+ */
737
+ export declare type ConnectorDescriptor = Message<"kusinta.iot.webrtc.v1.ConnectorDescriptor"> & {
738
+ /**
739
+ * The routing key. Stable and unique; what StartPairing.connector_id and
740
+ * ProvisionDevice.connector_id name.
741
+ *
742
+ * @generated from field: kusinta.iot.identity.v1.ConnectorId connector_id = 1;
743
+ */
744
+ connectorId?: ConnectorId | undefined;
745
+
746
+ /**
747
+ * User-facing label, free-form, never matched on.
748
+ *
749
+ * @generated from field: string display_name = 2;
750
+ */
751
+ displayName: string;
752
+
753
+ /**
754
+ * @generated from field: repeated uint32 supported_device_type_ids = 3;
755
+ */
756
+ supportedDeviceTypeIds: number[];
757
+
758
+ /**
759
+ * The capabilities the app branches on. Copied from the connector's handshake;
760
+ * see ConnectorInfo for what each means. The app decides pairing-vs-provisioning
761
+ * and whether to offer hard links from these, never from kind.
762
+ *
763
+ * @generated from field: bool supports_pairing = 4;
764
+ */
765
+ supportsPairing: boolean;
766
+
767
+ /**
768
+ * @generated from field: bool supports_provisioning = 5;
769
+ */
770
+ supportsProvisioning: boolean;
771
+
772
+ /**
773
+ * @generated from field: bool brokers_links = 6;
774
+ */
775
+ brokersLinks: boolean;
776
+
777
+ /**
778
+ * Presentation only — an icon or an "unknown hub" fallback; see
779
+ * common.v1.ConnectorKind. Unset renders as a generic hub.
780
+ *
781
+ * @generated from field: kusinta.iot.common.v1.ConnectorKind kind = 7;
782
+ */
783
+ kind: ConnectorKind;
784
+
785
+ /**
786
+ * Installer or operator detail, free-form, for a person.
787
+ *
788
+ * @generated from field: string description = 8;
789
+ */
790
+ description: string;
791
+
792
+ /**
793
+ * Whether the backend the connector drives is working, as the connector last reported it
794
+ * (see connector.v1.BackendHealthReport): state and category only — the connector's own
795
+ * detail stays in the gateway's logs. Unset when the connector has stated nothing, which
796
+ * reads as OK. FAILING is what opens a reporting.v1.PROBLEM_KIND_CONNECTOR_ERROR, and
797
+ * while it holds the app may offer ReconnectConnector.
798
+ *
799
+ * @generated from field: kusinta.iot.common.v1.BackendHealth backend_health = 9;
800
+ */
801
+ backendHealth?: BackendHealth | undefined;
802
+
803
+ /**
804
+ * The connector can re-initialise its backend on request: ReconnectConnector is
805
+ * refused for any connector without it. Copied from the handshake, as the other
806
+ * capabilities are.
807
+ *
808
+ * @generated from field: bool supports_backend_reinitialize = 10;
809
+ */
810
+ supportsBackendReinitialize: boolean;
811
+ };
812
+
813
+ /**
814
+ * Describes the message kusinta.iot.webrtc.v1.ConnectorDescriptor.
815
+ * Use `create(ConnectorDescriptorSchema)` to create a new message.
816
+ */
817
+ export declare const ConnectorDescriptorSchema: GenMessage<ConnectorDescriptor>;
818
+
819
+ /**
820
+ * The connectors the gateway currently holds, gateway → app: those connected now. A
821
+ * connector whose stream drops leaves the list, and its backend health with it; it is
822
+ * listed again when it reconnects. The app offers ReconnectConnector only for a listed
823
+ * connector.
824
+ *
825
+ * A push, not a ManagementResult arm: a new result-oneof member is a compile error
826
+ * in a consumer whose match on the result is exhaustive, whereas a new push case is
827
+ * absorbed by that switch's default. Sent on connect and whenever the set changes —
828
+ * a connector arriving, leaving, revising its capabilities, or its backend health
829
+ * changing — and replaces the app's whole picture each time rather than being a delta,
830
+ * so a client that missed one re-syncs from the next.
831
+ *
832
+ * @generated from message kusinta.iot.webrtc.v1.ConnectorsAnnounced
833
+ */
834
+ export declare type ConnectorsAnnounced = Message<"kusinta.iot.webrtc.v1.ConnectorsAnnounced"> & {
835
+ /**
836
+ * @generated from field: repeated kusinta.iot.webrtc.v1.ConnectorDescriptor connectors = 1;
837
+ */
838
+ connectors: ConnectorDescriptor[];
839
+ };
840
+
841
+ /**
842
+ * Describes the message kusinta.iot.webrtc.v1.ConnectorsAnnounced.
843
+ * Use `create(ConnectorsAnnouncedSchema)` to create a new message.
844
+ */
845
+ export declare const ConnectorsAnnouncedSchema: GenMessage<ConnectorsAnnounced>;
846
+
847
+ /**
848
+ * A room's climate changed, gateway → app: its target, what set it, what it is being
849
+ * held at, its condition. Apply as an upsert keyed on room.space_id. Sent only for rooms
850
+ * the recipient may see, and whenever any field the recipient is sent moves — a knob
851
+ * turned by hand shows up here without the app asking. To a recipient who sees the room
852
+ * as service, what is new is sent as it happens and what is lost at once. A recipient who
853
+ * is sent the room with state_withheld is therefore not sent it when only withheld fields
854
+ * move.
330
855
  *
856
+ * @generated from message kusinta.iot.webrtc.v1.RoomClimateChanged
857
+ */
858
+ export declare type RoomClimateChanged = Message<"kusinta.iot.webrtc.v1.RoomClimateChanged"> & {
859
+ /**
860
+ * @generated from field: kusinta.iot.climate.v1.RoomClimate room = 1;
861
+ */
862
+ room?: RoomClimate | undefined;
863
+ };
864
+
865
+ /**
866
+ * Describes the message kusinta.iot.webrtc.v1.RoomClimateChanged.
867
+ * Use `create(RoomClimateChangedSchema)` to create a new message.
868
+ */
869
+ export declare const RoomClimateChangedSchema: GenMessage<RoomClimateChanged>;
870
+
871
+ /**
872
+ * A mode on a space was switched on, changed or ended, gateway → app. `ended` rather than
873
+ * kind UNSPECIFIED, so an app can still name the mode that finished. A mode on an
874
+ * apartment or a room in one is sent to its residents only — whether a home stands empty
875
+ * is theirs to know — and, while the home is empty, to the property owner and the gateway
876
+ * administrators who reach it (household.proto, EMPTY HOME), who are sent its end at MOVE-IN;
877
+ * one on any other space, to whoever reaches it.
878
+ *
879
+ * @generated from message kusinta.iot.webrtc.v1.ClimateModeChanged
880
+ */
881
+ export declare type ClimateModeChanged = Message<"kusinta.iot.webrtc.v1.ClimateModeChanged"> & {
882
+ /**
883
+ * @generated from field: kusinta.iot.climate.v1.ClimateMode mode = 1;
884
+ */
885
+ mode?: ClimateMode | undefined;
886
+
887
+ /**
888
+ * @generated from field: bool ended = 2;
889
+ */
890
+ ended: boolean;
891
+ };
892
+
893
+ /**
894
+ * Describes the message kusinta.iot.webrtc.v1.ClimateModeChanged.
895
+ * Use `create(ClimateModeChangedSchema)` to create a new message.
896
+ */
897
+ export declare const ClimateModeChangedSchema: GenMessage<ClimateModeChanged>;
898
+
899
+ /**
331
900
  * @generated from message kusinta.iot.webrtc.v1.GatewayMessage
332
901
  */
333
902
  export declare type GatewayMessage = Message<"kusinta.iot.webrtc.v1.GatewayMessage"> & {
@@ -421,6 +990,98 @@ export declare type GatewayMessage = Message<"kusinta.iot.webrtc.v1.GatewayMessa
421
990
  */
422
991
  value: DeviceEventBatch;
423
992
  case: "deviceEvents";
993
+ } | {
994
+ /**
995
+ * @generated from field: kusinta.iot.webrtc.v1.PairingStarted pairing_started = 17;
996
+ */
997
+ value: PairingStarted;
998
+ case: "pairingStarted";
999
+ } | {
1000
+ /**
1001
+ * @generated from field: kusinta.iot.webrtc.v1.PairingFinished pairing_finished = 18;
1002
+ */
1003
+ value: PairingFinished;
1004
+ case: "pairingFinished";
1005
+ } | {
1006
+ /**
1007
+ * @generated from field: kusinta.iot.webrtc.v1.LinkChanged link_changed = 19;
1008
+ */
1009
+ value: LinkChanged;
1010
+ case: "linkChanged";
1011
+ } | {
1012
+ /**
1013
+ * @generated from field: kusinta.iot.webrtc.v1.ConnectorsAnnounced connectors_announced = 20;
1014
+ */
1015
+ value: ConnectorsAnnounced;
1016
+ case: "connectorsAnnounced";
1017
+ } | {
1018
+ /**
1019
+ * @generated from field: kusinta.iot.webrtc.v1.RoomClimateChanged room_climate_changed = 21;
1020
+ */
1021
+ value: RoomClimateChanged;
1022
+ case: "roomClimateChanged";
1023
+ } | {
1024
+ /**
1025
+ * @generated from field: kusinta.iot.webrtc.v1.ClimateModeChanged climate_mode_changed = 22;
1026
+ */
1027
+ value: ClimateModeChanged;
1028
+ case: "climateModeChanged";
1029
+ } | {
1030
+ /**
1031
+ * @generated from field: kusinta.iot.webrtc.v1.ServiceStatusChanged service_status_changed = 23;
1032
+ */
1033
+ value: ServiceStatusChanged;
1034
+ case: "serviceStatusChanged";
1035
+ } | {
1036
+ /**
1037
+ * A space's pending invites and join requests changed; see SpaceInvites.
1038
+ *
1039
+ * @generated from field: kusinta.iot.webrtc.v1.SpaceInvites space_invites = 24;
1040
+ */
1041
+ value: SpaceInvites;
1042
+ case: "spaceInvites";
1043
+ } | {
1044
+ /**
1045
+ * The promotion requests the session's user made or was asked to accept changed; see
1046
+ * PromotionRequests.
1047
+ *
1048
+ * @generated from field: kusinta.iot.webrtc.v1.PromotionRequests promotion_requests = 25;
1049
+ */
1050
+ value: PromotionRequests;
1051
+ case: "promotionRequests";
1052
+ } | {
1053
+ /**
1054
+ * A commissioning test changed state: to every session whose user is given it
1055
+ * (commissioning.v1), save its start to the session that started it.
1056
+ *
1057
+ * @generated from field: kusinta.iot.commissioning.v1.CommissioningTest commissioning_test = 26;
1058
+ */
1059
+ value: CommissioningTest;
1060
+ case: "commissioningTest";
1061
+ } | {
1062
+ /**
1063
+ * The commissioning grants on a space changed; see commissioning.v1.CommissioningGrants.
1064
+ *
1065
+ * @generated from field: kusinta.iot.commissioning.v1.CommissioningGrants commissioning_grants = 27;
1066
+ */
1067
+ value: CommissioningGrants;
1068
+ case: "commissioningGrants";
1069
+ } | {
1070
+ /**
1071
+ * A home's handover was started, cancelled or done; see HouseholdHandover.
1072
+ *
1073
+ * @generated from field: kusinta.iot.webrtc.v1.HouseholdHandover household_handover = 28;
1074
+ */
1075
+ value: HouseholdHandover;
1076
+ case: "householdHandover";
1077
+ } | {
1078
+ /**
1079
+ * A home's climate history was cleared; see ClimateHistoryCleared.
1080
+ *
1081
+ * @generated from field: kusinta.iot.webrtc.v1.ClimateHistoryCleared climate_history_cleared = 29;
1082
+ */
1083
+ value: ClimateHistoryCleared;
1084
+ case: "climateHistoryCleared";
424
1085
  } | { case: undefined; value?: undefined };
425
1086
  };
426
1087
 
@@ -497,6 +1158,12 @@ export declare type AppMessage = Message<"kusinta.iot.webrtc.v1.AppMessage"> & {
497
1158
  */
498
1159
  value: AttributeWriteRequest;
499
1160
  case: "attributeWrite";
1161
+ } | {
1162
+ /**
1163
+ * @generated from field: kusinta.iot.webrtc.v1.StartPairing start_pairing = 11;
1164
+ */
1165
+ value: StartPairing;
1166
+ case: "startPairing";
500
1167
  } | { case: undefined; value?: undefined };
501
1168
  };
502
1169
 
@@ -506,6 +1173,51 @@ export declare type AppMessage = Message<"kusinta.iot.webrtc.v1.AppMessage"> & {
506
1173
  */
507
1174
  export declare const AppMessageSchema: GenMessage<AppMessage>;
508
1175
 
1176
+ /**
1177
+ * Why a handshake was refused (HandshakeRejected.code).
1178
+ *
1179
+ * @generated from enum kusinta.iot.webrtc.v1.HandshakeRejectReason
1180
+ */
1181
+ export enum HandshakeRejectReason {
1182
+ /**
1183
+ * Not stated, or a value this app's schema does not know: an app says that the gateway
1184
+ * refused the connection, and no more. It treats the refusal as a passing failure, and
1185
+ * retries under its ordinary backoff.
1186
+ *
1187
+ * @generated from enum value: HANDSHAKE_REJECT_REASON_UNSPECIFIED = 0;
1188
+ */
1189
+ UNSPECIFIED = 0,
1190
+
1191
+ /**
1192
+ * A message the gateway could not decode. A fault of the app's: retrying repeats it, so an
1193
+ * app MUST NOT retry in a loop.
1194
+ *
1195
+ * @generated from enum value: HANDSHAKE_REJECT_REASON_INVALID_ENCODING = 1;
1196
+ */
1197
+ INVALID_ENCODING = 1,
1198
+
1199
+ /**
1200
+ * A message before AppHandshake, which must come first. A fault of the app's, as
1201
+ * INVALID_ENCODING is: an app MUST NOT retry in a loop.
1202
+ *
1203
+ * @generated from enum value: HANDSHAKE_REJECT_REASON_HANDSHAKE_REQUIRED = 2;
1204
+ */
1205
+ HANDSHAKE_REQUIRED = 2,
1206
+
1207
+ /**
1208
+ * The token in AppHandshake was not accepted (AppTokenClaims). A fresh token can help: an
1209
+ * app may refresh it and retry once, and then stops and tells its user.
1210
+ *
1211
+ * @generated from enum value: HANDSHAKE_REJECT_REASON_AUTHENTICATION_FAILED = 3;
1212
+ */
1213
+ AUTHENTICATION_FAILED = 3,
1214
+ }
1215
+
1216
+ /**
1217
+ * Describes the enum kusinta.iot.webrtc.v1.HandshakeRejectReason.
1218
+ */
1219
+ export declare const HandshakeRejectReasonSchema: GenEnum<HandshakeRejectReason>;
1220
+
509
1221
  /**
510
1222
  * Machine-readable classification of a session-level gateway error, so the app
511
1223
  * can branch without string-matching a human sentence. Deliberately an enum here,
@@ -570,6 +1282,23 @@ export enum GatewayErrorCode {
570
1282
  * @generated from enum value: GATEWAY_ERROR_CODE_SESSION_LIMIT_REACHED = 5;
571
1283
  */
572
1284
  SESSION_LIMIT_REACHED = 5,
1285
+
1286
+ /**
1287
+ * The request was well formed and the caller may make it, but it will not succeed without
1288
+ * a change on the receiving side — a capability the target lacks, configuration only a
1289
+ * person can fix. Do not retry as is. Distinct from INVALID_REQUEST, which is the app's
1290
+ * bug, and from UNAVAILABLE, which clears on its own. GatewayError.metadata says which
1291
+ * precondition failed where the operation documents one. Sent only in answer to a request
1292
+ * whose operation documents it, never as a session-level error that refuses or ends a
1293
+ * session.
1294
+ *
1295
+ * Rollout note: a client whose schema predates this value decodes it as UNSPECIFIED,
1296
+ * which is retryable by design, so it may offer a retry that fails the same way again.
1297
+ * Harmless, but client handling should ship before or with the gateway that emits it.
1298
+ *
1299
+ * @generated from enum value: GATEWAY_ERROR_CODE_FAILED_PRECONDITION = 6;
1300
+ */
1301
+ FAILED_PRECONDITION = 6,
573
1302
  }
574
1303
 
575
1304
  /**