@pellux/goodvibes-sdk 0.25.13 → 0.25.14

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 (26) hide show
  1. package/dist/_internal/contracts/artifacts/operator-contract.json +1 -1
  2. package/dist/_internal/contracts/generated/foundation-metadata.d.ts +1 -1
  3. package/dist/_internal/contracts/generated/foundation-metadata.js +1 -1
  4. package/dist/_internal/contracts/generated/operator-contract.js +1 -1
  5. package/dist/_internal/platform/adapters/homeassistant/index.d.ts.map +1 -1
  6. package/dist/_internal/platform/adapters/homeassistant/index.js +45 -65
  7. package/dist/_internal/platform/adapters/types.d.ts +26 -0
  8. package/dist/_internal/platform/adapters/types.d.ts.map +1 -1
  9. package/dist/_internal/platform/channels/builtin/homeassistant.d.ts.map +1 -1
  10. package/dist/_internal/platform/channels/builtin/homeassistant.js +3 -5
  11. package/dist/_internal/platform/channels/builtin/setup-schema.js +3 -3
  12. package/dist/_internal/platform/control-plane/session-types.d.ts +1 -2
  13. package/dist/_internal/platform/control-plane/session-types.d.ts.map +1 -1
  14. package/dist/_internal/platform/daemon/homeassistant-chat.d.ts +61 -0
  15. package/dist/_internal/platform/daemon/homeassistant-chat.d.ts.map +1 -0
  16. package/dist/_internal/platform/daemon/homeassistant-chat.js +128 -0
  17. package/dist/_internal/platform/daemon/http/homeassistant-routes.d.ts +6 -16
  18. package/dist/_internal/platform/daemon/http/homeassistant-routes.d.ts.map +1 -1
  19. package/dist/_internal/platform/daemon/http/homeassistant-routes.js +73 -255
  20. package/dist/_internal/platform/daemon/http/router.d.ts.map +1 -1
  21. package/dist/_internal/platform/daemon/http/router.js +6 -4
  22. package/dist/_internal/platform/daemon/surface-actions.d.ts +2 -0
  23. package/dist/_internal/platform/daemon/surface-actions.d.ts.map +1 -1
  24. package/dist/_internal/platform/daemon/surface-actions.js +118 -0
  25. package/dist/_internal/platform/version.js +1 -1
  26. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { HOME_ASSISTANT_SURFACE } from '../../channels/builtin/homeassistant.js';
3
+ import { postHomeAssistantChatMessage, readHomeAssistantRemoteSessionTtlMs, } from '../homeassistant-chat.js';
3
4
  const DEFAULT_WAIT_TIMEOUT_MS = 120_000;
4
5
  const MAX_WAIT_TIMEOUT_MS = 10 * 60_000;
5
- const DEFAULT_REMOTE_SESSION_TTL_MS = 20 * 60_000;
6
6
  export class HomeAssistantConversationRoutes {
7
7
  context;
8
8
  messageIndex = new Map();
@@ -20,13 +20,13 @@ export class HomeAssistantConversationRoutes {
20
20
  const body = await this.context.parseJsonBody(req);
21
21
  if (body instanceof Response)
22
22
  return body;
23
- return this.respondToSubmit(await this.submitConversation(body, req.signal));
23
+ return this.respondToSubmit(await this.submitConversation(body));
24
24
  }
25
25
  if (url.pathname === '/api/homeassistant/conversation/stream' && req.method === 'POST') {
26
26
  const body = await this.context.parseJsonBody(req);
27
27
  if (body instanceof Response)
28
28
  return body;
29
- return this.streamConversation(body, req.signal);
29
+ return this.streamConversation(body);
30
30
  }
31
31
  if (url.pathname === '/api/homeassistant/conversation/cancel' && req.method === 'POST') {
32
32
  const body = await this.context.parseJsonBody(req);
@@ -56,12 +56,13 @@ export class HomeAssistantConversationRoutes {
56
56
  'conversation-stream',
57
57
  'conversation-cancel',
58
58
  'stable-correlation',
59
+ 'isolated-remote-chat-session',
59
60
  'remote-session-ttl',
60
61
  'homeassistant-event-delivery',
61
62
  ],
62
63
  };
63
64
  }
