@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
@@ -2,9 +2,12 @@
2
2
  // @generated from file kusinta/iot/signaling/v1/signaling.proto (package kusinta.iot.signaling.v1, syntax proto3)
3
3
  /* eslint-disable */
4
4
 
5
- import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
5
+ import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
6
6
  import type { Message } from "@bufbuild/protobuf";
7
7
  import type { GatewayId, UserId } from "../../identity/v1/identity_pb.js";
8
+ import type { AccountLinkCancelled, AccountLinked, AccountLinkResult, RefreshToken, RevokeToken, TokenRefreshed, TokenRevoked } from "../../accountlink/v1/account_link_pb.js";
9
+ import type { ConnectorKind } from "../../common/v1/types_pb.js";
10
+ import type { Timestamp } from "@bufbuild/protobuf/wkt";
8
11
 
9
12
  /**
10
13
  * Describes the file kusinta/iot/signaling/v1/signaling.proto.
@@ -76,10 +79,26 @@ export declare type IceCandidate = Message<"kusinta.iot.signaling.v1.IceCandidat
76
79
  export declare const IceCandidateSchema: GenMessage<IceCandidate>;
77
80
 
78
81
  /**
79
- * Empty keepalive. The gateway sends this periodically on the GatewayConnect
80
- * stream so the otherwise-idle bidi request keeps producing DATA frames, which
81
- * resets the inactivity timers on any proxy between the two ends and stops it
82
- * from tearing the stream down. Carries no routing target and is dropped on receipt.
82
+ * Empty keepalive, sent periodically on a stream that would otherwise fall
83
+ * silent. The DATA frames it produces reset the inactivity timers on any proxy
84
+ * between the two ends and stop it tearing the stream down. Carries no routing
85
+ * target and is dropped on receipt.
86
+ *
87
+ * Carried on two arms, each covering a half that falls silent while neither end
88
+ * has anything to say: the building-server gateway sends it upstream on
89
+ * GatewayConnect, and the api-server sends it downstream to the app on
90
+ * UserConnectResponse. The remaining halves have no arm — an app leg's upstream
91
+ * that goes idle is one the client can write on whenever it needs to.
92
+ *
93
+ * Never an acknowledgement. A heartbeat answers no message and must not be
94
+ * treated as confirming one.
95
+ *
96
+ * On GatewayConnect it also lets the api-server judge whether the gateway is
97
+ * present. A gateway is present while its stream is open, and never lets it
98
+ * carry nothing for more than 30 seconds: a heartbeat fills any longer silence.
99
+ * A stream that has carried nothing for 90 seconds may be taken as gone, even
100
+ * when the transport has not yet said so. That is the gateway's presence and
101
+ * nothing more: a present gateway may still have lost its devices.
83
102
  *
84
103
  * @generated from message kusinta.iot.signaling.v1.HeartBeat
85
104
  */
@@ -124,6 +143,23 @@ export declare type UserHandshakeAck = Message<"kusinta.iot.signaling.v1.UserHan
124
143
  * @generated from field: string reason = 2;
125
144
  */
126
145
  reason: string;
146
+
147
+ /**
148
+ * How often the api-server will send a HeartBeat on this stream, in
149
+ * milliseconds.
150
+ *
151
+ * Advisory, and a client must not refuse a stream over it: a client that has
152
+ * seen no traffic at all for a small multiple of this may take the stream for
153
+ * gone and reattach with the same session_id, which is the difference between
154
+ * a renegotiation that stalls and one that reconnects. The server is free to
155
+ * answer with a different value on the next session.
156
+ *
157
+ * Zero means the server is not heartbeating this stream, and a client must
158
+ * then not infer anything from silence.
159
+ *
160
+ * @generated from field: uint32 heartbeat_interval_ms = 3;
161
+ */
162
+ heartbeatIntervalMs: number;
127
163
  };
128
164
 
129
165
  /**
@@ -141,13 +177,18 @@ export declare const UserHandshakeAckSchema: GenMessage<UserHandshakeAck>;
141
177
  */
142
178
  export declare type GatewayConnectRequest = Message<"kusinta.iot.signaling.v1.GatewayConnectRequest"> & {
143
179
  /**
180
+ * On redeem_invite_result, the user who redeemed (RedeemInvite). Unset on an
181
+ * acknowledgement and on the accountlink.v1 arms, which are to no user.
182
+ *
144
183
  * @generated from field: kusinta.iot.identity.v1.UserId target_user_id = 1;
145
184
  */
146
185
  targetUserId?: UserId | undefined;
147
186
 
148
187
  /**
149
188
  * The session of target_user_id this message answers. See the contract above.
150
- * Ignored on a heartbeat, which carries no routing target at all.
189
+ * Ignored on a heartbeat, which carries no routing target at all, and on
190
+ * redeem_invite_result, the acknowledgements and the accountlink.v1 arms, which
191
+ * belong to no session.
151
192
  *
152
193
  * @generated from field: string session_id = 5;
153
194
  */
@@ -174,6 +215,48 @@ export declare type GatewayConnectRequest = Message<"kusinta.iot.signaling.v1.Ga
174
215
  */
175
216
  value: HeartBeat;
176
217
  case: "heartbeat";
218
+ } | {
219
+ /**
220
+ * @generated from field: kusinta.iot.signaling.v1.RedeemInviteResult redeem_invite_result = 6;
221
+ */
222
+ value: RedeemInviteResult;
223
+ case: "redeemInviteResult";
224
+ } | {
225
+ /**
226
+ * @generated from field: kusinta.iot.signaling.v1.VouchedAdministratorsApplied vouched_administrators_applied = 7;
227
+ */
228
+ value: VouchedAdministratorsApplied;
229
+ case: "vouchedAdministratorsApplied";
230
+ } | {
231
+ /**
232
+ * @generated from field: kusinta.iot.signaling.v1.TransferOutcomeApplied transfer_outcome_applied = 8;
233
+ */
234
+ value: TransferOutcomeApplied;
235
+ case: "transferOutcomeApplied";
236
+ } | {
237
+ /**
238
+ * @generated from field: kusinta.iot.signaling.v1.GatewayWiped wiped = 9;
239
+ */
240
+ value: GatewayWiped;
241
+ case: "wiped";
242
+ } | {
243
+ /**
244
+ * @generated from field: kusinta.iot.accountlink.v1.AccountLinkResult account_link_result = 10;
245
+ */
246
+ value: AccountLinkResult;
247
+ case: "accountLinkResult";
248
+ } | {
249
+ /**
250
+ * @generated from field: kusinta.iot.accountlink.v1.RefreshToken refresh_token = 11;
251
+ */
252
+ value: RefreshToken;
253
+ case: "refreshToken";
254
+ } | {
255
+ /**
256
+ * @generated from field: kusinta.iot.accountlink.v1.RevokeToken revoke_token = 12;
257
+ */
258
+ value: RevokeToken;
259
+ case: "revokeToken";
177
260
  } | { case: undefined; value?: undefined };
