@pellux/goodvibes-sdk 0.25.10 → 0.25.12

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 (220) hide show
  1. package/dist/_internal/contracts/artifacts/operator-contract.json +178 -6
  2. package/dist/_internal/contracts/generated/foundation-client-types.d.ts +16 -1
  3. package/dist/_internal/contracts/generated/foundation-client-types.d.ts.map +1 -1
  4. package/dist/_internal/contracts/generated/foundation-metadata.d.ts +2 -2
  5. package/dist/_internal/contracts/generated/foundation-metadata.js +2 -2
  6. package/dist/_internal/contracts/generated/operator-contract.d.ts.map +1 -1
  7. package/dist/_internal/contracts/generated/operator-contract.js +178 -6
  8. package/dist/_internal/contracts/generated/operator-method-ids.d.ts +1 -1
  9. package/dist/_internal/contracts/generated/operator-method-ids.d.ts.map +1 -1
  10. package/dist/_internal/contracts/generated/operator-method-ids.js +1 -0
  11. package/dist/_internal/daemon/context.d.ts +1 -0
  12. package/dist/_internal/daemon/context.d.ts.map +1 -1
  13. package/dist/_internal/daemon/integration-route-types.d.ts +1 -0
  14. package/dist/_internal/daemon/integration-route-types.d.ts.map +1 -1
  15. package/dist/_internal/daemon/integration-routes.d.ts +1 -1
  16. package/dist/_internal/daemon/integration-routes.d.ts.map +1 -1
  17. package/dist/_internal/daemon/integration-routes.js +3 -0
  18. package/dist/_internal/daemon/operator.d.ts +1 -1
  19. package/dist/_internal/daemon/operator.d.ts.map +1 -1
  20. package/dist/_internal/daemon/operator.js +2 -0
  21. package/dist/_internal/daemon/runtime-route-types.d.ts +1 -1
  22. package/dist/_internal/daemon/runtime-route-types.d.ts.map +1 -1
  23. package/dist/_internal/platform/adapters/discord/index.d.ts.map +1 -1
  24. package/dist/_internal/platform/adapters/discord/index.js +4 -5
  25. package/dist/_internal/platform/adapters/github/index.d.ts.map +1 -1
  26. package/dist/_internal/platform/adapters/github/index.js +4 -5
  27. package/dist/_internal/platform/adapters/google-chat/index.d.ts.map +1 -1
  28. package/dist/_internal/platform/adapters/google-chat/index.js +7 -5
  29. package/dist/_internal/platform/adapters/helpers.d.ts +2 -1
  30. package/dist/_internal/platform/adapters/helpers.d.ts.map +1 -1
  31. package/dist/_internal/platform/adapters/helpers.js +3 -34
  32. package/dist/_internal/platform/adapters/homeassistant/index.d.ts +3 -0
  33. package/dist/_internal/platform/adapters/homeassistant/index.d.ts.map +1 -0
  34. package/dist/_internal/platform/adapters/homeassistant/index.js +185 -0
  35. package/dist/_internal/platform/adapters/index.d.ts +1 -0
  36. package/dist/_internal/platform/adapters/index.d.ts.map +1 -1
  37. package/dist/_internal/platform/adapters/index.js +1 -0
  38. package/dist/_internal/platform/adapters/mattermost/index.d.ts.map +1 -1
  39. package/dist/_internal/platform/adapters/mattermost/index.js +6 -2
  40. package/dist/_internal/platform/adapters/slack/index.d.ts.map +1 -1
  41. package/dist/_internal/platform/adapters/slack/index.js +4 -5
  42. package/dist/_internal/platform/adapters/telegram/index.d.ts.map +1 -1
  43. package/dist/_internal/platform/adapters/telegram/index.js +7 -5
  44. package/dist/_internal/platform/adapters/types.d.ts +1 -1
  45. package/dist/_internal/platform/adapters/types.d.ts.map +1 -1
  46. package/dist/_internal/platform/adapters/webhook/index.d.ts.map +1 -1
  47. package/dist/_internal/platform/adapters/webhook/index.js +4 -1
  48. package/dist/_internal/platform/automation/types.d.ts +1 -1
  49. package/dist/_internal/platform/automation/types.d.ts.map +1 -1
  50. package/dist/_internal/platform/channels/builtin/accounts.d.ts.map +1 -1
  51. package/dist/_internal/platform/channels/builtin/accounts.js +23 -0
  52. package/dist/_internal/platform/channels/builtin/contracts.d.ts.map +1 -1
  53. package/dist/_internal/platform/channels/builtin/contracts.js +9 -0
  54. package/dist/_internal/platform/channels/builtin/descriptors.d.ts.map +1 -1
  55. package/dist/_internal/platform/channels/builtin/descriptors.js +9 -2
  56. package/dist/_internal/platform/channels/builtin/homeassistant.d.ts +64 -0
  57. package/dist/_internal/platform/channels/builtin/homeassistant.d.ts.map +1 -0
  58. package/dist/_internal/platform/channels/builtin/homeassistant.js +391 -0
  59. package/dist/_internal/platform/channels/builtin/plugins.d.ts.map +1 -1
  60. package/dist/_internal/platform/channels/builtin/plugins.js +2 -1
  61. package/dist/_internal/platform/channels/builtin/presentation.d.ts.map +1 -1
  62. package/dist/_internal/platform/channels/builtin/presentation.js +4 -0
  63. package/dist/_internal/platform/channels/builtin/rendering.d.ts.map +1 -1
  64. package/dist/_internal/platform/channels/builtin/rendering.js +7 -0
  65. package/dist/_internal/platform/channels/builtin/setup-schema.d.ts.map +1 -1
  66. package/dist/_internal/platform/channels/builtin/setup-schema.js +53 -0
  67. package/dist/_internal/platform/channels/builtin/shared.d.ts +1 -1
  68. package/dist/_internal/platform/channels/builtin/shared.d.ts.map +1 -1
  69. package/dist/_internal/platform/channels/builtin/shared.js +2 -0
  70. package/dist/_internal/platform/channels/builtin/surfaces.d.ts.map +1 -1
  71. package/dist/_internal/platform/channels/builtin/surfaces.js +1 -0
  72. package/dist/_internal/platform/channels/builtin/targets.d.ts.map +1 -1
  73. package/dist/_internal/platform/channels/builtin/targets.js +24 -0
  74. package/dist/_internal/platform/channels/builtin-runtime.d.ts.map +1 -1
  75. package/dist/_internal/platform/channels/builtin-runtime.js +6 -0
  76. package/dist/_internal/platform/channels/delivery/strategies-core.d.ts +1 -0
  77. package/dist/_internal/platform/channels/delivery/strategies-core.d.ts.map +1 -1
  78. package/dist/_internal/platform/channels/delivery/strategies-core.js +60 -1
  79. package/dist/_internal/platform/channels/delivery/types.d.ts +2 -0
  80. package/dist/_internal/platform/channels/delivery/types.d.ts.map +1 -1
  81. package/dist/_internal/platform/channels/delivery-router.d.ts.map +1 -1
  82. package/dist/_internal/platform/channels/delivery-router.js +2 -1
  83. package/dist/_internal/platform/channels/reply-pipeline.d.ts.map +1 -1
  84. package/dist/_internal/platform/channels/reply-pipeline.js +9 -0
  85. package/dist/_internal/platform/channels/route-manager.d.ts.map +1 -1
  86. package/dist/_internal/platform/channels/route-manager.js +1 -0
  87. package/dist/_internal/platform/channels/surface-registry.d.ts.map +1 -1
  88. package/dist/_internal/platform/channels/surface-registry.js +4 -0
  89. package/dist/_internal/platform/channels/types.d.ts +1 -1
  90. package/dist/_internal/platform/channels/types.d.ts.map +1 -1
  91. package/dist/_internal/platform/cloudflare/manager.d.ts +1 -1
  92. package/dist/_internal/platform/cloudflare/manager.d.ts.map +1 -1
  93. package/dist/_internal/platform/cloudflare/manager.js +27 -24
  94. package/dist/_internal/platform/cloudflare/types.d.ts +5 -0
  95. package/dist/_internal/platform/cloudflare/types.d.ts.map +1 -1
  96. package/dist/_internal/platform/cloudflare/utils.d.ts.map +1 -1
  97. package/dist/_internal/platform/cloudflare/utils.js +4 -10
  98. package/dist/_internal/platform/companion/companion-chat-manager.d.ts +24 -4
  99. package/dist/_internal/platform/companion/companion-chat-manager.d.ts.map +1 -1
  100. package/dist/_internal/platform/companion/companion-chat-manager.js +128 -78
  101. package/dist/_internal/platform/config/schema-domain-surfaces.d.ts +12 -0
  102. package/dist/_internal/platform/config/schema-domain-surfaces.d.ts.map +1 -1
  103. package/dist/_internal/platform/config/schema-domain-surfaces.js +67 -0
  104. package/dist/_internal/platform/config/schema-types.d.ts +15 -2
  105. package/dist/_internal/platform/config/schema-types.d.ts.map +1 -1
  106. package/dist/_internal/platform/control-plane/gateway-utils.d.ts +37 -0
  107. package/dist/_internal/platform/control-plane/gateway-utils.d.ts.map +1 -0
  108. package/dist/_internal/platform/control-plane/gateway-utils.js +97 -0
  109. package/dist/_internal/platform/control-plane/gateway.d.ts +4 -9
  110. package/dist/_internal/platform/control-plane/gateway.d.ts.map +1 -1
  111. package/dist/_internal/platform/control-plane/gateway.js +26 -61
  112. package/dist/_internal/platform/control-plane/method-catalog-runtime.d.ts.map +1 -1
  113. package/dist/_internal/platform/control-plane/method-catalog-runtime.js +11 -1
  114. package/dist/_internal/platform/control-plane/operator-contract-schemas-admin.d.ts.map +1 -1
  115. package/dist/_internal/platform/control-plane/operator-contract-schemas-admin.js +3 -2
  116. package/dist/_internal/platform/control-plane/operator-contract-schemas-control.d.ts +1 -0
  117. package/dist/_internal/platform/control-plane/operator-contract-schemas-control.d.ts.map +1 -1
  118. package/dist/_internal/platform/control-plane/operator-contract-schemas-control.js +26 -0
  119. package/dist/_internal/platform/control-plane/routes/operator.d.ts +1 -1
  120. package/dist/_internal/platform/control-plane/routes/operator.d.ts.map +1 -1
  121. package/dist/_internal/platform/control-plane/routes/operator.js +2 -0
  122. package/dist/_internal/platform/control-plane/session-types.d.ts +2 -1
  123. package/dist/_internal/platform/control-plane/session-types.d.ts.map +1 -1
  124. package/dist/_internal/platform/control-plane/types.d.ts +1 -1
  125. package/dist/_internal/platform/control-plane/types.d.ts.map +1 -1
  126. package/dist/_internal/platform/daemon/control-plane.d.ts.map +1 -1
  127. package/dist/_internal/platform/daemon/control-plane.js +50 -6
  128. package/dist/_internal/platform/daemon/facade-composition.d.ts.map +1 -1
  129. package/dist/_internal/platform/daemon/facade-composition.js +30 -2
  130. package/dist/_internal/platform/daemon/facade-types.d.ts +1 -1
  131. package/dist/_internal/platform/daemon/facade-types.d.ts.map +1 -1
  132. package/dist/_internal/platform/daemon/http/homeassistant-routes.d.ts +40 -0
  133. package/dist/_internal/platform/daemon/http/homeassistant-routes.d.ts.map +1 -0
  134. package/dist/_internal/platform/daemon/http/homeassistant-routes.js +468 -0
  135. package/dist/_internal/platform/daemon/http/router.d.ts +4 -2
  136. package/dist/_internal/platform/daemon/http/router.d.ts.map +1 -1
  137. package/dist/_internal/platform/daemon/http/router.js +28 -16
  138. package/dist/_internal/platform/daemon/http/runtime-route-types.d.ts +1 -1
  139. package/dist/_internal/platform/daemon/http/runtime-route-types.d.ts.map +1 -1
  140. package/dist/_internal/platform/daemon/http-listener.d.ts.map +1 -1
  141. package/dist/_internal/platform/daemon/http-listener.js +4 -8
  142. package/dist/_internal/platform/daemon/surface-actions.d.ts +1 -1
  143. package/dist/_internal/platform/daemon/surface-actions.d.ts.map +1 -1
  144. package/dist/_internal/platform/daemon/surface-delivery.d.ts +1 -1
  145. package/dist/_internal/platform/daemon/surface-delivery.d.ts.map +1 -1
  146. package/dist/_internal/platform/daemon/surface-delivery.js +15 -0
  147. package/dist/_internal/platform/daemon/surface-policy.d.ts +1 -1
  148. package/dist/_internal/platform/daemon/surface-policy.d.ts.map +1 -1
  149. package/dist/_internal/platform/daemon/surface-policy.js +8 -0
  150. package/dist/_internal/platform/daemon/types.d.ts +3 -3
  151. package/dist/_internal/platform/daemon/types.d.ts.map +1 -1
  152. package/dist/_internal/platform/integrations/homeassistant.d.ts +62 -0
  153. package/dist/_internal/platform/integrations/homeassistant.d.ts.map +1 -0
  154. package/dist/_internal/platform/integrations/homeassistant.js +174 -0
  155. package/dist/_internal/platform/integrations/index.d.ts +2 -0
  156. package/dist/_internal/platform/integrations/index.d.ts.map +1 -1
  157. package/dist/_internal/platform/integrations/index.js +1 -0
  158. package/dist/_internal/platform/runtime/events/control-plane.d.ts +1 -1
  159. package/dist/_internal/platform/runtime/events/control-plane.d.ts.map +1 -1
  160. package/dist/_internal/platform/runtime/events/control-plane.js +1 -0
  161. package/dist/_internal/platform/runtime/events/routes.d.ts +1 -1
  162. package/dist/_internal/platform/runtime/events/routes.d.ts.map +1 -1
  163. package/dist/_internal/platform/runtime/events/routes.js +1 -0
  164. package/dist/_internal/platform/runtime/feature-flags/flags.d.ts.map +1 -1
  165. package/dist/_internal/platform/runtime/feature-flags/flags.js +9 -0
  166. package/dist/_internal/platform/runtime/feature-flags/gates.d.ts.map +1 -1
  167. package/dist/_internal/platform/runtime/feature-flags/gates.js +2 -0
  168. package/dist/_internal/platform/runtime/index.d.ts +2 -0
  169. package/dist/_internal/platform/runtime/index.d.ts.map +1 -1
  170. package/dist/_internal/platform/runtime/index.js +1 -0
  171. package/dist/_internal/platform/runtime/integration/helpers.d.ts +4 -0
  172. package/dist/_internal/platform/runtime/integration/helpers.d.ts.map +1 -1
  173. package/dist/_internal/platform/runtime/integration/helpers.js +4 -0
  174. package/dist/_internal/platform/runtime/security-settings.d.ts +19 -0
  175. package/dist/_internal/platform/runtime/security-settings.d.ts.map +1 -0
  176. package/dist/_internal/platform/runtime/security-settings.js +187 -0
  177. package/dist/_internal/platform/runtime/services.d.ts.map +1 -1
  178. package/dist/_internal/platform/runtime/services.js +1 -0
  179. package/dist/_internal/platform/security/user-auth.d.ts +1 -1
  180. package/dist/_internal/platform/security/user-auth.d.ts.map +1 -1
  181. package/dist/_internal/platform/security/user-auth.js +18 -3
  182. package/dist/_internal/platform/tools/edit/core.d.ts.map +1 -1
  183. package/dist/_internal/platform/tools/edit/core.js +4 -47
  184. package/dist/_internal/platform/tools/exec/runtime.d.ts.map +1 -1
  185. package/dist/_internal/platform/tools/exec/runtime.js +7 -1
  186. package/dist/_internal/platform/tools/exec/schema.d.ts +1 -0
  187. package/dist/_internal/platform/tools/exec/schema.d.ts.map +1 -1
  188. package/dist/_internal/platform/tools/exec/schema.js +1 -0
  189. package/dist/_internal/platform/tools/fetch/runtime.d.ts.map +1 -1
  190. package/dist/_internal/platform/tools/fetch/runtime.js +140 -19
  191. package/dist/_internal/platform/tools/fetch/schema.d.ts +1 -0
  192. package/dist/_internal/platform/tools/fetch/schema.d.ts.map +1 -1
  193. package/dist/_internal/platform/tools/fetch/schema.js +1 -0
  194. package/dist/_internal/platform/tools/find/executor.d.ts.map +1 -1
  195. package/dist/_internal/platform/tools/find/executor.js +7 -1
  196. package/dist/_internal/platform/tools/find/schema.d.ts.map +1 -1
  197. package/dist/_internal/platform/tools/find/schema.js +2 -0
  198. package/dist/_internal/platform/tools/read/index.d.ts.map +1 -1
  199. package/dist/_internal/platform/tools/read/index.js +7 -1
  200. package/dist/_internal/platform/tools/read/schema.d.ts +1 -0
  201. package/dist/_internal/platform/tools/read/schema.d.ts.map +1 -1
  202. package/dist/_internal/platform/tools/read/schema.js +1 -0
  203. package/dist/_internal/platform/tools/shared/process-manager.d.ts +2 -0
  204. package/dist/_internal/platform/tools/shared/process-manager.d.ts.map +1 -1
  205. package/dist/_internal/platform/tools/shared/process-manager.js +67 -5
  206. package/dist/_internal/platform/tools/write/index.d.ts.map +1 -1
  207. package/dist/_internal/platform/tools/write/index.js +3 -36
  208. package/dist/_internal/platform/utils/concurrency.d.ts +3 -0
  209. package/dist/_internal/platform/utils/concurrency.d.ts.map +1 -0
  210. package/dist/_internal/platform/utils/concurrency.js +17 -0
  211. package/dist/_internal/platform/utils/logger.d.ts.map +1 -1
  212. package/dist/_internal/platform/utils/logger.js +19 -1
  213. package/dist/_internal/platform/utils/request-body.d.ts +4 -0
  214. package/dist/_internal/platform/utils/request-body.d.ts.map +1 -0
  215. package/dist/_internal/platform/utils/request-body.js +45 -0
  216. package/dist/_internal/platform/version.js +1 -1
  217. package/dist/workers.d.ts +6 -0
  218. package/dist/workers.d.ts.map +1 -1
  219. package/dist/workers.js +55 -3
  220. package/package.json +1 -1
