@m1kad0/hannah-proto 0.5.2 → 0.5.4

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.
package/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # hannah-proto
2
+
3
+ Protobuf/gRPC schema definitions for the Hannah voice assistant ecosystem (Core, satellites, WebUI, ioBroker adapter, Telegram bot, and other consumers). This repo is the single source of truth for the wire protocol shared across all of them.
4
+
5
+ The `.proto` files live flat at the repo root, one per functional area — satellite control, event streaming, the ioBroker agent bridge, user registry, timers, automations, and so on. Nothing here is application code, just schema.
6
+
7
+ ## Distribution
8
+
9
+ Three independent, tag-triggered publish targets — pick whichever matches your language. Each contains only generated gRPC stubs/types for the current tagged release.
10
+
11
+ | Language | Package | Install |
12
+ |------------|------------------------------------------|---------------------------------------------|
13
+ | Python | PyPI [`hannah-proto`](https://pypi.org/project/hannah-proto/) | `pip install hannah-proto` |
14
+ | TypeScript | npm [`@m1kad0/hannah-proto`](https://www.npmjs.com/package/@m1kad0/hannah-proto) | `npm install @m1kad0/hannah-proto` |
15
+ | Go | [github.com/NurPech/hannah-proto-go](https://github.com/NurPech/hannah-proto-go) | `go get github.com/NurPech/hannah-proto-go` |
16
+
17
+ Go has no separate package registry, so that tagged GitHub repo *is* the package — `go get` resolves it directly.
18
+
19
+ ## Versioning: PROTO_VERSION
20
+
21
+ Alongside the semver package/tag version, every release carries a single-integer `PROTO_VERSION` (see the `PROTO_VERSION` file). Hannah Core and its clients exchange this value on every call and reject a mismatch at runtime — that's the actual compatibility gate, not the semver tag. A breaking schema change requires bumping `PROTO_VERSION`; CI enforces this on every merge request via `buf breaking`.
22
+
23
+ ## Compatibility checks
24
+
25
+ CI runs `buf lint` and `buf breaking` (against `origin/master`) on every MR. To check a local branch against a specific released version:
26
+
27
+ ```sh
28
+ buf breaking --against '.git#tag=vX.Y.Z'
29
+ ```
30
+
31
+ ## Changelog
32
+
33
+ See [CHANGELOG.md](CHANGELOG.md) for what changed release to release, including breaking changes and the consumers they affect.
package/dist/control.d.ts CHANGED
@@ -68,6 +68,13 @@ export interface Satellite {
68
68
  ownerUserId: number;
69
69
  /** display name of owner_user_id, "" if unassigned */
70
70
  ownerDisplayName: string;
71
+ /** firmware_version of the satellite */
72
+ firmwareVersion: string;
73
+ /** true if the device has a new firmware available */
74
+ updateAvailable: boolean;
75
+ newVersion?: string | undefined;
76
+ /** #158: mic reopens after a Smalltalk answer instead of waiting for wake-word/PTT again */
77
+ smalltalkFollowupListen: boolean;
71
78
  }
72
79
  export interface GetSatellitesResponse {
73
80
  satellites: Satellite[];
@@ -92,6 +99,12 @@ export interface SetSatelliteOwnerRequest {
92
99
  /** requestor */
93
100
  requestorId: number;
94
101
  }
102
+ export interface SetSatelliteSmalltalkFollowupRequest {
103
+ deviceId: string;
104
+ enabled: boolean;
105
+ /** requestor */
106
+ requestorId: number;
107
+ }
95
108
  export interface DeleteSatelliteRequest {
96
109
  deviceId: string;
97
110
  /** requestor */
@@ -319,6 +332,7 @@ export declare const GetSatellitesResponse: MessageFns<GetSatellitesResponse>;
319
332
  export declare const SetSatelliteRoomRequest: MessageFns<SetSatelliteRoomRequest>;
320
333
  export declare const SetSatelliteDisplayNameRequest: MessageFns<SetSatelliteDisplayNameRequest>;
321
334
  export declare const SetSatelliteOwnerRequest: MessageFns<SetSatelliteOwnerRequest>;
335
+ export declare const SetSatelliteSmalltalkFollowupRequest: MessageFns<SetSatelliteSmalltalkFollowupRequest>;
322
336
  export declare const DeleteSatelliteRequest: MessageFns<DeleteSatelliteRequest>;
323
337
  export declare const Room: MessageFns<Room>;
324
338
  export declare const GetRoomsResponse: MessageFns<GetRoomsResponse>;
package/dist/control.js CHANGED
@@ -5,7 +5,7 @@
5
5
  // protoc unknown
6
6
  // source: control.proto
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.DeleteCarRequest = exports.UpdateCarRequest = exports.CreateCarResponse = exports.CreateCarRequest = exports.GetCarsResponse = exports.Car = exports.DeleteBleTagRequest = exports.UpdateBleTagRequest = exports.CreateBleTagResponse = exports.CreateBleTagRequest = exports.GetBleTagsResponse = exports.BleTag = exports.UpdateConfigRequest = exports.SettingUpdate = exports.GetSettingsResponse = exports.Setting = exports.Category = exports.DeleteAlarmRequest = exports.UpdateAlarmRequest = exports.CreateAlarmResponse = exports.CreateAlarmRequest = exports.GetAlarmsResponse = exports.Alarm = exports.DeleteTriggerRequest = exports.UpdateTriggerRequest = exports.CreateTriggerRequest = exports.GetTriggersResponse = exports.Trigger = exports.SetGroupRoomsRequest = exports.DeleteGroupRequest = exports.UpdateGroupRequest = exports.CreateGroupRequest = exports.GetGroupsResponse = exports.Group = exports.GetRoomsResponse = exports.Room = exports.DeleteSatelliteRequest = exports.SetSatelliteOwnerRequest = exports.SetSatelliteDisplayNameRequest = exports.SetSatelliteRoomRequest = exports.GetSatellitesResponse = exports.Satellite = exports.AnnounceRequest = exports.SubmitVoiceResponse = exports.SubmitVoiceRequest = exports.SubmitTextResponse = exports.SubmitTextRequest = exports.protobufPackage = void 0;
8
+ exports.DeleteCarRequest = exports.UpdateCarRequest = exports.CreateCarResponse = exports.CreateCarRequest = exports.GetCarsResponse = exports.Car = exports.DeleteBleTagRequest = exports.UpdateBleTagRequest = exports.CreateBleTagResponse = exports.CreateBleTagRequest = exports.GetBleTagsResponse = exports.BleTag = exports.UpdateConfigRequest = exports.SettingUpdate = exports.GetSettingsResponse = exports.Setting = exports.Category = exports.DeleteAlarmRequest = exports.UpdateAlarmRequest = exports.CreateAlarmResponse = exports.CreateAlarmRequest = exports.GetAlarmsResponse = exports.Alarm = exports.DeleteTriggerRequest = exports.UpdateTriggerRequest = exports.CreateTriggerRequest = exports.GetTriggersResponse = exports.Trigger = exports.SetGroupRoomsRequest = exports.DeleteGroupRequest = exports.UpdateGroupRequest = exports.CreateGroupRequest = exports.GetGroupsResponse = exports.Group = exports.GetRoomsResponse = exports.Room = exports.DeleteSatelliteRequest = exports.SetSatelliteSmalltalkFollowupRequest = exports.SetSatelliteOwnerRequest = exports.SetSatelliteDisplayNameRequest = exports.SetSatelliteRoomRequest = exports.GetSatellitesResponse = exports.Satellite = exports.AnnounceRequest = exports.SubmitVoiceResponse = exports.SubmitVoiceRequest = exports.SubmitTextResponse = exports.SubmitTextRequest = exports.protobufPackage = void 0;
9
9
  /* eslint-disable */
10
10
  const wire_1 = require("@bufbuild/protobuf/wire");
11
11
  exports.protobufPackage = "hannah";
@@ -348,6 +348,10 @@ function createBaseSatellite() {
348
348
  roomMismatch: false,
349
349
  ownerUserId: 0,
350
350
  ownerDisplayName: "",
351
+ firmwareVersion: "",
352
+ updateAvailable: false,
353
+ newVersion: undefined,
354
+ smalltalkFollowupListen: false,
351
355
  };
352
356
  }
353
357
  exports.Satellite = {
@@ -385,6 +389,18 @@ exports.Satellite = {
385
389
  if (message.ownerDisplayName !== "") {
386
390
  writer.uint32(98).string(message.ownerDisplayName);
387
391
  }
392
+ if (message.firmwareVersion !== "") {
393
+ writer.uint32(106).string(message.firmwareVersion);
394
+ }
395
+ if (message.updateAvailable !== false) {
396
+ writer.uint32(112).bool(message.updateAvailable);
397
+ }
398
+ if (message.newVersion !== undefined) {
399
+ writer.uint32(122).string(message.newVersion);
400
+ }
401
+ if (message.smalltalkFollowupListen !== false) {
402
+ writer.uint32(128).bool(message.smalltalkFollowupListen);
403
+ }
388
404
  return writer;
389
405
  },
390
406
  decode(input, length) {
@@ -471,6 +487,34 @@ exports.Satellite = {
471
487
  message.ownerDisplayName = reader.string();
472
488
  continue;
473
489
  }
490
+ case 13: {
491
+ if (tag !== 106) {
492
+ break;
493
+ }
494
+ message.firmwareVersion = reader.string();
495
+ continue;
496
+ }
497
+ case 14: {
498
+ if (tag !== 112) {
499
+ break;
500
+ }
501
+ message.updateAvailable = reader.bool();
502
+ continue;
503
+ }
504
+ case 15: {
505
+ if (tag !== 122) {
506
+ break;
507
+ }
508
+ message.newVersion = reader.string();
509
+ continue;
510
+ }
511
+ case 16: {
512
+ if (tag !== 128) {
513
+ break;
514
+ }
515
+ message.smalltalkFollowupListen = reader.bool();
516
+ continue;
517
+ }
474
518
  }
475
519
  if ((tag & 7) === 4 || tag === 0) {
476
520
  break;
@@ -495,6 +539,10 @@ exports.Satellite = {
495
539
  message.roomMismatch = object.roomMismatch ?? false;
496
540
  message.ownerUserId = object.ownerUserId ?? 0;
497
541
  message.ownerDisplayName = object.ownerDisplayName ?? "";
542
+ message.firmwareVersion = object.firmwareVersion ?? "";
543
+ message.updateAvailable = object.updateAvailable ?? false;
544
+ message.newVersion = object.newVersion ?? undefined;
545
+ message.smalltalkFollowupListen = object.smalltalkFollowupListen ?? false;
498
546
  return message;
499
547
  },
500
548
  };
@@ -728,6 +776,69 @@ exports.SetSatelliteOwnerRequest = {
728
776
  return message;
729
777
  },
730
778
  };
779
+ function createBaseSetSatelliteSmalltalkFollowupRequest() {
780
+ return { deviceId: "", enabled: false, requestorId: 0 };
781
+ }
782
+ exports.SetSatelliteSmalltalkFollowupRequest = {
783
+ encode(message, writer = new wire_1.BinaryWriter()) {
784
+ if (message.deviceId !== "") {
785
+ writer.uint32(10).string(message.deviceId);
786
+ }
787
+ if (message.enabled !== false) {
788
+ writer.uint32(16).bool(message.enabled);
789
+ }
790
+ if (message.requestorId !== 0) {
791
+ writer.uint32(24).int32(message.requestorId);
792
+ }
793
+ return writer;
794
+ },
795
+ decode(input, length) {
796
+ const reader = input instanceof wire_1.BinaryReader ? input : new wire_1.BinaryReader(input);
797
+ const end = length === undefined ? reader.len : reader.pos + length;
798
+ const message = createBaseSetSatelliteSmalltalkFollowupRequest();
799
+ while (reader.pos < end) {
800
+ const tag = reader.uint32();
801
+ switch (tag >>> 3) {
802
+ case 1: {
803
+ if (tag !== 10) {
804
+ break;
805
+ }
806
+ message.deviceId = reader.string();
807
+ continue;
808
+ }
809
+ case 2: {
810
+ if (tag !== 16) {
811
+ break;
812
+ }
813
+ message.enabled = reader.bool();
814
+ continue;
815
+ }
816
+ case 3: {
817
+ if (tag !== 24) {
818
+ break;
819
+ }
820
+ message.requestorId = reader.int32();
821
+ continue;
822
+ }
823
+ }
824
+ if ((tag & 7) === 4 || tag === 0) {
825
+ break;
826
+ }
827
+ reader.skip(tag & 7);
828
+ }
829
+ return message;
830
+ },
831
+ create(base) {
832
+ return exports.SetSatelliteSmalltalkFollowupRequest.fromPartial(base ?? {});
833
+ },
834
+ fromPartial(object) {
835
+ const message = createBaseSetSatelliteSmalltalkFollowupRequest();
836
+ message.deviceId = object.deviceId ?? "";
837
+ message.enabled = object.enabled ?? false;
838
+ message.requestorId = object.requestorId ?? 0;
839
+ return message;
840
+ },
841
+ };
731
842
  function createBaseDeleteSatelliteRequest() {
732
843
  return { deviceId: "", requestorId: 0 };
733
844
  }
@@ -22,6 +22,8 @@ export interface SystemNotificationEvent {
22
22
  export interface FirmwareEventProto {
23
23
  device: string;
24
24
  version: string;
25
+ updateAvailable: boolean;
26
+ newVersion?: string | undefined;
25
27
  }
26
28
  export interface TriggerFirmwareUpdateRequest {
27
29
  device: string;
@@ -204,7 +204,7 @@ exports.SystemNotificationEvent = {
204
204
  },
205
205
  };
206
206
  function createBaseFirmwareEventProto() {
207
- return { device: "", version: "" };
207
+ return { device: "", version: "", updateAvailable: false, newVersion: undefined };
208
208
  }
209
209
  exports.FirmwareEventProto = {
210
210
  encode(message, writer = new wire_1.BinaryWriter()) {
@@ -214,6 +214,12 @@ exports.FirmwareEventProto = {
214
214
  if (message.version !== "") {
215
215
  writer.uint32(18).string(message.version);
216
216
  }
217
+ if (message.updateAvailable !== false) {
218
+ writer.uint32(24).bool(message.updateAvailable);
219
+ }
220
+ if (message.newVersion !== undefined) {
221
+ writer.uint32(34).string(message.newVersion);
222
+ }
217
223
  return writer;
218
224
  },
219
225
  decode(input, length) {
@@ -237,6 +243,20 @@ exports.FirmwareEventProto = {
237
243
  message.version = reader.string();
238
244
  continue;
239
245
  }
246
+ case 3: {
247
+ if (tag !== 24) {
248
+ break;
249
+ }
250
+ message.updateAvailable = reader.bool();
251
+ continue;
252
+ }
253
+ case 4: {
254
+ if (tag !== 34) {
255
+ break;
256
+ }
257
+ message.newVersion = reader.string();
258
+ continue;
259
+ }
240
260
  }
241
261
  if ((tag & 7) === 4 || tag === 0) {
242
262
  break;
@@ -252,6 +272,8 @@ exports.FirmwareEventProto = {
252
272
  const message = createBaseFirmwareEventProto();
253
273
  message.device = object.device ?? "";
254
274
  message.version = object.version ?? "";
275
+ message.updateAvailable = object.updateAvailable ?? false;
276
+ message.newVersion = object.newVersion ?? undefined;
255
277
  return message;
256
278
  },
257
279
  };
package/dist/hannah.d.ts CHANGED
@@ -2,7 +2,7 @@ import { type CallOptions, type ChannelCredentials, Client, type ClientDuplexStr
2
2
  import { AgentCommand, AgentMessage, AgentNotification } from "./agent";
3
3
  import { AutomationCommand, AutomationMessage } from "./automation";
4
4
  import { CarStateResponse, GetAllCarStatesResponse } from "./car_state";
5
- import { AnnounceRequest, CreateAlarmRequest, CreateAlarmResponse, CreateBleTagRequest, CreateBleTagResponse, CreateCarRequest, CreateCarResponse, CreateGroupRequest, CreateTriggerRequest, DeleteAlarmRequest, DeleteBleTagRequest, DeleteCarRequest, DeleteGroupRequest, DeleteSatelliteRequest, DeleteTriggerRequest, GetAlarmsResponse, GetBleTagsResponse, GetCarsResponse, GetGroupsResponse, GetRoomsResponse, GetSatellitesResponse, GetSettingsResponse, GetTriggersResponse, SetGroupRoomsRequest, SetSatelliteDisplayNameRequest, SetSatelliteOwnerRequest, SetSatelliteRoomRequest, SubmitTextRequest, SubmitTextResponse, SubmitVoiceRequest, SubmitVoiceResponse, UpdateAlarmRequest, UpdateBleTagRequest, UpdateCarRequest, UpdateConfigRequest, UpdateGroupRequest, UpdateTriggerRequest } from "./control";
5
+ import { AnnounceRequest, CreateAlarmRequest, CreateAlarmResponse, CreateBleTagRequest, CreateBleTagResponse, CreateCarRequest, CreateCarResponse, CreateGroupRequest, CreateTriggerRequest, DeleteAlarmRequest, DeleteBleTagRequest, DeleteCarRequest, DeleteGroupRequest, DeleteSatelliteRequest, DeleteTriggerRequest, GetAlarmsResponse, GetBleTagsResponse, GetCarsResponse, GetGroupsResponse, GetRoomsResponse, GetSatellitesResponse, GetSettingsResponse, GetTriggersResponse, SetGroupRoomsRequest, SetSatelliteDisplayNameRequest, SetSatelliteOwnerRequest, SetSatelliteRoomRequest, SetSatelliteSmalltalkFollowupRequest, SubmitTextRequest, SubmitTextResponse, SubmitVoiceRequest, SubmitVoiceResponse, UpdateAlarmRequest, UpdateBleTagRequest, UpdateCarRequest, UpdateConfigRequest, UpdateGroupRequest, UpdateTriggerRequest } from "./control";
6
6
  import { ControlDeviceRequest, GetDevicesResponse } from "./device_control_menu";
7
7
  import { EventFilter, HannahEvent, TriggerFirmwareUpdateRequest } from "./event_stream";
8
8
  import { ProvisionSatelliteRequest } from "./satellite_provisioning";
@@ -239,6 +239,19 @@ export declare const HannahServiceService: {
239
239
  readonly responseSerialize: (value: StatusResponse) => Buffer;
240
240
  readonly responseDeserialize: (value: Buffer) => StatusResponse;
241
241
  };
242
+ /**
243
+ * Toggle whether the satellite's mic reopens after a Smalltalk answer instead of
244
+ * waiting for wake-word/PTT again (silence-timeout lives in the satellite firmware). #158
245
+ */
246
+ readonly setSatelliteSmalltalkFollowup: {
247
+ readonly path: "/hannah.HannahService/SetSatelliteSmalltalkFollowup";
248
+ readonly requestStream: false;
249
+ readonly responseStream: false;
250
+ readonly requestSerialize: (value: SetSatelliteSmalltalkFollowupRequest) => Buffer;
251
+ readonly requestDeserialize: (value: Buffer) => SetSatelliteSmalltalkFollowupRequest;
252
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
253
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
254
+ };
242
255
  /** Delete existing satellite */
243
256
  readonly deleteSatellite: {
244
257
  readonly path: "/hannah.HannahService/DeleteSatellite";
@@ -770,6 +783,11 @@ export interface HannahServiceServer extends UntypedServiceImplementation {
770
783
  setSatelliteDisplayName: handleUnaryCall<SetSatelliteDisplayNameRequest, StatusResponse>;
771
784
  /** Assign a satellite to a Person (User), independent of its room. #31 */
772
785
  setSatelliteOwner: handleUnaryCall<SetSatelliteOwnerRequest, StatusResponse>;
786
+ /**
787
+ * Toggle whether the satellite's mic reopens after a Smalltalk answer instead of
788
+ * waiting for wake-word/PTT again (silence-timeout lives in the satellite firmware). #158
789
+ */
790
+ setSatelliteSmalltalkFollowup: handleUnaryCall<SetSatelliteSmalltalkFollowupRequest, StatusResponse>;
773
791
  /** Delete existing satellite */
774
792
  deleteSatellite: handleUnaryCall<DeleteSatelliteRequest, StatusResponse>;
775
793
  /** --- Rooms/Groups (Admin-UI, #27 Phase 1) --- */
@@ -993,6 +1011,13 @@ export interface HannahServiceClient extends Client {
993
1011
  setSatelliteOwner(request: SetSatelliteOwnerRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
994
1012
  setSatelliteOwner(request: SetSatelliteOwnerRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
995
1013
  setSatelliteOwner(request: SetSatelliteOwnerRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1014
+ /**
1015
+ * Toggle whether the satellite's mic reopens after a Smalltalk answer instead of
1016
+ * waiting for wake-word/PTT again (silence-timeout lives in the satellite firmware). #158
1017
+ */
1018
+ setSatelliteSmalltalkFollowup(request: SetSatelliteSmalltalkFollowupRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1019
+ setSatelliteSmalltalkFollowup(request: SetSatelliteSmalltalkFollowupRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1020
+ setSatelliteSmalltalkFollowup(request: SetSatelliteSmalltalkFollowupRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
996
1021
  /** Delete existing satellite */
997
1022
  deleteSatellite(request: DeleteSatelliteRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
998
1023
  deleteSatellite(request: DeleteSatelliteRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
package/dist/hannah.js CHANGED
@@ -247,6 +247,19 @@ exports.HannahServiceService = {
247
247
  responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
248
248
  responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
249
249
  },
250
+ /**
251
+ * Toggle whether the satellite's mic reopens after a Smalltalk answer instead of
252
+ * waiting for wake-word/PTT again (silence-timeout lives in the satellite firmware). #158
253
+ */
254
+ setSatelliteSmalltalkFollowup: {
255
+ path: "/hannah.HannahService/SetSatelliteSmalltalkFollowup",
256
+ requestStream: false,
257
+ responseStream: false,
258
+ requestSerialize: (value) => Buffer.from(control_1.SetSatelliteSmalltalkFollowupRequest.encode(value).finish()),
259
+ requestDeserialize: (value) => control_1.SetSatelliteSmalltalkFollowupRequest.decode(value),
260
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
261
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
262
+ },
250
263
  /** Delete existing satellite */
251
264
  deleteSatellite: {
252
265
  path: "/hannah.HannahService/DeleteSatellite",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m1kad0/hannah-proto",
3
- "version": "0.5.2",
3
+ "version": "0.5.4",
4
4
  "description": "Generated TypeScript gRPC-js client stubs for the Hannah voice assistant proto schema",
5
5
  "license": "UNLICENSED",
6
6
  "main": "dist/index.js",