@m1kad0/hannah-proto 4.4.0 → 4.6.0

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 (55) hide show
  1. package/README.md +21 -0
  2. package/dist/compat_interceptor.js +6 -6
  3. package/dist/compat_versions.js +176 -85
  4. package/dist/descriptor.binpb +0 -0
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.js +3 -1
  7. package/dist/logging.d.ts +189 -0
  8. package/dist/logging.js +775 -0
  9. package/dist/v1/activity_log.d.ts +60 -0
  10. package/dist/v1/activity_log.js +453 -0
  11. package/dist/v1/agent.d.ts +433 -0
  12. package/dist/v1/agent.js +2527 -0
  13. package/dist/v1/automation.d.ts +54 -0
  14. package/dist/v1/automation.js +303 -0
  15. package/dist/v1/car_state.d.ts +72 -0
  16. package/dist/v1/car_state.js +516 -0
  17. package/dist/v1/channel.d.ts +102 -0
  18. package/dist/v1/channel.js +587 -0
  19. package/dist/v1/control.d.ts +383 -0
  20. package/dist/v1/control.js +3879 -0
  21. package/dist/v1/device_control_menu.d.ts +88 -0
  22. package/dist/v1/device_control_menu.js +629 -0
  23. package/dist/v1/event_stream.d.ts +63 -0
  24. package/dist/v1/event_stream.js +494 -0
  25. package/dist/v1/hannah.d.ts +1644 -0
  26. package/dist/v1/hannah.js +968 -0
  27. package/dist/v1/index.d.ts +22 -0
  28. package/dist/v1/index.js +58 -0
  29. package/dist/v1/infrastructure.d.ts +98 -0
  30. package/dist/v1/infrastructure.js +652 -0
  31. package/dist/v1/logging.d.ts +189 -0
  32. package/dist/v1/logging.js +775 -0
  33. package/dist/v1/messages.d.ts +56 -0
  34. package/dist/v1/messages.js +398 -0
  35. package/dist/v1/satellite.d.ts +90 -0
  36. package/dist/v1/satellite.js +637 -0
  37. package/dist/v1/satellite_provisioning.d.ts +33 -0
  38. package/dist/v1/satellite_provisioning.js +84 -0
  39. package/dist/v1/satellite_proxy.d.ts +100 -0
  40. package/dist/v1/satellite_proxy.js +546 -0
  41. package/dist/v1/shared.d.ts +54 -0
  42. package/dist/v1/shared.js +249 -0
  43. package/dist/v1/speaker_enrollment.d.ts +44 -0
  44. package/dist/v1/speaker_enrollment.js +157 -0
  45. package/dist/v1/timer_admin.d.ts +42 -0
  46. package/dist/v1/timer_admin.js +273 -0
  47. package/dist/v1/timer_service.d.ts +133 -0
  48. package/dist/v1/timer_service.js +945 -0
  49. package/dist/v1/user_registry.d.ts +187 -0
  50. package/dist/v1/user_registry.js +1612 -0
  51. package/dist/v1/wakeword_capture.d.ts +101 -0
  52. package/dist/v1/wakeword_capture.js +611 -0
  53. package/dist/v1/weather.d.ts +81 -0
  54. package/dist/v1/weather.js +366 -0
  55. package/package.json +1 -1
