@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.
- package/dist/_internal/contracts/artifacts/operator-contract.json +1 -1
- package/dist/_internal/contracts/generated/foundation-metadata.d.ts +1 -1
- package/dist/_internal/contracts/generated/foundation-metadata.js +1 -1
- package/dist/_internal/contracts/generated/operator-contract.js +1 -1
- package/dist/_internal/platform/adapters/homeassistant/index.d.ts.map +1 -1
- package/dist/_internal/platform/adapters/homeassistant/index.js +45 -65
- package/dist/_internal/platform/adapters/types.d.ts +26 -0
- package/dist/_internal/platform/adapters/types.d.ts.map +1 -1
- package/dist/_internal/platform/channels/builtin/homeassistant.d.ts.map +1 -1
- package/dist/_internal/platform/channels/builtin/homeassistant.js +3 -5
- package/dist/_internal/platform/channels/builtin/setup-schema.js +3 -3
- package/dist/_internal/platform/cloudflare/manager.d.ts +1 -1
- package/dist/_internal/platform/cloudflare/manager.d.ts.map +1 -1
- package/dist/_internal/platform/cloudflare/manager.js +4 -5
- package/dist/_internal/platform/cloudflare/utils.d.ts +4 -0
- package/dist/_internal/platform/cloudflare/utils.d.ts.map +1 -1
- package/dist/_internal/platform/cloudflare/utils.js +72 -2
- package/dist/_internal/platform/control-plane/session-types.d.ts +1 -2
- package/dist/_internal/platform/control-plane/session-types.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/homeassistant-chat.d.ts +61 -0
- package/dist/_internal/platform/daemon/homeassistant-chat.d.ts.map +1 -0
- package/dist/_internal/platform/daemon/homeassistant-chat.js +128 -0
- package/dist/_internal/platform/daemon/http/homeassistant-routes.d.ts +6 -16
- package/dist/_internal/platform/daemon/http/homeassistant-routes.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/http/homeassistant-routes.js +73 -255
- package/dist/_internal/platform/daemon/http/router.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/http/router.js +6 -4
- package/dist/_internal/platform/daemon/surface-actions.d.ts +2 -0
- package/dist/_internal/platform/daemon/surface-actions.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/surface-actions.js +118 -0
- package/dist/_internal/platform/version.js +1 -1
- 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
|
-
|
|
402
|
-
agentManager: this.context.agentManager,
|
|
405
|
+
chatManager,
|
|
403
406
|
parseJsonBody: (request) => this.parseJsonBody(request),
|
|
404
|
-
|
|
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":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAE1F,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,KAAK,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAChG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,KAAK,EAAE,eAAe,EAA8B,MAAM,4BAA4B,CAAC;
|
|
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.
|
|
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;
|