@pellux/goodvibes-sdk 0.25.13 → 0.25.15

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 (32) 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/cloudflare/manager.d.ts +1 -1
  13. package/dist/_internal/platform/cloudflare/manager.d.ts.map +1 -1
  14. package/dist/_internal/platform/cloudflare/manager.js +4 -5
  15. package/dist/_internal/platform/cloudflare/utils.d.ts +4 -0
  16. package/dist/_internal/platform/cloudflare/utils.d.ts.map +1 -1
  17. package/dist/_internal/platform/cloudflare/utils.js +72 -2
  18. package/dist/_internal/platform/control-plane/session-types.d.ts +1 -2
  19. package/dist/_internal/platform/control-plane/session-types.d.ts.map +1 -1
  20. package/dist/_internal/platform/daemon/homeassistant-chat.d.ts +61 -0
  21. package/dist/_internal/platform/daemon/homeassistant-chat.d.ts.map +1 -0
  22. package/dist/_internal/platform/daemon/homeassistant-chat.js +128 -0
  23. package/dist/_internal/platform/daemon/http/homeassistant-routes.d.ts +6 -16
  24. package/dist/_internal/platform/daemon/http/homeassistant-routes.d.ts.map +1 -1
  25. package/dist/_internal/platform/daemon/http/homeassistant-routes.js +73 -255
  26. package/dist/_internal/platform/daemon/http/router.d.ts.map +1 -1
  27. package/dist/_internal/platform/daemon/http/router.js +6 -4
  28. package/dist/_internal/platform/daemon/surface-actions.d.ts +2 -0
  29. package/dist/_internal/platform/daemon/surface-actions.d.ts.map +1 -1
  30. package/dist/_internal/platform/daemon/surface-actions.js +118 -0
  31. package/dist/_internal/platform/version.js +1 -1
  32. package/package.json +1 -1
@@ -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;
@@ -1,6 +1,6 @@
1
1
  import { readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- let version = '0.25.13';
3
+ let version = '0.25.15';
4
4
  try {
5
5
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', '..', 'package.json'), 'utf-8'));
6
6
  version = pkg.version ?? version;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pellux/goodvibes-sdk",
3
- "version": "0.25.13",
3
+ "version": "0.25.15",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/mgd34msu/goodvibes-sdk.git"