178
261
  };
179
262
 
@@ -190,6 +273,11 @@ export declare const GatewayConnectRequestSchema: GenMessage<GatewayConnectReque
190
273
  */
191
274
  export declare type GatewayConnectResponse = Message<"kusinta.iot.signaling.v1.GatewayConnectResponse"> & {
192
275
  /**
276
+ * On redeem_invite, the user redeeming: the sub of the token the api-server
277
+ * verified, and never a value the user supplied. Unset on what concerns the
278
+ * gateway itself (stream_opened, vouched_administrators, transfer_outcome,
279
+ * gateway_deleted) and on the accountlink.v1 arms, which are from no user.
280
+ *
193
281
  * @generated from field: kusinta.iot.identity.v1.UserId from_user_id = 1;
194
282
  */
195
283
  fromUserId?: UserId | undefined;
@@ -197,7 +285,8 @@ export declare type GatewayConnectResponse = Message<"kusinta.iot.signaling.v1.G
197
285
  /**
198
286
  * The session of from_user_id this message originates from — the value the
199
287
  * gateway must echo on the GatewayConnectRequest that answers it. See the
200
- * contract above.
288
+ * contract above. Unset on redeem_invite, on what concerns the gateway itself
289
+ * and on the accountlink.v1 arms, which belong to no session.
201
290
  *
202
291
  * @generated from field: string session_id = 4;
203
292
  */
@@ -218,6 +307,60 @@ export declare type GatewayConnectResponse = Message<"kusinta.iot.signaling.v1.G
218
307
  */
219
308
  value: IceCandidate;
220
309
  case: "iceCandidate";
310
+ } | {
311
+ /**
312
+ * @generated from field: kusinta.iot.signaling.v1.RedeemInvite redeem_invite = 5;
313
+ */
314
+ value: RedeemInvite;
315
+ case: "redeemInvite";
316
+ } | {
317
+ /**
318
+ * @generated from field: kusinta.iot.signaling.v1.VouchedAdministrators vouched_administrators = 6;
319
+ */
320
+ value: VouchedAdministrators;
321
+ case: "vouchedAdministrators";
322
+ } | {
323
+ /**
324
+ * @generated from field: kusinta.iot.signaling.v1.TransferOutcome transfer_outcome = 7;
325
+ */
326
+ value: TransferOutcome;
327
+ case: "transferOutcome";
328
+ } | {
329
+ /**
330
+ * @generated from field: kusinta.iot.signaling.v1.GatewayStreamOpened stream_opened = 8;
331
+ */
332
+ value: GatewayStreamOpened;
333
+ case: "streamOpened";
334
+ } | {
335
+ /**
336
+ * @generated from field: kusinta.iot.signaling.v1.GatewayDeleted gateway_deleted = 9;
337
+ */
338
+ value: GatewayDeleted;
339
+ case: "gatewayDeleted";
340
+ } | {
341
+ /**
342
+ * @generated from field: kusinta.iot.accountlink.v1.AccountLinked account_linked = 10;
343
+ */
344
+ value: AccountLinked;
345
+ case: "accountLinked";
346
+ } | {
347
+ /**
348
+ * @generated from field: kusinta.iot.accountlink.v1.TokenRefreshed token_refreshed = 11;
349
+ */
350
+ value: TokenRefreshed;
351
+ case: "tokenRefreshed";
352
+ } | {
353
+ /**
354
+ * @generated from field: kusinta.iot.accountlink.v1.TokenRevoked token_revoked = 12;
355
+ */
356
+ value: TokenRevoked;
357
+ case: "tokenRevoked";
358
+ } | {
359
+ /**
360
+ * @generated from field: kusinta.iot.accountlink.v1.AccountLinkCancelled account_link_cancelled = 13;
361
+ */
362
+ value: AccountLinkCancelled;
363
+ case: "accountLinkCancelled";
221
364
  } | { case: undefined; value?: undefined };
222
365
  };
223
366
 
@@ -227,6 +370,497 @@ export declare type GatewayConnectResponse = Message<"kusinta.iot.signaling.v1.G
227
370
  */
228
371
  export declare const GatewayConnectResponseSchema: GenMessage<GatewayConnectResponse>;
229
372
 