@@ -0,0 +1,185 @@
1
+ import { timingSafeEqual, randomUUID } from 'node:crypto';
2
+ import { parseJsonRecord, readTextBodyWithinLimit } from '../helpers.js';
3
+ import { HOME_ASSISTANT_SURFACE, resolveHomeAssistantWebhookSecret, } from '../../channels/builtin/homeassistant.js';
4
+ export async function handleHomeAssistantSurfaceWebhook(req, context) {
5
+ const enabled = Boolean(context.configManager.get('surfaces.homeassistant.enabled'));
6
+ const secret = await resolveHomeAssistantWebhookSecret(context);
7
+ if (!enabled || !secret) {
8
+ return Response.json({ error: 'Home Assistant ingress is not configured' }, { status: 503 });
9
+ }
10
+ const rawBody = await readTextBodyWithinLimit(req);
11
+ if (rawBody instanceof Response)
12
+ return rawBody;
13
+ if (!isAuthorizedHomeAssistantRequest(req, secret)) {
14
+ return Response.json({ error: 'Unauthorized' }, { status: 401 });
15
+ }
16
+ const contentType = req.headers.get('content-type') ?? '';
17
+ const body = contentType.includes('application/json') || rawBody.trim().startsWith('{')
18
+ ? parseJsonRecord(rawBody)
19
+ : { message: rawBody.trim() };
20
+ if (body instanceof Response)
21
+ return body;
22
+ const text = readString(body.prompt)
23
+ ?? readString(body.message)
24
+ ?? readString(body.text)
25
+ ?? readString(body.task)
26
+ ?? '';
27
+ const controlCommand = text ? context.parseSurfaceControlCommand(text) : null;
28
+ if (controlCommand) {
29
+ const message = await context.performSurfaceControlCommand(controlCommand);
30
+ return Response.json({ acknowledged: true, control: true, message });
31
+ }
32
+ const conversationId = readString(body.conversationId ?? body.conversation_id)
33
+ ?? readString(body.threadId ?? body.thread_id)
34
+ ?? readString(body.deviceId ?? body.device_id)
35
+ ?? String(context.configManager.get('surfaces.homeassistant.defaultConversationId') || 'goodvibes');
36
+ const surfaceId = readString(body.surfaceId ?? body.instanceId ?? body.instance_id)
37
+ ?? readString(body.hassInstanceId ?? body.hass_instance_id)
38
+ ?? 'homeassistant';
39
+ const threadId = readString(body.threadId ?? body.thread_id);
40
+ const channelId = readString(body.areaId ?? body.area_id)
41
+ ?? readString(body.entityId ?? body.entity_id)
42
+ ?? conversationId;
43
+ const messageId = readString(body.messageId ?? body.message_id) ?? `ha-${randomUUID()}`;
44
+ const mode = readString(body.mode ?? body.type)?.toLowerCase() ?? 'prompt';
45
+ const conversationKind = conversationKindForHomeAssistant(mode, threadId, channelId);
46
+ const policy = await context.authorizeSurfaceIngress({
47
+ surface: HOME_ASSISTANT_SURFACE,
48
+ userId: readString(body.userId ?? body.user_id),
49
+ channelId,
50
+ groupId: readString(body.areaId ?? body.area_id) ?? channelId,
51
+ threadId,
52
+ workspaceId: readString(body.instanceId ?? body.instance_id),
53
+ conversationKind,
54
+ hasAnyMention: typeof body.hasAnyMention === 'boolean' ? body.hasAnyMention : true,
55
+ text,
56
+ mentioned: typeof body.mentioned === 'boolean' ? body.mentioned : true,
57
+ metadata: body,
58
+ });
59
+ if (!policy.allowed) {
60
+ return Response.json({ error: `Blocked by channel policy: ${policy.reason}` }, { status: 403 });
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
+ if (!text.trim()) {
81
+ return Response.json({
82
+ acknowledged: true,
83
+ queued: false,
84
+ bindingId: binding.id,
85
+ });
86
+ }
87
+ const routing = readRouting(body);
88
+ const submission = await context.sessionBroker.submitMessage({
89
+ sessionId: readString(body.sessionId ?? body.session_id),
90
+ routeId: binding.id,
91
+ surfaceKind: HOME_ASSISTANT_SURFACE,
92
+ surfaceId,
93
+ externalId: conversationId,
94
+ threadId,
95
+ userId: readString(body.userId ?? body.user_id),
96
+ displayName: readString(body.displayName ?? body.userName ?? body.user_name),
97
+ title: readString(body.title) ?? 'Home Assistant',
98
+ body: text,
99
+ metadata: {
100
+ source: 'homeassistant',
101
+ messageId,
102
+ conversationId,
103
+ deviceId: readString(body.deviceId ?? body.device_id) ?? null,
104
+ entityId: readString(body.entityId ?? body.entity_id) ?? null,
105
+ },
106
+ ...(routing ? { routing } : {}),
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
+ ...(routing?.modelId ? { model: routing.modelId } : {}),
124
+ ...(routing?.providerId ? { provider: routing.providerId } : {}),
125
+ ...(routing?.tools?.length ? { tools: [...routing.tools] } : {}),
126
+ context: `homeassistant:${conversationId}`,
127
+ }, 'handleHomeAssistantSurfaceWebhook', submission.session.id);
128
+ if (spawnResult instanceof Response)
129
+ return spawnResult;
130
+ await context.sessionBroker.bindAgent(submission.session.id, spawnResult.id);
131
+ context.queueSurfaceReplyFromBinding(binding, {
132
+ agentId: spawnResult.id,
133
+ task: text,
134
+ sessionId: submission.session.id,
135
+ });
136
+ return Response.json({
137
+ acknowledged: true,
138
+ queued: true,
139
+ bindingId: binding.id,
140
+ sessionId: submission.session.id,
141
+ agentId: spawnResult.id,
142
+ messageId,
143
+ conversationId,
144
+ });
145
+ }
146
+ function isAuthorizedHomeAssistantRequest(req, secret) {
147
+ const candidates = [
148
+ req.headers.get('x-goodvibes-homeassistant-secret'),
149
+ req.headers.get('x-goodvibes-webhook-secret'),
150
+ req.headers.get('authorization')?.replace(/^Bearer\s+/i, ''),
151
+ ].filter((value) => typeof value === 'string' && value.length > 0);
152
+ return candidates.some((candidate) => safeEqual(candidate, secret));
153
+ }
154
+ function safeEqual(a, b) {
155
+ const left = Buffer.from(a);
156
+ const right = Buffer.from(b);
157
+ return left.length === right.length && timingSafeEqual(left, right);
158
+ }
159
+ function conversationKindForHomeAssistant(mode, threadId, channelId) {
160
+ if (threadId)
161
+ return 'thread';
162
+ if (mode === 'conversation' || mode === 'chat' || mode === 'prompt')
163
+ return 'direct';
164
+ return channelId ? 'channel' : 'service';
165
+ }
166
+ function readRouting(body) {
167
+ const providerId = readString(body.providerId ?? body.provider);
168
+ const modelId = readString(body.modelId ?? body.model);
169
+ const tools = readStringList(body.tools);
170
+ if (!providerId && !modelId && !tools.length)
171
+ return undefined;
172
+ return {
173
+ ...(providerId ? { providerId } : {}),
174
+ ...(modelId ? { modelId } : {}),
175
+ ...(tools.length ? { tools } : {}),
176
+ };
177
+ }
178
+ function readString(value) {
179
+ return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
180
+ }
181
+ function readStringList(value) {
182
+ return Array.isArray(value)
183
+ ? value.filter((entry) => typeof entry === 'string' && entry.trim().length > 0).map((entry) => entry.trim())
184
+ : [];
185
+ }
@@ -2,6 +2,7 @@ export * from './types.js';
2
2
  export { handleSlackSurfacePayload, handleSlackSurfaceWebhook } from './slack/index.js';
3
3
  export { handleDiscordGatewayDispatchPayload, handleDiscordInteractionPayload, handleDiscordSurfaceWebhook } from './discord/index.js';
4
4
  export { handleNtfySurfacePayload, handleNtfySurfaceWebhook } from './ntfy/index.js';
5
+ export { handleHomeAssistantSurfaceWebhook } from './homeassistant/index.js';
5
6
  export { handleTelegramSurfaceWebhook } from './telegram/index.js';
6
7
  export { handleGoogleChatSurfaceWebhook } from './google-chat/index.js';
7
8
  export { handleSignalSurfaceWebhook } from './signal/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,mCAAmC,EAAE,+BAA+B,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACvI,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,mCAAmC,EAAE,+BAA+B,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACvI,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,iCAAiC,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC"}
@@ -2,6 +2,7 @@ export * from './types.js';
2
2
  export { handleSlackSurfacePayload, handleSlackSurfaceWebhook } from './slack/index.js';
3
3
  export { handleDiscordGatewayDispatchPayload, handleDiscordInteractionPayload, handleDiscordSurfaceWebhook } from './discord/index.js';
4
4
  export { handleNtfySurfacePayload, handleNtfySurfaceWebhook } from './ntfy/index.js';
5
+ export { handleHomeAssistantSurfaceWebhook } from './homeassistant/index.js';
5
6
  export { handleTelegramSurfaceWebhook } from './telegram/index.js';
6
7
  export { handleGoogleChatSurfaceWebhook } from './google-chat/index.js';
7
8
  export { handleSignalSurfaceWebhook } from './signal/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/adapters/mattermost/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAgCzD,wBAAsB,8BAA8B,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqHpH"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/adapters/mattermost/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAoCzD,wBAAsB,8BAA8B,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqHpH"}
@@ -8,8 +8,12 @@ function readString(value) {
8
8
  async function readBody(req) {
9
9
  const contentType = req.headers.get('content-type') ?? '';
10
10
  if (contentType.includes('multipart/form-data')) {
11
- const contentLength = parseInt(req.headers.get('content-length') ?? '0', 10);
12
- if (Number.isFinite(contentLength) && contentLength > 1_000_000) {
11
+ const contentLengthHeader = req.headers.get('content-length');
12
+ const contentLength = parseInt(contentLengthHeader ?? '', 10);
13
+ if (!contentLengthHeader || !Number.isFinite(contentLength)) {
14
+ return Response.json({ error: 'Content-Length required for multipart payloads' }, { status: 411 });
15
+ }
16
+ if (contentLength > 1_000_000) {
13
17
  return Response.json({ error: 'Payload too large' }, { status: 413 });
14
18
  }
15
19
  const form = await req.formData().catch(() => null);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/adapters/slack/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAKzD,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgD/G;AAED,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,EAAE,qBAAqB,EAC9B,KAAK,mBAAyB,EAC9B,GAAG,GAAE,OAAiF,GACrF,OAAO,CAAC,QAAQ,CAAC,CAyQnB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/adapters/slack/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAMzD,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC,CA4C/G;AAED,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,EAAE,qBAAqB,EAC9B,KAAK,mBAAyB,EAC9B,GAAG,GAAE,OAAiF,GACrF,OAAO,CAAC,QAAQ,CAAC,CAyQnB"}
@@ -3,11 +3,8 @@ import { SlackIntegration } from '../../integrations/index.js';
3
3
  import { summarizeError } from '../../utils/error-display.js';
4
4
  import { fetchWithTimeout } from '../../utils/fetch-with-timeout.js';
5
5
  import { resolveSecretInput } from '../../config/secret-refs.js';
6
+ import { readTextBodyWithinLimit } from '../helpers.js';
6
7
  export async function handleSlackSurfaceWebhook(req, context) {
7
- const contentLength = parseInt(req.headers.get('content-length') ?? '0', 10);
8
- if (contentLength > 1_000_000) {
9
- return Response.json({ error: 'Payload too large' }, { status: 413 });
10
- }
11
8
  const signingSecret = await context.serviceRegistry.resolveSecret('slack', 'signingSecret')
12
9
  ?? await resolveSlackConfigSecret(context, 'surfaces.slack.signingSecret')
13
10
  ?? process.env.SLACK_SIGNING_SECRET;
@@ -17,7 +14,9 @@ export async function handleSlackSurfaceWebhook(req, context) {
17
14
  }
18
15
  const timestamp = req.headers.get('x-slack-request-timestamp') ?? '';
19
16
  const signature = req.headers.get('x-slack-signature') ?? '';
20
- const rawBody = await req.text();
17
+ const rawBody = await readTextBodyWithinLimit(req);
18
+ if (rawBody instanceof Response)
19
+ return rawBody;
21
20
  const slack = new SlackIntegration(await context.serviceRegistry.resolveSecret('slack', 'webhookUrl') ?? process.env.SLACK_WEBHOOK_URL, await context.serviceRegistry.resolveSecret('slack', 'primary')
22
21
  ?? await resolveSlackConfigSecret(context, 'surfaces.slack.botToken')
23
22
  ?? process.env.SLACK_BOT_TOKEN);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/adapters/telegram/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAiCzD,wBAAsB,4BAA4B,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC,CA8HlH"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/adapters/telegram/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAkCzD,wBAAsB,4BAA4B,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6HlH"}
@@ -1,3 +1,4 @@
1
+ import { parseJsonRecord, readTextBodyWithinLimit } from '../helpers.js';
1
2
  function readRecord(value) {
2
3
  return value && typeof value === 'object' ? value : null;
3
4
  }
@@ -30,10 +31,6 @@ function telegramConversationKind(chatType, threadId) {
30
31
  return 'group';
31
32
  }
32
33
  export async function handleTelegramSurfaceWebhook(req, context) {
33
- const contentLength = parseInt(req.headers.get('content-length') ?? '0', 10);
34
- if (contentLength > 1_000_000) {
35
- return Response.json({ error: 'Payload too large' }, { status: 413 });
36
- }
37
34
  const configuredSecret = String(context.configManager.get('surfaces.telegram.webhookSecret') ?? '')
38
35
  || await context.serviceRegistry.resolveSecret('telegram', 'signingSecret')
39
36
  || process.env.TELEGRAM_WEBHOOK_SECRET
@@ -44,7 +41,12 @@ export async function handleTelegramSurfaceWebhook(req, context) {
44
41
  return Response.json({ error: 'Unauthorized' }, { status: 401 });
45
42
  }
46
43
  }
47
- const body = await req.json().catch(() => null);
44
+ const rawBody = await readTextBodyWithinLimit(req);
45
+ if (rawBody instanceof Response)
46
+ return rawBody;
47
+ const body = parseJsonRecord(rawBody);
48
+ if (body instanceof Response)
49
+ return body;
48
50
  const payload = readRecord(body);
49
51
  if (!payload)
50
52
  return Response.json({ error: 'Invalid JSON body' }, { status: 400 });
@@ -43,7 +43,7 @@ export interface SurfaceAdapterContext {
43
43
  readonly routeBindings: RouteBindingManager;
44
44
  readonly sessionBroker: SharedSessionBroker;
45
45
  readonly authorizeSurfaceIngress: (input: {
46
- surface: Extract<AutomationSurfaceKind, 'slack' | 'discord' | 'ntfy' | 'telegram' | 'google-chat' | 'signal' | 'whatsapp' | 'imessage' | 'msteams' | 'bluebubbles' | 'mattermost' | 'matrix'>;
46
+ surface: Extract<AutomationSurfaceKind, 'slack' | 'discord' | 'ntfy' | 'homeassistant' | 'telegram' | 'google-chat' | 'signal' | 'whatsapp' | 'imessage' | 'msteams' | 'bluebubbles' | 'mattermost' | 'matrix'>;
47
47
  userId?: string;
48
48
  channelId?: string;
49
49
  groupId?: 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":"index.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/adapters/webhook/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAWhE,wBAAsB,2BAA2B,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqKxH"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/adapters/webhook/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAYhE,wBAAsB,2BAA2B,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsKxH"}
@@ -1,5 +1,6 @@
1
1
  import { timingSafeEqual } from 'node:crypto';
2
2
  import { validatePublicWebhookUrl } from '../../utils/url-safety.js';
3
+ import { readTextBodyWithinLimit } from '../helpers.js';
3
4
  function parseJsonRecord(rawBody) {
4
5
  try {
5
6
  return JSON.parse(rawBody);
@@ -14,7 +15,9 @@ export async function handleGenericWebhookSurface(req, context) {
14
15
  if (!enabled || !configuredSecret) {
15
16
  return Response.json({ error: 'Webhook ingress is not configured' }, { status: 503 });
16
17
  }
17
- const rawBody = await req.text();
18
+ const rawBody = await readTextBodyWithinLimit(req);
19
+ if (rawBody instanceof Response)
20
+ return rawBody;
18
21
  const providedSignature = req.headers.get('x-goodvibes-signature') ?? '';
19
22
  const providedSecret = req.headers.get('x-goodvibes-webhook-secret')
20
23
  ?? req.headers.get('authorization')?.replace(/^Bearer\s+/i, '')
@@ -6,7 +6,7 @@
6
6
  export type AutomationJobStatus = 'enabled' | 'paused' | 'error' | 'archived';
7
7
  export type AutomationRunStatus = 'queued' | 'running' | 'completed' | 'failed' | 'cancelled';
8
8
  export type AutomationRunTrigger = 'scheduled' | 'manual' | 'catch_up' | 'webhook' | 'surface' | 'watcher' | 'migration';
9
- export type AutomationSurfaceKind = 'tui' | 'web' | 'slack' | 'discord' | 'ntfy' | 'webhook' | 'telegram' | 'google-chat' | 'signal' | 'whatsapp' | 'imessage' | 'msteams' | 'bluebubbles' | 'mattermost' | 'matrix' | 'service';
9
+ export type AutomationSurfaceKind = 'tui' | 'web' | 'slack' | 'discord' | 'ntfy' | 'webhook' | 'homeassistant' | 'telegram' | 'google-chat' | 'signal' | 'whatsapp' | 'imessage' | 'msteams' | 'bluebubbles' | 'mattermost' | 'matrix' | 'service';
10
10
  export type AutomationRouteKind = 'session' | 'thread' | 'channel' | 'message';
11
11
  export type AutomationSourceKind = 'schedule' | 'manual' | 'hook' | 'webhook' | 'surface' | 'watcher' | 'migration';
12
12
  export type AutomationExecutionKind = 'isolated' | 'current' | 'pinned' | 'background' | 'main';
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/automation/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/automation/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/channels/builtin/accounts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAEV,oBAAoB,EAEpB,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAE7D,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC;CAC9E;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,oBAAoB,CAAC,CA0R/B;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAKtC"}
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/channels/builtin/accounts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAEV,oBAAoB,EAEpB,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAE7D,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC;CAC9E;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,oBAAoB,CAAC,CAiT/B;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAKtC"}
@@ -100,6 +100,29 @@ export async function buildBuiltinAccount(context, surface) {
100
100
  },
101
101
  });
102
102
  }
103
+ case 'homeassistant': {
104
+ const surfaces = context.deps.configManager.getCategory('surfaces');
105
+ const secrets = await Promise.all([
106
+ describeBuiltinSecret(context.deps, 'primary', 'Long-lived access token', surfaces.homeassistant.accessToken, ['HOMEASSISTANT_ACCESS_TOKEN', 'HOME_ASSISTANT_ACCESS_TOKEN', 'HA_ACCESS_TOKEN'], 'homeassistant', 'primary'),
107
+ describeBuiltinSecret(context.deps, 'webhookSecret', 'Webhook secret', surfaces.homeassistant.webhookSecret, ['HOMEASSISTANT_WEBHOOK_SECRET', 'HOME_ASSISTANT_WEBHOOK_SECRET', 'HA_GOODVIBES_WEBHOOK_SECRET'], 'homeassistant', 'signingSecret'),
108
+ ]);
109
+ return finalizeBuiltinChannelAccount({
110
+ surface,
111
+ label: 'Home Assistant',
112
+ enabled: context.deps.surfaceDeliveryEnabled('homeassistant'),
113
+ accountId: surfaces.homeassistant.deviceId || surfaces.homeassistant.defaultConversationId || 'surface:homeassistant',
114
+ secrets,
115
+ metadata: {
116
+ instanceUrl: surfaces.homeassistant.instanceUrl,
117
+ defaultConversationId: surfaces.homeassistant.defaultConversationId,
118
+ deviceId: surfaces.homeassistant.deviceId,
119
+ deviceName: surfaces.homeassistant.deviceName,
120
+ eventType: surfaces.homeassistant.eventType,
121
+ remoteSessionTtlMs: surfaces.homeassistant.remoteSessionTtlMs,
122
+ setupVersion: surfaces.homeassistant.setupVersion,
123
+ },
124
+ });
125
+ }
103
126
  case 'telegram': {
104
127
  const surfaces = context.deps.configManager.getCategory('surfaces');
105
128
  const secrets = await Promise.all([
@@ -1 +1 @@
1
- {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/channels/builtin/contracts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EACV,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAK1B,mBAAmB,EAGnB,qBAAqB,EAErB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,2BAA2B,EAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAEL,KAAK,yBAAyB,EAE/B,MAAM,aAAa,CAAC;AAIrB,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAC7C,QAAQ,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClF,QAAQ,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IAC9G,QAAQ,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;CAClI;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,cAAc,GACtB,IAAI,CACL,aAAa,EACX,cAAc,GACd,cAAc,GACd,gBAAgB,GAChB,QAAQ,GACR,mBAAmB,GACnB,mBAAmB,GACnB,kBAAkB,GAClB,kBAAkB,GAClB,eAAe,CAClB,CAYA;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,cAAc,EACvB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC,CA6BzC;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,cAAc,EACvB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,CAAC,CAuG9B;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,cAAc,EACvB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,CAAC,CA6BhC;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,cAAc,EACvB,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,qBAAqB,CAAC,CAgBhC;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,0BAA0B,CAAC,CAsCrC;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,0BAA0B,CAAC,CAoDrC"}
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/channels/builtin/contracts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EACV,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAK1B,mBAAmB,EAGnB,qBAAqB,EAErB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,2BAA2B,EAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAEL,KAAK,yBAAyB,EAE/B,MAAM,aAAa,CAAC;AAIrB,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAC7C,QAAQ,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClF,QAAQ,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IAC9G,QAAQ,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;CAClI;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,cAAc,GACtB,IAAI,CACL,aAAa,EACX,cAAc,GACd,cAAc,GACd,gBAAgB,GAChB,QAAQ,GACR,mBAAmB,GACnB,mBAAmB,GACnB,kBAAkB,GAClB,kBAAkB,GAClB,eAAe,CAClB,CAYA;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,cAAc,EACvB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC,CA6BzC;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,cAAc,EACvB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,CAAC,CAgH9B;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,cAAc,EACvB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,CAAC,CA6BhC;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,cAAc,EACvB,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,qBAAqB,CAAC,CAgBhC;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,0BAA0B,CAAC,CAsCrC;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,0BAA0B,CAAC,CAoDrC"}
@@ -101,6 +101,15 @@ export async function getBuiltinDoctorReport(context, surface, accountId) {
101
101
  if (surface === 'matrix' && !surfaces.matrix.homeserverUrl) {
102
102
  pushCheck('homeserver-url', 'Homeserver URL', 'fail', 'Matrix requires a homeserver URL.', 'setup');
103
103
  }
104
+ if (surface === 'homeassistant' && !surfaces.homeassistant.webhookSecret) {
105
+ pushCheck('webhook-secret', 'Webhook secret', 'fail', 'Home Assistant ingress requires a webhook secret because webhook routes are evaluated before daemon bearer auth.', 'setup');
106
+ }
107
+ if (surface === 'homeassistant' && !surfaces.homeassistant.instanceUrl) {
108
+ pushCheck('instance-url', 'Instance URL', 'warn', 'Home Assistant REST-backed tools require an instance URL; daemon-only prompt ingress can work without one.', 'setup');
109
+ }
110
+ if (surface === 'homeassistant' && !surfaces.homeassistant.accessToken) {
111
+ pushCheck('access-token', 'Long-lived access token', 'warn', 'Home Assistant state, service, template, and event-delivery tools require an access token.', 'setup');
112
+ }
104
113
  const failures = checks.filter((check) => check.status === 'fail').length;
105
114
  const warnings = checks.filter((check) => check.status === 'warn').length;
106
115
  const summary = failures > 0
@@ -1 +1 @@
1
- {"version":3,"file":"descriptors.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/channels/builtin/descriptors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,2BAA2B,EAC3B,+BAA+B,EAC/B,cAAc,EACd,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAErB,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,oBAAoB,EAC7B,eAAe,EAAE,SAAS,iBAAiB,EAAE,GAC5C,2BAA2B,EAAE,CAiH/B;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,cAAc,GAAG,+BAA+B,EAAE,CAqOrG;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,qBAAqB,EAAE,CA6NjF"}
1
+ {"version":3,"file":"descriptors.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/channels/builtin/descriptors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,2BAA2B,EAC3B,+BAA+B,EAC/B,cAAc,EACd,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAOrB,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,oBAAoB,EAC7B,eAAe,EAAE,SAAS,iBAAiB,EAAE,GAC5C,2BAA2B,EAAE,CAiH/B;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,cAAc,GAAG,+BAA+B,EAAE,CAwOrG;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,qBAAqB,EAAE,CAgOjF"}
@@ -1,3 +1,4 @@
1
+ import { HOME_ASSISTANT_SURFACE, listHomeAssistantOperatorActions, listHomeAssistantTools, } from './homeassistant.js';
1
2
  export function listBuiltinCapabilities(surface, account, rawCapabilities) {
2
3
  const supports = (capability) => rawCapabilities.includes(capability);
3
4
  return [
@@ -113,7 +114,7 @@ export function listBuiltinCapabilities(surface, account, rawCapabilities) {
113
114
  ];
114
115
  }
115
116
  export function listBuiltinOperatorActions(surface) {
116
- return [
117
+ const actions = [
117
118
  {
118
119
  id: 'inspect-account',
119
120
  surface,
@@ -341,9 +342,12 @@ export function listBuiltinOperatorActions(surface) {
341
342
  metadata: {},
342
343
  },
343
344
  ];
345
+ return surface === HOME_ASSISTANT_SURFACE
346
+ ? [...actions, ...listHomeAssistantOperatorActions()]
347
+ : actions;
344
348
  }
345
349
  export function listBuiltinTools(surface) {
346
- return [
350
+ const tools = [
347
351
  {
348
352
  id: `${surface}:account`,
349
353
  surface,
@@ -563,4 +567,7 @@ export function listBuiltinTools(surface) {
563
567
  metadata: {},
564
568
  },
565
569
  ];
570
+ return surface === HOME_ASSISTANT_SURFACE
571
+ ? [...tools, ...listHomeAssistantTools()]
572
+ : tools;
566
573
  }
@@ -0,0 +1,64 @@
1
+ import type { SecretsManager } from '../../config/secrets.js';
2
+ import type { ServiceRegistry } from '../../config/service-registry.js';
3
+ import { HomeAssistantIntegration } from '../../integrations/homeassistant.js';
4
+ import type { ChannelOperatorActionDescriptor, ChannelToolDescriptor } from '../types.js';
5
+ import type { BuiltinChannelRuntimeDeps } from './shared.js';
6
+ export declare const HOME_ASSISTANT_SURFACE: "homeassistant";
7
+ export declare const HOME_ASSISTANT_WEBHOOK_PATH = "/webhook/homeassistant";
8
+ export declare const HOME_ASSISTANT_DEFAULT_EVENT_TYPE = "goodvibes_message";
9
+ interface ConfigReader {
10
+ get(key: string): unknown;
11
+ }
12
+ interface HomeAssistantActionContext {
13
+ readonly deps: BuiltinChannelRuntimeDeps;
14
+ }
15
+ export interface HomeAssistantSurfaceManifest {
16
+ readonly protocolVersion: number;
17
+ readonly surface: 'homeassistant';
18
+ readonly label: string;
19
+ readonly device: {
20
+ readonly identifiers: readonly string[];
21
+ readonly manufacturer: string;
22
+ readonly model: string;
23
+ readonly name: string;
24
+ readonly swVersion?: string;
25
+ };
26
+ readonly daemon: {
27
+ readonly baseUrl: string;
28
+ readonly auth: 'bearer';
29
+ readonly endpoints: Record<string, string>;
30
+ };
31
+ readonly capabilities: readonly string[];
32
+ readonly events: {
33
+ readonly outboundEventType: string;
34
+ readonly inboundWebhookPath: string;
35
+ readonly inboundSecretHeaders: readonly string[];
36
+ };
37
+ readonly recommendedServices: readonly {
38
+ readonly name: string;
39
+ readonly target: 'config_entry' | 'device' | 'entity';
40
+ readonly description: string;
41
+ }[];
42
+ readonly metadata: Record<string, unknown>;
43
+ }
44
+ export declare function listHomeAssistantOperatorActions(): ChannelOperatorActionDescriptor[];
45
+ export declare function listHomeAssistantTools(): ChannelToolDescriptor[];
46
+ export declare function runHomeAssistantOperatorAction(context: HomeAssistantActionContext, actionId: string, input?: Record<string, unknown>): Promise<{
47
+ readonly handled: boolean;
48
+ readonly result: unknown;
49
+ }>;
50
+ export declare function buildHomeAssistantManifest(deps: Pick<BuiltinChannelRuntimeDeps, 'configManager'>): HomeAssistantSurfaceManifest;
51
+ export declare function createHomeAssistantClient(deps: BuiltinChannelRuntimeDeps): Promise<HomeAssistantIntegration>;
52
+ export declare function resolveHomeAssistantBaseUrl(configManager: ConfigReader, serviceRegistry?: Pick<ServiceRegistry, 'get'>): string | null;
53
+ export declare function resolveHomeAssistantAccessToken(deps: {
54
+ readonly configManager: ConfigReader;
55
+ readonly secretsManager?: Pick<SecretsManager, 'get' | 'getGlobalHome'>;
56
+ readonly serviceRegistry?: Pick<ServiceRegistry, 'resolveSecret'>;
57
+ }): Promise<string | null>;
58
+ export declare function resolveHomeAssistantWebhookSecret(deps: {
59
+ readonly configManager: ConfigReader;
60
+ readonly secretsManager?: Pick<SecretsManager, 'get' | 'getGlobalHome'>;
61
+ readonly serviceRegistry?: Pick<ServiceRegistry, 'resolveSecret'>;
62
+ }): Promise<string | null>;
63
+ export {};
64
+ //# sourceMappingURL=homeassistant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homeassistant.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/channels/builtin/homeassistant.ts"],"names":[],"mappings":"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"}