@coffeerunhobby/mcp-ha-connect 0.5.0

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 (294) hide show
  1. package/.dockerignore +8 -0
  2. package/.env.example +149 -0
  3. package/.gitattributes +30 -0
  4. package/Dockerfile +33 -0
  5. package/LICENSE +21 -0
  6. package/README.md +394 -0
  7. package/dist/config.d.ts +33 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +183 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/haClient/automations.d.ts +67 -0
  12. package/dist/haClient/automations.d.ts.map +1 -0
  13. package/dist/haClient/automations.js +181 -0
  14. package/dist/haClient/automations.js.map +1 -0
  15. package/dist/haClient/config.d.ts +28 -0
  16. package/dist/haClient/config.d.ts.map +1 -0
  17. package/dist/haClient/config.js +38 -0
  18. package/dist/haClient/config.js.map +1 -0
  19. package/dist/haClient/devices.d.ts +219 -0
  20. package/dist/haClient/devices.d.ts.map +1 -0
  21. package/dist/haClient/devices.js +506 -0
  22. package/dist/haClient/devices.js.map +1 -0
  23. package/dist/haClient/entities.d.ts +35 -0
  24. package/dist/haClient/entities.d.ts.map +1 -0
  25. package/dist/haClient/entities.js +97 -0
  26. package/dist/haClient/entities.js.map +1 -0
  27. package/dist/haClient/events.d.ts +138 -0
  28. package/dist/haClient/events.d.ts.map +1 -0
  29. package/dist/haClient/events.js +344 -0
  30. package/dist/haClient/events.js.map +1 -0
  31. package/dist/haClient/history.d.ts +26 -0
  32. package/dist/haClient/history.d.ts.map +1 -0
  33. package/dist/haClient/history.js +54 -0
  34. package/dist/haClient/history.js.map +1 -0
  35. package/dist/haClient/index.d.ts +153 -0
  36. package/dist/haClient/index.d.ts.map +1 -0
  37. package/dist/haClient/index.js +223 -0
  38. package/dist/haClient/index.js.map +1 -0
  39. package/dist/haClient/request.d.ts +34 -0
  40. package/dist/haClient/request.d.ts.map +1 -0
  41. package/dist/haClient/request.js +93 -0
  42. package/dist/haClient/request.js.map +1 -0
  43. package/dist/haClient/services.d.ts +22 -0
  44. package/dist/haClient/services.d.ts.map +1 -0
  45. package/dist/haClient/services.js +39 -0
  46. package/dist/haClient/services.js.map +1 -0
  47. package/dist/haClient/states.d.ts +26 -0
  48. package/dist/haClient/states.d.ts.map +1 -0
  49. package/dist/haClient/states.js +53 -0
  50. package/dist/haClient/states.js.map +1 -0
  51. package/dist/haClient/updates.d.ts +22 -0
  52. package/dist/haClient/updates.d.ts.map +1 -0
  53. package/dist/haClient/updates.js +48 -0
  54. package/dist/haClient/updates.js.map +1 -0
  55. package/dist/haClient.d.ts +97 -0
  56. package/dist/haClient.d.ts.map +1 -0
  57. package/dist/haClient.js +344 -0
  58. package/dist/haClient.js.map +1 -0
  59. package/dist/index.d.ts +8 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +92 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/localAI/index.d.ts +37 -0
  64. package/dist/localAI/index.d.ts.map +1 -0
  65. package/dist/localAI/index.js +73 -0
  66. package/dist/localAI/index.js.map +1 -0
  67. package/dist/localAI/prompts.d.ts +20 -0
  68. package/dist/localAI/prompts.d.ts.map +1 -0
  69. package/dist/localAI/prompts.js +48 -0
  70. package/dist/localAI/prompts.js.map +1 -0
  71. package/dist/localAI/providers/base.d.ts +51 -0
  72. package/dist/localAI/providers/base.d.ts.map +1 -0
  73. package/dist/localAI/providers/base.js +80 -0
  74. package/dist/localAI/providers/base.js.map +1 -0
  75. package/dist/localAI/providers/ollama.d.ts +22 -0
  76. package/dist/localAI/providers/ollama.d.ts.map +1 -0
  77. package/dist/localAI/providers/ollama.js +63 -0
  78. package/dist/localAI/providers/ollama.js.map +1 -0
  79. package/dist/localAI/providers/openai.d.ts +23 -0
  80. package/dist/localAI/providers/openai.d.ts.map +1 -0
  81. package/dist/localAI/providers/openai.js +63 -0
  82. package/dist/localAI/providers/openai.js.map +1 -0
  83. package/dist/localAI/types.d.ts +61 -0
  84. package/dist/localAI/types.d.ts.map +1 -0
  85. package/dist/localAI/types.js +6 -0
  86. package/dist/localAI/types.js.map +1 -0
  87. package/dist/ollamaClient.d.ts +37 -0
  88. package/dist/ollamaClient.d.ts.map +1 -0
  89. package/dist/ollamaClient.js +110 -0
  90. package/dist/ollamaClient.js.map +1 -0
  91. package/dist/resources/index.d.ts +11 -0
  92. package/dist/resources/index.d.ts.map +1 -0
  93. package/dist/resources/index.js +238 -0
  94. package/dist/resources/index.js.map +1 -0
  95. package/dist/server/common.d.ts +9 -0
  96. package/dist/server/common.d.ts.map +1 -0
  97. package/dist/server/common.js +27 -0
  98. package/dist/server/common.js.map +1 -0
  99. package/dist/server/eventSubscription.d.ts +53 -0
  100. package/dist/server/eventSubscription.d.ts.map +1 -0
  101. package/dist/server/eventSubscription.js +257 -0
  102. package/dist/server/eventSubscription.js.map +1 -0
  103. package/dist/server/http.d.ts +12 -0
  104. package/dist/server/http.d.ts.map +1 -0
  105. package/dist/server/http.js +491 -0
  106. package/dist/server/http.js.map +1 -0
  107. package/dist/server/rateLimiter.d.ts +70 -0
  108. package/dist/server/rateLimiter.d.ts.map +1 -0
  109. package/dist/server/rateLimiter.js +156 -0
  110. package/dist/server/rateLimiter.js.map +1 -0
  111. package/dist/server/sse.d.ts +32 -0
  112. package/dist/server/sse.d.ts.map +1 -0
  113. package/dist/server/sse.js +76 -0
  114. package/dist/server/sse.js.map +1 -0
  115. package/dist/server/stdio.d.ts +8 -0
  116. package/dist/server/stdio.d.ts.map +1 -0
  117. package/dist/server/stdio.js +16 -0
  118. package/dist/server/stdio.js.map +1 -0
  119. package/dist/server/stream.d.ts +26 -0
  120. package/dist/server/stream.d.ts.map +1 -0
  121. package/dist/server/stream.js +81 -0
  122. package/dist/server/stream.js.map +1 -0
  123. package/dist/server.d.ts +8 -0
  124. package/dist/server.d.ts.map +1 -0
  125. package/dist/server.js +30 -0
  126. package/dist/server.js.map +1 -0
  127. package/dist/tools/callService.d.ts +8 -0
  128. package/dist/tools/callService.d.ts.map +1 -0
  129. package/dist/tools/callService.js +100 -0
  130. package/dist/tools/callService.js.map +1 -0
  131. package/dist/tools/getClient.d.ts +8 -0
  132. package/dist/tools/getClient.d.ts.map +1 -0
  133. package/dist/tools/getClient.js +94 -0
  134. package/dist/tools/getClient.js.map +1 -0
  135. package/dist/tools/getDevice.d.ts +8 -0
  136. package/dist/tools/getDevice.d.ts.map +1 -0
  137. package/dist/tools/getDevice.js +94 -0
  138. package/dist/tools/getDevice.js.map +1 -0
  139. package/dist/tools/getEntitiesByDomain.d.ts +8 -0
  140. package/dist/tools/getEntitiesByDomain.d.ts.map +1 -0
  141. package/dist/tools/getEntitiesByDomain.js +80 -0
  142. package/dist/tools/getEntitiesByDomain.js.map +1 -0
  143. package/dist/tools/getState.d.ts +8 -0
  144. package/dist/tools/getState.d.ts.map +1 -0
  145. package/dist/tools/getState.js +90 -0
  146. package/dist/tools/getState.js.map +1 -0
  147. package/dist/tools/getStates.d.ts +8 -0
  148. package/dist/tools/getStates.d.ts.map +1 -0
  149. package/dist/tools/getStates.js +70 -0
  150. package/dist/tools/getStates.js.map +1 -0
  151. package/dist/tools/index.d.ts +9 -0
  152. package/dist/tools/index.d.ts.map +1 -0
  153. package/dist/tools/index.js +9 -0
  154. package/dist/tools/index.js.map +1 -0
  155. package/dist/tools/listClients.d.ts +8 -0
  156. package/dist/tools/listClients.d.ts.map +1 -0
  157. package/dist/tools/listClients.js +73 -0
  158. package/dist/tools/listClients.js.map +1 -0
  159. package/dist/tools/listDevices.d.ts +8 -0
  160. package/dist/tools/listDevices.d.ts.map +1 -0
  161. package/dist/tools/listDevices.js +73 -0
  162. package/dist/tools/listDevices.js.map +1 -0
  163. package/dist/tools/listSites.d.ts +8 -0
  164. package/dist/tools/listSites.d.ts.map +1 -0
  165. package/dist/tools/listSites.js +67 -0
  166. package/dist/tools/listSites.js.map +1 -0
  167. package/dist/tools/registry.d.ts +9 -0
  168. package/dist/tools/registry.d.ts.map +1 -0
  169. package/dist/tools/registry.js +1382 -0
  170. package/dist/tools/registry.js.map +1 -0
  171. package/dist/tools/searchDevices.d.ts +8 -0
  172. package/dist/tools/searchDevices.d.ts.map +1 -0
  173. package/dist/tools/searchDevices.js +84 -0
  174. package/dist/tools/searchDevices.js.map +1 -0
  175. package/dist/tools/searchEntities.d.ts +8 -0
  176. package/dist/tools/searchEntities.d.ts.map +1 -0
  177. package/dist/tools/searchEntities.js +80 -0
  178. package/dist/tools/searchEntities.js.map +1 -0
  179. package/dist/types/entity.d.ts +98 -0
  180. package/dist/types/entity.d.ts.map +1 -0
  181. package/dist/types/entity.js +2 -0
  182. package/dist/types/entity.js.map +1 -0
  183. package/dist/types/errors.d.ts +16 -0
  184. package/dist/types/errors.d.ts.map +1 -0
  185. package/dist/types/errors.js +32 -0
  186. package/dist/types/errors.js.map +1 -0
  187. package/dist/types/haConfig.d.ts +8 -0
  188. package/dist/types/haConfig.d.ts.map +1 -0
  189. package/dist/types/haConfig.js +2 -0
  190. package/dist/types/haConfig.js.map +1 -0
  191. package/dist/types/index.d.ts +6 -0
  192. package/dist/types/index.d.ts.map +1 -0
  193. package/dist/types/index.js +2 -0
  194. package/dist/types/index.js.map +1 -0
  195. package/dist/types/request.d.ts +7 -0
  196. package/dist/types/request.d.ts.map +1 -0
  197. package/dist/types/request.js +2 -0
  198. package/dist/types/request.js.map +1 -0
  199. package/dist/types/serviceCall.d.ts +18 -0
  200. package/dist/types/serviceCall.d.ts.map +1 -0
  201. package/dist/types/serviceCall.js +2 -0
  202. package/dist/types/serviceCall.js.map +1 -0
  203. package/dist/types.d.ts +2 -0
  204. package/dist/types.d.ts.map +1 -0
  205. package/dist/types.js +3 -0
  206. package/dist/types.js.map +1 -0
  207. package/dist/utils/config-validations.d.ts +12 -0
  208. package/dist/utils/config-validations.d.ts.map +1 -0
  209. package/dist/utils/config-validations.js +43 -0
  210. package/dist/utils/config-validations.js.map +1 -0
  211. package/dist/utils/logger.d.ts +24 -0
  212. package/dist/utils/logger.d.ts.map +1 -0
  213. package/dist/utils/logger.js +94 -0
  214. package/dist/utils/logger.js.map +1 -0
  215. package/dist/wrapper.d.ts +8 -0
  216. package/dist/wrapper.d.ts.map +1 -0
  217. package/dist/wrapper.js +301 -0
  218. package/dist/wrapper.js.map +1 -0
  219. package/docker-compose.yml +17 -0
  220. package/docs/CHANGELOG.md +86 -0
  221. package/docs/LOCAL_CLIENT.md +268 -0
  222. package/docs/SSE_API.md +341 -0
  223. package/eslint.config.js +33 -0
  224. package/n8n/ai-agent-safety-monitor.json +355 -0
  225. package/openapi.json +166 -0
  226. package/package.json +51 -0
  227. package/src/config.ts +260 -0
  228. package/src/haClient/automations.ts +217 -0
  229. package/src/haClient/config.ts +41 -0
  230. package/src/haClient/devices.ts +653 -0
  231. package/src/haClient/entities.ts +128 -0
  232. package/src/haClient/events.ts +456 -0
  233. package/src/haClient/history.ts +68 -0
  234. package/src/haClient/index.ts +287 -0
  235. package/src/haClient/request.ts +127 -0
  236. package/src/haClient/services.ts +45 -0
  237. package/src/haClient/states.ts +60 -0
  238. package/src/haClient/updates.ts +58 -0
  239. package/src/index.ts +99 -0
  240. package/src/localAI/index.ts +88 -0
  241. package/src/localAI/prompts.ts +50 -0
  242. package/src/localAI/providers/base.ts +120 -0
  243. package/src/localAI/providers/ollama.ts +78 -0
  244. package/src/localAI/providers/openai.ts +86 -0
  245. package/src/localAI/types.ts +67 -0
  246. package/src/resources/index.ts +266 -0
  247. package/src/server/common.ts +38 -0
  248. package/src/server/eventSubscription.ts +318 -0
  249. package/src/server/http.ts +546 -0
  250. package/src/server/rateLimiter.ts +195 -0
  251. package/src/server/sse.ts +120 -0
  252. package/src/server/stdio.ts +22 -0
  253. package/src/server/stream.ts +113 -0
  254. package/src/tools/callService.ts +114 -0
  255. package/src/tools/getEntitiesByDomain.ts +92 -0
  256. package/src/tools/getState.ts +103 -0
  257. package/src/tools/getStates.ts +80 -0
  258. package/src/tools/index.ts +9 -0
  259. package/src/tools/registry.ts +1521 -0
  260. package/src/tools/searchEntities.ts +92 -0
  261. package/src/types/entity.ts +110 -0
  262. package/src/types/errors.ts +33 -0
  263. package/src/types/haConfig.ts +7 -0
  264. package/src/types/index.ts +5 -0
  265. package/src/types/request.ts +6 -0
  266. package/src/types/serviceCall.ts +18 -0
  267. package/src/types.ts +2 -0
  268. package/src/utils/config-validations.ts +46 -0
  269. package/src/utils/logger.ts +114 -0
  270. package/src/wrapper.ts +340 -0
  271. package/tests/config.test.ts +332 -0
  272. package/tests/haClient/automations.test.ts +133 -0
  273. package/tests/haClient/config.test.ts +96 -0
  274. package/tests/haClient/entities.test.ts +188 -0
  275. package/tests/haClient/history.test.ts +170 -0
  276. package/tests/haClient/index.test.ts +221 -0
  277. package/tests/haClient/request.test.ts +217 -0
  278. package/tests/haClient/services.test.ts +120 -0
  279. package/tests/haClient/states.test.ts +119 -0
  280. package/tests/haClient/updates.test.ts +193 -0
  281. package/tests/index.test.ts +164 -0
  282. package/tests/localAI/index.test.ts +168 -0
  283. package/tests/localAI/ollama.test.ts +187 -0
  284. package/tests/localAI/openai.test.ts +257 -0
  285. package/tests/server/common.test.ts +64 -0
  286. package/tests/server/http.test.ts +326 -0
  287. package/tests/server/sse.test.ts +240 -0
  288. package/tests/server/stdio.test.ts +102 -0
  289. package/tests/server/stream.test.ts +287 -0
  290. package/tests/tools/registry.test.ts +355 -0
  291. package/tests/utils/config-validations.test.ts +289 -0
  292. package/tests/utils/logger.test.ts +327 -0
  293. package/tsconfig.json +25 -0
  294. package/vitest.config.ts +26 -0