373
+ /**
374
+ * A person redeeming an invite (webrtc.v1 CreateInvite), api-server → gateway.
375
+ * Answered with a RedeemInviteResult carrying the same request_id.
376
+ *
377
+ * The api-server sends it only to the gateway whose invite routes hold the
378
+ * secret's hash (reporting.v1.ReportInviteRoutesRequest), and only for a user
379
+ * whose account has a verified email: it answers a user without one itself,
380
+ * before routing. A hash held by more than one gateway routes nowhere and is
381
+ * answered as INVALID.
382
+ *
383
+ * A code is 40 bits, few enough to guess at. The api-server limits how often each
384
+ * user, and each client address, may redeem, and answers past that limit itself.
385
+ *
386
+ * The api-server waits at least 30 seconds for the result. With no result by
387
+ * then, or no stream to send on, it tells the user to try again later; the redeem
388
+ * may or may not have been done. Trying again is safe: a redeem is idempotent for
389
+ * its user (see RedeemOutcome).
390
+ *
391
+ * @generated from message kusinta.iot.signaling.v1.RedeemInvite
392
+ */
393
+ export declare type RedeemInvite = Message<"kusinta.iot.signaling.v1.RedeemInvite"> & {
394
+ /**
395
+ * Minted by the api-server, opaque, unique among its redeems in flight.
396
+ *
397
+ * @generated from field: string request_id = 1;
398
+ */
399
+ requestId: string;
400
+
401
+ /**
402
+ * The secret as the user gave it: the token from a link, or the code as typed.
403
+ * The gateway hashes and normalises as webrtc.v1 invite.proto says.
404
+ *
405
+ * @generated from oneof kusinta.iot.signaling.v1.RedeemInvite.secret
406
+ */
407
+ secret: {
408
+ /**
409
+ * @generated from field: string token = 2;
410
+ */
411
+ value: string;
412
+ case: "token";
413
+ } | {
414
+ /**
415
+ * @generated from field: string code = 3;
416
+ */
417
+ value: string;
418
+ case: "code";
419
+ } | { case: undefined; value?: undefined };
420
+
421
+ /**
422
+ * The display name the user's token carries, for the join request it may make, by the
423
+ * same rule as webrtc.v1.AppTokenClaims.name: the identity provider's display-name claim
424
+ * alone, never a username or an email address. May be empty.
425
+ *
426
+ * @generated from field: string display_name = 4;
427
+ */
428
+ displayName: string;
429
+
430
+ /**
431
+ * The verified email address of the user's account, as their token states it.
432
+ * Never an address the token does not mark verified.
433
+ *
434
+ * @generated from field: string verified_email = 5;
435
+ */
436
+ verifiedEmail: string;
437
+ };
438
+
439
+ /**
440
+ * Describes the message kusinta.iot.signaling.v1.RedeemInvite.
441
+ * Use `create(RedeemInviteSchema)` to create a new message.
442
+ */
443
+ export declare const RedeemInviteSchema: GenMessage<RedeemInvite>;
444
+
445
+ /**
446
+ * The answer to a RedeemInvite, gateway → api-server.
447
+ *
448
+ * @generated from message kusinta.iot.signaling.v1.RedeemInviteResult
449
+ */
450
+ export declare type RedeemInviteResult = Message<"kusinta.iot.signaling.v1.RedeemInviteResult"> & {
451
+ /**
452
+ * As RedeemInvite.request_id.
453
+ *
454
+ * @generated from field: string request_id = 1;
455
+ */
456
+ requestId: string;
457
+
458
+ /**
459
+ * @generated from field: kusinta.iot.signaling.v1.RedeemOutcome outcome = 2;
460
+ */
461
+ outcome: RedeemOutcome;
462
+ };
463
+
464
+ /**
465
+ * Describes the message kusinta.iot.signaling.v1.RedeemInviteResult.
466
+ * Use `create(RedeemInviteResultSchema)` to create a new message.
467
+ */
468
+ export declare const RedeemInviteResultSchema: GenMessage<RedeemInviteResult>;
469
+
470
+ /**
471
+ * The api-server's first message on every GatewayConnect stream, sent before any other. It
472
+ * carries the ownership epoch of the gateway's owner record.
473
+ *
474
+ * OWNER OF RECORD. A gateway is owned by an organisation, which the api-server keeps; the
475
+ * organisation's administrators are the gateway's vouched administrators. The api-server
476
+ * vouches for them twice: in the token of each session one of them opens
477
+ * (webrtc.v1.AppTokenClaims.roles), and to the gateway, as the whole set
478
+ * (VouchedAdministrators). Neither can be changed on the gateway. A gateway moves to another
479
+ * organisation only by a transfer the receiving organisation accepted (TransferOutcome).
480
+ *
481
+ * OWNERSHIP EPOCH. An opaque id the api-server gives each owner record of a gateway. It is new
482
+ * at the first registration after the gateway was deleted, and only then: a revoke, a
483
+ * re-registration by the owning organisation and a transfer all keep it. The gateway takes it
484
+ * from the api-server's answer to its own registration (registration.v1.RegistrationComplete)
485
+ * and from this message, and from nowhere else: never from an app session, nor from anything an
486
+ * app hands over, the registration token included. It keeps the epoch it holds across restarts.
487
+ *
488
+ * Given an epoch other than the one it holds, the gateway wipes people and history (see
489
+ * GatewayDeleted, WIPE), space names included, before it admits any session or applies anything
490
+ * else from that registration or stream, and then holds the new epoch. A gateway holding no epoch takes the first it is given and wipes nothing. The
491
+ * epoch it holds, given again, changes nothing, so the same epoch twice wipes once.
492
+ *
493
+ * A gateway that holds an epoch treats a stream on which anything arrives before this message,
494
+ * or this message with an empty epoch, as not open: it applies nothing from it and closes it.
495
+ * So the api-server must send this message first on every stream before a gateway that
496
+ * requires it is deployed.
497
+ *
498
+ * @generated from message kusinta.iot.signaling.v1.GatewayStreamOpened
499
+ */
500
+ export declare type GatewayStreamOpened = Message<"kusinta.iot.signaling.v1.GatewayStreamOpened"> & {
501
+ /**
502
+ * @generated from field: string ownership_epoch = 1;
503
+ */
504
+ ownershipEpoch: string;
505
+ };
506
+
507
+ /**
508
+ * Describes the message kusinta.iot.signaling.v1.GatewayStreamOpened.
509
+ * Use `create(GatewayStreamOpenedSchema)` to create a new message.
510
+ */
511
+ export declare const GatewayStreamOpenedSchema: GenMessage<GatewayStreamOpened>;
512
+
513
+ /**
514
+ * The gateway was deleted at the api-server, api-server → gateway: the owner record with
515
+ * ownership_epoch has ended, and the gateway decommissions at once. Sent to a connected gateway
516
+ * before the api-server ends its stream, and answered with GatewayWiped. A gateway offline when
517
+ * it is deleted learns it from the new epoch at its next registration instead
518
+ * (GatewayStreamOpened, OWNERSHIP EPOCH), and wipes then just as it would have now.
519
+ *
520
+ * A delete is not a revoke. A revoke ends the gateway's certificate and keeps its owner: it sends
521
+ * no notice and wipes nothing, and a revoked gateway registered again by the owning organisation
522
+ * keeps everything. A delete ends the owner record itself, so the gateway starts empty for
523
+ * whoever registers it next, and nothing about people is carried to an organisation that did not
524
+ * choose it.
525
+ *
526
+ * A notice naming the epoch the gateway holds makes it wipe at once, in the scope asked and
527
+ * before it applies anything else, and then hold no epoch. A repeat of the notice it last applied
528
+ * is acknowledged again as before and changes nothing; a notice naming any other epoch is
529
+ * ignored.
530
+ *
531
+ * WIPE. A wipe of people and history (WIPE_SCOPE_PEOPLE_AND_HISTORY) keeps the building's setup:
532
+ * its spaces, with their structure and types; its devices and how they are filed; device links;
533
+ * connector configuration; the building's time zone; and the gateway's own credentials and the
534
+ * settings that are not about people. Everything about people goes: every user, role,
535
+ * membership and residency, with its residency id; every invite, join request and promotion
536
+ * request; every name and email address; the vouched administrators and their version; every end
537
+ * of access; every device's ownership, an owned device staying filed where it is, released, as
538
+ * one of the building's own; every contact; and everything recorded per home — room history,
539
+ * climate summaries, events, targets, modes and routines — including what is still queued for the
540
+ * api-server about any of them, and the gateway's own records of who did what. No home is held
541
+ * vacant after it (webrtc.v1 household.proto, VACANCY SETBACK): with every residency gone,
542
+ * nothing is left to show that anyone lived in any home, so the setback ends in all of them. A
543
+ * home's own wipe (household.proto, WIPE) keeps it. Every open session ends, and none is
544
+ * admitted until the wipe is done.
545
+ *
546
+ * Logs. A wipe takes what the gateway itself keeps; the operating system's log of the host it
547
+ * runs on is not the gateway's to erase, and what it holds stays until the host's own retention
548
+ * drops it. A gateway SHOULD NOT write user ids or names to that log in normal operation, so that
549
+ * nothing about people outlives a wipe there.
550
+ *
551
+ * It always renames every space too, since a name can name a person ("Ilse's room"): each gets a
552
+ * generic name, its type and its number among the spaces of that type under the same parent,
553
+ * counted from 1 in the order the gateway lists them — "Apartment 1", "Floor 2", "Room 3". In
554
+ * English, as here, since nothing on the gateway knows the building's language. The renaming is
555
+ * part of the wipe: done in the same step, all of it or none, and keyed by the same epoch, so it
556
+ * is done once per epoch as the rest is.
557
+ * No space is removed or moved by it; each keeps its type, its place in the structure, its
558
+ * devices, its filing and its links.
559
+ *
560
+ * The gateway then reports as a gateway starting afresh does: on new streams, a snapshot with no
561
+ * members (reporting.v1.ReportMembersRequest), no service reach and no invite routes, so the
562
+ * api-server's record of who belongs to the gateway empties too.
563
+ *
564
+ * @generated from message kusinta.iot.signaling.v1.GatewayDeleted
565
+ */
566
+ export declare type GatewayDeleted = Message<"kusinta.iot.signaling.v1.GatewayDeleted"> & {
567
+ /**
568
+ * @generated from field: string ownership_epoch = 1;
569
+ */
570
+ ownershipEpoch: string;
571
+
572
+ /**
573
+ * @generated from field: kusinta.iot.signaling.v1.WipeScope scope = 2;
574
+ */
575
+ scope: WipeScope;
576
+ };
577
+
578
+ /**
579
+ * Describes the message kusinta.iot.signaling.v1.GatewayDeleted.
580
+ * Use `create(GatewayDeletedSchema)` to create a new message.
581
+ */
582
+ export declare const GatewayDeletedSchema: GenMessage<GatewayDeleted>;
583
+
584
+ /**
585
+ * The gateway's acknowledgement of a GatewayDeleted, gateway → api-server: what it wiped.
586
+ *
587
+ * For WIPE_SCOPE_PEOPLE_AND_HISTORY, sent once the wipe is done. For WIPE_SCOPE_FACTORY_RESET,
588
+ * sent once everything but the gateway's credentials is gone and before it erases those, since
589
+ * sending needs them; the credentials go at once after. The api-server then revokes the gateway's
590
+ * certificate.
591
+ *
592
+ * @generated from message kusinta.iot.signaling.v1.GatewayWiped
593
+ */
594
+ export declare type GatewayWiped = Message<"kusinta.iot.signaling.v1.GatewayWiped"> & {
595
+ /**
596
+ * As GatewayDeleted.ownership_epoch.
597
+ *
598
+ * @generated from field: string ownership_epoch = 1;
599
+ */
600
+ ownershipEpoch: string;
601
+
602
+ /**
603
+ * The scope the gateway applied: WIPE_SCOPE_PEOPLE_AND_HISTORY when it was asked for that, and
604
+ * when it was asked for a factory reset it does not perform.
605
+ *
606
+ * @generated from field: kusinta.iot.signaling.v1.WipeScope scope = 2;
607
+ */
608
+ scope: WipeScope;
609
+
610
+ /**
611
+ * With WIPE_SCOPE_FACTORY_RESET: each piece of other hardware that still holds pairings the
612
+ * reset could not reach, for the person who asked to reset it by hand. Empty otherwise.
613
+ *
614
+ * @generated from field: repeated kusinta.iot.signaling.v1.PairingsLeftBehind left_behind = 3;
615
+ */
616
+ leftBehind: PairingsLeftBehind[];
617
+ };
618
+
619
+ /**
620
+ * Describes the message kusinta.iot.signaling.v1.GatewayWiped.
621
+ * Use `create(GatewayWipedSchema)` to create a new message.
622
+ */
623
+ export declare const GatewayWipedSchema: GenMessage<GatewayWiped>;
624
+
625
+ /**
626
+ * Hardware a connector drives that keeps its own pairings through a factory reset.
627
+ *
628
+ * @generated from message kusinta.iot.signaling.v1.PairingsLeftBehind
629
+ */
630
+ export declare type PairingsLeftBehind = Message<"kusinta.iot.signaling.v1.PairingsLeftBehind"> & {
631
+ /**
632
+ * As the connector described itself (webrtc.v1.ConnectorDescriptor): what kind of hardware,
633
+ * and its name, for a person.
634
+ *
635
+ * @generated from field: kusinta.iot.common.v1.ConnectorKind kind = 1;
636
+ */
637
+ kind: ConnectorKind;
638
+
639
+ /**
640
+ * @generated from field: string display_name = 2;
641
+ */
642
+ displayName: string;
643
+ };
644
+
645
+ /**
646
+ * Describes the message kusinta.iot.signaling.v1.PairingsLeftBehind.
647
+ * Use `create(PairingsLeftBehindSchema)` to create a new message.
648
+ */
649
+ export declare const PairingsLeftBehindSchema: GenMessage<PairingsLeftBehind>;
650
+
651
+ /**
652
+ * The administrators of the organisation that owns the gateway, api-server → gateway: the whole
653
+ * set each time, never a change to it.
654
+ *
655
+ * The api-server sends it on every stream, after GatewayStreamOpened and any unacknowledged
656
+ * TransferOutcome, and again whenever the set or the organisation's name changes. It sends the
657
+ * newest set again on every stream until the gateway acknowledges its version
658
+ * (VouchedAdministratorsApplied).
659
+ *
660
+ * It grants nothing on its own. A session holds ROLE_GATEWAY_ADMIN as a vouched administrator
661
+ * only when the token it opened with carries it (webrtc.v1.AppTokenClaims.roles); a user named
662
+ * here who connects with a token that does not is no administrator in that session. What the set
663
+ * says is who the administrators are between their tokens:
664
+ * * every user it names is a member of the gateway, listed as a vouched administrator
665
+ * (webrtc.v1.MemberDetail.vouched_admin) and counted under ROLE_GATEWAY_ADMIN, whether or not
666
+ * the gateway has seen them connect. Their name and email address are learnt from their own
667
+ * tokens, and are unknown until then;
668
+ * * their administration cannot be changed on the gateway (webrtc.v1 members.proto,
669
+ * "vouched_admin");
670
+ * * when a set the gateway applies drops a user, the gateway ends the administration of every
671
+ * open session of theirs at once, without waiting for them to reconnect: the session loses
672
+ * ROLE_GATEWAY_ADMIN as any change of role reaches it (webrtc.v1.LivePermissionUpdate,
673
+ * session_roles), unless the gateway holds that role for them itself;
674
+ * * a token issued (AppTokenClaims.iat, in whole seconds) no later than the second in which
675
+ * the set the gateway holds was issued, for a user that set does not name, vouches for no
676
+ * administration, so a token minted before a user was dropped cannot bring it back. A token
677
+ * issued later is honoured whether or not the set names its user, since the set may lag
678
+ * behind it.
679
+ *
680
+ * Safe to lose, repeat and reorder: the gateway applies a set only when its version is above the
681
+ * one it holds, ignores any other, and acknowledges each with the version it then holds. It keeps
682
+ * the set it holds, with its version and issued_at, across restarts, so a restart forgets nothing
683
+ * before the stream opens again. A wipe drops it, version included (GatewayDeleted, WIPE), so the
684
+ * versions of a new owner record start afresh.
685
+ *
686
+ * @generated from message kusinta.iot.signaling.v1.VouchedAdministrators
687
+ */
688
+ export declare type VouchedAdministrators = Message<"kusinta.iot.signaling.v1.VouchedAdministrators"> & {
689
+ /**
690
+ * Above that of every set the api-server sent before under the same ownership epoch. Never zero.
691
+ *
692
+ * @generated from field: uint64 version = 1;
693
+ */
694
+ version: bigint;
695
+
696
+ /**
697
+ * Each administrator of the owning organisation, once. Never empty, since an organisation
698
+ * always has one. The set carries no one's name or email address.
699
+ *
700
+ * @generated from field: repeated kusinta.iot.identity.v1.UserId administrators = 2;
701
+ */
702
+ administrators: UserId[];
703
+
704
+ /**
705
+ * The owning organisation's name, as its administrators set it: what
706
+ * webrtc.v1.PrivacyDisclosure.owner_organisation_name tells. Never its organisation number.
707
+ *
708
+ * @generated from field: string organisation_name = 3;
709
+ */
710
+ organisationName: string;
711
+
712
+ /**
713
+ * When the api-server made this set, on the clock that sets AppTokenClaims.iat, so the two
714
+ * compare. Never earlier than an earlier version's.
715
+ *
716
+ * @generated from field: google.protobuf.Timestamp issued_at = 4;
717
+ */
718
+ issuedAt?: Timestamp | undefined;
719
+ };
720
+
721
+ /**
722
+ * Describes the message kusinta.iot.signaling.v1.VouchedAdministrators.
723
+ * Use `create(VouchedAdministratorsSchema)` to create a new message.
724
+ */
725
+ export declare const VouchedAdministratorsSchema: GenMessage<VouchedAdministrators>;
726
+
727
+ /**
728
+ * The gateway's acknowledgement of a VouchedAdministrators, gateway → api-server.
729
+ *
730
+ * @generated from message kusinta.iot.signaling.v1.VouchedAdministratorsApplied
731
+ */
732
+ export declare type VouchedAdministratorsApplied = Message<"kusinta.iot.signaling.v1.VouchedAdministratorsApplied"> & {
733
+ /**
734
+ * The version the gateway holds once it has applied or ignored the set, which may be above
735
+ * the one acknowledged. The api-server sends no set at or below it again.
736
+ *
737
+ * @generated from field: uint64 version = 1;
738
+ */
739
+ version: bigint;
740
+ };
741
+
742
+ /**
743
+ * Describes the message kusinta.iot.signaling.v1.VouchedAdministratorsApplied.
744
+ * Use `create(VouchedAdministratorsAppliedSchema)` to create a new message.
745
+ */
746
+ export declare const VouchedAdministratorsAppliedSchema: GenMessage<VouchedAdministratorsApplied>;
747
+
748
+ /**
749
+ * A transfer of the gateway to another organisation, accepted by an administrator of the
750
+ * receiving one, api-server → gateway. It carries the receiving organisation's vouched set and
751
+ * what becomes of each outgoing staff member, and the gateway applies the two in one step — all
752
+ * of it or none — before anything after it on the stream. The ownership epoch is kept: residents,
753
+ * technicians, spaces and devices stay as they are.
754
+ *
755
+ * The api-server keeps an outcome until the gateway acknowledges it (TransferOutcomeApplied),
756
+ * through the gateway's offline spells, and sends it on every stream right after
757
+ * GatewayStreamOpened. While one is unacknowledged it sends the vouched set only inside it, as
758
+ * administrators, the newest set. Applying is idempotent by transfer_id: an outcome already
759
+ * applied is acknowledged again, its outgoing choices are not applied again, and its set is
760
+ * applied as any VouchedAdministrators is, by version.
761
+ *
762
+ * The outgoing staff are everyone named in outgoing and everyone holding ROLE_GATEWAY_ADMIN or
763
+ * ROLE_PROPERTY_OWNER on the gateway as the outcome is applied — save anyone the new set names,
764
+ * who is of the receiving organisation and is left as they are. The api-server names in outgoing
765
+ * every administrator of the sending organisation, and everyone it holds as reported with
766
+ * ROLE_GATEWAY_ADMIN or ROLE_PROPERTY_OWNER (reporting.v1.GatewayMember). Each outgoing staff
767
+ * member either:
768
+ * * leaves: their choice is LEAVE, UNSPECIFIED or a value the gateway does not know, or they
769
+ * are not named in outgoing at all, so a transfer keeps no one by omission. The gateway takes
770
+ * every role it holds for them and every SERVICE membership, with the pending invites they
771
+ * made as staff, as RemoveFromGateway by user id does from a caller who lives in none of
772
+ * their homes. It never ends a residency, nor the invites they made as its resident;
773
+ * * or stays as a technician: STAY_AS_TECHNICIAN. The gateway takes ROLE_GATEWAY_ADMIN and
774
+ * ROLE_PROPERTY_OWNER as webrtc.v1.SetMemberRole taking them away does, gives
775
+ * ROLE_TECHNICIAN, keeps their SERVICE memberships, files them SERVICE on every top-level
776
+ * space they are not filed on, and sets access_until as webrtc.v1.SetAccessUntil does. One
777
+ * whose access_until is not after the moment the outcome is applied leaves instead.
778
+ * Every change reaches the outgoing staff's open sessions at once, as a change of role does.
779
+ *
780
+ * @generated from message kusinta.iot.signaling.v1.TransferOutcome
781
+ */
782
+ export declare type TransferOutcome = Message<"kusinta.iot.signaling.v1.TransferOutcome"> & {
783
+ /**
784
+ * Minted by the api-server, opaque, unique among the gateway's transfers.
785
+ *
786
+ * @generated from field: string transfer_id = 1;
787
+ */
788
+ transferId: string;
789
+
790
+ /**
791
+ * The receiving organisation's vouched set, as it stands.
792
+ *
793
+ * @generated from field: kusinta.iot.signaling.v1.VouchedAdministrators administrators = 2;
794
+ */
795
+ administrators?: VouchedAdministrators | undefined;
796
+
797
+ /**
798
+ * What becomes of each outgoing staff member, once each.
799
+ *
800
+ * @generated from field: repeated kusinta.iot.signaling.v1.OutgoingChoice outgoing = 3;
801
+ */
802
+ outgoing: OutgoingChoice[];
803
+ };
804
+
805
+ /**
806
+ * Describes the message kusinta.iot.signaling.v1.TransferOutcome.
807
+ * Use `create(TransferOutcomeSchema)` to create a new message.
808
+ */
809
+ export declare const TransferOutcomeSchema: GenMessage<TransferOutcome>;
810
+
811
+ /**
812
+ * What a transfer does with one outgoing staff member (TransferOutcome).
813
+ *
814
+ * @generated from message kusinta.iot.signaling.v1.OutgoingChoice
815
+ */
816
+ export declare type OutgoingChoice = Message<"kusinta.iot.signaling.v1.OutgoingChoice"> & {
817
+ /**
818
+ * @generated from field: kusinta.iot.identity.v1.UserId user_id = 1;
819
+ */
820
+ userId?: UserId | undefined;
821
+
822
+ /**
823
+ * @generated from field: kusinta.iot.signaling.v1.OutgoingStaffChoice choice = 2;
824
+ */
825
+ choice: OutgoingStaffChoice;
826
+
827
+ /**
828
+ * When their access as a technician ends; unset for no end. Only with STAY_AS_TECHNICIAN, and
829
+ * ignored with any other choice.
830
+ *
831
+ * @generated from field: google.protobuf.Timestamp access_until = 3;
832
+ */
833
+ accessUntil?: Timestamp | undefined;
834
+ };
835
+
836
+ /**
837
+ * Describes the message kusinta.iot.signaling.v1.OutgoingChoice.
838
+ * Use `create(OutgoingChoiceSchema)` to create a new message.
839
+ */
840
+ export declare const OutgoingChoiceSchema: GenMessage<OutgoingChoice>;
841
+
842
+ /**
843
+ * The gateway's acknowledgement of a TransferOutcome, gateway → api-server: applied now or
844
+ * before. It acknowledges the outcome's vouched set too. The api-server sends the outcome no
845
+ * more.
846
+ *
847
+ * @generated from message kusinta.iot.signaling.v1.TransferOutcomeApplied
848
+ */
849
+ export declare type TransferOutcomeApplied = Message<"kusinta.iot.signaling.v1.TransferOutcomeApplied"> & {
850
+ /**
851
+ * As TransferOutcome.transfer_id.
852
+ *
853
+ * @generated from field: string transfer_id = 1;
854
+ */
855
+ transferId: string;
856
+ };
857
+
858
+ /**
859
+ * Describes the message kusinta.iot.signaling.v1.TransferOutcomeApplied.
860
+ * Use `create(TransferOutcomeAppliedSchema)` to create a new message.
861
+ */
862
+ export declare const TransferOutcomeAppliedSchema: GenMessage<TransferOutcomeApplied>;
863
+
230
864
  /**
231
865
  * Messages sent by the app (GatewaySignalingService.UserConnect stream).
232
866
  * Auth: Authorization: Bearer <jwt> in gRPC request metadata (validated by interceptor).
@@ -244,6 +878,10 @@ export declare type UserConnectRequest = Message<"kusinta.iot.signaling.v1.UserC
244
878
  sessionId: string;
245
879
 
246
880
  /**
881
+ * A payload added here, the handshake aside, belongs in UserSendRequest too:
882
+ * the half-duplex form of this leg carries the same upstream messages, and
883
+ * nothing fails if one of them is only added to one of the two.
884
+ *
247
885
  * @generated from oneof kusinta.iot.signaling.v1.UserConnectRequest.payload
248
886
  */
