@coffeerunhobby/mcp-ha-connect 0.6.0 → 0.8.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.
- package/.env.example +19 -0
- package/README.md +444 -105
- package/dist/config.d.ts +2 -0
- package/dist/config.js +19 -0
- package/dist/config.js.map +1 -1
- package/dist/haClient/calendars.d.ts +33 -0
- package/dist/haClient/calendars.js +68 -0
- package/dist/haClient/calendars.js.map +1 -0
- package/dist/haClient/index.d.ts +18 -1
- package/dist/haClient/index.js +23 -0
- package/dist/haClient/index.js.map +1 -1
- package/dist/haClient/labels.d.ts +64 -0
- package/dist/haClient/labels.js +177 -0
- package/dist/haClient/labels.js.map +1 -0
- package/dist/server/auth.d.ts +20 -0
- package/dist/server/auth.js +74 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/common.js +2 -1
- package/dist/server/common.js.map +1 -1
- package/dist/server/http.js +45 -4
- package/dist/server/http.js.map +1 -1
- package/dist/tools/calendar.d.ts +7 -0
- package/dist/tools/calendar.js +82 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/common.d.ts +17 -0
- package/dist/tools/common.js +9 -0
- package/dist/tools/common.js.map +1 -1
- package/dist/tools/index.js +24 -7
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/labels.d.ts +12 -0
- package/dist/tools/labels.js +139 -0
- package/dist/tools/labels.js.map +1 -0
- package/dist/tools/listPersons.d.ts +6 -0
- package/dist/tools/listPersons.js +36 -0
- package/dist/tools/listPersons.js.map +1 -0
- package/dist/tools/searchEntities.js +3 -1
- package/dist/tools/searchEntities.js.map +1 -1
- package/dist/types/automations.d.ts +38 -0
- package/dist/types/automations.js +5 -0
- package/dist/types/automations.js.map +1 -0
- package/dist/types/calendars.d.ts +24 -0
- package/dist/types/calendars.js +5 -0
- package/dist/types/calendars.js.map +1 -0
- package/dist/types/config.d.ts +10 -0
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/entities.d.ts +13 -0
- package/dist/types/entities.js +5 -0
- package/dist/types/entities.js.map +1 -0
- package/dist/types/entity.d.ts +21 -0
- package/dist/types/history.d.ts +12 -0
- package/dist/types/history.js +5 -0
- package/dist/types/history.js.map +1 -0
- package/dist/types/index.d.ts +7 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/labels.d.ts +34 -0
- package/dist/types/labels.js +5 -0
- package/dist/types/labels.js.map +1 -0
- package/dist/types/states.d.ts +19 -0
- package/dist/types/states.js +5 -0
- package/dist/types/states.js.map +1 -0
- package/dist/types/updates.d.ts +24 -0
- package/dist/types/updates.js +5 -0
- package/dist/types/updates.js.map +1 -0
- package/dist/utils/sanitize.d.ts +25 -0
- package/dist/utils/sanitize.js +92 -0
- package/dist/utils/sanitize.js.map +1 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.js +17 -0
- package/dist/version.js.map +1 -0
- package/docs/CHANGELOG.md +126 -104
- package/docs/LOCAL_CLIENT.md +572 -338
- package/docs/SSE_API.md +1 -1
- package/openapi.json +1149 -37
- package/package.json +4 -3
- package/src/config.ts +29 -0
- package/src/haClient/calendars.ts +94 -0
- package/src/haClient/index.ts +36 -0
- package/src/server/auth.ts +103 -0
- package/src/server/common.ts +2 -1
- package/src/server/http.ts +56 -4
- package/src/tools/calendar.ts +97 -0
- package/src/tools/common.ts +11 -0
- package/src/tools/index.ts +28 -7
- package/src/tools/listPersons.ts +46 -0
- package/src/tools/searchEntities.ts +3 -1
- package/src/types/automations.ts +43 -0
- package/src/types/calendars.ts +26 -0
- package/src/types/config.ts +11 -0
- package/src/types/entities.ts +14 -0
- package/src/types/history.ts +13 -0
- package/src/types/index.ts +37 -1
- package/src/types/states.ts +21 -0
- package/src/types/updates.ts +28 -0
- package/src/version.ts +16 -0
- package/tests/bdd/automation-creation.spec.ts +214 -0
- package/tests/bdd/automation-management.spec.ts +267 -0
- package/tests/bdd/calendar.spec.ts +190 -0
- package/tests/bdd/configuration.spec.ts +283 -0
- package/tests/bdd/device-control.spec.ts +344 -0
- package/tests/bdd/entity-listing.spec.ts +208 -0
- package/tests/bdd/entity-search.spec.ts +183 -0
- package/tests/bdd/history-retrieval.spec.ts +195 -0
- package/tests/bdd/notifications.spec.ts +238 -0
- package/tests/bdd/service-calls.spec.ts +144 -0
- package/tests/bdd/state-retrieval.spec.ts +204 -0
- package/tests/features/automation-creation.feature +36 -0
- package/tests/features/automation-management.feature +54 -0
- package/tests/features/calendar.feature +37 -0
- package/tests/features/configuration.feature +71 -0
- package/tests/features/device-control.feature +100 -0
- package/tests/features/entity-listing.feature +51 -0
- package/tests/features/entity-search.feature +44 -0
- package/tests/features/history-retrieval.feature +38 -0
- package/tests/features/notifications.feature +37 -0
- package/tests/features/service-calls.feature +35 -0
- package/tests/features/state-retrieval.feature +37 -0
- package/tests/haClient/index.test.ts +142 -110
- package/tests/localAI/index.test.ts +27 -18
- package/tests/server/auth.test.ts +206 -0
- package/tests/server/http.test.ts +118 -5
- package/tests/server/stdio.test.ts +4 -6
- package/vitest.config.ts +1 -1
- package/src/types/entity.ts +0 -111
package/dist/config.d.ts
CHANGED
|
@@ -26,6 +26,8 @@ export interface EnvironmentConfig {
|
|
|
26
26
|
rateLimitEnabled: boolean;
|
|
27
27
|
rateLimitWindowMs: number;
|
|
28
28
|
rateLimitMaxRequests: number;
|
|
29
|
+
authMethod: 'none' | 'bearer';
|
|
30
|
+
authToken?: Set<string>;
|
|
29
31
|
}
|
|
30
32
|
export declare function loadConfig(env?: NodeJS.ProcessEnv): EnvironmentConfig;
|
|
31
33
|
export declare function validateConfig(config: EnvironmentConfig): void;
|
package/dist/config.js
CHANGED
|
@@ -57,6 +57,9 @@ const envSchema = z
|
|
|
57
57
|
rateLimitEnabled: createBooleanStringSchema(true),
|
|
58
58
|
rateLimitWindowMs: numericStringSchema,
|
|
59
59
|
rateLimitMaxRequests: numericStringSchema,
|
|
60
|
+
// Authentication Configuration
|
|
61
|
+
authMethod: z.enum(['none', 'bearer']).optional().default('none'),
|
|
62
|
+
authToken: listStringSchema,
|
|
60
63
|
})
|
|
61
64
|
.refine((data) => {
|
|
62
65
|
// Validate httpBindAddr if provided
|
|
@@ -84,6 +87,16 @@ const envSchema = z
|
|
|
84
87
|
message: `MCP_HTTP_ALLOWED_ORIGINS contains invalid origin: ${invalidOrigin}`,
|
|
85
88
|
path: ['httpAllowedOrigins'],
|
|
86
89
|
};
|
|
90
|
+
})
|
|
91
|
+
.refine((data) => {
|
|
92
|
+
// If bearer auth is enabled, token must be provided
|
|
93
|
+
if (data.authMethod === 'bearer' && !data.authToken) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
return true;
|
|
97
|
+
}, {
|
|
98
|
+
message: 'MCP_AUTH_TOKEN is required when MCP_AUTH_METHOD is "bearer"',
|
|
99
|
+
path: ['authToken'],
|
|
87
100
|
});
|
|
88
101
|
export function loadConfig(env = process.env) {
|
|
89
102
|
const parsed = envSchema.safeParse({
|
|
@@ -119,6 +132,9 @@ export function loadConfig(env = process.env) {
|
|
|
119
132
|
rateLimitEnabled: env.MCP_RATE_LIMIT_ENABLED,
|
|
120
133
|
rateLimitWindowMs: env.MCP_RATE_LIMIT_WINDOW_MS,
|
|
121
134
|
rateLimitMaxRequests: env.MCP_RATE_LIMIT_MAX_REQUESTS,
|
|
135
|
+
// Authentication Configuration
|
|
136
|
+
authMethod: env.MCP_AUTH_METHOD,
|
|
137
|
+
authToken: env.MCP_AUTH_TOKEN,
|
|
122
138
|
});
|
|
123
139
|
if (!parsed.success) {
|
|
124
140
|
const messages = parsed.error.issues.map((issue) => issue.message);
|
|
@@ -168,6 +184,9 @@ export function loadConfig(env = process.env) {
|
|
|
168
184
|
rateLimitEnabled: parsed.data.rateLimitEnabled,
|
|
169
185
|
rateLimitWindowMs: parsed.data.rateLimitWindowMs ?? 60000,
|
|
170
186
|
rateLimitMaxRequests: parsed.data.rateLimitMaxRequests ?? 100,
|
|
187
|
+
// Authentication Configuration
|
|
188
|
+
authMethod: parsed.data.authMethod,
|
|
189
|
+
authToken: parsed.data.authToken ? new Set(parsed.data.authToken) : undefined,
|
|
171
190
|
};
|
|
172
191
|
}
|
|
173
192
|
// Legacy compatibility functions
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calendar Operations for Home Assistant API
|
|
3
|
+
* Handles calendar listing and event retrieval
|
|
4
|
+
*/
|
|
5
|
+
import type { CalendarEvent, Calendar } from '../types/index.js';
|
|
6
|
+
import type { RequestHandler } from './request.js';
|
|
7
|
+
/**
|
|
8
|
+
* Calendar-related operations for the Home Assistant API.
|
|
9
|
+
*/
|
|
10
|
+
export declare class CalendarOperations {
|
|
11
|
+
private readonly request;
|
|
12
|
+
constructor(request: RequestHandler);
|
|
13
|
+
/**
|
|
14
|
+
* Get all calendar entities
|
|
15
|
+
*/
|
|
16
|
+
getCalendars(): Promise<Calendar[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Get events from a calendar
|
|
19
|
+
* @param entityId - Calendar entity ID (e.g., 'calendar.my_calendar')
|
|
20
|
+
* @param startDate - Start date for event range (defaults to now)
|
|
21
|
+
* @param endDate - End date for event range (defaults to 30 days from start)
|
|
22
|
+
*/
|
|
23
|
+
getCalendarEvents(entityId: string, startDate?: Date, endDate?: Date): Promise<CalendarEvent[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Get events from all calendars
|
|
26
|
+
* @param startDate - Start date for event range (defaults to now)
|
|
27
|
+
* @param endDate - End date for event range (defaults to 30 days from start)
|
|
28
|
+
*/
|
|
29
|
+
getAllCalendarEvents(startDate?: Date, endDate?: Date): Promise<Array<{
|
|
30
|
+
calendar: string;
|
|
31
|
+
events: CalendarEvent[];
|
|
32
|
+
}>>;
|
|
33
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calendar Operations for Home Assistant API
|
|
3
|
+
* Handles calendar listing and event retrieval
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Calendar-related operations for the Home Assistant API.
|
|
8
|
+
*/
|
|
9
|
+
export class CalendarOperations {
|
|
10
|
+
request;
|
|
11
|
+
constructor(request) {
|
|
12
|
+
this.request = request;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get all calendar entities
|
|
16
|
+
*/
|
|
17
|
+
async getCalendars() {
|
|
18
|
+
logger.debug('Fetching calendars');
|
|
19
|
+
// Use dedicated /api/calendars endpoint instead of filtering all states
|
|
20
|
+
const response = await this.request.get('/calendars');
|
|
21
|
+
const calendars = response.map(cal => ({
|
|
22
|
+
entity_id: cal.entity_id,
|
|
23
|
+
name: cal.name || cal.entity_id.replace('calendar.', ''),
|
|
24
|
+
state: 'on', // Calendar API doesn't return state, default to 'on'
|
|
25
|
+
}));
|
|
26
|
+
logger.info('Fetched calendars', { count: calendars.length });
|
|
27
|
+
return calendars;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get events from a calendar
|
|
31
|
+
* @param entityId - Calendar entity ID (e.g., 'calendar.my_calendar')
|
|
32
|
+
* @param startDate - Start date for event range (defaults to now)
|
|
33
|
+
* @param endDate - End date for event range (defaults to 30 days from start)
|
|
34
|
+
*/
|
|
35
|
+
async getCalendarEvents(entityId, startDate, endDate) {
|
|
36
|
+
const start = startDate || new Date();
|
|
37
|
+
const end = endDate || new Date(start.getTime() + 30 * 24 * 60 * 60 * 1000);
|
|
38
|
+
logger.debug('Fetching calendar events', { entityId, start: start.toISOString(), end: end.toISOString() });
|
|
39
|
+
// Calendar events use a special API endpoint, not the standard services API
|
|
40
|
+
const events = await this.request.get(`/calendars/${entityId}`, {
|
|
41
|
+
start: start.toISOString(),
|
|
42
|
+
end: end.toISOString(),
|
|
43
|
+
});
|
|
44
|
+
logger.info('Fetched calendar events', { entityId, count: events.length });
|
|
45
|
+
return events;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get events from all calendars
|
|
49
|
+
* @param startDate - Start date for event range (defaults to now)
|
|
50
|
+
* @param endDate - End date for event range (defaults to 30 days from start)
|
|
51
|
+
*/
|
|
52
|
+
async getAllCalendarEvents(startDate, endDate) {
|
|
53
|
+
const calendars = await this.getCalendars();
|
|
54
|
+
// Fetch all calendar events in parallel
|
|
55
|
+
const results = await Promise.all(calendars.map(async (calendar) => {
|
|
56
|
+
try {
|
|
57
|
+
const events = await this.getCalendarEvents(calendar.entity_id, startDate, endDate);
|
|
58
|
+
return { calendar: calendar.entity_id, events };
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
logger.warn('Failed to fetch events for calendar', { calendar: calendar.entity_id, error });
|
|
62
|
+
return { calendar: calendar.entity_id, events: [] };
|
|
63
|
+
}
|
|
64
|
+
}));
|
|
65
|
+
return results;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=calendars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendars.js","sourceRoot":"","sources":["../../src/haClient/calendars.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAQ5C;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAExD;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAEnC,wEAAwE;QACxE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAwB,YAAY,CAAC,CAAC;QAC7E,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YACxD,KAAK,EAAE,IAAI,EAAE,qDAAqD;SACnE,CAAC,CAAC,CAAC;QAEJ,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,iBAAiB,CACrB,QAAgB,EAChB,SAAgB,EAChB,OAAc;QAEd,MAAM,KAAK,GAAG,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,OAAO,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAE5E,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAE3G,4EAA4E;QAC5E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CACnC,cAAc,QAAQ,EAAE,EACxB;YACE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE;YAC1B,GAAG,EAAE,GAAG,CAAC,WAAW,EAAE;SACvB,CACF,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,oBAAoB,CACxB,SAAgB,EAChB,OAAc;QAEd,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAE5C,wCAAwC;QACxC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,SAAS,CAAC,GAAG,CAAC,KAAK,EAAC,QAAQ,EAAC,EAAE;YAC7B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;gBACpF,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YAClD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC5F,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YACtD,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
package/dist/haClient/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Main client class that composes all operation modules
|
|
4
4
|
*/
|
|
5
5
|
import type { EnvironmentConfig } from '../config.js';
|
|
6
|
-
import type { Entity, ServiceCallData, ServiceCallResponse, Automation, AutomationConfig, DomainSummary, HaVersion, LogbookEntry, UpdateInfo } from '../types/index.js';
|
|
6
|
+
import type { Entity, ServiceCallData, ServiceCallResponse, Automation, AutomationConfig, DomainSummary, HaVersion, LogbookEntry, UpdateInfo, Calendar, CalendarEvent } from '../types/index.js';
|
|
7
7
|
import { DeviceOperations } from './devices.js';
|
|
8
8
|
/**
|
|
9
9
|
* Main client for interacting with the Home Assistant API.
|
|
@@ -18,6 +18,7 @@ export declare class HaClient {
|
|
|
18
18
|
private readonly historyOps;
|
|
19
19
|
private readonly updateOps;
|
|
20
20
|
private readonly configOps;
|
|
21
|
+
private readonly calendarOps;
|
|
21
22
|
readonly devices: DeviceOperations;
|
|
22
23
|
constructor(config: EnvironmentConfig);
|
|
23
24
|
/**
|
|
@@ -139,6 +140,21 @@ export declare class HaClient {
|
|
|
139
140
|
* Get Home Assistant version and configuration info
|
|
140
141
|
*/
|
|
141
142
|
getVersion(): Promise<HaVersion>;
|
|
143
|
+
/**
|
|
144
|
+
* Get all calendar entities
|
|
145
|
+
*/
|
|
146
|
+
getCalendars(): Promise<Calendar[]>;
|
|
147
|
+
/**
|
|
148
|
+
* Get events from a calendar
|
|
149
|
+
*/
|
|
150
|
+
getCalendarEvents(entityId: string, startDate?: Date, endDate?: Date): Promise<CalendarEvent[]>;
|
|
151
|
+
/**
|
|
152
|
+
* Get events from all calendars
|
|
153
|
+
*/
|
|
154
|
+
getAllCalendarEvents(startDate?: Date, endDate?: Date): Promise<Array<{
|
|
155
|
+
calendar: string;
|
|
156
|
+
events: CalendarEvent[];
|
|
157
|
+
}>>;
|
|
142
158
|
}
|
|
143
159
|
export { RequestHandler } from './request.js';
|
|
144
160
|
export { StateOperations } from './states.js';
|
|
@@ -149,4 +165,5 @@ export { HistoryOperations } from './history.js';
|
|
|
149
165
|
export { UpdateOperations } from './updates.js';
|
|
150
166
|
export { ConfigOperations } from './config.js';
|
|
151
167
|
export { DeviceOperations } from './devices.js';
|
|
168
|
+
export { CalendarOperations } from './calendars.js';
|
|
152
169
|
export type { LightControlOptions, ClimateControlOptions, MediaPlayerControlOptions, CoverControlOptions, FanControlOptions } from './devices.js';
|
package/dist/haClient/index.js
CHANGED
|
@@ -12,6 +12,7 @@ import { RequestHandler } from './request.js';
|
|
|
12
12
|
import { ServiceOperations } from './services.js';
|
|
13
13
|
import { StateOperations } from './states.js';
|
|
14
14
|
import { UpdateOperations } from './updates.js';
|
|
15
|
+
import { CalendarOperations } from './calendars.js';
|
|
15
16
|
/**
|
|
16
17
|
* Main client for interacting with the Home Assistant API.
|
|
17
18
|
* Organized with dedicated operation classes for each domain.
|
|
@@ -25,6 +26,7 @@ export class HaClient {
|
|
|
25
26
|
historyOps;
|
|
26
27
|
updateOps;
|
|
27
28
|
configOps;
|
|
29
|
+
calendarOps;
|
|
28
30
|
devices;
|
|
29
31
|
constructor(config) {
|
|
30
32
|
logger.debug('Initializing HaClient');
|
|
@@ -43,6 +45,7 @@ export class HaClient {
|
|
|
43
45
|
this.historyOps = new HistoryOperations(this.request);
|
|
44
46
|
this.updateOps = new UpdateOperations(this.entityOps);
|
|
45
47
|
this.configOps = new ConfigOperations(this.request);
|
|
48
|
+
this.calendarOps = new CalendarOperations(this.request);
|
|
46
49
|
this.devices = new DeviceOperations(this.serviceOps, this.stateOps);
|
|
47
50
|
logger.info('HaClient initialized');
|
|
48
51
|
}
|
|
@@ -209,6 +212,25 @@ export class HaClient {
|
|
|
209
212
|
async getVersion() {
|
|
210
213
|
return this.configOps.getVersion();
|
|
211
214
|
}
|
|
215
|
+
// ===== Calendar Operations =====
|
|
216
|
+
/**
|
|
217
|
+
* Get all calendar entities
|
|
218
|
+
*/
|
|
219
|
+
async getCalendars() {
|
|
220
|
+
return this.calendarOps.getCalendars();
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get events from a calendar
|
|
224
|
+
*/
|
|
225
|
+
async getCalendarEvents(entityId, startDate, endDate) {
|
|
226
|
+
return this.calendarOps.getCalendarEvents(entityId, startDate, endDate);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get events from all calendars
|
|
230
|
+
*/
|
|
231
|
+
async getAllCalendarEvents(startDate, endDate) {
|
|
232
|
+
return this.calendarOps.getAllCalendarEvents(startDate, endDate);
|
|
233
|
+
}
|
|
212
234
|
}
|
|
213
235
|
// Re-export operation classes for testing
|
|
214
236
|
export { RequestHandler } from './request.js';
|
|
@@ -220,4 +242,5 @@ export { HistoryOperations } from './history.js';
|
|
|
220
242
|
export { UpdateOperations } from './updates.js';
|
|
221
243
|
export { ConfigOperations } from './config.js';
|
|
222
244
|
export { DeviceOperations } from './devices.js';
|
|
245
|
+
export { CalendarOperations } from './calendars.js';
|
|
223
246
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/haClient/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/haClient/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;GAGG;AACH,MAAM,OAAO,QAAQ;IACF,OAAO,CAAiB;IACxB,QAAQ,CAAkB;IAC1B,UAAU,CAAoB;IAC9B,SAAS,CAAmB;IAC5B,aAAa,CAAuB;IACpC,UAAU,CAAoB;IAC9B,SAAS,CAAmB;IAC5B,SAAS,CAAmB;IAC5B,WAAW,CAAqB;IACjC,OAAO,CAAmB;IAE1C,YAAY,MAAyB;QACnC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAEtC,6BAA6B;QAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC;YAChC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC,CAAC;QAEH,iDAAiD;QACjD,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,aAAa,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5F,IAAI,CAAC,UAAU,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpE,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;IAED,+BAA+B;IAE/B;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IACvC,CAAC;IAED,iCAAiC;IAEjC;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,IAAqB;QACrC,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC;IAED,gCAAgC;IAEhC;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,MAAc;QACtC,OAAO,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,KAAa;QAChC,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,MAAc;QACnC,OAAO,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,UAKf,EAAE;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,oCAAoC;IAEpC;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,OAAO,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,QAAgB,EAAE,SAAmC;QAC3E,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,OAAO,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,QAAgB;QACtC,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,OAAO,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,MAAwB;QAC7C,OAAO,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,YAAoB,EAAE,MAAiC;QAC5E,OAAO,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,YAAoB;QACzC,OAAO,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,QAAgB;QACvC,OAAO,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED,iCAAiC;IAEjC;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,QAAgB,EAAE;QACnD,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,UAGf,EAAE;QACJ,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,gCAAgC;IAEhC;;OAEG;IACH,KAAK,CAAC,mBAAmB;QAIvB,OAAO,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAAC;IAC9C,CAAC;IAED,gCAAgC;IAEhC;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC;IAED,kCAAkC;IAElC;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CACrB,QAAgB,EAChB,SAAgB,EAChB,OAAc;QAEd,OAAO,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CACxB,SAAgB,EAChB,OAAc;QAEd,OAAO,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC;CACF;AAED,0CAA0C;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Label Operations for Home Assistant API
|
|
3
|
+
* Uses WebSocket API for label registry and entity registry operations
|
|
4
|
+
*/
|
|
5
|
+
import type { Label, LabelCreateInput, LabelUpdateInput, EntityRegistryEntry } from '../types/index.js';
|
|
6
|
+
import type { RequestHandlerConfig } from './request.js';
|
|
7
|
+
/**
|
|
8
|
+
* Label-related operations for the Home Assistant API.
|
|
9
|
+
* Uses WebSocket API since label/entity registry is not available via REST.
|
|
10
|
+
*/
|
|
11
|
+
export declare class LabelOperations {
|
|
12
|
+
private baseUrl;
|
|
13
|
+
private token;
|
|
14
|
+
constructor(config: RequestHandlerConfig);
|
|
15
|
+
/**
|
|
16
|
+
* Execute a WebSocket command and return the result
|
|
17
|
+
*/
|
|
18
|
+
private wsCommand;
|
|
19
|
+
/**
|
|
20
|
+
* List all labels
|
|
21
|
+
*/
|
|
22
|
+
listLabels(): Promise<Label[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Create a new label
|
|
25
|
+
*/
|
|
26
|
+
createLabel(input: LabelCreateInput): Promise<Label>;
|
|
27
|
+
/**
|
|
28
|
+
* Update an existing label
|
|
29
|
+
*/
|
|
30
|
+
updateLabel(labelId: string, input: LabelUpdateInput): Promise<Label>;
|
|
31
|
+
/**
|
|
32
|
+
* Delete a label
|
|
33
|
+
*/
|
|
34
|
+
deleteLabel(labelId: string): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* List all entities in the registry
|
|
37
|
+
*/
|
|
38
|
+
listEntityRegistry(): Promise<EntityRegistryEntry[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Get a single entity from the registry
|
|
41
|
+
*/
|
|
42
|
+
getEntityRegistryEntry(entityId: string): Promise<EntityRegistryEntry>;
|
|
43
|
+
/**
|
|
44
|
+
* Update an entity in the registry (including labels)
|
|
45
|
+
*/
|
|
46
|
+
updateEntityRegistry(entityId: string, updates: {
|
|
47
|
+
labels?: string[];
|
|
48
|
+
name?: string;
|
|
49
|
+
icon?: string;
|
|
50
|
+
area_id?: string;
|
|
51
|
+
}): Promise<EntityRegistryEntry>;
|
|
52
|
+
/**
|
|
53
|
+
* Get entities by label
|
|
54
|
+
*/
|
|
55
|
+
getEntitiesByLabel(labelId: string): Promise<EntityRegistryEntry[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Assign a label to an entity
|
|
58
|
+
*/
|
|
59
|
+
assignLabelToEntity(entityId: string, labelId: string): Promise<EntityRegistryEntry>;
|
|
60
|
+
/**
|
|
61
|
+
* Remove a label from an entity
|
|
62
|
+
*/
|
|
63
|
+
removeLabelFromEntity(entityId: string, labelId: string): Promise<EntityRegistryEntry>;
|
|
64
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Label Operations for Home Assistant API
|
|
3
|
+
* Uses WebSocket API for label registry and entity registry operations
|
|
4
|
+
*/
|
|
5
|
+
import WebSocket from 'ws';
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
/**
|
|
8
|
+
* Label-related operations for the Home Assistant API.
|
|
9
|
+
* Uses WebSocket API since label/entity registry is not available via REST.
|
|
10
|
+
*/
|
|
11
|
+
export class LabelOperations {
|
|
12
|
+
baseUrl;
|
|
13
|
+
token;
|
|
14
|
+
constructor(config) {
|
|
15
|
+
this.baseUrl = config.baseUrl;
|
|
16
|
+
this.token = config.token;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Execute a WebSocket command and return the result
|
|
20
|
+
*/
|
|
21
|
+
async wsCommand(type, data = {}) {
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
const wsUrl = this.baseUrl.replace('http', 'ws') + '/api/websocket';
|
|
24
|
+
const ws = new WebSocket(wsUrl);
|
|
25
|
+
let msgId = 1;
|
|
26
|
+
let authenticated = false;
|
|
27
|
+
const timeout = setTimeout(() => {
|
|
28
|
+
ws.close();
|
|
29
|
+
reject(new Error('WebSocket command timed out'));
|
|
30
|
+
}, 30000);
|
|
31
|
+
ws.on('open', () => {
|
|
32
|
+
logger.debug('WebSocket connection opened for label operation');
|
|
33
|
+
});
|
|
34
|
+
ws.on('message', (rawData) => {
|
|
35
|
+
const msg = JSON.parse(rawData.toString());
|
|
36
|
+
if (msg.type === 'auth_required') {
|
|
37
|
+
ws.send(JSON.stringify({ type: 'auth', access_token: this.token }));
|
|
38
|
+
}
|
|
39
|
+
else if (msg.type === 'auth_ok') {
|
|
40
|
+
authenticated = true;
|
|
41
|
+
// Send the actual command
|
|
42
|
+
ws.send(JSON.stringify({ id: msgId++, type, ...data }));
|
|
43
|
+
}
|
|
44
|
+
else if (msg.type === 'auth_invalid') {
|
|
45
|
+
clearTimeout(timeout);
|
|
46
|
+
ws.close();
|
|
47
|
+
reject(new Error('WebSocket authentication failed'));
|
|
48
|
+
}
|
|
49
|
+
else if (msg.type === 'result') {
|
|
50
|
+
clearTimeout(timeout);
|
|
51
|
+
ws.close();
|
|
52
|
+
if (msg.success) {
|
|
53
|
+
resolve(msg.result);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
reject(new Error(msg.error?.message || 'WebSocket command failed'));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
ws.on('error', (err) => {
|
|
61
|
+
clearTimeout(timeout);
|
|
62
|
+
reject(err);
|
|
63
|
+
});
|
|
64
|
+
ws.on('close', () => {
|
|
65
|
+
if (!authenticated) {
|
|
66
|
+
clearTimeout(timeout);
|
|
67
|
+
reject(new Error('WebSocket connection closed before authentication'));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// ===== Label Registry Operations =====
|
|
73
|
+
/**
|
|
74
|
+
* List all labels
|
|
75
|
+
*/
|
|
76
|
+
async listLabels() {
|
|
77
|
+
logger.debug('Listing all labels');
|
|
78
|
+
const labels = await this.wsCommand('config/label_registry/list');
|
|
79
|
+
logger.info('Listed labels', { count: labels.length });
|
|
80
|
+
return labels;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Create a new label
|
|
84
|
+
*/
|
|
85
|
+
async createLabel(input) {
|
|
86
|
+
logger.debug('Creating label', { name: input.name });
|
|
87
|
+
const label = await this.wsCommand('config/label_registry/create', {
|
|
88
|
+
name: input.name,
|
|
89
|
+
color: input.color,
|
|
90
|
+
icon: input.icon,
|
|
91
|
+
description: input.description,
|
|
92
|
+
});
|
|
93
|
+
logger.info('Created label', { label_id: label.label_id, name: label.name });
|
|
94
|
+
return label;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Update an existing label
|
|
98
|
+
*/
|
|
99
|
+
async updateLabel(labelId, input) {
|
|
100
|
+
logger.debug('Updating label', { label_id: labelId });
|
|
101
|
+
const label = await this.wsCommand('config/label_registry/update', {
|
|
102
|
+
label_id: labelId,
|
|
103
|
+
...input,
|
|
104
|
+
});
|
|
105
|
+
logger.info('Updated label', { label_id: label.label_id });
|
|
106
|
+
return label;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Delete a label
|
|
110
|
+
*/
|
|
111
|
+
async deleteLabel(labelId) {
|
|
112
|
+
logger.debug('Deleting label', { label_id: labelId });
|
|
113
|
+
await this.wsCommand('config/label_registry/delete', { label_id: labelId });
|
|
114
|
+
logger.info('Deleted label', { label_id: labelId });
|
|
115
|
+
}
|
|
116
|
+
// ===== Entity Registry Operations =====
|
|
117
|
+
/**
|
|
118
|
+
* List all entities in the registry
|
|
119
|
+
*/
|
|
120
|
+
async listEntityRegistry() {
|
|
121
|
+
logger.debug('Listing entity registry');
|
|
122
|
+
const entities = await this.wsCommand('config/entity_registry/list');
|
|
123
|
+
logger.info('Listed entity registry', { count: entities.length });
|
|
124
|
+
return entities;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get a single entity from the registry
|
|
128
|
+
*/
|
|
129
|
+
async getEntityRegistryEntry(entityId) {
|
|
130
|
+
logger.debug('Getting entity registry entry', { entity_id: entityId });
|
|
131
|
+
const entity = await this.wsCommand('config/entity_registry/get', {
|
|
132
|
+
entity_id: entityId,
|
|
133
|
+
});
|
|
134
|
+
return entity;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Update an entity in the registry (including labels)
|
|
138
|
+
*/
|
|
139
|
+
async updateEntityRegistry(entityId, updates) {
|
|
140
|
+
logger.debug('Updating entity registry', { entity_id: entityId, updates });
|
|
141
|
+
const entity = await this.wsCommand('config/entity_registry/update', {
|
|
142
|
+
entity_id: entityId,
|
|
143
|
+
...updates,
|
|
144
|
+
});
|
|
145
|
+
logger.info('Updated entity registry', { entity_id: entityId });
|
|
146
|
+
return entity;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get entities by label
|
|
150
|
+
*/
|
|
151
|
+
async getEntitiesByLabel(labelId) {
|
|
152
|
+
logger.debug('Getting entities by label', { label_id: labelId });
|
|
153
|
+
const allEntities = await this.listEntityRegistry();
|
|
154
|
+
const filtered = allEntities.filter(e => e.labels.includes(labelId));
|
|
155
|
+
logger.info('Found entities with label', { label_id: labelId, count: filtered.length });
|
|
156
|
+
return filtered;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Assign a label to an entity
|
|
160
|
+
*/
|
|
161
|
+
async assignLabelToEntity(entityId, labelId) {
|
|
162
|
+
logger.debug('Assigning label to entity', { entity_id: entityId, label_id: labelId });
|
|
163
|
+
const entity = await this.getEntityRegistryEntry(entityId);
|
|
164
|
+
const labels = entity.labels.includes(labelId) ? entity.labels : [...entity.labels, labelId];
|
|
165
|
+
return this.updateEntityRegistry(entityId, { labels });
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Remove a label from an entity
|
|
169
|
+
*/
|
|
170
|
+
async removeLabelFromEntity(entityId, labelId) {
|
|
171
|
+
logger.debug('Removing label from entity', { entity_id: entityId, label_id: labelId });
|
|
172
|
+
const entity = await this.getEntityRegistryEntry(entityId);
|
|
173
|
+
const labels = entity.labels.filter(l => l !== labelId);
|
|
174
|
+
return this.updateEntityRegistry(entityId, { labels });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.js","sourceRoot":"","sources":["../../src/haClient/labels.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication middleware for HTTP server
|
|
3
|
+
* Supports bearer token authentication with multi-token support
|
|
4
|
+
*/
|
|
5
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
6
|
+
export type AuthMethod = 'none' | 'bearer';
|
|
7
|
+
export interface AuthConfig {
|
|
8
|
+
method: AuthMethod;
|
|
9
|
+
tokens?: Set<string>;
|
|
10
|
+
skipPaths?: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface AuthResult {
|
|
13
|
+
authenticated: boolean;
|
|
14
|
+
error?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Authentication middleware
|
|
18
|
+
* Returns true if request should proceed, false if blocked
|
|
19
|
+
*/
|
|
20
|
+
export declare function createAuthMiddleware(config: AuthConfig): (req: IncomingMessage, res: ServerResponse) => boolean;
|