@@ -0,0 +1,968 @@
1
+ "use strict";
2
+ // Code generated by protoc-gen-ts_proto. DO NOT EDIT.
3
+ // versions:
4
+ // protoc-gen-ts_proto v2.12.1
5
+ // protoc unknown
6
+ // source: hannah/v1/hannah.proto
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.HannahServiceClient = exports.HannahServiceService = exports.protobufPackage = void 0;
9
+ /* eslint-disable */
10
+ const grpc_js_1 = require("@grpc/grpc-js");
11
+ const activity_log_1 = require("./activity_log");
12
+ const agent_1 = require("./agent");
13
+ const automation_1 = require("./automation");
14
+ const car_state_1 = require("./car_state");
15
+ const channel_1 = require("./channel");
16
+ const control_1 = require("./control");
17
+ const device_control_menu_1 = require("./device_control_menu");
18
+ const event_stream_1 = require("./event_stream");
19
+ const infrastructure_1 = require("./infrastructure");
20
+ const messages_1 = require("./messages");
21
+ const satellite_1 = require("./satellite");
22
+ const satellite_provisioning_1 = require("./satellite_provisioning");
23
+ const satellite_proxy_1 = require("./satellite_proxy");
24
+ const shared_1 = require("./shared");
25
+ const speaker_enrollment_1 = require("./speaker_enrollment");
26
+ const timer_admin_1 = require("./timer_admin");
27
+ const timer_service_1 = require("./timer_service");
28
+ const user_registry_1 = require("./user_registry");
29
+ const wakeword_capture_1 = require("./wakeword_capture");
30
+ exports.protobufPackage = "hannah.v1";
31
+ exports.HannahServiceService = {
32
+ /** --- User Registry --- */
33
+ getUsers: {
34
+ path: "/hannah.v1.HannahService/GetUsers",
35
+ requestStream: false,
36
+ responseStream: false,
37
+ requestSerialize: (value) => Buffer.from(user_registry_1.GetUsersRequest.encode(value).finish()),
38
+ requestDeserialize: (value) => user_registry_1.GetUsersRequest.decode(value),
39
+ responseSerialize: (value) => Buffer.from(user_registry_1.GetUsersResponse.encode(value).finish()),
40
+ responseDeserialize: (value) => user_registry_1.GetUsersResponse.decode(value),
41
+ },
42
+ getUser: {
43
+ path: "/hannah.v1.HannahService/GetUser",
44
+ requestStream: false,
45
+ responseStream: false,
46
+ requestSerialize: (value) => Buffer.from(user_registry_1.GetUserRequest.encode(value).finish()),
47
+ requestDeserialize: (value) => user_registry_1.GetUserRequest.decode(value),
48
+ responseSerialize: (value) => Buffer.from(user_registry_1.UserResponse.encode(value).finish()),
49
+ responseDeserialize: (value) => user_registry_1.UserResponse.decode(value),
50
+ },
51
+ linkAccount: {
52
+ path: "/hannah.v1.HannahService/LinkAccount",
53
+ requestStream: false,
54
+ responseStream: false,
55
+ requestSerialize: (value) => Buffer.from(user_registry_1.LinkAccountRequest.encode(value).finish()),
56
+ requestDeserialize: (value) => user_registry_1.LinkAccountRequest.decode(value),
57
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
58
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
59
+ },
60
+ unlinkAccount: {
61
+ path: "/hannah.v1.HannahService/UnlinkAccount",
62
+ requestStream: false,
63
+ responseStream: false,
64
+ requestSerialize: (value) => Buffer.from(user_registry_1.UnlinkAccountRequest.encode(value).finish()),
65
+ requestDeserialize: (value) => user_registry_1.UnlinkAccountRequest.decode(value),
66
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
67
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
68
+ },
69
+ /**
70
+ * One-time token for linking an account via the service's adapter (e.g. Telegram deep link).
71
+ * Redeemed by the adapter over ChannelConnect.
72
+ */
73
+ createLinkToken: {
74
+ path: "/hannah.v1.HannahService/CreateLinkToken",
75
+ requestStream: false,
76
+ responseStream: false,
77
+ requestSerialize: (value) => Buffer.from(user_registry_1.CreateLinkTokenRequest.encode(value).finish()),
78
+ requestDeserialize: (value) => user_registry_1.CreateLinkTokenRequest.decode(value),
79
+ responseSerialize: (value) => Buffer.from(user_registry_1.CreateLinkTokenResponse.encode(value).finish()),
80
+ responseDeserialize: (value) => user_registry_1.CreateLinkTokenResponse.decode(value),
81
+ },
82
+ setTrustLevel: {
83
+ path: "/hannah.v1.HannahService/SetTrustLevel",
84
+ requestStream: false,
85
+ responseStream: false,
86
+ requestSerialize: (value) => Buffer.from(user_registry_1.SetTrustLevelRequest.encode(value).finish()),
87
+ requestDeserialize: (value) => user_registry_1.SetTrustLevelRequest.decode(value),
88
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
89
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
90
+ },
91
+ setSystemMessages: {
92
+ path: "/hannah.v1.HannahService/SetSystemMessages",
93
+ requestStream: false,
94
+ responseStream: false,
95
+ requestSerialize: (value) => Buffer.from(user_registry_1.SetSystemMessagesRequest.encode(value).finish()),
96
+ requestDeserialize: (value) => user_registry_1.SetSystemMessagesRequest.decode(value),
97
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
98
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
99
+ },
100
+ /**
101
+ * Enable/disable an automation service (e.g. "telegram_autoresponder") for a user.
102
+ * Pushes a live update to any connected AutomationConnect stream registered for it.
103
+ */
104
+ setAutomation: {
105
+ path: "/hannah.v1.HannahService/SetAutomation",
106
+ requestStream: false,
107
+ responseStream: false,
108
+ requestSerialize: (value) => Buffer.from(user_registry_1.SetAutomationRequest.encode(value).finish()),
109
+ requestDeserialize: (value) => user_registry_1.SetAutomationRequest.decode(value),
110
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
111
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
112
+ },
113
+ login: {
114
+ path: "/hannah.v1.HannahService/Login",
115
+ requestStream: false,
116
+ responseStream: false,
117
+ requestSerialize: (value) => Buffer.from(user_registry_1.LoginRequest.encode(value).finish()),
118
+ requestDeserialize: (value) => user_registry_1.LoginRequest.decode(value),
119
+ responseSerialize: (value) => Buffer.from(user_registry_1.UserResponse.encode(value).finish()),
120
+ responseDeserialize: (value) => user_registry_1.UserResponse.decode(value),
121
+ },
122
+ /** --- User-Verwaltung (Admin-UI, #27 Phase 6) --- */
123
+ createUser: {
124
+ path: "/hannah.v1.HannahService/CreateUser",
125
+ requestStream: false,
126
+ responseStream: false,
127
+ requestSerialize: (value) => Buffer.from(user_registry_1.CreateUserRequest.encode(value).finish()),
128
+ requestDeserialize: (value) => user_registry_1.CreateUserRequest.decode(value),
129
+ responseSerialize: (value) => Buffer.from(user_registry_1.CreateUserResponse.encode(value).finish()),
130
+ responseDeserialize: (value) => user_registry_1.CreateUserResponse.decode(value),
131
+ },
132
+ updateUser: {
133
+ path: "/hannah.v1.HannahService/UpdateUser",
134
+ requestStream: false,
135
+ responseStream: false,
136
+ requestSerialize: (value) => Buffer.from(user_registry_1.UpdateUserRequest.encode(value).finish()),
137
+ requestDeserialize: (value) => user_registry_1.UpdateUserRequest.decode(value),
138
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
139
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
140
+ },
141
+ deleteUser: {
142
+ path: "/hannah.v1.HannahService/DeleteUser",
143
+ requestStream: false,
144
+ responseStream: false,
145
+ requestSerialize: (value) => Buffer.from(user_registry_1.DeleteUserRequest.encode(value).finish()),
146
+ requestDeserialize: (value) => user_registry_1.DeleteUserRequest.decode(value),
147
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
148
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
149
+ },
150
+ /** Residents (Roomies/Guests/Pets) aus dem ioBroker-Adapter-Cache — fürs "Resident verknüpfen"-Dropdown. */
151
+ getResidents: {
152
+ path: "/hannah.v1.HannahService/GetResidents",
153
+ requestStream: false,
154
+ responseStream: false,
155
+ requestSerialize: (value) => Buffer.from(shared_1.Empty.encode(value).finish()),
156
+ requestDeserialize: (value) => shared_1.Empty.decode(value),
157
+ responseSerialize: (value) => Buffer.from(user_registry_1.GetResidentsResponse.encode(value).finish()),
158
+ responseDeserialize: (value) => user_registry_1.GetResidentsResponse.decode(value),
159
+ },
160
+ /**
161
+ * --- Device Control Menu ---
162
+ * Returns all rooms and devices with current state — for building control menus.
163
+ */
164
+ getDevices: {
165
+ path: "/hannah.v1.HannahService/GetDevices",
166
+ requestStream: false,
167
+ responseStream: false,
168
+ requestSerialize: (value) => Buffer.from(shared_1.Empty.encode(value).finish()),
169
+ requestDeserialize: (value) => shared_1.Empty.decode(value),
170
+ responseSerialize: (value) => Buffer.from(device_control_menu_1.GetDevicesResponse.encode(value).finish()),
171
+ responseDeserialize: (value) => device_control_menu_1.GetDevicesResponse.decode(value),
172
+ },
173
+ /** Directly set a device state (bypasses NLU). Trust level check is done by the caller. */
174
+ controlDevice: {
175
+ path: "/hannah.v1.HannahService/ControlDevice",
176
+ requestStream: false,
177
+ responseStream: false,
178
+ requestSerialize: (value) => Buffer.from(device_control_menu_1.ControlDeviceRequest.encode(value).finish()),
179
+ requestDeserialize: (value) => device_control_menu_1.ControlDeviceRequest.decode(value),
180
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
181
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
182
+ },
183
+ /**
184
+ * --- Control ---
185
+ * Submit a plain-text command; Hannah processes it through NLU and returns the answer.
186
+ */
187
+ submitText: {
188
+ path: "/hannah.v1.HannahService/SubmitText",
189
+ requestStream: false,
190
+ responseStream: false,
191
+ requestSerialize: (value) => Buffer.from(control_1.SubmitTextRequest.encode(value).finish()),
192
+ requestDeserialize: (value) => control_1.SubmitTextRequest.decode(value),
193
+ responseSerialize: (value) => Buffer.from(control_1.SubmitTextResponse.encode(value).finish()),
194
+ responseDeserialize: (value) => control_1.SubmitTextResponse.decode(value),
195
+ },
196
+ /** Submit a voice message (OGG/Opus bytes); Hannah does STT → NLU → TTS and returns the result. */
197
+ submitVoice: {
198
+ path: "/hannah.v1.HannahService/SubmitVoice",
199
+ requestStream: false,
200
+ responseStream: false,
201
+ requestSerialize: (value) => Buffer.from(control_1.SubmitVoiceRequest.encode(value).finish()),
202
+ requestDeserialize: (value) => control_1.SubmitVoiceRequest.decode(value),
203
+ responseSerialize: (value) => Buffer.from(control_1.SubmitVoiceResponse.encode(value).finish()),
204
+ responseDeserialize: (value) => control_1.SubmitVoiceResponse.decode(value),
205
+ },
206
+ /** Send a TTS announcement to one satellite or all ("all"). */
207
+ announce: {
208
+ path: "/hannah.v1.HannahService/Announce",
209
+ requestStream: false,
210
+ responseStream: false,
211
+ requestSerialize: (value) => Buffer.from(control_1.AnnounceRequest.encode(value).finish()),
212
+ requestDeserialize: (value) => control_1.AnnounceRequest.decode(value),
213
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
214
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
215
+ },
216
+ /**
217
+ * Send a notification from ioBroker to Hannah. Returns ok=true when queued.
218
+ * direct=true: skip LLM reformulation. severity: "alert"|"notify"|"info".
219
+ */
220
+ notify: {
221
+ path: "/hannah.v1.HannahService/Notify",
222
+ requestStream: false,
223
+ responseStream: false,
224
+ requestSerialize: (value) => Buffer.from(agent_1.AgentNotification.encode(value).finish()),
225
+ requestDeserialize: (value) => agent_1.AgentNotification.decode(value),
226
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
227
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
228
+ },
229
+ /** List all known satellites (DB + live status merged). */
230
+ getSatellites: {
231
+ path: "/hannah.v1.HannahService/GetSatellites",
232
+ requestStream: false,
233
+ responseStream: false,
234
+ requestSerialize: (value) => Buffer.from(shared_1.Empty.encode(value).finish()),
235
+ requestDeserialize: (value) => shared_1.Empty.decode(value),
236
+ responseSerialize: (value) => Buffer.from(satellite_1.GetSatellitesResponse.encode(value).finish()),
237
+ responseDeserialize: (value) => satellite_1.GetSatellitesResponse.decode(value),
238
+ },
239
+ /** --- Satellites (Admin-UI, #27 Phase 2) --- */
240
+ setSatelliteRoom: {
241
+ path: "/hannah.v1.HannahService/SetSatelliteRoom",
242
+ requestStream: false,
243
+ responseStream: false,
244
+ requestSerialize: (value) => Buffer.from(satellite_1.SetSatelliteRoomRequest.encode(value).finish()),
245
+ requestDeserialize: (value) => satellite_1.SetSatelliteRoomRequest.decode(value),
246
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
247
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
248
+ },
249
+ setSatelliteDisplayName: {
250
+ path: "/hannah.v1.HannahService/SetSatelliteDisplayName",
251
+ requestStream: false,
252
+ responseStream: false,
253
+ requestSerialize: (value) => Buffer.from(satellite_1.SetSatelliteDisplayNameRequest.encode(value).finish()),
254
+ requestDeserialize: (value) => satellite_1.SetSatelliteDisplayNameRequest.decode(value),
255
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
256
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
257
+ },
258
+ /** Assign a satellite to a Person (User), independent of its room. #31 */
259
+ setSatelliteOwner: {
260
+ path: "/hannah.v1.HannahService/SetSatelliteOwner",
261
+ requestStream: false,
262
+ responseStream: false,
263
+ requestSerialize: (value) => Buffer.from(satellite_1.SetSatelliteOwnerRequest.encode(value).finish()),
264
+ requestDeserialize: (value) => satellite_1.SetSatelliteOwnerRequest.decode(value),
265
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
266
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
267
+ },
268
+ /**
269
+ * Toggle whether the satellite's mic reopens after a Smalltalk answer instead of
270
+ * waiting for wake-word/PTT again (silence-timeout lives in the satellite firmware). #158
271
+ */
272
+ setSatelliteSmalltalkFollowup: {
273
+ path: "/hannah.v1.HannahService/SetSatelliteSmalltalkFollowup",
274
+ requestStream: false,
275
+ responseStream: false,
276
+ requestSerialize: (value) => Buffer.from(satellite_1.SetSatelliteSmalltalkFollowupRequest.encode(value).finish()),
277
+ requestDeserialize: (value) => satellite_1.SetSatelliteSmalltalkFollowupRequest.decode(value),
278
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
279
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
280
+ },
281
+ /** Delete existing satellite */
282
+ deleteSatellite: {
283
+ path: "/hannah.v1.HannahService/DeleteSatellite",
284
+ requestStream: false,
285
+ responseStream: false,
286
+ requestSerialize: (value) => Buffer.from(satellite_1.DeleteSatelliteRequest.encode(value).finish()),
287
+ requestDeserialize: (value) => satellite_1.DeleteSatelliteRequest.decode(value),
288
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
289
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
290
+ },
291
+ /** --- Rooms/Groups (Admin-UI, #27 Phase 1) --- */
292
+ getRooms: {
293
+ path: "/hannah.v1.HannahService/GetRooms",
294
+ requestStream: false,
295
+ responseStream: false,
296
+ requestSerialize: (value) => Buffer.from(shared_1.Empty.encode(value).finish()),
297
+ requestDeserialize: (value) => shared_1.Empty.decode(value),
298
+ responseSerialize: (value) => Buffer.from(control_1.GetRoomsResponse.encode(value).finish()),
299
+ responseDeserialize: (value) => control_1.GetRoomsResponse.decode(value),
300
+ },
301
+ getGroups: {
302
+ path: "/hannah.v1.HannahService/GetGroups",
303
+ requestStream: false,
304
+ responseStream: false,
305
+ requestSerialize: (value) => Buffer.from(shared_1.Empty.encode(value).finish()),
306
+ requestDeserialize: (value) => shared_1.Empty.decode(value),
307
+ responseSerialize: (value) => Buffer.from(control_1.GetGroupsResponse.encode(value).finish()),
308
+ responseDeserialize: (value) => control_1.GetGroupsResponse.decode(value),
309
+ },
310
+ createGroup: {
311
+ path: "/hannah.v1.HannahService/CreateGroup",
312
+ requestStream: false,
313
+ responseStream: false,
314
+ requestSerialize: (value) => Buffer.from(control_1.CreateGroupRequest.encode(value).finish()),
315
+ requestDeserialize: (value) => control_1.CreateGroupRequest.decode(value),
316
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
317
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
318
+ },
319
+ updateGroup: {
320
+ path: "/hannah.v1.HannahService/UpdateGroup",
321
+ requestStream: false,
322
+ responseStream: false,
323
+ requestSerialize: (value) => Buffer.from(control_1.UpdateGroupRequest.encode(value).finish()),
324
+ requestDeserialize: (value) => control_1.UpdateGroupRequest.decode(value),
325
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
326
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
327
+ },
328
+ deleteGroup: {
329
+ path: "/hannah.v1.HannahService/DeleteGroup",
330
+ requestStream: false,
331
+ responseStream: false,
332
+ requestSerialize: (value) => Buffer.from(control_1.DeleteGroupRequest.encode(value).finish()),
333
+ requestDeserialize: (value) => control_1.DeleteGroupRequest.decode(value),
334
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
335
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
336
+ },
337
+ setGroupSatellites: {
338
+ path: "/hannah.v1.HannahService/SetGroupSatellites",
339
+ requestStream: false,
340
+ responseStream: false,
341
+ requestSerialize: (value) => Buffer.from(control_1.SetGroupSatellitesRequest.encode(value).finish()),
342
+ requestDeserialize: (value) => control_1.SetGroupSatellitesRequest.decode(value),
343
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
344
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
345
+ },
346
+ /** --- Triggers (Admin-UI, #28) --- */
347
+ getTriggers: {
348
+ path: "/hannah.v1.HannahService/GetTriggers",
349
+ requestStream: false,
350
+ responseStream: false,
351
+ requestSerialize: (value) => Buffer.from(shared_1.Empty.encode(value).finish()),
352
+ requestDeserialize: (value) => shared_1.Empty.decode(value),
353
+ responseSerialize: (value) => Buffer.from(control_1.GetTriggersResponse.encode(value).finish()),
354
+ responseDeserialize: (value) => control_1.GetTriggersResponse.decode(value),
355
+ },
356
+ createTrigger: {
357
+ path: "/hannah.v1.HannahService/CreateTrigger",
358
+ requestStream: false,
359
+ responseStream: false,
360
+ requestSerialize: (value) => Buffer.from(control_1.CreateTriggerRequest.encode(value).finish()),
361
+ requestDeserialize: (value) => control_1.CreateTriggerRequest.decode(value),
362
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
363
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
364
+ },
365
+ updateTrigger: {
366
+ path: "/hannah.v1.HannahService/UpdateTrigger",
367
+ requestStream: false,
368
+ responseStream: false,
369
+ requestSerialize: (value) => Buffer.from(control_1.UpdateTriggerRequest.encode(value).finish()),
370
+ requestDeserialize: (value) => control_1.UpdateTriggerRequest.decode(value),
371
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
372
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
373
+ },
374
+ deleteTrigger: {
375
+ path: "/hannah.v1.HannahService/DeleteTrigger",
376
+ requestStream: false,
377
+ responseStream: false,
378
+ requestSerialize: (value) => Buffer.from(control_1.DeleteTriggerRequest.encode(value).finish()),
379
+ requestDeserialize: (value) => control_1.DeleteTriggerRequest.decode(value),
380
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
381
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
382
+ },
383
+ /** --- Alarms (Wecker, #4) --- */
384
+ getAlarms: {
385
+ path: "/hannah.v1.HannahService/GetAlarms",
386
+ requestStream: false,
387
+ responseStream: false,
388
+ requestSerialize: (value) => Buffer.from(shared_1.Empty.encode(value).finish()),
389
+ requestDeserialize: (value) => shared_1.Empty.decode(value),
390
+ responseSerialize: (value) => Buffer.from(control_1.GetAlarmsResponse.encode(value).finish()),
391
+ responseDeserialize: (value) => control_1.GetAlarmsResponse.decode(value),
392
+ },
393
+ createAlarm: {
394
+ path: "/hannah.v1.HannahService/CreateAlarm",
395
+ requestStream: false,
396
+ responseStream: false,
397
+ requestSerialize: (value) => Buffer.from(control_1.CreateAlarmRequest.encode(value).finish()),
398
+ requestDeserialize: (value) => control_1.CreateAlarmRequest.decode(value),
399
+ responseSerialize: (value) => Buffer.from(control_1.CreateAlarmResponse.encode(value).finish()),
400
+ responseDeserialize: (value) => control_1.CreateAlarmResponse.decode(value),
401
+ },
402
+ updateAlarm: {
403
+ path: "/hannah.v1.HannahService/UpdateAlarm",
404
+ requestStream: false,
405
+ responseStream: false,
406
+ requestSerialize: (value) => Buffer.from(control_1.UpdateAlarmRequest.encode(value).finish()),
407
+ requestDeserialize: (value) => control_1.UpdateAlarmRequest.decode(value),
408
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
409
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
410
+ },
411
+ deleteAlarm: {
412
+ path: "/hannah.v1.HannahService/DeleteAlarm",
413
+ requestStream: false,
414
+ responseStream: false,
415
+ requestSerialize: (value) => Buffer.from(control_1.DeleteAlarmRequest.encode(value).finish()),
416
+ requestDeserialize: (value) => control_1.DeleteAlarmRequest.decode(value),
417
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
418
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
419
+ },
420
+ /**
421
+ * --- Settings (Admin-UI, #27 Phase 5) ---
422
+ * CreateSetting/DeleteSetting wurden mit #115 entfernt: ble.tags/cars haben jetzt
423
+ * eigene Modelle+CRUD (unten), nlu/iobroker.state_names/llm.system_prompt sind immer
424
+ * vorab bekannt/geseedet — es gibt keinen verbleibenden Bedarf, neue Settings anzulegen.
425
+ */
426
+ getSettings: {
427
+ path: "/hannah.v1.HannahService/GetSettings",
428
+ requestStream: false,
429
+ responseStream: false,
430
+ requestSerialize: (value) => Buffer.from(shared_1.Empty.encode(value).finish()),
431
+ requestDeserialize: (value) => shared_1.Empty.decode(value),
432
+ responseSerialize: (value) => Buffer.from(control_1.GetSettingsResponse.encode(value).finish()),
433
+ responseDeserialize: (value) => control_1.GetSettingsResponse.decode(value),
434
+ },
435
+ updateConfig: {
436
+ path: "/hannah.v1.HannahService/UpdateConfig",
437
+ requestStream: false,
438
+ responseStream: false,
439
+ requestSerialize: (value) => Buffer.from(control_1.UpdateConfigRequest.encode(value).finish()),
440
+ requestDeserialize: (value) => control_1.UpdateConfigRequest.decode(value),
441
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
442
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
443
+ },
444
+ /** --- BLE Tags (Admin-UI, #115 — eigenes Modell statt Settings-JSON-Blob) --- */
445
+ getBleTags: {
446
+ path: "/hannah.v1.HannahService/GetBleTags",
447
+ requestStream: false,
448
+ responseStream: false,
449
+ requestSerialize: (value) => Buffer.from(shared_1.Empty.encode(value).finish()),
450
+ requestDeserialize: (value) => shared_1.Empty.decode(value),
451
+ responseSerialize: (value) => Buffer.from(control_1.GetBleTagsResponse.encode(value).finish()),
452
+ responseDeserialize: (value) => control_1.GetBleTagsResponse.decode(value),
453
+ },
454
+ createBleTag: {
455
+ path: "/hannah.v1.HannahService/CreateBleTag",
456
+ requestStream: false,
457
+ responseStream: false,
458
+ requestSerialize: (value) => Buffer.from(control_1.CreateBleTagRequest.encode(value).finish()),
459
+ requestDeserialize: (value) => control_1.CreateBleTagRequest.decode(value),
460
+ responseSerialize: (value) => Buffer.from(control_1.CreateBleTagResponse.encode(value).finish()),
461
+ responseDeserialize: (value) => control_1.CreateBleTagResponse.decode(value),
462
+ },
463
+ updateBleTag: {
464
+ path: "/hannah.v1.HannahService/UpdateBleTag",
465
+ requestStream: false,
466
+ responseStream: false,
467
+ requestSerialize: (value) => Buffer.from(control_1.UpdateBleTagRequest.encode(value).finish()),
468
+ requestDeserialize: (value) => control_1.UpdateBleTagRequest.decode(value),
469
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
470
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
471
+ },
472
+ deleteBleTag: {
473
+ path: "/hannah.v1.HannahService/DeleteBleTag",
474
+ requestStream: false,
475
+ responseStream: false,
476
+ requestSerialize: (value) => Buffer.from(control_1.DeleteBleTagRequest.encode(value).finish()),
477
+ requestDeserialize: (value) => control_1.DeleteBleTagRequest.decode(value),
478
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
479
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
480
+ },
481
+ /** --- Presence Sources (Admin-UI, hannah#294 — presence fusion) --- */
482
+ getPresenceSources: {
483
+ path: "/hannah.v1.HannahService/GetPresenceSources",
484
+ requestStream: false,
485
+ responseStream: false,
486
+ requestSerialize: (value) => Buffer.from(shared_1.Empty.encode(value).finish()),
487
+ requestDeserialize: (value) => shared_1.Empty.decode(value),
488
+ responseSerialize: (value) => Buffer.from(control_1.GetPresenceSourcesResponse.encode(value).finish()),
489
+ responseDeserialize: (value) => control_1.GetPresenceSourcesResponse.decode(value),
490
+ },
491
+ createPresenceSource: {
492
+ path: "/hannah.v1.HannahService/CreatePresenceSource",
493
+ requestStream: false,
494
+ responseStream: false,
495
+ requestSerialize: (value) => Buffer.from(control_1.CreatePresenceSourceRequest.encode(value).finish()),
496
+ requestDeserialize: (value) => control_1.CreatePresenceSourceRequest.decode(value),
497
+ responseSerialize: (value) => Buffer.from(control_1.CreatePresenceSourceResponse.encode(value).finish()),
498
+ responseDeserialize: (value) => control_1.CreatePresenceSourceResponse.decode(value),
499
+ },
500
+ updatePresenceSource: {
501
+ path: "/hannah.v1.HannahService/UpdatePresenceSource",
502
+ requestStream: false,
503
+ responseStream: false,
504
+ requestSerialize: (value) => Buffer.from(control_1.UpdatePresenceSourceRequest.encode(value).finish()),
505
+ requestDeserialize: (value) => control_1.UpdatePresenceSourceRequest.decode(value),
506
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
507
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
508
+ },
509
+ deletePresenceSource: {
510
+ path: "/hannah.v1.HannahService/DeletePresenceSource",
511
+ requestStream: false,
512
+ responseStream: false,
513
+ requestSerialize: (value) => Buffer.from(control_1.DeletePresenceSourceRequest.encode(value).finish()),
514
+ requestDeserialize: (value) => control_1.DeletePresenceSourceRequest.decode(value),
515
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
516
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
517
+ },
518
+ /** --- Cars (Admin-UI, #115 — eigenes Modell + user_to_car-Pivot statt Settings-JSON-Blob) --- */
519
+ getCars: {
520
+ path: "/hannah.v1.HannahService/GetCars",
521
+ requestStream: false,
522
+ responseStream: false,
523
+ requestSerialize: (value) => Buffer.from(shared_1.Empty.encode(value).finish()),
524
+ requestDeserialize: (value) => shared_1.Empty.decode(value),
525
+ responseSerialize: (value) => Buffer.from(control_1.GetCarsResponse.encode(value).finish()),
526
+ responseDeserialize: (value) => control_1.GetCarsResponse.decode(value),
527
+ },
528
+ createCar: {
529
+ path: "/hannah.v1.HannahService/CreateCar",
530
+ requestStream: false,
531
+ responseStream: false,
532
+ requestSerialize: (value) => Buffer.from(control_1.CreateCarRequest.encode(value).finish()),
533
+ requestDeserialize: (value) => control_1.CreateCarRequest.decode(value),
534
+ responseSerialize: (value) => Buffer.from(control_1.CreateCarResponse.encode(value).finish()),
535
+ responseDeserialize: (value) => control_1.CreateCarResponse.decode(value),
536
+ },
537
+ updateCar: {
538
+ path: "/hannah.v1.HannahService/UpdateCar",
539
+ requestStream: false,
540
+ responseStream: false,
541
+ requestSerialize: (value) => Buffer.from(control_1.UpdateCarRequest.encode(value).finish()),
542
+ requestDeserialize: (value) => control_1.UpdateCarRequest.decode(value),
543
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
544
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
545
+ },
546
+ deleteCar: {
547
+ path: "/hannah.v1.HannahService/DeleteCar",
548
+ requestStream: false,
549
+ responseStream: false,
550
+ requestSerialize: (value) => Buffer.from(control_1.DeleteCarRequest.encode(value).finish()),
551
+ requestDeserialize: (value) => control_1.DeleteCarRequest.decode(value),
552
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
553
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
554
+ },
555
+ /**
556
+ * --- Car state (Live-VW-Connect-Status, unabhängig von der Car-Konfiguration oben) ---
557
+ * Returns the current cached car state (available=false if no data received yet).
558
+ */
559
+ getCarState: {
560
+ path: "/hannah.v1.HannahService/GetCarState",
561
+ requestStream: false,
562
+ responseStream: false,
563
+ requestSerialize: (value) => Buffer.from(shared_1.Empty.encode(value).finish()),
564
+ requestDeserialize: (value) => shared_1.Empty.decode(value),
565
+ responseSerialize: (value) => Buffer.from(car_state_1.CarStateResponse.encode(value).finish()),
566
+ responseDeserialize: (value) => car_state_1.CarStateResponse.decode(value),
567
+ },
568
+ /** Returns all tracked car states (one per configured car). */
569
+ getAllCarStates: {
570
+ path: "/hannah.v1.HannahService/GetAllCarStates",
571
+ requestStream: false,
572
+ responseStream: false,
573
+ requestSerialize: (value) => Buffer.from(shared_1.Empty.encode(value).finish()),
574
+ requestDeserialize: (value) => shared_1.Empty.decode(value),
575
+ responseSerialize: (value) => Buffer.from(car_state_1.GetAllCarStatesResponse.encode(value).finish()),
576
+ responseDeserialize: (value) => car_state_1.GetAllCarStatesResponse.decode(value),
577
+ },
578
+ /**
579
+ * --- Event stream ---
580
+ * Opens a server-side stream; Hannah pushes events as they occur.
581
+ * Pass event_types to filter (empty = all events).
582
+ * Known event types: "car.parked", "resident.arrived", "resident.departed", "satellite.firmware"
583
+ */
584
+ subscribeEvents: {
585
+ path: "/hannah.v1.HannahService/SubscribeEvents",
586
+ requestStream: false,
587
+ responseStream: true,
588
+ requestSerialize: (value) => Buffer.from(event_stream_1.EventFilter.encode(value).finish()),
589
+ requestDeserialize: (value) => event_stream_1.EventFilter.decode(value),
590
+ responseSerialize: (value) => Buffer.from(event_stream_1.HannahEvent.encode(value).finish()),
591
+ responseDeserialize: (value) => event_stream_1.HannahEvent.decode(value),
592
+ },
593
+ /**
594
+ * --- Firmware Manager ---
595
+ * Trigger an immediate OTA update for a satellite (bypasses residents check).
596
+ */
597
+ triggerFirmwareUpdate: {
598
+ path: "/hannah.v1.HannahService/TriggerFirmwareUpdate",
599
+ requestStream: false,
600
+ responseStream: false,
601
+ requestSerialize: (value) => Buffer.from(event_stream_1.TriggerFirmwareUpdateRequest.encode(value).finish()),
602
+ requestDeserialize: (value) => event_stream_1.TriggerFirmwareUpdateRequest.decode(value),
603
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
604
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
605
+ },
606
+ /**
607
+ * Trigger an ordered remote restart (esp_restart()) of a satellite over MQTT.
608
+ * Diagnostic/rejuvenation tool for suspected resource exhaustion (heap fragmentation
609
+ * after long uptime) — works even when the satellite's OTA/webserver no longer
610
+ * respond, since MQTT stays alive in that failure mode.
611
+ */
612
+ triggerSatelliteRestart: {
613
+ path: "/hannah.v1.HannahService/TriggerSatelliteRestart",
614
+ requestStream: false,
615
+ responseStream: false,
616
+ requestSerialize: (value) => Buffer.from(event_stream_1.TriggerSatelliteRestartRequest.encode(value).finish()),
617
+ requestDeserialize: (value) => event_stream_1.TriggerSatelliteRestartRequest.decode(value),
618
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
619
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
620
+ },
621
+ /**
622
+ * --- Wakeword Capture ---
623
+ * Put a satellite in audio-capture mode for wakeword training data collection.
624
+ * While captured: wakeword detection is suspended, speaker is muted, DND is active.
625
+ * Hannah relays raw PCM chunks from the satellite to the collector via StreamSatelliteAudio.
626
+ * The stream stays open until the collector disconnects; Hannah then auto-releases the satellite.
627
+ */
628
+ requestSatelliteCapture: {
629
+ path: "/hannah.v1.HannahService/RequestSatelliteCapture",
630
+ requestStream: false,
631
+ responseStream: false,
632
+ requestSerialize: (value) => Buffer.from(wakeword_capture_1.SatelliteCaptureRequest.encode(value).finish()),
633
+ requestDeserialize: (value) => wakeword_capture_1.SatelliteCaptureRequest.decode(value),
634
+ responseSerialize: (value) => Buffer.from(wakeword_capture_1.SatelliteCaptureResponse.encode(value).finish()),
635
+ responseDeserialize: (value) => wakeword_capture_1.SatelliteCaptureResponse.decode(value),
636
+ },
637
+ releaseSatelliteCapture: {
638
+ path: "/hannah.v1.HannahService/ReleaseSatelliteCapture",
639
+ requestStream: false,
640
+ responseStream: false,
641
+ requestSerialize: (value) => Buffer.from(wakeword_capture_1.SatelliteCaptureRequest.encode(value).finish()),
642
+ requestDeserialize: (value) => wakeword_capture_1.SatelliteCaptureRequest.decode(value),
643
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
644
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
645
+ },
646
+ streamSatelliteAudio: {
647
+ path: "/hannah.v1.HannahService/StreamSatelliteAudio",
648
+ requestStream: false,
649
+ responseStream: true,
650
+ requestSerialize: (value) => Buffer.from(wakeword_capture_1.SatelliteCaptureRequest.encode(value).finish()),
651
+ requestDeserialize: (value) => wakeword_capture_1.SatelliteCaptureRequest.decode(value),
652
+ responseSerialize: (value) => Buffer.from(wakeword_capture_1.SatelliteAudioChunk.encode(value).finish()),
653
+ responseDeserialize: (value) => wakeword_capture_1.SatelliteAudioChunk.decode(value),
654
+ },
655
+ /**
656
+ * Play a plink sound on the satellite, then hold virtual PTT for record_duration seconds.
657
+ * Returns after PTT is released — Collector calls this in a loop for guided hey-hannah collection.
658
+ */
659
+ triggerPlink: {
660
+ path: "/hannah.v1.HannahService/TriggerPlink",
661
+ requestStream: false,
662
+ responseStream: false,
663
+ requestSerialize: (value) => Buffer.from(wakeword_capture_1.TriggerPlinkRequest.encode(value).finish()),
664
+ requestDeserialize: (value) => wakeword_capture_1.TriggerPlinkRequest.decode(value),
665
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
666
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
667
+ },
668
+ /**
669
+ * Bidirectional stream between the Collector and Hannah Core, analogous to TimerConnect.
670
+ * The Collector initiates and holds the connection open; Hannah pushes CaptureCommands
671
+ * down to start/stop satellite captures instead of the Collector polling for them.
672
+ */
673
+ collectorConnect: {
674
+ path: "/hannah.v1.HannahService/CollectorConnect",
675
+ requestStream: true,
676
+ responseStream: true,
677
+ requestSerialize: (value) => Buffer.from(wakeword_capture_1.CollectorMessage.encode(value).finish()),
678
+ requestDeserialize: (value) => wakeword_capture_1.CollectorMessage.decode(value),
679
+ responseSerialize: (value) => Buffer.from(wakeword_capture_1.CaptureCommand.encode(value).finish()),
680
+ responseDeserialize: (value) => wakeword_capture_1.CaptureCommand.decode(value),
681
+ },
682
+ /**
683
+ * Unary trigger for external callers (e.g. WebUI) that can't hold a CollectorConnect
684
+ * stream themselves — Hannah relays the command over its own CollectorConnect stream
685
+ * to the connected Collector. Fails with ok=false if no Collector is connected.
686
+ */
687
+ triggerCollectorCapture: {
688
+ path: "/hannah.v1.HannahService/TriggerCollectorCapture",
689
+ requestStream: false,
690
+ responseStream: false,
691
+ requestSerialize: (value) => Buffer.from(wakeword_capture_1.CaptureCommand.encode(value).finish()),
692
+ requestDeserialize: (value) => wakeword_capture_1.CaptureCommand.decode(value),
693
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
694
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
695
+ },
696
+ /**
697
+ * --- Satellite Proxy (Go gRPC proxy) ---
698
+ * Bidirectional keepalive stream. Proxy sends heartbeats; Hannah sends TTS
699
+ * audio commands back (for announcements). While this stream is open, Hannah
700
+ * disables its own UDP server. If the stream drops, Hannah re-enables UDP.
701
+ */
702
+ registerProxy: {
703
+ path: "/hannah.v1.HannahService/RegisterProxy",
704
+ requestStream: true,
705
+ responseStream: true,
706
+ requestSerialize: (value) => Buffer.from(satellite_proxy_1.ProxyHeartbeat.encode(value).finish()),
707
+ requestDeserialize: (value) => satellite_proxy_1.ProxyHeartbeat.decode(value),
708
+ responseSerialize: (value) => Buffer.from(satellite_proxy_1.ProxyCommand.encode(value).finish()),
709
+ responseDeserialize: (value) => satellite_proxy_1.ProxyCommand.decode(value),
710
+ },
711
+ /**
712
+ * Submit a complete satellite audio session for processing.
713
+ * Hannah runs the full pipeline (STT → NLU → TTS → MQTT status) and returns
714
+ * the result so the proxy can play TTS audio back to the satellite.
715
+ */
716
+ submitSatelliteAudio: {
717
+ path: "/hannah.v1.HannahService/SubmitSatelliteAudio",
718
+ requestStream: false,
719
+ responseStream: false,
720
+ requestSerialize: (value) => Buffer.from(satellite_proxy_1.SubmitSatelliteAudioRequest.encode(value).finish()),
721
+ requestDeserialize: (value) => satellite_proxy_1.SubmitSatelliteAudioRequest.decode(value),
722
+ responseSerialize: (value) => Buffer.from(satellite_proxy_1.SubmitSatelliteAudioResponse.encode(value).finish()),
723
+ responseDeserialize: (value) => satellite_proxy_1.SubmitSatelliteAudioResponse.decode(value),
724
+ },
725
+ /**
726
+ * Notify Hannah that a satellite registered or disconnected via the proxy.
727
+ * Hannah updates its room registry (hannah/rooms MQTT) immediately.
728
+ */
729
+ notifySatelliteRegistered: {
730
+ path: "/hannah.v1.HannahService/NotifySatelliteRegistered",
731
+ requestStream: false,
732
+ responseStream: false,
733
+ requestSerialize: (value) => Buffer.from(satellite_proxy_1.SatelliteRegistration.encode(value).finish()),
734
+ requestDeserialize: (value) => satellite_proxy_1.SatelliteRegistration.decode(value),
735
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
736
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
737
+ },
738
+ notifySatelliteGone: {
739
+ path: "/hannah.v1.HannahService/NotifySatelliteGone",
740
+ requestStream: false,
741
+ responseStream: false,
742
+ requestSerialize: (value) => Buffer.from(satellite_proxy_1.SatelliteRegistration.encode(value).finish()),
743
+ requestDeserialize: (value) => satellite_proxy_1.SatelliteRegistration.decode(value),
744
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
745
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
746
+ },
747
+ /**
748
+ * --- Satellite Provisioning ---
749
+ * Called by the ioBroker adapter before WebFlash to pre-register a seed + display name + room.
750
+ * When the satellite first connects with that seed, Hannah links serial → pre-config and clears the seed.
751
+ */
752
+ provisionSatellite: {
753
+ path: "/hannah.v1.HannahService/ProvisionSatellite",
754
+ requestStream: false,
755
+ responseStream: false,
756
+ requestSerialize: (value) => Buffer.from(satellite_provisioning_1.ProvisionSatelliteRequest.encode(value).finish()),
757
+ requestDeserialize: (value) => satellite_provisioning_1.ProvisionSatelliteRequest.decode(value),
758
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
759
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
760
+ },
761
+ /**
762
+ * --- Speaker Enrollment ---
763
+ * Trigger a guided voice-enrollment dialog for user_id at satellite_id (hannah#8);
764
+ * Core orchestrates the dialog itself. EnrollVoiceprint stays available as the
765
+ * low-level "store one already-captured sample" call — kept for now (additive,
766
+ * no hard cut) until hannah#8 confirms Core no longer needs it as an external RPC.
767
+ */
768
+ startVoiceEnrollment: {
769
+ path: "/hannah.v1.HannahService/StartVoiceEnrollment",
770
+ requestStream: false,
771
+ responseStream: false,
772
+ requestSerialize: (value) => Buffer.from(speaker_enrollment_1.StartVoiceEnrollmentRequest.encode(value).finish()),
773
+ requestDeserialize: (value) => speaker_enrollment_1.StartVoiceEnrollmentRequest.decode(value),
774
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
775
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
776
+ },
777
+ enrollVoiceprint: {
778
+ path: "/hannah.v1.HannahService/EnrollVoiceprint",
779
+ requestStream: false,
780
+ responseStream: false,
781
+ requestSerialize: (value) => Buffer.from(speaker_enrollment_1.EnrollVoiceprintRequest.encode(value).finish()),
782
+ requestDeserialize: (value) => speaker_enrollment_1.EnrollVoiceprintRequest.decode(value),
783
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
784
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
785
+ },
786
+ /**
787
+ * --- Timer Service ---
788
+ * Bidirectional stream between the Hannah Timer Service and Hannah Core.
789
+ * The Timer Service initiates the connection; if Hannah restarts, the service reconnects.
790
+ * Hannah sends timer commands (create, cancel, list); the service fires events when timers expire.
791
+ */
792
+ timerConnect: {
793
+ path: "/hannah.v1.HannahService/TimerConnect",
794
+ requestStream: true,
795
+ responseStream: true,
796
+ requestSerialize: (value) => Buffer.from(timer_service_1.TimerMessage.encode(value).finish()),
797
+ requestDeserialize: (value) => timer_service_1.TimerMessage.decode(value),
798
+ responseSerialize: (value) => Buffer.from(timer_service_1.TimerCommand.encode(value).finish()),
799
+ responseDeserialize: (value) => timer_service_1.TimerCommand.decode(value),
800
+ },
801
+ /**
802
+ * --- Timer Admin ---
803
+ * Query and cancel timers independent of the TimerConnect stream — e.g. for an
804
+ * Admin-UI or Telegram bot listing/cancelling a user's active timers.
805
+ */
806
+ getTimers: {
807
+ path: "/hannah.v1.HannahService/GetTimers",
808
+ requestStream: false,
809
+ responseStream: false,
810
+ requestSerialize: (value) => Buffer.from(timer_admin_1.GetTimersRequest.encode(value).finish()),
811
+ requestDeserialize: (value) => timer_admin_1.GetTimersRequest.decode(value),
812
+ responseSerialize: (value) => Buffer.from(timer_admin_1.GetTimersResponse.encode(value).finish()),
813
+ responseDeserialize: (value) => timer_admin_1.GetTimersResponse.decode(value),
814
+ },
815
+ deleteTimer: {
816
+ path: "/hannah.v1.HannahService/DeleteTimer",
817
+ requestStream: false,
818
+ responseStream: false,
819
+ requestSerialize: (value) => Buffer.from(timer_admin_1.DeleteTimerRequest.encode(value).finish()),
820
+ requestDeserialize: (value) => timer_admin_1.DeleteTimerRequest.decode(value),
821
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
822
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
823
+ },
824
+ /**
825
+ * --- ioBroker Agent ---
826
+ * Single bidirectional stream between the HannahAgent ioBroker adapter and Hannah Core.
827
+ * The adapter pushes state updates (device states, presence, text commands);
828
+ * Hannah pushes device-control commands and on-demand state-subscription requests back.
829
+ * The adapter initiates the connection; if Hannah restarts, the adapter reconnects.
830
+ */
831
+ agentConnect: {
832
+ path: "/hannah.v1.HannahService/AgentConnect",
833
+ requestStream: true,
834
+ responseStream: true,
835
+ requestSerialize: (value) => Buffer.from(agent_1.AgentMessage.encode(value).finish()),
836
+ requestDeserialize: (value) => agent_1.AgentMessage.decode(value),
837
+ responseSerialize: (value) => Buffer.from(agent_1.AgentCommand.encode(value).finish()),
838
+ responseDeserialize: (value) => agent_1.AgentCommand.decode(value),
839
+ },
840
+ /**
841
+ * --- Automations ---
842
+ * Bidirectional stream for external automation services (e.g. telegram_autoresponder).
843
+ * The service sends an AutomationRegister identifying itself, then Hannah replies with
844
+ * an AutomationSnapshot (all users with it currently enabled) followed by live
845
+ * AutomationStateChanged deltas as users toggle it via SetAutomation/voice.
846
+ * Chosen over SubscribeEvents so a reconnecting service always gets a fresh snapshot
847
+ * instead of missing state changes that happened while it was offline.
848
+ */
849
+ automationConnect: {
850
+ path: "/hannah.v1.HannahService/AutomationConnect",
851
+ requestStream: true,
852
+ responseStream: true,
853
+ requestSerialize: (value) => Buffer.from(automation_1.AutomationMessage.encode(value).finish()),
854
+ requestDeserialize: (value) => automation_1.AutomationMessage.decode(value),
855
+ responseSerialize: (value) => Buffer.from(automation_1.AutomationCommand.encode(value).finish()),
856
+ responseDeserialize: (value) => automation_1.AutomationCommand.decode(value),
857
+ },
858
+ /**
859
+ * --- Channels ---
860
+ * Bidirectional stream for channel adapters (e.g. the Telegram service). The adapter
861
+ * sends a ChannelRegister and keeps the stream open; it counts as available exactly as
862
+ * long as the stream is open. A second registration for the same service replaces the
863
+ * first. Link tokens (CreateLinkToken) are redeemed over this stream.
864
+ */
865
+ channelConnect: {
866
+ path: "/hannah.v1.HannahService/ChannelConnect",
867
+ requestStream: true,
868
+ responseStream: true,
869
+ requestSerialize: (value) => Buffer.from(channel_1.ChannelMessage.encode(value).finish()),
870
+ requestDeserialize: (value) => channel_1.ChannelMessage.decode(value),
871
+ responseSerialize: (value) => Buffer.from(channel_1.ChannelCommand.encode(value).finish()),
872
+ responseDeserialize: (value) => channel_1.ChannelCommand.decode(value),
873
+ },
874
+ /** Currently connected channel adapters and whether they support account linking. */
875
+ getChannels: {
876
+ path: "/hannah.v1.HannahService/GetChannels",
877
+ requestStream: false,
878
+ responseStream: false,
879
+ requestSerialize: (value) => Buffer.from(shared_1.Empty.encode(value).finish()),
880
+ requestDeserialize: (value) => shared_1.Empty.decode(value),
881
+ responseSerialize: (value) => Buffer.from(channel_1.GetChannelsResponse.encode(value).finish()),
882
+ responseDeserialize: (value) => channel_1.GetChannelsResponse.decode(value),
883
+ },
884
+ /**
885
+ * --- Infrastructure ---
886
+ * Service discovery for components: Hannah sends an InfrastructureSnapshot of all
887
+ * currently available infrastructure services (e.g. the log collector) right after
888
+ * subscribing, followed by ServiceAvailable/ServiceUnavailable deltas.
889
+ */
890
+ subscribeInfrastructure: {
891
+ path: "/hannah.v1.HannahService/SubscribeInfrastructure",
892
+ requestStream: false,
893
+ responseStream: true,
894
+ requestSerialize: (value) => Buffer.from(infrastructure_1.InfrastructureFilter.encode(value).finish()),
895
+ requestDeserialize: (value) => infrastructure_1.InfrastructureFilter.decode(value),
896
+ responseSerialize: (value) => Buffer.from(infrastructure_1.InfrastructureMessage.encode(value).finish()),
897
+ responseDeserialize: (value) => infrastructure_1.InfrastructureMessage.decode(value),
898
+ },
899
+ /**
900
+ * Bidirectional stream for the log collector. The collector sends a LogCollectorRegister
901
+ * and keeps the stream open; it counts as available exactly as long as the stream is
902
+ * open, and a second registration for the same instance replaces the first (same
903
+ * semantics as ChannelConnect). Not related to CollectorConnect (wakeword capture).
904
+ */
905
+ logCollectorConnect: {
906
+ path: "/hannah.v1.HannahService/LogCollectorConnect",
907
+ requestStream: true,
908
+ responseStream: true,
909
+ requestSerialize: (value) => Buffer.from(infrastructure_1.LogCollectorMessage.encode(value).finish()),
910
+ requestDeserialize: (value) => infrastructure_1.LogCollectorMessage.decode(value),
911
+ responseSerialize: (value) => Buffer.from(infrastructure_1.LogCollectorCommand.encode(value).finish()),
912
+ responseDeserialize: (value) => infrastructure_1.LogCollectorCommand.decode(value),
913
+ },
914
+ /**
915
+ * --- Activity Log ---
916
+ * Read access to the Activity Log (#220) for external consumers (WebUI). List returns
917
+ * full entry detail inline (transcript, intent + intent_meta, answer text) with
918
+ * cursor-based pagination; audio is fetched separately, decoded server-side from the
919
+ * stored WAV and streamed as raw PCM chunks.
920
+ */
921
+ listActivityLog: {
922
+ path: "/hannah.v1.HannahService/ListActivityLog",
923
+ requestStream: false,
924
+ responseStream: false,
925
+ requestSerialize: (value) => Buffer.from(activity_log_1.ListActivityLogRequest.encode(value).finish()),
926
+ requestDeserialize: (value) => activity_log_1.ListActivityLogRequest.decode(value),
927
+ responseSerialize: (value) => Buffer.from(activity_log_1.ListActivityLogResponse.encode(value).finish()),
928
+ responseDeserialize: (value) => activity_log_1.ListActivityLogResponse.decode(value),
929
+ },
930
+ streamActivityAudio: {
931
+ path: "/hannah.v1.HannahService/StreamActivityAudio",
932
+ requestStream: false,
933
+ responseStream: true,
934
+ requestSerialize: (value) => Buffer.from(activity_log_1.StreamActivityAudioRequest.encode(value).finish()),
935
+ requestDeserialize: (value) => activity_log_1.StreamActivityAudioRequest.decode(value),
936
+ responseSerialize: (value) => Buffer.from(activity_log_1.ActivityAudioChunk.encode(value).finish()),
937
+ responseDeserialize: (value) => activity_log_1.ActivityAudioChunk.decode(value),
938
+ },
939
+ /** --- Messages (passive per-user mailbox, third notification type) --- */
940
+ createMessage: {
941
+ path: "/hannah.v1.HannahService/CreateMessage",
942
+ requestStream: false,
943
+ responseStream: false,
944
+ requestSerialize: (value) => Buffer.from(messages_1.CreateMessageRequest.encode(value).finish()),
945
+ requestDeserialize: (value) => messages_1.CreateMessageRequest.decode(value),
946
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
947
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
948
+ },
949
+ listMessages: {
950
+ path: "/hannah.v1.HannahService/ListMessages",
951
+ requestStream: false,
952
+ responseStream: false,
953
+ requestSerialize: (value) => Buffer.from(messages_1.ListMessagesRequest.encode(value).finish()),
954
+ requestDeserialize: (value) => messages_1.ListMessagesRequest.decode(value),
955
+ responseSerialize: (value) => Buffer.from(messages_1.ListMessagesResponse.encode(value).finish()),
956
+ responseDeserialize: (value) => messages_1.ListMessagesResponse.decode(value),
957
+ },
958
+ deleteMessage: {
959
+ path: "/hannah.v1.HannahService/DeleteMessage",
960
+ requestStream: false,
961
+ responseStream: false,
962
+ requestSerialize: (value) => Buffer.from(messages_1.DeleteMessageRequest.encode(value).finish()),
963
+ requestDeserialize: (value) => messages_1.DeleteMessageRequest.decode(value),
964
+ responseSerialize: (value) => Buffer.from(shared_1.StatusResponse.encode(value).finish()),
965
+ responseDeserialize: (value) => shared_1.StatusResponse.decode(value),
966
+ },
967
+ };
968
+ exports.HannahServiceClient = (0, grpc_js_1.makeGenericClientConstructor)(exports.HannahServiceService, "hannah.v1.HannahService");