249
887
  payload: {
@@ -276,6 +914,10 @@ export declare const UserConnectRequestSchema: GenMessage<UserConnectRequest>;
276
914
  /**
277
915
  * Messages sent by the api-server to the app.
278
916
  *
917
+ * One oneof serves both forms of the leg: UserListenResponse wraps this message
918
+ * rather than restating its payloads, so an arm added here reaches the bidi and
919
+ * half-duplex forms alike.
920
+ *
279
921
  * @generated from message kusinta.iot.signaling.v1.UserConnectResponse
280
922
  */
281
923
  export declare type UserConnectResponse = Message<"kusinta.iot.signaling.v1.UserConnectResponse"> & {
@@ -283,6 +925,7 @@ export declare type UserConnectResponse = Message<"kusinta.iot.signaling.v1.User
283
925
  * Echoes the session_id of the stream this message is delivered on, so a
284
926
  * client can assert the relay routed to the session it thinks it is. See the
285
927
  * contract above.
928
+ * Ignored on a heartbeat, which carries no routing target at all.
286
929
  *
287
930
  * @generated from field: string session_id = 4;
288
931
  */
@@ -309,6 +952,22 @@ export declare type UserConnectResponse = Message<"kusinta.iot.signaling.v1.User
309
952
  */
310
953
  value: IceCandidate;
311
954
  case: "iceCandidate";
955
+ } | {
956
+ /**
957
+ * Keeps a silent stream alive. UserListen is downstream-only — the client
958
+ * opens it with a handshake and then writes nothing — so between the
959
+ * acknowledgement and an answer there is no traffic in either direction, and
960
+ * an idle negotiation can outlast a proxy's patience. Upstream cannot help:
961
+ * the client has nothing to send, and it is traffic *to* the client that
962
+ * resets a client-side idle timer.
963
+ *
964
+ * A client that does not know this arm sees an unset payload rather than an
965
+ * error, which is what the oneof buys.
966
+ *
967
+ * @generated from field: kusinta.iot.signaling.v1.HeartBeat heartbeat = 5;
968
+ */
969
+ value: HeartBeat;
970
+ case: "heartbeat";
312
971
  } | { case: undefined; value?: undefined };
313
972
  };
