@m1kad0/hannah-proto 0.5.3 → 0.5.5

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
@@ -73,6 +73,8 @@ export interface Satellite {
73
73
  /** true if the device has a new firmware available */
74
74
  updateAvailable: boolean;
75
75
  newVersion?: string | undefined;
76
+ /** #158: mic reopens after a Smalltalk answer instead of waiting for wake-word/PTT again */
77
+ smalltalkFollowupListen: boolean;
76
78
  }
77
79
  export interface GetSatellitesResponse {
78
80
  satellites: Satellite[];
@@ -97,6 +99,12 @@ export interface SetSatelliteOwnerRequest {
97
99
  /** requestor */
98
100
  requestorId: number;
99
101
  }
102
+ export interface SetSatelliteSmalltalkFollowupRequest {
103
+ deviceId: string;
104
+ enabled: boolean;
105
+ /** requestor */
106
+ requestorId: number;
107
+ }
100
108
  export interface DeleteSatelliteRequest {
101
109
  deviceId: string;
102
110
  /** requestor */
@@ -324,6 +332,7 @@ export declare const GetSatellitesResponse: MessageFns<GetSatellitesResponse>;
324
332
  export declare const SetSatelliteRoomRequest: MessageFns<SetSatelliteRoomRequest>;
325
333
  export declare const SetSatelliteDisplayNameRequest: MessageFns<SetSatelliteDisplayNameRequest>;
326
334
  export declare const SetSatelliteOwnerRequest: MessageFns<SetSatelliteOwnerRequest>;
335
+ export declare const SetSatelliteSmalltalkFollowupRequest: MessageFns<SetSatelliteSmalltalkFollowupRequest>;
327
336
  export declare const DeleteSatelliteRequest: MessageFns<DeleteSatelliteRequest>;
328
337
  export declare const Room: MessageFns<Room>;
329
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";
@@ -351,6 +351,7 @@ function createBaseSatellite() {
351
351
  firmwareVersion: "",
352
352
  updateAvailable: false,
353
353
  newVersion: undefined,
354
+ smalltalkFollowupListen: false,
354
355
  };
355
356
  }
356
357
  exports.Satellite = {
@@ -397,6 +398,9 @@ exports.Satellite = {
397
398
  if (message.newVersion !== undefined) {
398
399
  writer.uint32(122).string(message.newVersion);
399
400
  }
401
+ if (message.smalltalkFollowupListen !== false) {
402
+ writer.uint32(128).bool(message.smalltalkFollowupListen);
403
+ }
400
404
  return writer;
401
405
  },
402
406
  decode(input, length) {
@@ -504,6 +508,13 @@ exports.Satellite = {
504
508
  message.newVersion = reader.string();
505
509
  continue;
506
510
  }
511
+ case 16: {
512
+ if (tag !== 128) {
513
+ break;
514
+ }
515
+ message.smalltalkFollowupListen = reader.bool();
516
+ continue;
517
+ }
507
518
  }
508
519
  if ((tag & 7) === 4 || tag === 0) {
509
520
  break;
@@ -531,6 +542,7 @@ exports.Satellite = {
531
542
  message.firmwareVersion = object.firmwareVersion ?? "";
532
543
  message.updateAvailable = object.updateAvailable ?? false;
533
544
  message.newVersion = object.newVersion ?? undefined;
545
+ message.smalltalkFollowupListen = object.smalltalkFollowupListen ?? false;
534
546
  return message;
535
547
  },
536
548
  };
@@ -764,6 +776,69 @@ exports.SetSatelliteOwnerRequest = {
764
776
  return message;
765
777
  },
766
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
+ };
767
842
  function createBaseDeleteSatelliteRequest() {
768
843
  return { deviceId: "", requestorId: 0 };
769
844
  }
@@ -28,6 +28,9 @@ export interface FirmwareEventProto {
28
28
  export interface TriggerFirmwareUpdateRequest {
29
29
  device: string;
30
30
  }
31
+ export interface TriggerSatelliteRestartRequest {
32
+ device: string;
33
+ }
31
34
  export interface ResidentEventProto {
32
35
  roomieId: string;
33
36
  displayName: string;
@@ -39,6 +42,7 @@ export declare const HannahEvent: MessageFns<HannahEvent>;
39
42
  export declare const SystemNotificationEvent: MessageFns<SystemNotificationEvent>;
40
43
  export declare const FirmwareEventProto: MessageFns<FirmwareEventProto>;
41
44
  export declare const TriggerFirmwareUpdateRequest: MessageFns<TriggerFirmwareUpdateRequest>;
45
+ export declare const TriggerSatelliteRestartRequest: MessageFns<TriggerSatelliteRestartRequest>;
42
46
  export declare const ResidentEventProto: MessageFns<ResidentEventProto>;
43
47
  type Builtin = Date | Function | Uint8Array | string | number | boolean | bigint | undefined;
44
48
  export type DeepPartial<T> = T extends bigint ? string | number | bigint : T extends Builtin ? T : T extends globalThis.Array<infer U> ? globalThis.Array<DeepPartial<U>> : T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : T extends {} ? {
@@ -5,7 +5,7 @@
5
5
  // protoc unknown
6
6
  // source: event_stream.proto
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.ResidentEventProto = exports.TriggerFirmwareUpdateRequest = exports.FirmwareEventProto = exports.SystemNotificationEvent = exports.HannahEvent = exports.EventFilter = exports.protobufPackage = void 0;
8
+ exports.ResidentEventProto = exports.TriggerSatelliteRestartRequest = exports.TriggerFirmwareUpdateRequest = exports.FirmwareEventProto = exports.SystemNotificationEvent = exports.HannahEvent = exports.EventFilter = exports.protobufPackage = void 0;
9
9
  /* eslint-disable */
10
10
  const wire_1 = require("@bufbuild/protobuf/wire");
11
11
  const car_state_1 = require("./car_state");
@@ -318,6 +318,47 @@ exports.TriggerFirmwareUpdateRequest = {
318
318
  return message;
319
319
  },
320
320
  };
321
+ function createBaseTriggerSatelliteRestartRequest() {
322
+ return { device: "" };
323
+ }
324
+ exports.TriggerSatelliteRestartRequest = {
325
+ encode(message, writer = new wire_1.BinaryWriter()) {
326
+ if (message.device !== "") {
327
+ writer.uint32(10).string(message.device);
328
+ }
329
+ return writer;
330
+ },
331
+ decode(input, length) {
332
+ const reader = input instanceof wire_1.BinaryReader ? input : new wire_1.BinaryReader(input);
333
+ const end = length === undefined ? reader.len : reader.pos + length;
334
+ const message = createBaseTriggerSatelliteRestartRequest();
335
+ while (reader.pos < end) {
336
+ const tag = reader.uint32();
337
+ switch (tag >>> 3) {
338
+ case 1: {
339
+ if (tag !== 10) {
340
+ break;
341
+ }
342
+ message.device = reader.string();
343
+ continue;
344
+ }
345
+ }
346
+ if ((tag & 7) === 4 || tag === 0) {
347
+ break;
348
+ }
349
+ reader.skip(tag & 7);
350
+ }
351
+ return message;
352
+ },
353
+ create(base) {
354
+ return exports.TriggerSatelliteRestartRequest.fromPartial(base ?? {});
355
+ },
356
+ fromPartial(object) {
357
+ const message = createBaseTriggerSatelliteRestartRequest();
358
+ message.device = object.device ?? "";
359
+ return message;
360
+ },
361
+ };
321
362
  function createBaseResidentEventProto() {
322
363
  return { roomieId: "", displayName: "", event: "" };
323
364
  }
package/dist/hannah.d.ts CHANGED
@@ -2,9 +2,9 @@ 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
- import { EventFilter, HannahEvent, TriggerFirmwareUpdateRequest } from "./event_stream";
7
+ import { EventFilter, HannahEvent, TriggerFirmwareUpdateRequest, TriggerSatelliteRestartRequest } from "./event_stream";
8
8
  import { ProvisionSatelliteRequest } from "./satellite_provisioning";
9
9
  import { ProxyCommand, ProxyHeartbeat, SatelliteRegistration, SubmitSatelliteAudioRequest, SubmitSatelliteAudioResponse } from "./satellite_proxy";
10
10
  import { Empty, StatusResponse } from "./shared";
@@ -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";
@@ -527,6 +540,21 @@ export declare const HannahServiceService: {
527
540
  readonly responseSerialize: (value: StatusResponse) => Buffer;
528
541
  readonly responseDeserialize: (value: Buffer) => StatusResponse;
529
542
  };
543
+ /**
544
+ * Trigger an ordered remote restart (esp_restart()) of a satellite over MQTT.
545
+ * Diagnostic/rejuvenation tool for suspected resource exhaustion (heap fragmentation
546
+ * after long uptime) — works even when the satellite's OTA/webserver no longer
547
+ * respond, since MQTT stays alive in that failure mode.
548
+ */
549
+ readonly triggerSatelliteRestart: {
550
+ readonly path: "/hannah.HannahService/TriggerSatelliteRestart";
551
+ readonly requestStream: false;
552
+ readonly responseStream: false;
553
+ readonly requestSerialize: (value: TriggerSatelliteRestartRequest) => Buffer;
554
+ readonly requestDeserialize: (value: Buffer) => TriggerSatelliteRestartRequest;
555
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
556
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
557
+ };
530
558
  /**
531
559
  * --- Wakeword Capture ---
532
560
  * Put a satellite in audio-capture mode for wakeword training data collection.
@@ -770,6 +798,11 @@ export interface HannahServiceServer extends UntypedServiceImplementation {
770
798
  setSatelliteDisplayName: handleUnaryCall<SetSatelliteDisplayNameRequest, StatusResponse>;
771
799
  /** Assign a satellite to a Person (User), independent of its room. #31 */
772
800
  setSatelliteOwner: handleUnaryCall<SetSatelliteOwnerRequest, StatusResponse>;
801
+ /**
802
+ * Toggle whether the satellite's mic reopens after a Smalltalk answer instead of
803
+ * waiting for wake-word/PTT again (silence-timeout lives in the satellite firmware). #158
804
+ */
805
+ setSatelliteSmalltalkFollowup: handleUnaryCall<SetSatelliteSmalltalkFollowupRequest, StatusResponse>;
773
806
  /** Delete existing satellite */
774
807
  deleteSatellite: handleUnaryCall<DeleteSatelliteRequest, StatusResponse>;
775
808
  /** --- Rooms/Groups (Admin-UI, #27 Phase 1) --- */
@@ -826,6 +859,13 @@ export interface HannahServiceServer extends UntypedServiceImplementation {
826
859
  * Trigger an immediate OTA update for a satellite (bypasses residents check).
827
860
  */
828
861
  triggerFirmwareUpdate: handleUnaryCall<TriggerFirmwareUpdateRequest, StatusResponse>;
862
+ /**
863
+ * Trigger an ordered remote restart (esp_restart()) of a satellite over MQTT.
864
+ * Diagnostic/rejuvenation tool for suspected resource exhaustion (heap fragmentation
865
+ * after long uptime) — works even when the satellite's OTA/webserver no longer
866
+ * respond, since MQTT stays alive in that failure mode.
867
+ */
868
+ triggerSatelliteRestart: handleUnaryCall<TriggerSatelliteRestartRequest, StatusResponse>;
829
869
  /**
830
870
  * --- Wakeword Capture ---
831
871
  * Put a satellite in audio-capture mode for wakeword training data collection.
@@ -993,6 +1033,13 @@ export interface HannahServiceClient extends Client {
993
1033
  setSatelliteOwner(request: SetSatelliteOwnerRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
994
1034
  setSatelliteOwner(request: SetSatelliteOwnerRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
995
1035
  setSatelliteOwner(request: SetSatelliteOwnerRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1036
+ /**
1037
+ * Toggle whether the satellite's mic reopens after a Smalltalk answer instead of
1038
+ * waiting for wake-word/PTT again (silence-timeout lives in the satellite firmware). #158
1039
+ */
1040
+ setSatelliteSmalltalkFollowup(request: SetSatelliteSmalltalkFollowupRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1041
+ setSatelliteSmalltalkFollowup(request: SetSatelliteSmalltalkFollowupRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1042
+ setSatelliteSmalltalkFollowup(request: SetSatelliteSmalltalkFollowupRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
996
1043
  /** Delete existing satellite */
997
1044
  deleteSatellite(request: DeleteSatelliteRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
998
1045
  deleteSatellite(request: DeleteSatelliteRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
@@ -1106,6 +1153,15 @@ export interface HannahServiceClient extends Client {
1106
1153
  triggerFirmwareUpdate(request: TriggerFirmwareUpdateRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1107
1154
  triggerFirmwareUpdate(request: TriggerFirmwareUpdateRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1108
1155
  triggerFirmwareUpdate(request: TriggerFirmwareUpdateRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1156
+ /**
1157
+ * Trigger an ordered remote restart (esp_restart()) of a satellite over MQTT.
1158
+ * Diagnostic/rejuvenation tool for suspected resource exhaustion (heap fragmentation
1159
+ * after long uptime) — works even when the satellite's OTA/webserver no longer
1160
+ * respond, since MQTT stays alive in that failure mode.
1161
+ */
1162
+ triggerSatelliteRestart(request: TriggerSatelliteRestartRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1163
+ triggerSatelliteRestart(request: TriggerSatelliteRestartRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1164
+ triggerSatelliteRestart(request: TriggerSatelliteRestartRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1109
1165
  /**
1110
1166
  * --- Wakeword Capture ---
1111
1167
  * Put a satellite in audio-capture mode for wakeword training data collection.
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",
@@ -535,6 +548,21 @@ exports.HannahServiceService = {
535
548
  responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
536
549
  responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
537
550
  },
551
+ /**
552
+ * Trigger an ordered remote restart (esp_restart()) of a satellite over MQTT.
553
+ * Diagnostic/rejuvenation tool for suspected resource exhaustion (heap fragmentation
554
+ * after long uptime) — works even when the satellite's OTA/webserver no longer
555
+ * respond, since MQTT stays alive in that failure mode.
556
+ */
557
+ triggerSatelliteRestart: {
558
+ path: "/hannah.HannahService/TriggerSatelliteRestart",
559
+ requestStream: false,
560
+ responseStream: false,
561
+ requestSerialize: (value) => Buffer.from(event_stream_1.TriggerSatelliteRestartRequest.encode(value).finish()),
562
+ requestDeserialize: (value) => event_stream_1.TriggerSatelliteRestartRequest.decode(value),
563
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
564
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
565
+ },
538
566
  /**
539
567
  * --- Wakeword Capture ---
540
568
  * Put a satellite in audio-capture mode for wakeword training data collection.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m1kad0/hannah-proto",
3
- "version": "0.5.3",
3
+ "version": "0.5.5",
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",