@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.
- 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/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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Synced from packages/contracts/src/generated/foundation-metadata.ts
|
|
2
2
|
export const FOUNDATION_METADATA = {
|
|
3
3
|
"productId": "goodvibes",
|
|
4
|
-
"productVersion": "0.25.
|
|
4
|
+
"productVersion": "0.25.14",
|
|
5
5
|
"operatorMethodCount": 224,
|
|
6
6
|
"operatorEventCount": 30,
|
|
7
7
|
"peerEndpointCount": 6
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/adapters/homeassistant/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAQzD,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/adapters/homeassistant/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAQzD,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,QAAQ,CAAC,CAmInB"}
|
|
@@ -59,25 +59,29 @@ export async function handleHomeAssistantSurfaceWebhook(req, context) {
|
|
|
59
59
|
if (!policy.allowed) {
|
|
60
60
|
return Response.json({ error: `Blocked by channel policy: ${policy.reason}` }, { status: 403 });
|
|
61
61
|
}
|
|
62
|
-
await context.routeBindings.start();
|
|
63
|
-
const binding = await context.routeBindings.upsertBinding({
|
|
64
|
-
kind: threadId ? 'thread' : 'channel',
|
|
65
|
-
surfaceKind: HOME_ASSISTANT_SURFACE,
|
|
66
|
-
surfaceId,
|
|
67
|
-
externalId: conversationId,
|
|
68
|
-
threadId,
|
|
69
|
-
channelId,
|
|
70
|
-
sessionId: readString(body.sessionId ?? body.session_id),
|
|
71
|
-
title: readString(body.title) ?? 'Home Assistant',
|
|
72
|
-
metadata: {
|
|
73
|
-
...body,
|
|
74
|
-
directoryKind: conversationKind === 'direct' ? 'user' : conversationKind,
|
|
75
|
-
source: 'homeassistant',
|
|
76
|
-
messageId,
|
|
77
|
-
conversationId,
|
|
78
|
-
},
|
|
79
|
-
});
|
|
80
62
|
if (!text.trim()) {
|
|
63
|
+
await context.routeBindings.start();
|
|
64
|
+
const binding = await context.routeBindings.upsertBinding({
|
|
65
|
+
kind: threadId ? 'thread' : 'channel',
|
|
66
|
+
surfaceKind: HOME_ASSISTANT_SURFACE,
|
|
67
|
+
surfaceId,
|
|
68
|
+
externalId: conversationId,
|
|
69
|
+
threadId,
|
|
70
|
+
channelId,
|
|
71
|
+
title: readString(body.title) ?? 'Home Assistant',
|
|
72
|
+
metadata: {
|
|
73
|
+
...body,
|
|
74
|
+
directoryKind: conversationKind === 'direct' ? 'user' : conversationKind,
|
|
75
|
+
source: 'homeassistant',
|
|
76
|
+
messageId,
|
|
77
|
+
conversationId,
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
await context.routeBindings.patchBinding(binding.id, {
|
|
81
|
+
sessionId: null,
|
|
82
|
+
jobId: null,
|
|
83
|
+
runId: null,
|
|
84
|
+
});
|
|
81
85
|
return Response.json({
|
|
82
86
|
acknowledged: true,
|
|
83
87
|
queued: false,
|
|
@@ -85,65 +89,41 @@ export async function handleHomeAssistantSurfaceWebhook(req, context) {
|
|
|
85
89
|
});
|
|
86
90
|
}
|
|
87
91
|
const routing = readRouting(body);
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
+
if (!context.postHomeAssistantChatMessage) {
|
|
93
|
+
return Response.json({ error: 'Home Assistant remote chat is unavailable in this runtime' }, { status: 503 });
|
|
94
|
+
}
|
|
95
|
+
const result = await context.postHomeAssistantChatMessage({
|
|
96
|
+
body: text,
|
|
97
|
+
messageId,
|
|
98
|
+
conversationId,
|
|
92
99
|
surfaceId,
|
|
93
|
-
|
|
94
|
-
threadId,
|
|
95
|
-
userId: readString(body.userId ?? body.user_id),
|
|
96
|
-
displayName: readString(body.displayName ?? body.userName ?? body.user_name),
|
|
100
|
+
channelId,
|
|
101
|
+
...(threadId ? { threadId } : {}),
|
|
102
|
+
...(readString(body.userId ?? body.user_id) ? { userId: readString(body.userId ?? body.user_id) } : {}),
|
|
103
|
+
...(readString(body.displayName ?? body.userName ?? body.user_name) ? { displayName: readString(body.displayName ?? body.userName ?? body.user_name) } : {}),
|
|
97
104
|
title: readString(body.title) ?? 'Home Assistant',
|
|
98
|
-
|
|
99
|
-
|
|
105
|
+
...(routing?.providerId ? { providerId: routing.providerId } : {}),
|
|
106
|
+
...(routing?.modelId ? { modelId: routing.modelId } : {}),
|
|
107
|
+
...(routing?.tools?.length ? { tools: routing.tools } : {}),
|
|
108
|
+
context: {
|
|
109
|
+
...body,
|
|
100
110
|
source: 'homeassistant',
|
|
101
111
|
messageId,
|
|
102
112
|
conversationId,
|
|
103
113
|
deviceId: readString(body.deviceId ?? body.device_id) ?? null,
|
|
104
114
|
entityId: readString(body.entityId ?? body.entity_id) ?? null,
|
|
105
115
|
},
|
|
106
|
-
|
|
107
|
-
});
|
|
108
|
-
if (submission.mode === 'continued-live') {
|
|
109
|
-
return Response.json({
|
|
110
|
-
acknowledged: true,
|
|
111
|
-
queued: true,
|
|
112
|
-
continued: true,
|
|
113
|
-
bindingId: binding.id,
|
|
114
|
-
sessionId: submission.session.id,
|
|
115
|
-
agentId: submission.activeAgentId ?? null,
|
|
116
|
-
messageId,
|
|
117
|
-
conversationId,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
const spawnResult = context.trySpawnAgent({
|
|
121
|
-
mode: 'spawn',
|
|
122
|
-
task: submission.task,
|
|
123
|
-
executionProtocol: 'direct',
|
|
124
|
-
reviewMode: 'none',
|
|
125
|
-
communicationLane: 'direct',
|
|
126
|
-
dangerously_disable_wrfc: true,
|
|
127
|
-
...(routing?.modelId ? { model: routing.modelId } : {}),
|
|
128
|
-
...(routing?.providerId ? { provider: routing.providerId } : {}),
|
|
129
|
-
...(routing?.tools?.length ? { tools: [...routing.tools] } : {}),
|
|
130
|
-
context: `homeassistant:${conversationId}`,
|
|
131
|
-
}, 'handleHomeAssistantSurfaceWebhook', submission.session.id);
|
|
132
|
-
if (spawnResult instanceof Response)
|
|
133
|
-
return spawnResult;
|
|
134
|
-
await context.sessionBroker.bindAgent(submission.session.id, spawnResult.id);
|
|
135
|
-
context.queueSurfaceReplyFromBinding(binding, {
|
|
136
|
-
agentId: spawnResult.id,
|
|
137
|
-
task: text,
|
|
138
|
-
sessionId: submission.session.id,
|
|
116
|
+
publishEvent: true,
|
|
139
117
|
});
|
|
140
118
|
return Response.json({
|
|
141
119
|
acknowledged: true,
|
|
142
|
-
queued:
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
120
|
+
queued: false,
|
|
121
|
+
delivered: result.delivered,
|
|
122
|
+
...(result.routeId ? { bindingId: result.routeId } : {}),
|
|
123
|
+
sessionId: result.sessionId,
|
|
146
124
|
messageId,
|
|
125
|
+
...(result.assistantMessageId ? { assistantMessageId: result.assistantMessageId } : {}),
|
|
126
|
+
...(result.error ? { error: result.error } : {}),
|
|
147
127
|
conversationId,
|
|
148
128
|
});
|
|
149
129
|
}
|
|
@@ -31,6 +31,15 @@ export interface NtfyRemoteChatResult {
|
|
|
31
31
|
readonly delivered: boolean;
|
|
32
32
|
readonly error?: string;
|
|
33
33
|
}
|
|
34
|
+
export interface HomeAssistantRemoteChatResult {
|
|
35
|
+
readonly sessionId: string;
|
|
36
|
+
readonly routeId?: string;
|
|
37
|
+
readonly messageId: string;
|
|
38
|
+
readonly assistantMessageId?: string;
|
|
39
|
+
readonly response?: string;
|
|
40
|
+
readonly delivered: boolean;
|
|
41
|
+
readonly error?: string;
|
|
42
|
+
}
|
|
34
43
|
export type TrySpawnAgentInput = Parameters<AgentManager['spawn']>[0];
|
|
35
44
|
export type TrySpawnAgentResult = AgentRecord | Response;
|
|
36
45
|
export type TrySpawnAgentFn = (input: TrySpawnAgentInput, logLabel: string, sessionId?: string) => TrySpawnAgentResult;
|
|
@@ -68,6 +77,23 @@ export interface SurfaceAdapterContext {
|
|
|
68
77
|
readonly body: string;
|
|
69
78
|
readonly title?: string;
|
|
70
79
|
}) => Promise<NtfyRemoteChatResult>;
|
|
80
|
+
readonly postHomeAssistantChatMessage?: (input: {
|
|
81
|
+
readonly body: string;
|
|
82
|
+
readonly messageId: string;
|
|
83
|
+
readonly conversationId: string;
|
|
84
|
+
readonly surfaceId: string;
|
|
85
|
+
readonly channelId: string;
|
|
86
|
+
readonly threadId?: string;
|
|
87
|
+
readonly userId?: string;
|
|
88
|
+
readonly displayName?: string;
|
|
89
|
+
readonly title: string;
|
|
90
|
+
readonly providerId?: string;
|
|
91
|
+
readonly modelId?: string;
|
|
92
|
+
readonly tools?: readonly string[];
|
|
93
|
+
readonly context?: Record<string, unknown>;
|
|
94
|
+
readonly remoteSessionTtlMs?: number;
|
|
95
|
+
readonly publishEvent?: boolean;
|
|
96
|
+
}) => Promise<HomeAssistantRemoteChatResult>;
|
|
71
97
|
}
|
|
72
98
|
export interface GenericWebhookReplyInput {
|
|
73
99
|
readonly agentId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/adapters/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/adapters/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"homeassistant.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/channels/builtin/homeassistant.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EACV,+BAA+B,EAE/B,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAE7D,eAAO,MAAM,sBAAsB,iBAAoD,CAAC;AACxF,eAAO,MAAM,2BAA2B,2BAA2B,CAAC;AACpE,eAAO,MAAM,iCAAiC,sBAAsB,CAAC;AAErE,UAAU,YAAY;IACpB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B;AAoBD,UAAU,0BAA0B;IAClC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;CAC1C;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;QACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC5C,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;QACnC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;KAClD,CAAC;IACF,QAAQ,CAAC,mBAAmB,EAAE,SAAS;QACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACtD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;KAC9B,EAAE,CAAC;IACJ,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,wBAAgB,gCAAgC,IAAI,+BAA+B,EAAE,CAqDpF;AAED,wBAAgB,sBAAsB,IAAI,qBAAqB,EAAE,CAmDhE;AAED,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,0BAA0B,EACnC,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAuBlE;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,IAAI,CAAC,yBAAyB,EAAE,eAAe,CAAC,GAAG,4BAA4B,
|
|
1
|
+
{"version":3,"file":"homeassistant.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/channels/builtin/homeassistant.ts"],"names":[],"mappings":"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"}
|
|
@@ -184,7 +184,6 @@ export function buildHomeAssistantManifest(deps) {
|
|
|
184
184
|
},
|
|
185
185
|
capabilities: [
|
|
186
186
|
'conversation-ingress',
|
|
187
|
-
'agent-task-ingress',
|
|
188
187
|
'daemon-tool-catalog',
|
|
189
188
|
'daemon-agent-tools',
|
|
190
189
|
'session-binding',
|
|
@@ -204,10 +203,9 @@ export function buildHomeAssistantManifest(deps) {
|
|
|
204
203
|
inboundSecretHeaders: ['x-goodvibes-homeassistant-secret', 'authorization'],
|
|
205
204
|
},
|
|
206
205
|
recommendedServices: [
|
|
207
|
-
{ name: 'goodvibes.prompt', target: 'config_entry', description: 'Submit a normal prompt
|
|
208
|
-
{ name: 'goodvibes.
|
|
209
|
-
{ name: 'goodvibes.
|
|
210
|
-
{ name: 'goodvibes.status', target: 'config_entry', description: 'Inspect daemon, session, or agent status.' },
|
|
206
|
+
{ name: 'goodvibes.prompt', target: 'config_entry', description: 'Submit a normal prompt through an isolated daemon chat session.' },
|
|
207
|
+
{ name: 'goodvibes.cancel', target: 'config_entry', description: 'Cancel an active Home Assistant conversation session.' },
|
|
208
|
+
{ name: 'goodvibes.status', target: 'config_entry', description: 'Inspect daemon and Home Assistant conversation status.' },
|
|
211
209
|
],
|
|
212
210
|
metadata: {
|
|
213
211
|
configKeys: [
|
|
@@ -204,11 +204,11 @@ export function getBuiltinSetupSchema(surface) {
|
|
|
204
204
|
'Create the Home Assistant custom integration with config_flow enabled and a single config entry for this daemon.',
|
|
205
205
|
'Configure the integration with the daemon base URL and operator bearer token.',
|
|
206
206
|
'Use /api/homeassistant/conversation for Assist conversation agents that need a final reply in the request/response cycle.',
|
|
207
|
-
'Use /api/homeassistant/conversation/stream when the integration wants
|
|
208
|
-
'Home Assistant-originated
|
|
207
|
+
'Use /api/homeassistant/conversation/stream only when the integration wants an SSE transport for final/error events.',
|
|
208
|
+
'Home Assistant-originated prompts use isolated remote chat sessions and do not use shared TUI sessions, agents, or WRFC review/fix chains.',
|
|
209
209
|
`Send Home Assistant-originated prompts to ${HOME_ASSISTANT_WEBHOOK_PATH} with x-goodvibes-homeassistant-secret or Authorization: Bearer <webhookSecret>.`,
|
|
210
210
|
'Subscribe the Home Assistant integration to the configured GoodVibes event type to update entities and service-call responses.',
|
|
211
|
-
'Use the channel tool catalog endpoints to expose daemon
|
|
211
|
+
'Use the channel tool catalog endpoints to expose daemon and Home Assistant tools as service actions.',
|
|
212
212
|
],
|
|
213
213
|
metadata: {
|
|
214
214
|
protocolVersion: 1,
|
|
@@ -31,9 +31,8 @@ export interface SharedSessionMessage {
|
|
|
31
31
|
* - 'tui': created by the operator TUI (default for existing sessions)
|
|
32
32
|
* - 'companion-task': created via task-submit flow (agent spawn)
|
|
33
33
|
* - 'companion-chat': created via companion chat-mode API (no agent spawn; uses per-session orchestrator)
|
|
34
|
-
* - 'homeassistant-remote': created by the Home Assistant daemon surface and closed by an idle TTL
|
|
35
34
|
*/
|
|
36
|
-
export type SharedSessionKind = 'tui' | 'companion-task' | 'companion-chat'
|
|
35
|
+
export type SharedSessionKind = 'tui' | 'companion-task' | 'companion-chat';
|
|
37
36
|
export interface SharedSessionRecord {
|
|
38
37
|
readonly id: string;
|
|
39
38
|
readonly kind: SharedSessionKind;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-types.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/control-plane/session-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EACV,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC3B,MAAM,sBAAsB,CAAC;AAE9B,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACtD,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEvE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED
|
|
1
|
+
{"version":3,"file":"session-types.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/control-plane/session-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { AutomationRouteBinding } from '../automation/routes.js';
|
|
2
|
+
import type { RouteBindingManager } from '../channels/index.js';
|
|
3
|
+
import type { CompanionChatManager } from '../companion/companion-chat-manager.js';
|
|
4
|
+
import type { CompanionChatSession } from '../companion/companion-chat-types.js';
|
|
5
|
+
import type { ConfigManager } from '../config/manager.js';
|
|
6
|
+
export declare const HOME_ASSISTANT_DEFAULT_REMOTE_SESSION_TTL_MS: number;
|
|
7
|
+
type JsonRecord = Record<string, unknown>;
|
|
8
|
+
interface RouteBindingsLike {
|
|
9
|
+
readonly start: RouteBindingManager['start'];
|
|
10
|
+
readonly upsertBinding: RouteBindingManager['upsertBinding'];
|
|
11
|
+
readonly patchBinding: RouteBindingManager['patchBinding'];
|
|
12
|
+
}
|
|
13
|
+
interface ConfigReader {
|
|
14
|
+
get(key: string): unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface HomeAssistantChatInput {
|
|
17
|
+
readonly text: string;
|
|
18
|
+
readonly messageId: string;
|
|
19
|
+
readonly conversationId: string;
|
|
20
|
+
readonly surfaceId: string;
|
|
21
|
+
readonly channelId: string;
|
|
22
|
+
readonly threadId?: string;
|
|
23
|
+
readonly userId?: string;
|
|
24
|
+
readonly displayName?: string;
|
|
25
|
+
readonly title: string;
|
|
26
|
+
readonly providerId?: string;
|
|
27
|
+
readonly modelId?: string;
|
|
28
|
+
readonly tools?: readonly string[];
|
|
29
|
+
readonly context?: JsonRecord;
|
|
30
|
+
readonly remoteSessionTtlMs: number;
|
|
31
|
+
}
|
|
32
|
+
export interface HomeAssistantChatResolution {
|
|
33
|
+
readonly binding: AutomationRouteBinding;
|
|
34
|
+
readonly session: CompanionChatSession;
|
|
35
|
+
readonly newSession: boolean;
|
|
36
|
+
readonly sessionExpired: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface HomeAssistantChatPostResult extends HomeAssistantChatResolution {
|
|
39
|
+
readonly messageId: string;
|
|
40
|
+
readonly assistantMessageId?: string;
|
|
41
|
+
readonly response?: string;
|
|
42
|
+
readonly error?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface HomeAssistantChatRuntime {
|
|
45
|
+
readonly configManager: Pick<ConfigManager, 'get'> | ConfigReader;
|
|
46
|
+
readonly routeBindings: RouteBindingsLike;
|
|
47
|
+
readonly chatManager: CompanionChatManager;
|
|
48
|
+
readonly resolveDefaultProviderModel?: () => {
|
|
49
|
+
provider: string;
|
|
50
|
+
model: string;
|
|
51
|
+
} | null;
|
|
52
|
+
}
|
|
53
|
+
export declare function postHomeAssistantChatMessage(runtime: HomeAssistantChatRuntime, input: HomeAssistantChatInput, options?: {
|
|
54
|
+
readonly wait?: boolean;
|
|
55
|
+
readonly timeoutMs?: number;
|
|
56
|
+
readonly clientId?: string;
|
|
57
|
+
}): Promise<HomeAssistantChatPostResult>;
|
|
58
|
+
export declare function resolveHomeAssistantChatSession(runtime: HomeAssistantChatRuntime, input: HomeAssistantChatInput): Promise<HomeAssistantChatResolution>;
|
|
59
|
+
export declare function readHomeAssistantRemoteSessionTtlMs(configManager: ConfigReader, value: unknown): number;
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=homeassistant-chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"homeassistant-chat.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/daemon/homeassistant-chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { HOME_ASSISTANT_SURFACE } from '../channels/builtin/homeassistant.js';
|
|
2
|
+
export const HOME_ASSISTANT_DEFAULT_REMOTE_SESSION_TTL_MS = 20 * 60_000;
|
|
3
|
+
const MIN_REMOTE_SESSION_TTL_MS = 60_000;
|
|
4
|
+
const MAX_REMOTE_SESSION_TTL_MS = 24 * 60 * 60_000;
|
|
5
|
+
export async function postHomeAssistantChatMessage(runtime, input, options = {}) {
|
|
6
|
+
const resolution = await resolveHomeAssistantChatSession(runtime, input);
|
|
7
|
+
const clientId = options.clientId ?? `homeassistant:${input.surfaceId}:${input.conversationId}`;
|
|
8
|
+
if (options.wait === false) {
|
|
9
|
+
const messageId = await runtime.chatManager.postMessage(resolution.session.id, formatHomeAssistantUserMessage(input), clientId);
|
|
10
|
+
return { ...resolution, messageId };
|
|
11
|
+
}
|
|
12
|
+
const reply = await runtime.chatManager.postMessageAndWaitForReply(resolution.session.id, formatHomeAssistantUserMessage(input), clientId, { timeoutMs: options.timeoutMs });
|
|
13
|
+
return {
|
|
14
|
+
...resolution,
|
|
15
|
+
messageId: reply.messageId,
|
|
16
|
+
...(reply.assistantMessageId ? { assistantMessageId: reply.assistantMessageId } : {}),
|
|
17
|
+
...(reply.response ? { response: reply.response } : {}),
|
|
18
|
+
...(reply.error ? { error: reply.error } : {}),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export async function resolveHomeAssistantChatSession(runtime, input) {
|
|
22
|
+
await runtime.chatManager.init();
|
|
23
|
+
await runtime.routeBindings.start();
|
|
24
|
+
const binding = await runtime.routeBindings.upsertBinding({
|
|
25
|
+
kind: input.threadId ? 'thread' : 'channel',
|
|
26
|
+
surfaceKind: HOME_ASSISTANT_SURFACE,
|
|
27
|
+
surfaceId: input.surfaceId,
|
|
28
|
+
externalId: input.conversationId,
|
|
29
|
+
...(input.threadId ? { threadId: input.threadId } : {}),
|
|
30
|
+
channelId: input.channelId,
|
|
31
|
+
title: input.title,
|
|
32
|
+
metadata: {
|
|
33
|
+
source: 'homeassistant',
|
|
34
|
+
directoryKind: input.threadId ? 'thread' : 'user',
|
|
35
|
+
messageId: input.messageId,
|
|
36
|
+
conversationId: input.conversationId,
|
|
37
|
+
remoteSessionTtlMs: input.remoteSessionTtlMs,
|
|
38
|
+
...(input.context ? { homeAssistantContext: input.context } : {}),
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
const existingSessionId = readString(binding.metadata.homeAssistantChatSessionId);
|
|
43
|
+
const existing = existingSessionId ? runtime.chatManager.getSession(existingSessionId) : null;
|
|
44
|
+
const expired = Boolean(existing && existing.status !== 'closed' && now - existing.updatedAt > input.remoteSessionTtlMs);
|
|
45
|
+
if (expired && existing) {
|
|
46
|
+
runtime.chatManager.closeSession(existing.id);
|
|
47
|
+
}
|
|
48
|
+
const defaultProviderModel = runtime.resolveDefaultProviderModel?.() ?? null;
|
|
49
|
+
const provider = input.providerId ?? defaultProviderModel?.provider;
|
|
50
|
+
const model = input.modelId ?? defaultProviderModel?.model;
|
|
51
|
+
const systemPrompt = buildHomeAssistantSystemPrompt(input);
|
|
52
|
+
const shouldCreate = !existing || existing.status === 'closed' || expired;
|
|
53
|
+
const session = shouldCreate
|
|
54
|
+
? runtime.chatManager.createSession({
|
|
55
|
+
title: input.title || 'Home Assistant',
|
|
56
|
+
...(provider ? { provider } : {}),
|
|
57
|
+
...(model ? { model } : {}),
|
|
58
|
+
systemPrompt,
|
|
59
|
+
})
|
|
60
|
+
: runtime.chatManager.updateSession(existing.id, {
|
|
61
|
+
title: input.title || existing.title,
|
|
62
|
+
...(provider ? { provider } : {}),
|
|
63
|
+
...(model ? { model } : {}),
|
|
64
|
+
systemPrompt,
|
|
65
|
+
});
|
|
66
|
+
await runtime.routeBindings.patchBinding(binding.id, {
|
|
67
|
+
sessionId: null,
|
|
68
|
+
jobId: null,
|
|
69
|
+
runId: null,
|
|
70
|
+
metadata: {
|
|
71
|
+
homeAssistantChatSessionId: session.id,
|
|
72
|
+
homeAssistantChatSessionUpdatedAt: now,
|
|
73
|
+
remoteSessionTtlMs: input.remoteSessionTtlMs,
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
return {
|
|
77
|
+
binding,
|
|
78
|
+
session,
|
|
79
|
+
newSession: shouldCreate,
|
|
80
|
+
sessionExpired: expired,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export function readHomeAssistantRemoteSessionTtlMs(configManager, value) {
|
|
84
|
+
return clampNumber(value, Number(configManager.get('surfaces.homeassistant.remoteSessionTtlMs') ?? HOME_ASSISTANT_DEFAULT_REMOTE_SESSION_TTL_MS), MIN_REMOTE_SESSION_TTL_MS, MAX_REMOTE_SESSION_TTL_MS);
|
|
85
|
+
}
|
|
86
|
+
function buildHomeAssistantSystemPrompt(input) {
|
|
87
|
+
const contextLines = [
|
|
88
|
+
`Conversation id: ${input.conversationId}`,
|
|
89
|
+
`Surface id: ${input.surfaceId}`,
|
|
90
|
+
input.channelId ? `Area/entity channel: ${input.channelId}` : '',
|
|
91
|
+
input.userId ? `Home Assistant user id: ${input.userId}` : '',
|
|
92
|
+
input.displayName ? `Home Assistant display name: ${input.displayName}` : '',
|
|
93
|
+
].filter(Boolean);
|
|
94
|
+
return [
|
|
95
|
+
'You are GoodVibes responding inside Home Assistant.',
|
|
96
|
+
'Answer as a normal assistant. Do not emit JSON summaries, WRFC summaries, agent reports, changelogs, or engineering-stage output.',
|
|
97
|
+
'Use Home Assistant tools whenever the user asks about devices, entities, rooms, services, automations, templates, or current home state.',
|
|
98
|
+
'For weather questions, first look for Home Assistant weather entities or other relevant sensors before saying live weather is unavailable.',
|
|
99
|
+
'Ask a concise follow-up only when Home Assistant does not expose enough information to answer safely.',
|
|
100
|
+
contextLines.length ? `Home Assistant context:\n${contextLines.join('\n')}` : '',
|
|
101
|
+
].filter(Boolean).join('\n\n');
|
|
102
|
+
}
|
|
103
|
+
function formatHomeAssistantUserMessage(input) {
|
|
104
|
+
const metadata = {
|
|
105
|
+
source: 'homeassistant',
|
|
106
|
+
messageId: input.messageId,
|
|
107
|
+
conversationId: input.conversationId,
|
|
108
|
+
surfaceId: input.surfaceId,
|
|
109
|
+
channelId: input.channelId,
|
|
110
|
+
...(input.threadId ? { threadId: input.threadId } : {}),
|
|
111
|
+
...(input.userId ? { userId: input.userId } : {}),
|
|
112
|
+
...(input.displayName ? { displayName: input.displayName } : {}),
|
|
113
|
+
...(input.context ? { context: input.context } : {}),
|
|
114
|
+
};
|
|
115
|
+
return [
|
|
116
|
+
input.text,
|
|
117
|
+
`Home Assistant metadata: ${JSON.stringify(metadata)}`,
|
|
118
|
+
].join('\n\n');
|
|
119
|
+
}
|
|
120
|
+
function readString(value) {
|
|
121
|
+
return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
|
|
122
|
+
}
|
|
123
|
+
function clampNumber(value, fallback, min, max) {
|
|
124
|
+
const parsed = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : fallback;
|
|
125
|
+
if (!Number.isFinite(parsed))
|
|
126
|
+
return fallback;
|
|
127
|
+
return Math.max(min, Math.min(max, Math.trunc(parsed)));
|
|
128
|
+
}
|
|
@@ -1,21 +1,16 @@
|
|
|
1
|
-
import type { AutomationRouteBinding } from '../../automation/routes.js';
|
|
2
1
|
import type { RouteBindingManager } from '../../channels/index.js';
|
|
2
|
+
import type { CompanionChatManager } from '../../companion/companion-chat-manager.js';
|
|
3
3
|
import type { ConfigManager } from '../../config/manager.js';
|
|
4
|
-
import type { SharedSessionBroker } from '../../control-plane/index.js';
|
|
5
|
-
import type { AgentManager, AgentRecord } from '../../tools/agent/index.js';
|
|
6
4
|
type JsonRecord = Record<string, unknown>;
|
|
7
5
|
interface HomeAssistantRouteContext {
|
|
8
6
|
readonly configManager: Pick<ConfigManager, 'get'>;
|
|
9
7
|
readonly routeBindings: Pick<RouteBindingManager, 'start' | 'upsertBinding' | 'patchBinding'>;
|
|
10
|
-
readonly
|
|
11
|
-
readonly agentManager: Pick<AgentManager, 'getStatus' | 'cancel'>;
|
|
8
|
+
readonly chatManager: CompanionChatManager;
|
|
12
9
|
readonly parseJsonBody: (req: Request) => Promise<JsonRecord | Response>;
|
|
13
|
-
readonly
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
readonly sessionId?: string;
|
|
18
|
-
}) => void;
|
|
10
|
+
readonly resolveDefaultProviderModel?: () => {
|
|
11
|
+
provider: string;
|
|
12
|
+
model: string;
|
|
13
|
+
} | null;
|
|
19
14
|
}
|
|
20
15
|
export declare class HomeAssistantConversationRoutes {
|
|
21
16
|
private readonly context;
|
|
@@ -28,11 +23,6 @@ export declare class HomeAssistantConversationRoutes {
|
|
|
28
23
|
private streamConversation;
|
|
29
24
|
private cancelConversation;
|
|
30
25
|
private parseInput;
|
|
31
|
-
private upsertBinding;
|
|
32
|
-
private resolveRemoteSession;
|
|
33
|
-
private buildRouting;
|
|
34
|
-
private waitForAgent;
|
|
35
|
-
private errorFromSpawnResponse;
|
|
36
26
|
private indexMessage;
|
|
37
27
|
private readRemoteSessionTtlMs;
|
|
38
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"homeassistant-routes.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/daemon/http/homeassistant-routes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"homeassistant-routes.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/daemon/http/homeassistant-routes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAW7D,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAkC1C,UAAU,yBAAyB;IACjC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACnD,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,eAAe,GAAG,cAAc,CAAC,CAAC;IAC9F,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;IACzE,QAAQ,CAAC,2BAA2B,CAAC,EAAE,MAAM;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACzF;AAQD,qBAAa,+BAA+B;IAG9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgD;gBAEhD,OAAO,EAAE,yBAAyB;IAEzD,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IA6BpD,OAAO,CAAC,cAAc;YA2BR,kBAAkB;IAmGhC,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,UAAU;IAuClB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,sBAAsB;CAG/B"}
|