314
973
 
@@ -318,3 +977,276 @@ export declare type UserConnectResponse = Message<"kusinta.iot.signaling.v1.User
318
977
  */
319
978
  export declare const UserConnectResponseSchema: GenMessage<UserConnectResponse>;
320
979
 
980
+ /**
981
+ * The app leg of the protocol exists twice. UserConnect is one bidi stream, and
982
+ * is what a client uses when its transport can stream a request body. A client
983
+ * whose transport cannot — a browser, whose fetch API has no full-duplex request
984
+ * stream — uses UserListen and UserSend instead. Both forms carry the same
985
+ * messages and are served by the same relay: once a session is live, how it was
986
+ * opened is not observable.
987
+ *
988
+ * Opens the downstream half of a half-duplex app session, and carries the
989
+ * handshake that is the first frame of the bidi form. Field numbers are those of
990
+ * the equivalent UserConnectRequest, so the two cannot be confused on the wire.
991
+ *
992
+ * @generated from message kusinta.iot.signaling.v1.UserListenRequest
993
+ */
994
+ export declare type UserListenRequest = Message<"kusinta.iot.signaling.v1.UserListenRequest"> & {
995
+ /**
996
+ * @generated from field: kusinta.iot.signaling.v1.UserHandshake handshake = 1;
997
+ */
998
+ handshake?: UserHandshake | undefined;
999
+
1000
+ /**
1001
+ * This client's session: opaque, minted by the client, stable across
1002
+ * reconnects, never a credential, and required. See the contract above.
1003
+ *
1004
+ * @generated from field: string session_id = 4;
1005
+ */
1006
+ sessionId: string;
1007
+ };
1008
+
1009
+ /**
1010
+ * Describes the message kusinta.iot.signaling.v1.UserListenRequest.
1011
+ * Use `create(UserListenRequestSchema)` to create a new message.
1012
+ */
1013
+ export declare const UserListenRequestSchema: GenMessage<UserListenRequest>;
1014
+
1015
+ /**
1016
+ * One message of the downstream half. Wraps the response the bidi form delivers
1017
+ * directly, rather than restating its payloads: a response message is not shared
1018
+ * between two rpcs, and a second copy of the oneof would be free to drift from
1019
+ * the first.
1020
+ *
1021
+ * @generated from message kusinta.iot.signaling.v1.UserListenResponse
1022
+ */
1023
+ export declare type UserListenResponse = Message<"kusinta.iot.signaling.v1.UserListenResponse"> & {
1024
+ /**
1025
+ * @generated from field: kusinta.iot.signaling.v1.UserConnectResponse response = 1;
1026
+ */
1027
+ response?: UserConnectResponse | undefined;
1028
+ };
1029
+
1030
+ /**
1031
+ * Describes the message kusinta.iot.signaling.v1.UserListenResponse.
1032
+ * Use `create(UserListenResponseSchema)` to create a new message.
1033
+ */
1034
+ export declare const UserListenResponseSchema: GenMessage<UserListenResponse>;
1035
+
1036
+ /**
1037
+ * One upstream message of a half-duplex app session, delivered by its own call.
1038
+ *
1039
+ * The session must already be open, which is what makes ordering the caller's
1040
+ * job: the handshake is acknowledged on the UserListen stream, and a UserSend
1041
+ * issued before that acknowledgement names a session the relay does not hold
1042
+ * yet. It is refused, not queued. Two sends racing each other can also arrive
1043
+ * out of order, so a caller that must preserve order — an offer before the
1044
+ * candidates that belong to it — issues them one at a time.
1045
+ *
1046
+ * @generated from message kusinta.iot.signaling.v1.UserSendRequest
1047
+ */
1048
+ export declare type UserSendRequest = Message<"kusinta.iot.signaling.v1.UserSendRequest"> & {
1049
+ /**
1050
+ * The session to deliver into. See the contract above.
1051
+ *
1052
+ * @generated from field: string session_id = 4;
1053
+ */
1054
+ sessionId: string;
1055
+
1056
+ /**
1057
+ * @generated from oneof kusinta.iot.signaling.v1.UserSendRequest.payload
1058
+ */
1059
+ payload: {
1060
+ /**
1061
+ * @generated from field: kusinta.iot.signaling.v1.SdpOffer offer = 2;
1062
+ */
1063
+ value: SdpOffer;
1064
+ case: "offer";
1065
+ } | {
1066
+ /**
1067
+ * @generated from field: kusinta.iot.signaling.v1.IceCandidate ice_candidate = 3;
1068
+ */
1069
+ value: IceCandidate;
1070
+ case: "iceCandidate";
1071
+ } | { case: undefined; value?: undefined };
1072
+ };
1073
+
1074
+ /**
1075
+ * Describes the message kusinta.iot.signaling.v1.UserSendRequest.
1076
+ * Use `create(UserSendRequestSchema)` to create a new message.
1077
+ */
1078
+ export declare const UserSendRequestSchema: GenMessage<UserSendRequest>;
1079
+
1080
+ /**
1081
+ * Empty. Delivery is acknowledged by the call succeeding; a message that could
1082
+ * not be routed fails the call instead.
1083
+ *
1084
+ * @generated from message kusinta.iot.signaling.v1.UserSendResponse
1085
+ */
1086
+ export declare type UserSendResponse = Message<"kusinta.iot.signaling.v1.UserSendResponse"> & {
1087
+ };
1088
+
1089
+ /**
1090
+ * Describes the message kusinta.iot.signaling.v1.UserSendResponse.
1091
+ * Use `create(UserSendResponseSchema)` to create a new message.
1092
+ */
1093
+ export declare const UserSendResponseSchema: GenMessage<UserSendResponse>;
1094
+
1095
+ /**
1096
+ * What redeeming an invite did, as the gateway decided it.
1097
+ *
1098
+ * A redeem is idempotent for its user: redeemed again by the same user, for as
1099
+ * long as its secret would have lasted unused, a used invite answers JOINED if
1100
+ * the user is filed on its space by then, and otherwise as it did the first time
1101
+ * — so a denied request still answers PENDING_APPROVAL — except that one which
1102
+ * filed the user, who has left that space since, answers INVALID. To anyone
1103
+ * else it answers INVALID. So a user who never saw the first answer can safely
1104
+ * try again.
1105
+ *
1106
+ * @generated from enum kusinta.iot.signaling.v1.RedeemOutcome
1107
+ */
1108
+ export enum RedeemOutcome {
1109
+ /**
1110
+ * @generated from enum value: REDEEM_OUTCOME_UNSPECIFIED = 0;
1111
+ */
1112
+ UNSPECIFIED = 0,
1113
+
1114
+ /**
1115
+ * The user is a member of the invite's space. Answered only once the
1116
+ * api-server has applied the member report that names them
1117
+ * (reporting.v1.GatewayMember), so the user can connect as soon as they are
1118
+ * told. Also the answer for a user already filed on that space: the invite is
1119
+ * used up, and their membership is left exactly as it was.
1120
+ *
1121
+ * @generated from enum value: REDEEM_OUTCOME_JOINED = 1;
1122
+ */
1123
+ JOINED = 1,
1124
+
1125
+ /**
1126
+ * A join request was made (webrtc.v1.JoinRequest); the user becomes a member
1127
+ * once it is approved. Also the answer for a user who already has one on that
1128
+ * space.
1129
+ *
1130
+ * @generated from enum value: REDEEM_OUTCOME_PENDING_APPROVAL = 2;
1131
+ */
1132
+ PENDING_APPROVAL = 2,
1133
+
1134
+ /**
1135
+ * No invite: unknown, expired, revoked, already used by someone else, a code
1136
+ * for an invite bound to another address, or anything else that is not a
1137
+ * live invite. One answer for all of them, so a redeem tells nothing about
1138
+ * which secrets exist.
1139
+ *
1140
+ * @generated from enum value: REDEEM_OUTCOME_INVALID = 3;
1141
+ */
1142
+ INVALID = 3,
1143
+
1144
+ /**
1145
+ * The invite is bound to an address (webrtc.v1.CreateInvite.email) that is not
1146
+ * the user's verified one. Answered only to a token, which cannot be guessed;
1147
+ * a code bound to another address answers INVALID. Never says which address
1148
+ * it is bound to, and leaves the invite pending.
1149
+ *
1150
+ * @generated from enum value: REDEEM_OUTCOME_WRONG_ACCOUNT = 4;
1151
+ */
1152
+ WRONG_ACCOUNT = 4,
1153
+
1154
+ /**
1155
+ * The invite appoints a household admin (webrtc.v1 household.proto, STAFF APPOINTMENT),
1156
+ * and this user may not be appointed: they created it, or hold a staff role on the gateway.
1157
+ * Also the answer to anyone outside the departing household redeeming a RESIDENT or
1158
+ * HOUSEHOLD_ADMIN invite on a home whose vacated handover is pending (webrtc.v1
1159
+ * household.proto, VACANCY). Leaves the invite pending, for the person it was meant for.
1160
+ * Answered only to a user whose secret matched a live invite, so it tells nothing about
1161
+ * which secrets exist. An
1162
+ * appointment invite on a home that is no longer empty is no invite, and answers INVALID.
1163
+ *
1164
+ * Rollout order: the api-server handles it before a gateway sends it.
1165
+ *
1166
+ * @generated from enum value: REDEEM_OUTCOME_NOT_ELIGIBLE = 5;
1167
+ */
1168
+ NOT_ELIGIBLE = 5,
1169
+ }
1170
+
1171
+ /**
1172
+ * Describes the enum kusinta.iot.signaling.v1.RedeemOutcome.
1173
+ */
1174
+ export declare const RedeemOutcomeSchema: GenEnum<RedeemOutcome>;
1175
+
1176
+ /**
1177
+ * How much a wipe takes (GatewayDeleted).
1178
+ *
1179
+ * @generated from enum kusinta.iot.signaling.v1.WipeScope
1180
+ */
1181
+ export enum WipeScope {
1182
+ /**
1183
+ * Not stated. Read as PEOPLE_AND_HISTORY, as is any value the gateway does not know.
1184
+ *
1185
+ * @generated from enum value: WIPE_SCOPE_UNSPECIFIED = 0;
1186
+ */
1187
+ UNSPECIFIED = 0,
1188
+
1189
+ /**
1190
+ * Decommissioning: people and their history go, every space is given a generic name, and the
1191
+ * rest of the building's setup stays (GatewayDeleted, WIPE).
1192
+ *
1193
+ * @generated from enum value: WIPE_SCOPE_PEOPLE_AND_HISTORY = 1;
1194
+ */
1195
+ PEOPLE_AND_HISTORY = 1,
1196
+
1197
+ /**
1198
+ * Out of the box, for a gateway that is to be used anywhere else: everything the gateway holds
1199
+ * goes — what a wipe of people and history takes and also the building's setup, the gateway's
1200
+ * certificates, keys and registration, connector configuration, the readings connectors store
1201
+ * on the gateway, and the log files it keeps itself (not the host's system log: see WIPE, Logs).
1202
+ * What is held in other hardware is not reached: devices paired
1203
+ * to a radio central the gateway drives stay paired there until that is reset too, and the
1204
+ * gateway says so (GatewayWiped.left_behind).
1205
+ *
1206
+ * A gateway that does not perform a factory reset wipes people and history instead, and says
1207
+ * so in GatewayWiped.scope.
1208
+ *
1209
+ * @generated from enum value: WIPE_SCOPE_FACTORY_RESET = 2;
1210
+ */
1211
+ FACTORY_RESET = 2,
1212
+ }
1213
+
1214
+ /**
1215
+ * Describes the enum kusinta.iot.signaling.v1.WipeScope.
1216
+ */
1217
+ export declare const WipeScopeSchema: GenEnum<WipeScope>;
1218
+
1219
+ /**
1220
+ * Whether an outgoing staff member leaves the gateway or stays on it as a technician. Chosen
1221
+ * per person by the sending organisation's administrator who offered the transfer.
1222
+ *
1223
+ * @generated from enum kusinta.iot.signaling.v1.OutgoingStaffChoice
1224
+ */
1225
+ export enum OutgoingStaffChoice {
1226
+ /**
1227
+ * No choice stated. Read as LEAVE, as is any value the gateway does not know.
1228
+ *
1229
+ * @generated from enum value: OUTGOING_STAFF_CHOICE_UNSPECIFIED = 0;
1230
+ */
1231
+ UNSPECIFIED = 0,
1232
+
1233
+ /**
1234
+ * Leaves: every staff role and SERVICE membership goes, and no residency.
1235
+ *
1236
+ * @generated from enum value: OUTGOING_STAFF_CHOICE_LEAVE = 1;
1237
+ */
1238
+ LEAVE = 1,
1239
+
1240
+ /**
1241
+ * Stays as a technician, with access_until as its end.
1242
+ *
1243
+ * @generated from enum value: OUTGOING_STAFF_CHOICE_STAY_AS_TECHNICIAN = 2;
1244
+ */
1245
+ STAY_AS_TECHNICIAN = 2,
1246
+ }
1247
+
1248
+ /**
1249
+ * Describes the enum kusinta.iot.signaling.v1.OutgoingStaffChoice.
1250
+ */
1251
+ export declare const OutgoingStaffChoiceSchema: GenEnum<OutgoingStaffChoice>;
1252
+