package/dist/config.js ADDED
@@ -0,0 +1,183 @@
1
+ import { z } from 'zod';
2
+ import { isValidBindAddress, isValidOrigin } from './utils/config-validations.js';
3
+ import { logger } from './utils/logger.js';
4
+ const createBooleanStringSchema = (defaultValue) => z
5
+ .union([z.literal('true'), z.literal('false')])
6
+ .optional()
7
+ .transform((value) => {
8
+ if (value === undefined)
9
+ return defaultValue;
10
+ return value === 'true';
11
+ });
12
+ const numericStringSchema = z
13
+ .string()
14
+ .optional()
15
+ .transform((value) => (value ? Number.parseInt(value, 10) : undefined))
16
+ .pipe(z.number().positive().optional());
17
+ const listStringSchema = z
18
+ .string()
19
+ .optional()
20
+ .transform((value) => value
21
+ ? value
22
+ .split(',')
23
+ .map((s) => s.trim())
24
+ .filter(Boolean)
25
+ : undefined);
26
+ const envSchema = z
27
+ .object({
28
+ // Home Assistant Client Configuration
29
+ haUrl: z.string().url({ message: 'HA_URL must be a valid URL' }),
30
+ haToken: z.string().min(1, 'HA_TOKEN is required'),
31
+ haStrictSsl: createBooleanStringSchema(true),
32
+ haTimeout: numericStringSchema,
33
+ // AI Provider Configuration (use 'none' to disable AI features)
34
+ aiProvider: z.enum(['ollama', 'openai', 'none']).optional(),
35
+ aiUrl: z.string().url().optional(),
36
+ aiModel: z.string().optional(),
37
+ aiTimeout: numericStringSchema,
38
+ aiApiKey: z.string().optional(),
39
+ // MCP Generic Server Configuration
40
+ logLevel: z.enum(['debug', 'info', 'warn', 'error']).optional().default('info'),
41
+ logFormat: z.enum(['plain', 'json', 'gcp-json']).optional().default('plain'),
42
+ useHttp: createBooleanStringSchema(false),
43
+ stateful: createBooleanStringSchema(false),
44
+ // MCP Server HTTP Configuration
45
+ httpPort: numericStringSchema,
46
+ httpTransport: z.enum(['stream', 'sse']).optional().default('stream'),
47
+ httpBindAddr: z.string().optional(),
48
+ httpPath: z.string().optional(),
49
+ httpEnableHealthcheck: createBooleanStringSchema(true),
50
+ httpHealthcheckPath: z.string().optional(),
51
+ httpAllowCors: createBooleanStringSchema(true),
52
+ httpAllowedOrigins: listStringSchema,
53
+ // SSE Event Subscription Configuration
54
+ sseEventsEnabled: createBooleanStringSchema(true),
55
+ sseEventsPath: z.string().optional(),
56
+ // Rate Limiting Configuration
57
+ rateLimitEnabled: createBooleanStringSchema(true),
58
+ rateLimitWindowMs: numericStringSchema,
59
+ rateLimitMaxRequests: numericStringSchema,
60
+ })
61
+ .refine((data) => {
62
+ // Validate httpBindAddr if provided
63
+ if (data.httpBindAddr && !isValidBindAddress(data.httpBindAddr)) {
64
+ return false;
65
+ }
66
+ return true;
67
+ }, {
68
+ message: 'MCP_HTTP_BIND_ADDR must be a valid IPv4 or IPv6 address',
69
+ path: ['httpBindAddr'],
70
+ })
71
+ .refine((data) => {
72
+ // Validate httpAllowedOrigins if provided
73
+ if (data.httpAllowedOrigins) {
74
+ for (const origin of data.httpAllowedOrigins) {
75
+ if (!isValidOrigin(origin)) {
76
+ return false;
77
+ }
78
+ }
79
+ }
80
+ return true;
81
+ }, (data) => {
82
+ const invalidOrigin = data.httpAllowedOrigins?.find((origin) => !isValidOrigin(origin));
83
+ return {
84
+ message: `MCP_HTTP_ALLOWED_ORIGINS contains invalid origin: ${invalidOrigin}`,
85
+ path: ['httpAllowedOrigins'],
86
+ };
87
+ });
88
+ export function loadConfig(env = process.env) {
89
+ const parsed = envSchema.safeParse({
90
+ // Home Assistant Client Configuration
91
+ haUrl: env.HA_URL,
92
+ haToken: env.HA_TOKEN,
93
+ haStrictSsl: env.HA_STRICT_SSL,
94
+ haTimeout: env.HA_TIMEOUT,
95
+ // AI Provider Configuration
96
+ aiProvider: env.AI_PROVIDER,
97
+ aiUrl: env.AI_URL,
98
+ aiModel: env.AI_MODEL,
99
+ aiTimeout: env.AI_TIMEOUT,
100
+ aiApiKey: env.AI_API_KEY,
101
+ // MCP Generic Server Configuration
102
+ logLevel: env.MCP_SERVER_LOG_LEVEL,
103
+ logFormat: env.MCP_SERVER_LOG_FORMAT,
104
+ useHttp: env.MCP_SERVER_USE_HTTP,
105
+ stateful: env.MCP_SERVER_STATEFUL,
106
+ // MCP Server HTTP Configuration
107
+ httpPort: env.MCP_HTTP_PORT,
108
+ httpTransport: env.MCP_HTTP_TRANSPORT,
109
+ httpBindAddr: env.MCP_HTTP_BIND_ADDR,
110
+ httpPath: env.MCP_HTTP_PATH,
111
+ httpEnableHealthcheck: env.MCP_HTTP_ENABLE_HEALTHCHECK,
112
+ httpHealthcheckPath: env.MCP_HTTP_HEALTHCHECK_PATH,
113
+ httpAllowCors: env.MCP_HTTP_ALLOW_CORS,
114
+ httpAllowedOrigins: env.MCP_HTTP_ALLOWED_ORIGINS,
115
+ // SSE Event Subscription Configuration
116
+ sseEventsEnabled: env.MCP_SSE_EVENTS_ENABLED,
117
+ sseEventsPath: env.MCP_SSE_EVENTS_PATH,
118
+ // Rate Limiting Configuration
119
+ rateLimitEnabled: env.MCP_RATE_LIMIT_ENABLED,
120
+ rateLimitWindowMs: env.MCP_RATE_LIMIT_WINDOW_MS,
121
+ rateLimitMaxRequests: env.MCP_RATE_LIMIT_MAX_REQUESTS,
122
+ });
123
+ if (!parsed.success) {
124
+ const messages = parsed.error.issues.map((issue) => issue.message);
125
+ throw new Error(`Invalid environment configuration:\n${messages.join('\n')}`);
126
+ }
127
+ // Determine default httpPath based on transport if not explicitly set
128
+ const defaultPath = parsed.data.httpTransport === 'sse' ? '/sse' : '/mcp';
129
+ const httpPath = parsed.data.httpPath ?? defaultPath;
130
+ // Set default bind address and allowed origins for security
131
+ const httpBindAddr = parsed.data.httpBindAddr ?? '127.0.0.1';
132
+ let httpAllowedOrigins = parsed.data.httpAllowedOrigins ?? ['127.0.0.1', 'localhost'];
133
+ // If wildcard is present, use empty array to disable SDK origin validation
134
+ if (httpAllowedOrigins.includes('*')) {
135
+ logger.warn('Wildcard (*) origin allowed - origin validation is disabled. This should only be used in development.');
136
+ httpAllowedOrigins = [];
137
+ }
138
+ return {
139
+ // Home Assistant Client Configuration
140
+ baseUrl: parsed.data.haUrl.replace(/\/$/, ''),
141
+ token: parsed.data.haToken,
142
+ strictSsl: parsed.data.haStrictSsl,
143
+ timeout: parsed.data.haTimeout ?? 30000,
144
+ // AI Provider Configuration
145
+ aiProvider: (parsed.data.aiProvider ?? 'ollama'),
146
+ aiUrl: parsed.data.aiUrl ?? 'http://localhost:11434',
147
+ aiModel: parsed.data.aiModel ?? 'qwen3:14b',
148
+ aiTimeout: parsed.data.aiTimeout ?? 60000,
149
+ aiApiKey: parsed.data.aiApiKey,
150
+ // MCP Generic Server Configuration
151
+ logLevel: parsed.data.logLevel,
152
+ logFormat: parsed.data.logFormat,
153
+ useHttp: parsed.data.useHttp,
154
+ stateful: parsed.data.stateful,
155
+ // MCP Server HTTP Configuration
156
+ httpPort: parsed.data.httpPort,
157
+ httpTransport: parsed.data.httpTransport,
158
+ httpBindAddr,
159
+ httpPath,
160
+ httpEnableHealthcheck: parsed.data.httpEnableHealthcheck,
161
+ httpHealthcheckPath: parsed.data.httpHealthcheckPath,
162
+ httpAllowCors: parsed.data.httpAllowCors,
163
+ httpAllowedOrigins,
164
+ // SSE Event Subscription Configuration
165
+ sseEventsEnabled: parsed.data.sseEventsEnabled,
166
+ sseEventsPath: parsed.data.sseEventsPath ?? '/subscribe_events',
167
+ // Rate Limiting Configuration
168
+ rateLimitEnabled: parsed.data.rateLimitEnabled,
169
+ rateLimitWindowMs: parsed.data.rateLimitWindowMs ?? 60000,
170
+ rateLimitMaxRequests: parsed.data.rateLimitMaxRequests ?? 100,
171
+ };
172
+ }
173
+ // Legacy compatibility functions
174
+ export function validateConfig(config) {
175
+ // Config is already validated by Zod, this is for compatibility
176
+ if (!config.baseUrl || !config.token) {
177
+ throw new Error('Invalid configuration: missing baseUrl or token');
178
+ }
179
+ }
180
+ export function loadConfigFromEnv() {
181
+ return loadConfig();
182
+ }
183
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Automation Operations for Home Assistant API
3
+ * Handles automation listing and management
4
+ */
5
+ import type { Automation, AutomationConfig, ServiceCallResponse } from '../types/index.js';
6
+ import type { StateOperations } from './states.js';
7
+ import type { ServiceOperations } from './services.js';
8
+ import type { RequestHandler } from './request.js';
9
+ /**
10
+ * Automation-related operations for the Home Assistant API.
11
+ */
12
+ export declare class AutomationOperations {
13
+ private readonly stateOps;
14
+ private readonly serviceOps?;
15
+ private readonly request?;
16
+ constructor(stateOps: StateOperations, serviceOps?: ServiceOperations | undefined, request?: RequestHandler | undefined);
17
+ /**
18
+ * Get all automations
19
+ */
20
+ getAutomations(): Promise<Automation[]>;
21
+ /**
22
+ * Get a single automation by entity_id
23
+ */
24
+ getAutomation(entityId: string): Promise<Automation | null>;
25
+ /**
26
+ * Trigger an automation manually
27
+ */
28
+ triggerAutomation(entityId: string, variables?: Record<string, unknown>): Promise<ServiceCallResponse>;
29
+ /**
30
+ * Enable an automation
31
+ */
32
+ enableAutomation(entityId: string): Promise<ServiceCallResponse>;
33
+ /**
34
+ * Disable an automation
35
+ */
36
+ disableAutomation(entityId: string): Promise<ServiceCallResponse>;
37
+ /**
38
+ * Toggle an automation (enable if disabled, disable if enabled)
39
+ */
40
+ toggleAutomation(entityId: string): Promise<ServiceCallResponse>;
41
+ /**
42
+ * Reload all automations from configuration
43
+ */
44
+ reloadAutomations(): Promise<void>;
45
+ /**
46
+ * Create a new automation via the config API
47
+ * Note: Requires Home Assistant 2023.7+ with config flow support
48
+ */
49
+ createAutomation(config: AutomationConfig): Promise<{
50
+ id: string;
51
+ }>;
52
+ /**
53
+ * Update an existing automation
54
+ * Note: Requires the automation's unique_id from the automation registry
55
+ */
56
+ updateAutomation(automationId: string, config: Partial<AutomationConfig>): Promise<void>;
57
+ /**
58
+ * Delete an automation
59
+ * Note: Only works for automations created via the UI/API
60
+ */
61
+ deleteAutomation(automationId: string): Promise<void>;
62
+ /**
63
+ * Get automation trace (execution history)
64
+ */
65
+ getAutomationTrace(entityId: string): Promise<unknown[]>;
66
+ }
67
+ //# sourceMappingURL=automations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automations.d.ts","sourceRoot":"","sources":["../../src/haClient/automations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE3F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD;;GAEG;AACH,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAFR,QAAQ,EAAE,eAAe,EACzB,UAAU,CAAC,EAAE,iBAAiB,YAAA,EAC9B,OAAO,CAAC,EAAE,cAAc,YAAA;IAG3C;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAmB7C;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAkBjE;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAe5G;;OAEG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IActE;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAcvE;;OAEG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IActE;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAaxC;;;OAGG;IACG,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBzE;;;OAGG;IACG,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9F;;;OAGG;IACG,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3D;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAU/D"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Automation Operations for Home Assistant API
3
+ * Handles automation listing and management
4
+ */
5
+ import { logger } from '../utils/logger.js';
6
+ /**
7
+ * Automation-related operations for the Home Assistant API.
8
+ */
9
+ export class AutomationOperations {
10
+ stateOps;
11
+ serviceOps;
12
+ request;
13
+ constructor(stateOps, serviceOps, request) {
14
+ this.stateOps = stateOps;
15
+ this.serviceOps = serviceOps;
16
+ this.request = request;
17
+ }
18
+ /**
19
+ * Get all automations
20
+ */
21
+ async getAutomations() {
22
+ logger.debug('Fetching automations');
23
+ const allStates = await this.stateOps.getStates();
24
+ const automations = allStates
25
+ .filter(entity => entity.entity_id.startsWith('automation.'))
26
+ .map(entity => ({
27
+ id: entity.entity_id,
28
+ alias: String(entity.attributes.friendly_name || entity.entity_id.replace('automation.', '')),
29
+ state: entity.state,
30
+ last_triggered: entity.attributes.last_triggered,
31
+ description: entity.attributes.description,
32
+ mode: entity.attributes.mode,
33
+ }));
34
+ logger.info('Fetched automations', { count: automations.length });
35
+ return automations;
36
+ }
37
+ /**
38
+ * Get a single automation by entity_id
39
+ */
40
+ async getAutomation(entityId) {
41
+ logger.debug('Fetching automation', { entityId });
42
+ const state = await this.stateOps.getState(entityId);
43
+ if (!state || !entityId.startsWith('automation.')) {
44
+ return null;
45
+ }
46
+ return {
47
+ id: state.entity_id,
48
+ alias: String(state.attributes.friendly_name || state.entity_id.replace('automation.', '')),
49
+ state: state.state,
50
+ last_triggered: state.attributes.last_triggered,
51
+ description: state.attributes.description,
52
+ mode: state.attributes.mode,
53
+ };
54
+ }
55
+ /**
56
+ * Trigger an automation manually
57
+ */
58
+ async triggerAutomation(entityId, variables) {
59
+ if (!this.serviceOps) {
60
+ throw new Error('ServiceOperations not available');
61
+ }
62
+ logger.info('Triggering automation', { entityId, variables });
63
+ return this.serviceOps.callService({
64
+ domain: 'automation',
65
+ service: 'trigger',
66
+ target: { entity_id: entityId },
67
+ service_data: variables ? { variables } : undefined,
68
+ });
69
+ }
70
+ /**
71
+ * Enable an automation
72
+ */
73
+ async enableAutomation(entityId) {
74
+ if (!this.serviceOps) {
75
+ throw new Error('ServiceOperations not available');
76
+ }
77
+ logger.info('Enabling automation', { entityId });
78
+ return this.serviceOps.callService({
79
+ domain: 'automation',
80
+ service: 'turn_on',
81
+ target: { entity_id: entityId },
82
+ });
83
+ }
84
+ /**
85
+ * Disable an automation
86
+ */
87
+ async disableAutomation(entityId) {
88
+ if (!this.serviceOps) {
89
+ throw new Error('ServiceOperations not available');
90
+ }
91
+ logger.info('Disabling automation', { entityId });
92
+ return this.serviceOps.callService({
93
+ domain: 'automation',
94
+ service: 'turn_off',
95
+ target: { entity_id: entityId },
96
+ });
97
+ }
98
+ /**
99
+ * Toggle an automation (enable if disabled, disable if enabled)
100
+ */
101
+ async toggleAutomation(entityId) {
102
+ if (!this.serviceOps) {
103
+ throw new Error('ServiceOperations not available');
104
+ }
105
+ logger.info('Toggling automation', { entityId });
106
+ return this.serviceOps.callService({
107
+ domain: 'automation',
108
+ service: 'toggle',
109
+ target: { entity_id: entityId },
110
+ });
111
+ }
112
+ /**
113
+ * Reload all automations from configuration
114
+ */
115
+ async reloadAutomations() {
116
+ if (!this.serviceOps) {
117
+ throw new Error('ServiceOperations not available');
118
+ }
119
+ logger.info('Reloading automations');
120
+ await this.serviceOps.callService({
121
+ domain: 'automation',
122
+ service: 'reload',
123
+ });
124
+ }
125
+ /**
126
+ * Create a new automation via the config API
127
+ * Note: Requires Home Assistant 2023.7+ with config flow support
128
+ */
129
+ async createAutomation(config) {
130
+ if (!this.request) {
131
+ throw new Error('RequestHandler not available');
132
+ }
133
+ logger.info('Creating automation', { alias: config.alias });
134
+ // Use the config/automation/config endpoint to create automations
135
+ const result = await this.request.post('/config/automation/config', {
136
+ alias: config.alias,
137
+ description: config.description,
138
+ mode: config.mode ?? 'single',
139
+ trigger: config.trigger,
140
+ condition: config.condition,
141
+ action: config.action,
142
+ });
143
+ return { id: result.result };
144
+ }
145
+ /**
146
+ * Update an existing automation
147
+ * Note: Requires the automation's unique_id from the automation registry
148
+ */
149
+ async updateAutomation(automationId, config) {
150
+ if (!this.request) {
151
+ throw new Error('RequestHandler not available');
152
+ }
153
+ logger.info('Updating automation', { automationId, alias: config.alias });
154
+ await this.request.post(`/config/automation/config/${automationId}`, config);
155
+ }
156
+ /**
157
+ * Delete an automation
158
+ * Note: Only works for automations created via the UI/API
159
+ */
160
+ async deleteAutomation(automationId) {
161
+ if (!this.request) {
162
+ throw new Error('RequestHandler not available');
163
+ }
164
+ logger.info('Deleting automation', { automationId });
165
+ await this.request.request(`/config/automation/config/${automationId}`, {
166
+ method: 'DELETE',
167
+ });
168
+ }
169
+ /**
170
+ * Get automation trace (execution history)
171
+ */
172
+ async getAutomationTrace(entityId) {
173
+ if (!this.request) {
174
+ throw new Error('RequestHandler not available');
175
+ }
176
+ const automationId = entityId.replace('automation.', '');
177
+ logger.debug('Fetching automation trace', { automationId });
178
+ return this.request.get(`/trace/automation/${automationId}`);
179
+ }
180
+ }
181
+ //# sourceMappingURL=automations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automations.js","sourceRoot":"","sources":["../../src/haClient/automations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Config Operations for Home Assistant API
3
+ * Handles configuration and version information
4
+ */
5
+ import type { HaVersion } from '../types/index.js';
6
+ import type { RequestHandler } from './request.js';
7
+ /**
8
+ * Config-related operations for the Home Assistant API.
9
+ */
10
+ export declare class ConfigOperations {
11
+ private readonly request;
12
+ constructor(request: RequestHandler);
13
+ /**
14
+ * Get config
15
+ */
16
+ getConfig(): Promise<Record<string, unknown>>;
17
+ /**
18
+ * Check API (health check)
19
+ */
20
+ checkApi(): Promise<{
21
+ message: string;
22
+ }>;
23
+ /**
24
+ * Get Home Assistant version and configuration info
25
+ */
26
+ getVersion(): Promise<HaVersion>;
27
+ }
28
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/haClient/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD;;GAEG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAEpD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAKnD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAK9C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;CAMvC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Config Operations for Home Assistant API
3
+ * Handles configuration and version information
4
+ */
5
+ import { logger } from '../utils/logger.js';
6
+ /**
7
+ * Config-related operations for the Home Assistant API.
8
+ */
9
+ export class ConfigOperations {
10
+ request;
11
+ constructor(request) {
12
+ this.request = request;
13
+ }
14
+ /**
15
+ * Get config
16
+ */
17
+ async getConfig() {
18
+ logger.debug('Fetching config');
19
+ return await this.request.get('/config');
20
+ }
21
+ /**
22
+ * Check API (health check)
23
+ */
24
+ async checkApi() {
25
+ logger.debug('Checking API health');
26
+ return await this.request.get('/');
27
+ }
28
+ /**
29
+ * Get Home Assistant version and configuration info
30
+ */
31
+ async getVersion() {
32
+ logger.debug('Fetching Home Assistant version');
33
+ const config = await this.request.get('/config');
34
+ logger.info('Fetched version', { version: config.version });
35
+ return config;
36
+ }
37
+ }
38
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/haClient/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAExD;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAChC,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAA0B,SAAS,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACpC,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAsB,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAY,SAAS,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}