64
- async submitConversation(body, signal) {
65
+ async submitConversation(body) {
65
66
  if (!Boolean(this.context.configManager.get('surfaces.homeassistant.enabled'))) {
66
67
  return {
67
68
  ok: false,
@@ -93,87 +94,63 @@ export class HomeAssistantConversationRoutes {
93
94
  error: 'Missing Home Assistant conversation message.',
94
95
  };
95
96
  }
96
- await this.context.routeBindings.start();
97
- await this.context.sessionBroker.start();
98
- const binding = await this.upsertBinding(input);
99
- const sessionResolution = await this.resolveRemoteSession(binding, input);
100
- const routing = this.buildRouting(input);
101
- const submission = await this.context.sessionBroker.submitMessage({
102
- sessionId: sessionResolution.session.id,
103
- routeId: binding.id,
104
- surfaceKind: HOME_ASSISTANT_SURFACE,
105
- surfaceId: input.surfaceId,
106
- externalId: input.conversationId,
107
- ...(input.threadId ? { threadId: input.threadId } : {}),
108
- ...(input.userId ? { userId: input.userId } : {}),
109
- ...(input.displayName ? { displayName: input.displayName } : {}),
110
- title: input.title,
111
- body: input.text,
112
- metadata: {
113
- source: 'homeassistant',
97
+ let posted;
98
+ try {
99
+ posted = await postHomeAssistantChatMessage({
100
+ configManager: this.context.configManager,
101
+ routeBindings: this.context.routeBindings,
102
+ chatManager: this.context.chatManager,
103
+ resolveDefaultProviderModel: this.context.resolveDefaultProviderModel,
104
+ }, input, {
105
+ wait: input.wait,
106
+ timeoutMs: input.waitTimeoutMs,
107
+ clientId: `homeassistant:${input.surfaceId}:${input.conversationId}`,
108
+ });
109
+ }
110
+ catch (error) {
111
+ return {
112
+ ok: false,
113
+ acknowledged: true,
114
114
  messageId: input.messageId,
115
115
  conversationId: input.conversationId,
116
- remoteSessionTtlMs: input.remoteSessionTtlMs,
117
- ...(input.context ? { homeAssistantContext: input.context } : {}),
118
- },
119
- ...(routing ? { routing } : {}),
120
- });
121
- let agentId = submission.activeAgentId;
122
- if (submission.mode === 'spawn') {
123
- const spawnResult = this.context.trySpawnAgent({
124
- mode: 'spawn',
125
- task: submission.task,
126
- executionProtocol: 'direct',
127
- reviewMode: 'none',
128
- communicationLane: 'direct',
129
- dangerously_disable_wrfc: true,
130
- ...(input.modelId ? { model: input.modelId } : {}),
131
- ...(input.providerId ? { provider: input.providerId } : {}),
132
- ...(input.tools?.length ? { tools: [...input.tools] } : {}),
133
- context: `homeassistant:${input.conversationId}`,
134
- }, 'HomeAssistantConversationRoutes.submitConversation', submission.session.id);
135
- if (spawnResult instanceof Response) {
136
- return this.errorFromSpawnResponse(input, sessionResolution, binding, spawnResult);
137
- }
138
- agentId = spawnResult.id;
139
- await this.context.sessionBroker.bindAgent(submission.session.id, spawnResult.id);
140
- if (input.publishEvent) {
141
- this.context.queueSurfaceReplyFromBinding(binding, {
142
- agentId: spawnResult.id,
143
- task: input.text,
144
- sessionId: submission.session.id,
145
- });
146
- }
116
+ sessionId: '',
117
+ routeId: '',
118
+ mode: 'rejected',
119
+ newSession: false,
120
+ sessionExpired: false,
121
+ status: 'rejected',
122
+ error: error instanceof Error ? error.message : String(error),
123
+ };
147
124
  }
148
- this.indexMessage(input, submission.session.id, binding.id, agentId);
125
+ this.indexMessage(input, posted);
149
126
  const base = {
150
127
  ok: true,
151
128
  acknowledged: true,
152
129
  messageId: input.messageId,
153
130
  conversationId: input.conversationId,
154
- sessionId: submission.session.id,
155
- routeId: binding.id,
156
- ...(agentId ? { agentId } : {}),
157
- mode: submission.mode === 'spawn' ? 'direct' : submission.mode,
158
- newSession: sessionResolution.newSession,
159
- sessionExpired: sessionResolution.sessionExpired,
131
+ sessionId: posted.session.id,
132
+ routeId: posted.binding.id,
133
+ mode: 'remote-chat',
134
+ newSession: posted.newSession,
135
+ sessionExpired: posted.sessionExpired,
160
136
  };
161
- if (submission.mode === 'rejected') {
162
- return { ...base, ok: false, status: 'rejected', error: 'Home Assistant conversation was rejected.' };
163
- }
164
- if (!agentId || !input.wait) {
165
- return { ...base, status: agentId ? 'running' : 'queued' };
137
+ if (!input.wait) {
138
+ return { ...base, status: 'running' };
166
139
  }
167
- const finalRecord = await this.waitForAgent(agentId, input.waitTimeoutMs, signal);
168
- if (!finalRecord) {
169
- return { ...base, status: 'timeout', timeoutMs: input.waitTimeoutMs };
140
+ if (posted.error) {
141
+ const timedOut = posted.error.toLowerCase().includes('timed out');
142
+ return {
143
+ ...base,
144
+ ok: false,
145
+ status: timedOut ? 'timeout' : 'failed',
146
+ ...(timedOut ? { timeoutMs: input.waitTimeoutMs } : {}),
147
+ error: posted.error,
148
+ };
170
149
  }
171
150
  return {
172
151
  ...base,
173
- status: normalizeAgentStatus(finalRecord.status),
174
- ok: finalRecord.status === 'completed',
175
- assistant: buildAssistantResult(finalRecord),
176
- ...(finalRecord.status !== 'completed' ? { error: finalRecord.error ?? finalRecord.status } : {}),
152
+ status: 'completed',
153
+ assistant: buildAssistantResult(posted.response ?? ''),
177
154
  };
178
155
  }
179
156
  respondToSubmit(result) {
@@ -189,7 +166,7 @@ export class HomeAssistantConversationRoutes {
189
166
  return Response.json(result, { status: 409 });
190
167
  return Response.json(result, { status: result.status === 'completed' ? 200 : 202 });
191
168
  }
192
- streamConversation(body, signal) {
169
+ streamConversation(body) {
193
170
  const encoder = new TextEncoder();
194
171
  const stream = new ReadableStream({
195
172
  start: async (controller) => {
@@ -197,47 +174,13 @@ export class HomeAssistantConversationRoutes {
197
174
  controller.enqueue(encoder.encode(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`));
198
175
  };
199
176
  try {
200
- const result = await this.submitConversation({ ...body, wait: false }, signal);
201
- send('ack', result);
202
- if (!result.agentId) {
203
- send('final', result);
204
- controller.close();
205
- return;
206
- }
207
- let lastProgress = '';
208
- for (;;) {
209
- if (signal.aborted)
210
- return;
211
- const record = this.context.agentManager.getStatus(result.agentId);
212
- if (!record) {
213
- send('error', { ...result, ok: false, error: 'Unknown agent.' });
214
- controller.close();
215
- return;
216
- }
217
- const progress = record.streamingContent ?? record.progress ?? '';
218
- if (progress && progress !== lastProgress) {
219
- lastProgress = progress;
220
- send('progress', { messageId: result.messageId, agentId: result.agentId, text: progress });
221
- }
222
- if (record.status === 'completed' || record.status === 'failed' || record.status === 'cancelled') {
223
- send('final', {
224
- ...result,
225
- ok: record.status === 'completed',
226
- status: normalizeAgentStatus(record.status),
227
- assistant: buildAssistantResult(record),
228
- ...(record.status !== 'completed' ? { error: record.error ?? record.status } : {}),
229
- });
230
- controller.close();
231
- return;
232
- }
233
- await delay(250, signal);
234
- }
177
+ const result = await this.submitConversation({ ...body, wait: true });
178
+ send(result.status === 'completed' ? 'final' : 'error', result);
179
+ controller.close();
235
180
  }
236
181
  catch (error) {
237
- if (!signal.aborted) {
238
- send('error', { ok: false, error: error instanceof Error ? error.message : String(error) });
239
- controller.close();
240
- }
182
+ send('error', { ok: false, error: error instanceof Error ? error.message : String(error) });
183
+ controller.close();
241
184
  }
242
185
  },
243
186
  cancel: () => undefined,
@@ -251,17 +194,17 @@ export class HomeAssistantConversationRoutes {
251
194
  });
252
195
  }
253
196
  cancelConversation(body) {
254
- const agentId = readString(body.agentId)
255
- ?? (readString(body.messageId ?? body.message_id)
256
- ? this.messageIndex.get(readString(body.messageId ?? body.message_id))?.agentId
257
- : undefined);
258
- if (!agentId) {
259
- return Response.json({ ok: false, error: 'agentId or known messageId is required.' }, { status: 400 });
197
+ const indexed = readString(body.messageId ?? body.message_id)
198
+ ? this.messageIndex.get(readString(body.messageId ?? body.message_id))
199
+ : undefined;
200
+ const sessionId = readString(body.sessionId ?? body.session_id) ?? indexed?.sessionId;
201
+ if (!sessionId) {
202
+ return Response.json({ ok: false, error: 'sessionId or known messageId is required.' }, { status: 400 });
260
203
  }
261
- const cancelled = this.context.agentManager.cancel(agentId);
262
- return cancelled
263
- ? Response.json({ ok: true, agentId, status: 'cancelled' })
264
- : Response.json({ ok: false, agentId, error: 'Unknown or already finished agent.' }, { status: 404 });
204
+ const session = this.context.chatManager.closeSession(sessionId);
205
+ return session
206
+ ? Response.json({ ok: true, sessionId, status: 'cancelled' })
207
+ : Response.json({ ok: false, sessionId, error: 'Unknown Home Assistant chat session.' }, { status: 404 });
265
208
  }
266
209
  parseInput(body) {
267
210
  const threadId = readString(body.threadId ?? body.thread_id);
@@ -301,111 +244,12 @@ export class HomeAssistantConversationRoutes {
301
244
  remoteSessionTtlMs: this.readRemoteSessionTtlMs(body),
302
245
  };
303
246
  }
304
- async upsertBinding(input) {
305
- return this.context.routeBindings.upsertBinding({
306
- kind: input.threadId ? 'thread' : 'channel',
307
- surfaceKind: HOME_ASSISTANT_SURFACE,
308
- surfaceId: input.surfaceId,
309
- externalId: input.conversationId,
310
- ...(input.threadId ? { threadId: input.threadId } : {}),
311
- channelId: input.channelId,
312
- title: input.title,
313
- metadata: {
314
- source: 'homeassistant',
315
- directoryKind: input.threadId ? 'thread' : 'user',
316
- messageId: input.messageId,
317
- conversationId: input.conversationId,
318
- remoteSessionTtlMs: input.remoteSessionTtlMs,
319
- ...(input.context ? { homeAssistantContext: input.context } : {}),
320
- },
321
- });
322
- }
323
- async resolveRemoteSession(binding, input) {
324
- const now = Date.now();
325
- const current = binding.sessionId ? this.context.sessionBroker.getSession(binding.sessionId) : null;
326
- if (current && current.status !== 'closed' && !isExpiredSession(current, input.remoteSessionTtlMs, now)) {
327
- return { session: current, newSession: false, sessionExpired: false };
328
- }
329
- if (current && current.status !== 'closed' && !current.activeAgentId) {
330
- await this.context.sessionBroker.closeSession(current.id);
331
- }
332
- const session = await this.context.sessionBroker.createSession({
333
- title: input.title,
334
- metadata: {
335
- source: 'homeassistant',
336
- conversationId: input.conversationId,
337
- remote: true,
338
- remoteSessionTtlMs: input.remoteSessionTtlMs,
339
- },
340
- routeBinding: binding,
341
- participant: {
342
- surfaceKind: HOME_ASSISTANT_SURFACE,
343
- surfaceId: input.surfaceId,
344
- externalId: input.conversationId,
345
- ...(input.userId ? { userId: input.userId } : {}),
346
- ...(input.displayName ? { displayName: input.displayName } : {}),
347
- routeId: binding.id,
348
- lastSeenAt: now,
349
- },
350
- kind: 'homeassistant-remote',
351
- });
352
- await this.context.routeBindings.patchBinding(binding.id, {
353
- sessionId: session.id,
354
- metadata: {
355
- homeAssistantSessionId: session.id,
356
- homeAssistantSessionCreatedAt: now,
357
- remoteSessionTtlMs: input.remoteSessionTtlMs,
358
- },
359
- });
360
- return {
361
- session,
362
- newSession: true,
363
- sessionExpired: Boolean(current),
364
- };
365
- }
366
- buildRouting(input) {
367
- if (!input.providerId && !input.modelId && !input.tools?.length)
368
- return undefined;
369
- return {
370
- ...(input.providerId ? { providerId: input.providerId } : {}),
371
- ...(input.modelId ? { modelId: input.modelId } : {}),
372
- ...(input.tools?.length ? { tools: input.tools } : {}),
373
- };
374
- }
375
- async waitForAgent(agentId, timeoutMs, signal) {
376
- const startedAt = Date.now();
377
- while (Date.now() - startedAt < timeoutMs) {
378
- if (signal.aborted)
379
- return null;
380
- const record = this.context.agentManager.getStatus(agentId);
381
- if (record && (record.status === 'completed' || record.status === 'failed' || record.status === 'cancelled')) {
382
- return record;
383
- }
384
- await delay(200, signal);
385
- }
386
- return null;
387
- }
388
- errorFromSpawnResponse(input, session, binding, response) {
389
- return {
390
- ok: false,
391
- acknowledged: true,
392
- messageId: input.messageId,
393
- conversationId: input.conversationId,
394
- sessionId: session.session.id,
395
- routeId: binding.id,
396
- mode: 'rejected',
397
- newSession: session.newSession,
398
- sessionExpired: session.sessionExpired,
399
- status: 'rejected',
400
- error: `Home Assistant responder failed to start with HTTP ${response.status}.`,
401
- };
402
- }
403
- indexMessage(input, sessionId, routeId, agentId) {
247
+ indexMessage(input, posted) {
404
248
  this.messageIndex.set(input.messageId, {
405
249
  messageId: input.messageId,
406
- ...(agentId ? { agentId } : {}),
407
- sessionId,
408
- routeId,
250
+ ...(posted.assistantMessageId ? { assistantMessageId: posted.assistantMessageId } : {}),
251
+ sessionId: posted.session.id,
252
+ routeId: posted.binding.id,
409
253
  conversationId: input.conversationId,
410
254
  createdAt: Date.now(),
411
255
  });
@@ -416,32 +260,17 @@ export class HomeAssistantConversationRoutes {
416
260
  }
417
261
  }
418
262
  readRemoteSessionTtlMs(body) {
419
- return clampNumber(body.remoteSessionTtlMs, Number(this.context.configManager.get('surfaces.homeassistant.remoteSessionTtlMs') ?? DEFAULT_REMOTE_SESSION_TTL_MS), 60_000, 24 * 60 * 60_000);
263
+ return readHomeAssistantRemoteSessionTtlMs(this.context.configManager, body.remoteSessionTtlMs);
420
264
  }
421
265
  }
422
- function isExpiredSession(session, ttlMs, now) {
423
- if (session.activeAgentId)
424
- return false;
425
- return now - session.lastActivityAt > ttlMs;
426
- }
427
- function buildAssistantResult(record) {
428
- const text = record.status === 'completed'
429
- ? (record.fullOutput ?? record.streamingContent ?? record.progress ?? 'Completed')
430
- : record.error ?? record.status;
266
+ function buildAssistantResult(text) {
431
267
  return {
432
268
  text,
433
269
  speechText: text,
434
- status: record.status,
435
- toolCallsMade: record.toolCallCount,
436
- ...(record.usage ? { usage: record.usage } : {}),
437
- ...(record.completedAt ? { completedAt: record.completedAt } : {}),
270
+ status: 'completed',
271
+ completedAt: Date.now(),
438
272
  };
439
273
  }
440
- function normalizeAgentStatus(status) {
441
- if (status === 'pending' || status === 'running')
442
- return 'running';
443
- return status;
444
- }
445
274
  function readString(value) {
446
275
  return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
447
276
  }
@@ -459,14 +288,3 @@ function clampNumber(value, fallback, min, max) {
459
288
  return fallback;
460
289
  return Math.max(min, Math.min(max, Math.trunc(parsed)));
461
290
  }
462
- function delay(ms, signal) {
463
- if (signal.aborted)
464
- return Promise.resolve();
465
- return new Promise((resolve) => {
466
- const timer = setTimeout(resolve, ms);
467
- signal.addEventListener('abort', () => {
468
- clearTimeout(timer);
469
- resolve();
470
- }, { once: true });
471
- });
472
- }
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/daemon/http/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/daemon/http/router.ts"],"names":[],"mappings":"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"}
@@ -395,14 +395,16 @@ export class DaemonHttpRouter {
395
395
  }
396
396
  getHomeAssistantRoutes() {
397
397
  if (!this.homeAssistantRoutes) {
398
+ const chatManager = this.context.companionChatManager;
399
+ if (!chatManager) {
400
+ throw new Error('Home Assistant remote chat manager is unavailable.');
401
+ }
398
402
  this.homeAssistantRoutes = new HomeAssistantConversationRoutes({
399
403
  configManager: this.context.configManager,
400
404
  routeBindings: this.context.routeBindings,
401
- sessionBroker: this.context.sessionBroker,
402
- agentManager: this.context.agentManager,
405
+ chatManager,
403
406
  parseJsonBody: (request) => this.parseJsonBody(request),
404
- trySpawnAgent: (input, logLabel, sessionId) => this.context.trySpawnAgent(input, logLabel, sessionId),
405
- queueSurfaceReplyFromBinding: (binding, input) => this.context.queueSurfaceReplyFromBinding(binding, input),
407
+ resolveDefaultProviderModel: this.context.resolveDefaultProviderModel,
406
408
  });
407
409
  }
408
410
  return this.homeAssistantRoutes;
@@ -78,6 +78,8 @@ export declare class DaemonSurfaceActionHelper {
78
78
  private cleanupExpiredNtfyChatReplies;
79
79
  private postNtfyRemoteChatMessage;
80
80
  private runNtfyRemoteChatTurn;
81
+ private postHomeAssistantChatMessage;
82
+ private publishHomeAssistantChatReply;
81
83
  private publishNtfyReply;
82
84
  private resolveNtfyToken;
83
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"surface-actions.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/daemon/surface-actions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"surface-actions.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/daemon/surface-actions.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,8 @@
1
1
  import { emitCompanionMessageReceived } from '../runtime/emitters/index.js';
2
2
  import { NtfyIntegration } from '../integrations/ntfy.js';
3
+ import { HomeAssistantIntegration } from '../integrations/homeassistant.js';
4
+ import { HOME_ASSISTANT_DEFAULT_EVENT_TYPE, resolveHomeAssistantAccessToken, resolveHomeAssistantBaseUrl, } from '../channels/builtin/homeassistant.js';
5
+ import { postHomeAssistantChatMessage as postHomeAssistantChatTurn, readHomeAssistantRemoteSessionTtlMs, } from './homeassistant-chat.js';
3
6
  import { logger } from '../utils/logger.js';
4
7
  import { summarizeError } from '../utils/error-display.js';
5
8
  export class DaemonSurfaceActionHelper {
@@ -27,6 +30,7 @@ export class DaemonSurfaceActionHelper {
27
30
  publishConversationFollowup: (sessionId, envelope) => this.publishConversationFollowup(sessionId, envelope),
28
31
  queueNtfyChatReply: (input) => this.queueNtfyChatReply(input),
29
32
  postNtfyRemoteChatMessage: (input) => this.postNtfyRemoteChatMessage(input),
33
+ postHomeAssistantChatMessage: (input) => this.postHomeAssistantChatMessage(input),
30
34
  };
31
35
  }
32
36
  buildGenericWebhookAdapterContext() {
@@ -349,6 +353,120 @@ export class DaemonSurfaceActionHelper {
349
353
  }
350
354
  }
351
355
  }
356
+ async postHomeAssistantChatMessage(input) {
357
+ const manager = this.context.companionChatManager;
358
+ if (!manager) {
359
+ return {
360
+ sessionId: '',
361
+ messageId: input.messageId,
362
+ delivered: false,
363
+ error: 'Home Assistant remote chat manager is unavailable',
364
+ };
365
+ }
366
+ try {
367
+ const result = await postHomeAssistantChatTurn({
368
+ configManager: this.context.configManager,
369
+ routeBindings: this.context.routeBindings,
370
+ chatManager: manager,
371
+ resolveDefaultProviderModel: this.context.resolveDefaultProviderModel,
372
+ }, {
373
+ text: input.body,
374
+ messageId: input.messageId,
375
+ conversationId: input.conversationId,
376
+ surfaceId: input.surfaceId,
377
+ channelId: input.channelId,
378
+ ...(input.threadId ? { threadId: input.threadId } : {}),
379
+ ...(input.userId ? { userId: input.userId } : {}),
380
+ ...(input.displayName ? { displayName: input.displayName } : {}),
381
+ title: input.title,
382
+ ...(input.providerId ? { providerId: input.providerId } : {}),
383
+ ...(input.modelId ? { modelId: input.modelId } : {}),
384
+ ...(input.tools?.length ? { tools: input.tools } : {}),
385
+ ...(input.context ? { context: input.context } : {}),
386
+ remoteSessionTtlMs: readHomeAssistantRemoteSessionTtlMs(this.context.configManager, input.remoteSessionTtlMs),
387
+ }, {
388
+ wait: true,
389
+ timeoutMs: 120_000,
390
+ clientId: `homeassistant:${input.surfaceId}:${input.conversationId}`,
391
+ });
392
+ const response = result.response?.trim();
393
+ const error = result.error ?? (response ? undefined : 'No response from Home Assistant remote chat');
394
+ if (input.publishEvent !== false) {
395
+ await this.publishHomeAssistantChatReply(input, {
396
+ sessionId: result.session.id,
397
+ routeId: result.binding.id,
398
+ assistantMessageId: result.assistantMessageId,
399
+ response: response || `Error: ${error}`,
400
+ status: error ? 'failed' : 'completed',
401
+ });
402
+ }
403
+ return {
404
+ sessionId: result.session.id,
405
+ routeId: result.binding.id,
406
+ messageId: input.messageId,
407
+ ...(result.assistantMessageId ? { assistantMessageId: result.assistantMessageId } : {}),
408
+ ...(response ? { response } : {}),
409
+ delivered: !error,
410
+ ...(error ? { error } : {}),
411
+ };
412
+ }
413
+ catch (error) {
414
+ const errorMessage = summarizeError(error);
415
+ if (input.publishEvent !== false) {
416
+ try {
417
+ await this.publishHomeAssistantChatReply(input, {
418
+ sessionId: '',
419
+ response: `Error: ${errorMessage}`,
420
+ status: 'failed',
421
+ });
422
+ }
423
+ catch (publishError) {
424
+ logger.warn('DaemonSurfaceActionHelper: failed to publish Home Assistant chat error', {
425
+ conversationId: input.conversationId,
426
+ error: summarizeError(publishError),
427
+ });
428
+ }
429
+ }
430
+ return {
431
+ sessionId: '',
432
+ messageId: input.messageId,
433
+ delivered: false,
434
+ error: errorMessage,
435
+ };
436
+ }
437
+ }
438
+ async publishHomeAssistantChatReply(input, result) {
439
+ const baseUrl = resolveHomeAssistantBaseUrl(this.context.configManager, this.context.serviceRegistry);
440
+ const accessToken = await resolveHomeAssistantAccessToken(this.context);
441
+ if (!baseUrl || !accessToken) {
442
+ throw new Error('Home Assistant instance URL or access token is not configured.');
443
+ }
444
+ const eventType = String(this.context.configManager.get('surfaces.homeassistant.eventType') || HOME_ASSISTANT_DEFAULT_EVENT_TYPE);
445
+ const client = new HomeAssistantIntegration({ baseUrl, accessToken });
446
+ await client.publishGoodVibesEvent(eventType, {
447
+ type: 'message',
448
+ title: input.title || 'GoodVibes',
449
+ body: result.response,
450
+ speechText: result.response,
451
+ status: result.status,
452
+ sessionId: result.sessionId,
453
+ ...(result.routeId ? { routeId: result.routeId } : {}),
454
+ surfaceId: input.surfaceId,
455
+ externalId: input.conversationId,
456
+ ...(result.assistantMessageId ? { messageId: result.assistantMessageId } : {}),
457
+ replyToMessageId: input.messageId,
458
+ conversationId: input.conversationId,
459
+ metadata: {
460
+ threadId: input.threadId ?? null,
461
+ channelId: input.channelId,
462
+ userId: input.userId ?? null,
463
+ displayName: input.displayName ?? null,
464
+ inboundMessageId: input.messageId,
465
+ conversationId: input.conversationId,
466
+ ...(input.context ? { homeAssistantContext: input.context } : {}),
467
+ },
468
+ });
469
+ }
352
470
  async publishNtfyReply(topic, message, title) {
353
471
  if (!topic || !message.trim())
354
472
  return;