@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
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Home Assistant API Client
3
+ * Main client class that composes all operation modules
4
+ */
5
+ import type { EnvironmentConfig } from '../config.js';
6
+ import type { Entity, ServiceCallData, ServiceCallResponse, Automation, AutomationConfig, DomainSummary, HaVersion, LogbookEntry, UpdateInfo } from '../types/index.js';
7
+ import { DeviceOperations } from './devices.js';
8
+ /**
9
+ * Main client for interacting with the Home Assistant API.
10
+ * Organized with dedicated operation classes for each domain.
11
+ */
12
+ export declare class HaClient {
13
+ private readonly request;
14
+ private readonly stateOps;
15
+ private readonly serviceOps;
16
+ private readonly entityOps;
17
+ private readonly automationOps;
18
+ private readonly historyOps;
19
+ private readonly updateOps;
20
+ private readonly configOps;
21
+ readonly devices: DeviceOperations;
22
+ constructor(config: EnvironmentConfig);
23
+ /**
24
+ * Get all states (entities)
25
+ */
26
+ getStates(): Promise<Entity[]>;
27
+ /**
28
+ * Get state of a specific entity
29
+ */
30
+ getState(entityId: string): Promise<Entity | null>;
31
+ /**
32
+ * Get all sensors (sensor.* and binary_sensor.* entities)
33
+ */
34
+ getAllSensors(): Promise<Entity[]>;
35
+ /**
36
+ * Call a service
37
+ */
38
+ callService(data: ServiceCallData): Promise<ServiceCallResponse>;
39
+ /**
40
+ * Restart Home Assistant
41
+ */
42
+ restartServer(): Promise<void>;
43
+ /**
44
+ * Get entities filtered by domain
45
+ */
46
+ getEntitiesByDomain(domain: string): Promise<Entity[]>;
47
+ /**
48
+ * Search entities by name or entity_id
49
+ */
50
+ searchEntities(query: string): Promise<Entity[]>;
51
+ /**
52
+ * Get domain summary with entity counts and state breakdown
53
+ */
54
+ getDomainSummary(domain: string): Promise<DomainSummary>;
55
+ /**
56
+ * List entities with optional filtering
57
+ */
58
+ listEntities(options?: {
59
+ domain?: string;
60
+ search?: string;
61
+ limit?: number;
62
+ state?: string;
63
+ }): Promise<Entity[]>;
64
+ /**
65
+ * Get all automations
66
+ */
67
+ getAutomations(): Promise<Automation[]>;
68
+ /**
69
+ * Get a single automation by entity_id
70
+ */
71
+ getAutomation(entityId: string): Promise<Automation | null>;
72
+ /**
73
+ * Trigger an automation manually
74
+ */
75
+ triggerAutomation(entityId: string, variables?: Record<string, unknown>): Promise<ServiceCallResponse>;
76
+ /**
77
+ * Enable an automation
78
+ */
79
+ enableAutomation(entityId: string): Promise<ServiceCallResponse>;
80
+ /**
81
+ * Disable an automation
82
+ */
83
+ disableAutomation(entityId: string): Promise<ServiceCallResponse>;
84
+ /**
85
+ * Toggle an automation
86
+ */
87
+ toggleAutomation(entityId: string): Promise<ServiceCallResponse>;
88
+ /**
89
+ * Reload all automations from configuration
90
+ */
91
+ reloadAutomations(): Promise<void>;
92
+ /**
93
+ * Create a new automation
94
+ */
95
+ createAutomation(config: AutomationConfig): Promise<{
96
+ id: string;
97
+ }>;
98
+ /**
99
+ * Update an existing automation
100
+ */
101
+ updateAutomation(automationId: string, config: Partial<AutomationConfig>): Promise<void>;
102
+ /**
103
+ * Delete an automation
104
+ */
105
+ deleteAutomation(automationId: string): Promise<void>;
106
+ /**
107
+ * Get automation execution trace
108
+ */
109
+ getAutomationTrace(entityId: string): Promise<unknown[]>;
110
+ /**
111
+ * Get historical data for an entity
112
+ */
113
+ getHistory(entityId: string, hours?: number): Promise<Entity[][]>;
114
+ /**
115
+ * Get system log entries from the logbook
116
+ */
117
+ getSystemLog(options?: {
118
+ hours?: number;
119
+ entity_id?: string;
120
+ }): Promise<LogbookEntry[]>;
121
+ /**
122
+ * Get available updates by checking update.* entities
123
+ */
124
+ getAvailableUpdates(): Promise<{
125
+ updates: UpdateInfo[];
126
+ entities: Entity[];
127
+ }>;
128
+ /**
129
+ * Get config
130
+ */
131
+ getConfig(): Promise<Record<string, unknown>>;
132
+ /**
133
+ * Check API (health check)
134
+ */
135
+ checkApi(): Promise<{
136
+ message: string;
137
+ }>;
138
+ /**
139
+ * Get Home Assistant version and configuration info
140
+ */
141
+ getVersion(): Promise<HaVersion>;
142
+ }
143
+ export { RequestHandler } from './request.js';
144
+ export { StateOperations } from './states.js';
145
+ export { ServiceOperations } from './services.js';
146
+ export { EntityOperations } from './entities.js';
147
+ export { AutomationOperations } from './automations.js';
148
+ export { HistoryOperations } from './history.js';
149
+ export { UpdateOperations } from './updates.js';
150
+ export { ConfigOperations } from './config.js';
151
+ export { DeviceOperations } from './devices.js';
152
+ export type { LightControlOptions, ClimateControlOptions, MediaPlayerControlOptions, CoverControlOptions, FanControlOptions } from './devices.js';
153
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/haClient/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Home Assistant API Client
3
+ * Main client class that composes all operation modules
4
+ */
5
+ import { logger } from '../utils/logger.js';
6
+ import { AutomationOperations } from './automations.js';
7
+ import { ConfigOperations } from './config.js';
8
+ import { DeviceOperations } from './devices.js';
9
+ import { EntityOperations } from './entities.js';
10
+ import { HistoryOperations } from './history.js';
11
+ import { RequestHandler } from './request.js';
12
+ import { ServiceOperations } from './services.js';
13
+ import { StateOperations } from './states.js';
14
+ import { UpdateOperations } from './updates.js';
15
+ /**
16
+ * Main client for interacting with the Home Assistant API.
17
+ * Organized with dedicated operation classes for each domain.
18
+ */
19
+ export class HaClient {
20
+ request;
21
+ stateOps;
22
+ serviceOps;
23
+ entityOps;
24
+ automationOps;
25
+ historyOps;
26
+ updateOps;
27
+ configOps;
28
+ devices;
29
+ constructor(config) {
30
+ logger.debug('Initializing HaClient');
31
+ // Initialize request handler
32
+ this.request = new RequestHandler({
33
+ baseUrl: config.baseUrl,
34
+ token: config.token,
35
+ timeout: config.timeout,
36
+ strictSsl: config.strictSsl,
37
+ });
38
+ // Initialize operation modules with dependencies
39
+ this.stateOps = new StateOperations(this.request);
40
+ this.serviceOps = new ServiceOperations(this.request);
41
+ this.entityOps = new EntityOperations(this.stateOps);
42
+ this.automationOps = new AutomationOperations(this.stateOps, this.serviceOps, this.request);
43
+ this.historyOps = new HistoryOperations(this.request);
44
+ this.updateOps = new UpdateOperations(this.entityOps);
45
+ this.configOps = new ConfigOperations(this.request);
46
+ this.devices = new DeviceOperations(this.serviceOps, this.stateOps);
47
+ logger.info('HaClient initialized');
48
+ }
49
+ // ===== State Operations =====
50
+ /**
51
+ * Get all states (entities)
52
+ */
53
+ async getStates() {
54
+ return this.stateOps.getStates();
55
+ }
56
+ /**
57
+ * Get state of a specific entity
58
+ */
59
+ async getState(entityId) {
60
+ return this.stateOps.getState(entityId);
61
+ }
62
+ /**
63
+ * Get all sensors (sensor.* and binary_sensor.* entities)
64
+ */
65
+ async getAllSensors() {
66
+ return this.stateOps.getAllSensors();
67
+ }
68
+ // ===== Service Operations =====
69
+ /**
70
+ * Call a service
71
+ */
72
+ async callService(data) {
73
+ return this.serviceOps.callService(data);
74
+ }
75
+ /**
76
+ * Restart Home Assistant
77
+ */
78
+ async restartServer() {
79
+ return this.serviceOps.restartServer();
80
+ }
81
+ // ===== Entity Operations =====
82
+ /**
83
+ * Get entities filtered by domain
84
+ */
85
+ async getEntitiesByDomain(domain) {
86
+ return this.entityOps.getEntitiesByDomain(domain);
87
+ }
88
+ /**
89
+ * Search entities by name or entity_id
90
+ */
91
+ async searchEntities(query) {
92
+ return this.entityOps.searchEntities(query);
93
+ }
94
+ /**
95
+ * Get domain summary with entity counts and state breakdown
96
+ */
97
+ async getDomainSummary(domain) {
98
+ return this.entityOps.getDomainSummary(domain);
99
+ }
100
+ /**
101
+ * List entities with optional filtering
102
+ */
103
+ async listEntities(options = {}) {
104
+ return this.entityOps.listEntities(options);
105
+ }
106
+ // ===== Automation Operations =====
107
+ /**
108
+ * Get all automations
109
+ */
110
+ async getAutomations() {
111
+ return this.automationOps.getAutomations();
112
+ }
113
+ /**
114
+ * Get a single automation by entity_id
115
+ */
116
+ async getAutomation(entityId) {
117
+ return this.automationOps.getAutomation(entityId);
118
+ }
119
+ /**
120
+ * Trigger an automation manually
121
+ */
122
+ async triggerAutomation(entityId, variables) {
123
+ return this.automationOps.triggerAutomation(entityId, variables);
124
+ }
125
+ /**
126
+ * Enable an automation
127
+ */
128
+ async enableAutomation(entityId) {
129
+ return this.automationOps.enableAutomation(entityId);
130
+ }
131
+ /**
132
+ * Disable an automation
133
+ */
134
+ async disableAutomation(entityId) {
135
+ return this.automationOps.disableAutomation(entityId);
136
+ }
137
+ /**
138
+ * Toggle an automation
139
+ */
140
+ async toggleAutomation(entityId) {
141
+ return this.automationOps.toggleAutomation(entityId);
142
+ }
143
+ /**
144
+ * Reload all automations from configuration
145
+ */
146
+ async reloadAutomations() {
147
+ return this.automationOps.reloadAutomations();
148
+ }
149
+ /**
150
+ * Create a new automation
151
+ */
152
+ async createAutomation(config) {
153
+ return this.automationOps.createAutomation(config);
154
+ }
155
+ /**
156
+ * Update an existing automation
157
+ */
158
+ async updateAutomation(automationId, config) {
159
+ return this.automationOps.updateAutomation(automationId, config);
160
+ }
161
+ /**
162
+ * Delete an automation
163
+ */
164
+ async deleteAutomation(automationId) {
165
+ return this.automationOps.deleteAutomation(automationId);
166
+ }
167
+ /**
168
+ * Get automation execution trace
169
+ */
170
+ async getAutomationTrace(entityId) {
171
+ return this.automationOps.getAutomationTrace(entityId);
172
+ }
173
+ // ===== History Operations =====
174
+ /**
175
+ * Get historical data for an entity
176
+ */
177
+ async getHistory(entityId, hours = 24) {
178
+ return this.historyOps.getHistory(entityId, hours);
179
+ }
180
+ /**
181
+ * Get system log entries from the logbook
182
+ */
183
+ async getSystemLog(options = {}) {
184
+ return this.historyOps.getSystemLog(options);
185
+ }
186
+ // ===== Update Operations =====
187
+ /**
188
+ * Get available updates by checking update.* entities
189
+ */
190
+ async getAvailableUpdates() {
191
+ return this.updateOps.getAvailableUpdates();
192
+ }
193
+ // ===== Config Operations =====
194
+ /**
195
+ * Get config
196
+ */
197
+ async getConfig() {
198
+ return this.configOps.getConfig();
199
+ }
200
+ /**
201
+ * Check API (health check)
202
+ */
203
+ async checkApi() {
204
+ return this.configOps.checkApi();
205
+ }
206
+ /**
207
+ * Get Home Assistant version and configuration info
208
+ */
209
+ async getVersion() {
210
+ return this.configOps.getVersion();
211
+ }
212
+ }
213
+ // Re-export operation classes for testing
214
+ export { RequestHandler } from './request.js';
215
+ export { StateOperations } from './states.js';
216
+ export { ServiceOperations } from './services.js';
217
+ export { EntityOperations } from './entities.js';
218
+ export { AutomationOperations } from './automations.js';
219
+ export { HistoryOperations } from './history.js';
220
+ export { UpdateOperations } from './updates.js';
221
+ export { ConfigOperations } from './config.js';
222
+ export { DeviceOperations } from './devices.js';
223
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/haClient/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * HTTP Request Handler for Home Assistant API
3
+ * Handles authentication and HTTP requests
4
+ */
5
+ import type { RequestOptions } from '../types/index.js';
6
+ export interface RequestHandlerConfig {
7
+ baseUrl: string;
8
+ token: string;
9
+ timeout: number;
10
+ strictSsl: boolean;
11
+ }
12
+ /**
13
+ * HTTP request handler for Home Assistant API calls.
14
+ */
15
+ export declare class RequestHandler {
16
+ private httpsAgent?;
17
+ private baseUrl;
18
+ private token;
19
+ private timeout;
20
+ constructor(config: RequestHandlerConfig);
21
+ /**
22
+ * Make authenticated request to Home Assistant API
23
+ */
24
+ request<T>(path: string, options?: RequestOptions): Promise<T>;
25
+ /**
26
+ * Make a GET request
27
+ */
28
+ get<T>(path: string, params?: Record<string, string | number>): Promise<T>;
29
+ /**
30
+ * Make a POST request
31
+ */
32
+ post<T>(path: string, body?: unknown): Promise<T>;
33
+ }
34
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/haClient/request.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIxD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAC,CAAc;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,oBAAoB;IAcxC;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;IAsExE;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhF;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;CAGxD"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * HTTP Request Handler for Home Assistant API
3
+ * Handles authentication and HTTP requests
4
+ */
5
+ import https from 'https';
6
+ import { AuthenticationError, ApiError } from '../types/index.js';
7
+ import { logger } from '../utils/logger.js';
8
+ /**
9
+ * HTTP request handler for Home Assistant API calls.
10
+ */
11
+ export class RequestHandler {
12
+ httpsAgent;
13
+ baseUrl;
14
+ token;
15
+ timeout;
16
+ constructor(config) {
17
+ this.baseUrl = config.baseUrl;
18
+ this.token = config.token;
19
+ this.timeout = config.timeout;
20
+ // Create HTTPS agent with custom SSL settings
21
+ if (!config.strictSsl) {
22
+ this.httpsAgent = new https.Agent({
23
+ rejectUnauthorized: false,
24
+ });
25
+ logger.warn('SSL certificate validation is disabled');
26
+ }
27
+ }
28
+ /**
29
+ * Make authenticated request to Home Assistant API
30
+ */
31
+ async request(path, options = {}) {
32
+ const url = new URL(`${this.baseUrl}/api${path}`);
33
+ // Add query parameters
34
+ if (options.params) {
35
+ Object.entries(options.params).forEach(([key, value]) => {
36
+ url.searchParams.append(key, String(value));
37
+ });
38
+ }
39
+ const headers = {
40
+ 'Authorization': `Bearer ${this.token}`,
41
+ 'Content-Type': 'application/json',
42
+ ...options.headers,
43
+ };
44
+ logger.debug('Making API request', {
45
+ method: options.method ?? 'GET',
46
+ path,
47
+ params: options.params,
48
+ });
49
+ try {
50
+ const response = await fetch(url.toString(), {
51
+ method: options.method ?? 'GET',
52
+ headers,
53
+ body: options.body ? JSON.stringify(options.body) : undefined,
54
+ // @ts-expect-error - agent is valid but not in types
55
+ agent: this.httpsAgent,
56
+ signal: AbortSignal.timeout(this.timeout),
57
+ });
58
+ if (!response.ok) {
59
+ const errorText = await response.text();
60
+ if (response.status === 401) {
61
+ throw new AuthenticationError('Invalid Home Assistant token', { status: response.status, body: errorText });
62
+ }
63
+ throw new ApiError(`API request failed: ${response.statusText}`, response.status, { path, body: errorText });
64
+ }
65
+ // Handle empty responses
66
+ const contentType = response.headers.get('content-type');
67
+ if (!contentType?.includes('application/json')) {
68
+ return {};
69
+ }
70
+ const data = await response.json();
71
+ return data;
72
+ }
73
+ catch (error) {
74
+ if (error instanceof AuthenticationError || error instanceof ApiError) {
75
+ throw error;
76
+ }
77
+ throw new ApiError(`Request failed: ${error instanceof Error ? error.message : String(error)}`, 500, { path });
78
+ }
79
+ }
80
+ /**
81
+ * Make a GET request
82
+ */
83
+ async get(path, params) {
84
+ return this.request(path, { params });
85
+ }
86
+ /**
87
+ * Make a POST request
88
+ */
89
+ async post(path, body) {
90
+ return this.request(path, { method: 'POST', body });
91
+ }
92
+ }
93
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/haClient/request.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Service Operations for Home Assistant API
3
+ * Handles service calls and server management
4
+ */
5
+ import type { ServiceCallData, ServiceCallResponse } from '../types/index.js';
6
+ import type { RequestHandler } from './request.js';
7
+ /**
8
+ * Service-related operations for the Home Assistant API.
9
+ */
10
+ export declare class ServiceOperations {
11
+ private readonly request;
12
+ constructor(request: RequestHandler);
13
+ /**
14
+ * Call a service
15
+ */
16
+ callService(data: ServiceCallData): Promise<ServiceCallResponse>;
17
+ /**
18
+ * Restart Home Assistant
19
+ */
20
+ restartServer(): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/haClient/services.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD;;GAEG;AACH,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAEpD;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAgBtE;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAOrC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Service Operations for Home Assistant API
3
+ * Handles service calls and server management
4
+ */
5
+ import { logger } from '../utils/logger.js';
6
+ /**
7
+ * Service-related operations for the Home Assistant API.
8
+ */
9
+ export class ServiceOperations {
10
+ request;
11
+ constructor(request) {
12
+ this.request = request;
13
+ }
14
+ /**
15
+ * Call a service
16
+ */
17
+ async callService(data) {
18
+ logger.info('Calling service', {
19
+ domain: data.domain,
20
+ service: data.service,
21
+ hasTarget: !!data.target,
22
+ });
23
+ const path = `/services/${data.domain}/${data.service}`;
24
+ const body = {
25
+ ...data.service_data,
26
+ ...data.target,
27
+ };
28
+ return await this.request.post(path, body);
29
+ }
30
+ /**
31
+ * Restart Home Assistant
32
+ */
33
+ async restartServer() {
34
+ logger.warn('Restarting Home Assistant');
35
+ await this.request.post('/services/homeassistant/restart', {});
36
+ logger.info('Home Assistant restart initiated');
37
+ }
38
+ }
39
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/haClient/services.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAExD;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,IAAqB;QACrC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,aAAa,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG;YACX,GAAG,IAAI,CAAC,YAAY;YACpB,GAAG,IAAI,CAAC,MAAM;SACf,CAAC;QAEF,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAsB,IAAI,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAEzC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC;QAE/D,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * State Operations for Home Assistant API
3
+ * Handles entity state retrieval
4
+ */
5
+ import type { Entity } from '../types/index.js';
6
+ import type { RequestHandler } from './request.js';
7
+ /**
8
+ * State-related operations for the Home Assistant API.
9
+ */
10
+ export declare class StateOperations {
11
+ private readonly request;
12
+ constructor(request: RequestHandler);
13
+ /**
14
+ * Get all states (entities)
15
+ */
16
+ getStates(): Promise<Entity[]>;
17
+ /**
18
+ * Get state of a specific entity
19
+ */
20
+ getState(entityId: string): Promise<Entity | null>;
21
+ /**
22
+ * Get all sensors (sensor.* and binary_sensor.* entities)
23
+ */
24
+ getAllSensors(): Promise<Entity[]>;
25
+ }
26
+ //# sourceMappingURL=states.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../src/haClient/states.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD;;GAEG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAEpD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAOpC;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAexD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAYzC"}