@coffeerunhobby/mcp-ha-connect 2.4.4 → 2.4.5

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.
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Vendor-neutral network tools (net_*). They speak the shared model (src/net/model.ts)
3
+ * and work through whichever adapter is configured (Omada today; UniFi and MikroTik
4
+ * later). Every write is planned first: dryRun returns the plan, otherwise the plan is
5
+ * applied, refused if the controller changed meanwhile or if online devices would be
6
+ * cut off without allowLockout.
7
+ *
8
+ * 2.4.5: networks and Wi-Fi. Rules arrive in 2.4.6, switch ports and mDNS in 2.4.7.
9
+ */
10
+ import type { McpServer } from '@modelcontextprotocol/server';
11
+ import { z } from 'zod';
12
+ import { type NetworkController } from '../../net/model.js';
13
+ export declare const createNetworkSchema: z.ZodObject<{
14
+ name: z.ZodString;
15
+ vlan: z.ZodNumber;
16
+ gateway: z.ZodOptional<z.ZodString>;
17
+ purpose: z.ZodOptional<z.ZodEnum<{
18
+ guest: "guest";
19
+ normal: "normal";
20
+ vlanOnly: "vlanOnly";
21
+ }>>;
22
+ dhcp: z.ZodOptional<z.ZodObject<{
23
+ enabled: z.ZodBoolean;
24
+ from: z.ZodOptional<z.ZodString>;
25
+ to: z.ZodOptional<z.ZodString>;
26
+ leaseMinutes: z.ZodOptional<z.ZodNumber>;
27
+ dns: z.ZodOptional<z.ZodArray<z.ZodString>>;
28
+ }, z.core.$strip>>;
29
+ ipv6: z.ZodOptional<z.ZodBoolean>;
30
+ isolated: z.ZodOptional<z.ZodBoolean>;
31
+ dryRun: z.ZodOptional<z.ZodBoolean>;
32
+ }, z.core.$strip>;
33
+ export declare const updateNetworkSchema: z.ZodObject<{
34
+ network: z.ZodString;
35
+ name: z.ZodOptional<z.ZodString>;
36
+ vlan: z.ZodOptional<z.ZodNumber>;
37
+ gateway: z.ZodOptional<z.ZodString>;
38
+ dhcp: z.ZodOptional<z.ZodObject<{
39
+ enabled: z.ZodBoolean;
40
+ from: z.ZodOptional<z.ZodString>;
41
+ to: z.ZodOptional<z.ZodString>;
42
+ leaseMinutes: z.ZodOptional<z.ZodNumber>;
43
+ dns: z.ZodOptional<z.ZodArray<z.ZodString>>;
44
+ }, z.core.$strip>>;
45
+ ipv6: z.ZodOptional<z.ZodBoolean>;
46
+ isolated: z.ZodOptional<z.ZodBoolean>;
47
+ dryRun: z.ZodOptional<z.ZodBoolean>;
48
+ allowLockout: z.ZodOptional<z.ZodBoolean>;
49
+ }, z.core.$strip>;
50
+ export declare const deleteNetworkSchema: z.ZodObject<{
51
+ network: z.ZodString;
52
+ dryRun: z.ZodOptional<z.ZodBoolean>;
53
+ allowLockout: z.ZodOptional<z.ZodBoolean>;
54
+ }, z.core.$strip>;
55
+ export declare const createWifiSchema: z.ZodObject<{
56
+ name: z.ZodString;
57
+ network: z.ZodString;
58
+ bands: z.ZodOptional<z.ZodArray<z.ZodEnum<{
59
+ 5: "5";
60
+ 6: "6";
61
+ 2.4: "2.4";
62
+ }>>>;
63
+ security: z.ZodOptional<z.ZodEnum<{
64
+ open: "open";
65
+ wpa2: "wpa2";
66
+ wpa3: "wpa3";
67
+ wpa2wpa3: "wpa2wpa3";
68
+ }>>;
69
+ pmf: z.ZodOptional<z.ZodEnum<{
70
+ optional: "optional";
71
+ off: "off";
72
+ required: "required";
73
+ }>>;
74
+ clientIsolation: z.ZodOptional<z.ZodBoolean>;
75
+ hidden: z.ZodOptional<z.ZodBoolean>;
76
+ fastRoaming: z.ZodOptional<z.ZodBoolean>;
77
+ macFilter: z.ZodOptional<z.ZodObject<{
78
+ policy: z.ZodEnum<{
79
+ allow: "allow";
80
+ deny: "deny";
81
+ }>;
82
+ group: z.ZodString;
83
+ }, z.core.$strip>>;
84
+ dryRun: z.ZodOptional<z.ZodBoolean>;
85
+ }, z.core.$strip>;
86
+ export declare const updateWifiSchema: z.ZodObject<{
87
+ wifi: z.ZodString;
88
+ name: z.ZodOptional<z.ZodString>;
89
+ network: z.ZodOptional<z.ZodString>;
90
+ bands: z.ZodOptional<z.ZodArray<z.ZodEnum<{
91
+ 5: "5";
92
+ 6: "6";
93
+ 2.4: "2.4";
94
+ }>>>;
95
+ security: z.ZodOptional<z.ZodEnum<{
96
+ open: "open";
97
+ wpa2: "wpa2";
98
+ wpa3: "wpa3";
99
+ wpa2wpa3: "wpa2wpa3";
100
+ }>>;
101
+ pmf: z.ZodOptional<z.ZodEnum<{
102
+ optional: "optional";
103
+ off: "off";
104
+ required: "required";
105
+ }>>;
106
+ clientIsolation: z.ZodOptional<z.ZodBoolean>;
107
+ hidden: z.ZodOptional<z.ZodBoolean>;
108
+ fastRoaming: z.ZodOptional<z.ZodBoolean>;
109
+ macFilter: z.ZodOptional<z.ZodNullable<z.ZodObject<{
110
+ policy: z.ZodEnum<{
111
+ allow: "allow";
112
+ deny: "deny";
113
+ }>;
114
+ group: z.ZodString;
115
+ }, z.core.$strip>>>;
116
+ newTemporaryPassword: z.ZodOptional<z.ZodBoolean>;
117
+ dryRun: z.ZodOptional<z.ZodBoolean>;
118
+ allowLockout: z.ZodOptional<z.ZodBoolean>;
119
+ }, z.core.$strip>;
120
+ export declare const deleteWifiSchema: z.ZodObject<{
121
+ wifi: z.ZodString;
122
+ dryRun: z.ZodOptional<z.ZodBoolean>;
123
+ allowLockout: z.ZodOptional<z.ZodBoolean>;
124
+ }, z.core.$strip>;
125
+ export declare function registerNetTools(server: McpServer, controller: NetworkController): number;
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Vendor-neutral network tools (net_*). They speak the shared model (src/net/model.ts)
3
+ * and work through whichever adapter is configured (Omada today; UniFi and MikroTik
4
+ * later). Every write is planned first: dryRun returns the plan, otherwise the plan is
5
+ * applied, refused if the controller changed meanwhile or if online devices would be
6
+ * cut off without allowLockout.
7
+ *
8
+ * 2.4.5: networks and Wi-Fi. Rules arrive in 2.4.6, switch ports and mDNS in 2.4.7.
9
+ */
10
+ import { z } from 'zod';
11
+ import { Permission, toToolResult, wrapToolHandler } from '../common.js';
12
+ const ref = (what) => z.string().min(1).describe(`${what} name or id`);
13
+ const dryRun = z.boolean().optional().describe('Only show what would change (steps, effects, devices cut off); write nothing');
14
+ const allowLockout = z.boolean().optional().describe('Apply even if online devices would be disconnected');
15
+ const band = z.enum(['2.4', '5', '6']);
16
+ const dhcp = z.object({
17
+ enabled: z.boolean(),
18
+ from: z.string().optional().describe('First address of the DHCP range'),
19
+ to: z.string().optional().describe('Last address of the DHCP range'),
20
+ leaseMinutes: z.number().int().optional().describe('2-10080, default 120'),
21
+ dns: z.array(z.string()).max(2).optional().describe('DNS servers handed out; default: the gateway'),
22
+ }).refine((d) => (d.from === undefined) === (d.to === undefined), { message: 'Give both ends of the DHCP range (from and to), or neither' });
23
+ const macFilter = z.object({ policy: z.enum(['allow', 'deny']), group: ref('MAC group') });
24
+ export const createNetworkSchema = z.object({
25
+ name: z.string().min(1).max(128),
26
+ vlan: z.number().int().describe('2-4090'),
27
+ gateway: z.string().optional().describe('Gateway address with prefix, e.g. "192.168.3.1/24" (not for vlanOnly)'),
28
+ purpose: z.enum(['normal', 'guest', 'vlanOnly']).optional().describe('normal (default): routed with DHCP; vlanOnly: switches only'),
29
+ dhcp: dhcp.optional(),
30
+ ipv6: z.boolean().optional().describe('Default off'),
31
+ isolated: z.boolean().optional().describe("Devices can't start connections to other networks"),
32
+ dryRun,
33
+ });
34
+ export const updateNetworkSchema = z.object({
35
+ network: ref('Network'),
36
+ name: z.string().min(1).max(128).optional(),
37
+ vlan: z.number().int().optional(),
38
+ gateway: z.string().optional(),
39
+ dhcp: dhcp.optional(),
40
+ ipv6: z.boolean().optional(),
41
+ isolated: z.boolean().optional(),
42
+ dryRun,
43
+ allowLockout,
44
+ });
45
+ export const deleteNetworkSchema = z.object({ network: ref('Network'), dryRun, allowLockout });
46
+ export const createWifiSchema = z.object({
47
+ name: z.string().min(1).max(32),
48
+ network: ref('Network the Wi-Fi puts its devices on'),
49
+ bands: z.array(band).min(1).optional().describe('Default ["2.4", "5"]'),
50
+ security: z.enum(['open', 'wpa2', 'wpa3', 'wpa2wpa3']).optional().describe('Default wpa2'),
51
+ pmf: z.enum(['off', 'optional', 'required']).optional().describe('Protected management frames, default optional'),
52
+ clientIsolation: z.boolean().optional().describe("Devices can't reach each other"),
53
+ hidden: z.boolean().optional(),
54
+ fastRoaming: z.boolean().optional().describe('802.11r, default off'),
55
+ macFilter: macFilter.optional().describe('Only (allow) or never (deny) the devices in a MAC group'),
56
+ dryRun,
57
+ });
58
+ export const updateWifiSchema = z.object({
59
+ wifi: ref('Wi-Fi network'),
60
+ name: z.string().min(1).max(32).optional(),
61
+ network: ref('Network').optional(),
62
+ bands: z.array(band).min(1).optional(),
63
+ security: z.enum(['open', 'wpa2', 'wpa3', 'wpa2wpa3']).optional(),
64
+ pmf: z.enum(['off', 'optional', 'required']).optional(),
65
+ clientIsolation: z.boolean().optional(),
66
+ hidden: z.boolean().optional(),
67
+ fastRoaming: z.boolean().optional(),
68
+ macFilter: macFilter.nullable().optional().describe('null switches the MAC filter off'),
69
+ newTemporaryPassword: z.boolean().optional().describe('Replace the password with a random one nobody knows (set the real one in the controller web UI)'),
70
+ dryRun,
71
+ allowLockout,
72
+ });
73
+ export const deleteWifiSchema = z.object({ wifi: ref('Wi-Fi network'), dryRun, allowLockout });
74
+ const NO_PASSWORD = ' Passwords are never taken or shown: a new or reset Wi-Fi network gets a random temporary password, and the owner sets the real one in the controller web UI.';
75
+ const CONFIRM = ' Confirm with the user before applying (use dryRun first).';
76
+ /** Plan, then apply unless dryRun. */
77
+ async function run(controller, change, options) {
78
+ const plan = await controller.plan(change);
79
+ if (options.dryRun)
80
+ return { dryRun: true, ...summary(plan) };
81
+ const result = await controller.apply(plan, { allowLockout: options.allowLockout });
82
+ return { applied: true, controller: controller.id, steps: plan.steps, effects: plan.effects, ...(result.object ? { result: result.object } : {}) };
83
+ }
84
+ function summary(plan) {
85
+ return {
86
+ controller: plan.vendor,
87
+ steps: plan.steps,
88
+ effects: plan.effects,
89
+ wouldLockOut: plan.wouldLockOut.map((c) => ({ mac: c.mac, name: c.name })),
90
+ ...(plan.wouldLockOut.length ? { note: 'Applying needs allowLockout: these online devices would be disconnected.' } : {}),
91
+ };
92
+ }
93
+ export function registerNetTools(server, controller) {
94
+ server.registerTool('net_capabilities', { description: 'What the network controller can do: per feature native, emulated (built from several objects) or unsupported.', inputSchema: z.object({}) }, wrapToolHandler('net_capabilities', async () => toToolResult({ controller: controller.id, ...(await controller.capabilities()) }), Permission.QUERY));
95
+ server.registerTool('net_listNetworks', { description: 'List networks (VLANs): VLAN, gateway, DHCP, IPv6, and whether it is protected (carries the controller).', inputSchema: z.object({}) }, wrapToolHandler('net_listNetworks', async () => toToolResult(await controller.listNetworks()), Permission.QUERY));
96
+ server.registerTool('net_listWifi', { description: 'List Wi-Fi networks: the network they put devices on, bands, security, isolation, MAC filter. Passwords are never shown.', inputSchema: z.object({}) }, wrapToolHandler('net_listWifi', async () => toToolResult(await controller.listWifi()), Permission.QUERY));
97
+ server.registerTool('net_createNetwork', {
98
+ description: 'Create a network (VLAN) on the gateway: VLAN id, gateway address with prefix, DHCP range. Refuses a VLAN, name or subnet already in use.' +
99
+ CONFIRM,
100
+ inputSchema: createNetworkSchema,
101
+ }, wrapToolHandler('net_createNetwork', async (a) => toToolResult(await run(controller, {
102
+ op: 'create',
103
+ kind: 'network',
104
+ value: {
105
+ name: a.name,
106
+ purpose: a.purpose ?? 'normal',
107
+ vlan: a.vlan,
108
+ ...(a.gateway ? { gateway: a.gateway } : {}),
109
+ ...(a.dhcp ? { dhcp: toDhcp(a.dhcp) } : {}),
110
+ ipv6: a.ipv6 ?? false,
111
+ isolated: a.isolated ?? false,
112
+ },
113
+ }, a)), Permission.CONFIGURE));
114
+ server.registerTool('net_updateNetwork', {
115
+ description: "Change a network: name, VLAN, gateway, DHCP, IPv6 off. Never changes the VLAN or gateway of the network the controller is on; changes that cut devices off need allowLockout." +
116
+ CONFIRM,
117
+ inputSchema: updateNetworkSchema,
118
+ }, wrapToolHandler('net_updateNetwork', async (a) => toToolResult(await run(controller, {
119
+ op: 'update',
120
+ kind: 'network',
121
+ value: {
122
+ ref: { name: a.network },
123
+ set: {
124
+ ...(a.name !== undefined ? { name: a.name } : {}),
125
+ ...(a.vlan !== undefined ? { vlan: a.vlan } : {}),
126
+ ...(a.gateway !== undefined ? { gateway: a.gateway } : {}),
127
+ ...(a.dhcp !== undefined ? { dhcp: toDhcp(a.dhcp) } : {}),
128
+ ...(a.ipv6 !== undefined ? { ipv6: a.ipv6 } : {}),
129
+ ...(a.isolated !== undefined ? { isolated: a.isolated } : {}),
130
+ },
131
+ },
132
+ }, a)), Permission.CONFIGURE));
133
+ server.registerTool('net_deleteNetwork', {
134
+ description: 'Delete a network. Refused while a Wi-Fi network, port profile, DHCP reservation or rule uses it, and for the network the controller is on.' + CONFIRM,
135
+ inputSchema: deleteNetworkSchema,
136
+ }, wrapToolHandler('net_deleteNetwork', async (a) => toToolResult(await run(controller, { op: 'delete', kind: 'network', ref: { name: a.network } }, a)), Permission.CONFIGURE));
137
+ server.registerTool('net_createWifi', {
138
+ description: 'Create a Wi-Fi network (SSID) that puts its devices on a given network (VLAN).' + NO_PASSWORD + CONFIRM,
139
+ inputSchema: createWifiSchema,
140
+ }, wrapToolHandler('net_createWifi', async (a) => toToolResult(await run(controller, {
141
+ op: 'create',
142
+ kind: 'wifi',
143
+ value: {
144
+ name: a.name,
145
+ network: { name: a.network },
146
+ bands: a.bands ?? ['2.4', '5'],
147
+ security: a.security ?? 'wpa2',
148
+ pmf: a.pmf ?? 'optional',
149
+ clientIsolation: a.clientIsolation ?? false,
150
+ hidden: a.hidden ?? false,
151
+ fastRoaming: a.fastRoaming ?? false,
152
+ macFilter: a.macFilter ? { policy: a.macFilter.policy, group: { name: a.macFilter.group } } : null,
153
+ enabled: true,
154
+ },
155
+ passphrase: { kind: 'temporary' },
156
+ }, a)), Permission.CONFIGURE));
157
+ server.registerTool('net_updateWifi', {
158
+ description: 'Change a Wi-Fi network: name, network (VLAN), bands, security, PMF, isolation, hidden, 802.11r, MAC filter, or reset its password to a random one.' +
159
+ ' Changes that disconnect devices need allowLockout.' +
160
+ NO_PASSWORD +
161
+ CONFIRM,
162
+ inputSchema: updateWifiSchema,
163
+ }, wrapToolHandler('net_updateWifi', async (a) => toToolResult(await run(controller, {
164
+ op: 'update',
165
+ kind: 'wifi',
166
+ value: {
167
+ ref: { name: a.wifi },
168
+ set: {
169
+ ...(a.name !== undefined ? { name: a.name } : {}),
170
+ ...(a.network !== undefined ? { network: { name: a.network } } : {}),
171
+ ...(a.bands !== undefined ? { bands: a.bands } : {}),
172
+ ...(a.security !== undefined ? { security: a.security } : {}),
173
+ ...(a.pmf !== undefined ? { pmf: a.pmf } : {}),
174
+ ...(a.clientIsolation !== undefined ? { clientIsolation: a.clientIsolation } : {}),
175
+ ...(a.hidden !== undefined ? { hidden: a.hidden } : {}),
176
+ ...(a.fastRoaming !== undefined ? { fastRoaming: a.fastRoaming } : {}),
177
+ ...(a.macFilter !== undefined ? { macFilter: a.macFilter ? { policy: a.macFilter.policy, group: { name: a.macFilter.group } } : null } : {}),
178
+ },
179
+ },
180
+ passphrase: a.newTemporaryPassword ? { kind: 'temporary' } : { kind: 'unchanged' },
181
+ }, a)), Permission.CONFIGURE));
182
+ server.registerTool('net_deleteWifi', { description: 'Delete a Wi-Fi network; its connected devices are disconnected (needs allowLockout then).' + CONFIRM, inputSchema: deleteWifiSchema }, wrapToolHandler('net_deleteWifi', async (a) => toToolResult(await run(controller, { op: 'delete', kind: 'wifi', ref: { name: a.wifi } }, a)), Permission.CONFIGURE));
183
+ return 9;
184
+ }
185
+ function toDhcp(d) {
186
+ return {
187
+ enabled: d.enabled,
188
+ ...(d.from && d.to ? { range: { from: d.from, to: d.to } } : {}),
189
+ ...(d.leaseMinutes !== undefined ? { leaseMinutes: d.leaseMinutes } : {}),
190
+ ...(d.dns ? { dns: d.dns } : {}),
191
+ };
192
+ }
193
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/net/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** Small IPv4 helpers shared by the Omada access control and the vendor-neutral net_* tools. */
2
+ /** "192.0.2.10" -> 3221225994. Throws on anything that is not a dotted IPv4 address. */
3
+ export declare function ipToNumber(ip: string): number;
4
+ /** "192.0.2.1/24" -> { ip, prefix, network, broadcast } (numbers). Throws on bad input. */
5
+ export declare function parseCidr(value: string): {
6
+ ip: string;
7
+ prefix: number;
8
+ network: number;
9
+ broadcast: number;
10
+ };
11
+ /** Whether an address lies inside a CIDR ("192.0.2.0/24" or a gateway form "192.0.2.1/24"). */
12
+ export declare function inSubnet(address: number, cidr: string): boolean;
13
+ /** Whether two CIDRs share any address. */
14
+ export declare function subnetsOverlap(a: string, b: string): boolean;
@@ -0,0 +1,37 @@
1
+ /** Small IPv4 helpers shared by the Omada access control and the vendor-neutral net_* tools. */
2
+ /** "192.0.2.10" -> 3221225994. Throws on anything that is not a dotted IPv4 address. */
3
+ export function ipToNumber(ip) {
4
+ const parts = ip.trim().split('.');
5
+ if (parts.length !== 4 || parts.some((p) => !/^\d{1,3}$/.test(p) || Number(p) > 255)) {
6
+ throw new Error(`'${ip}' is not an IPv4 address`);
7
+ }
8
+ return parts.reduce((n, p) => n * 256 + Number(p), 0);
9
+ }
10
+ /** "192.0.2.1/24" -> { ip, prefix, network, broadcast } (numbers). Throws on bad input. */
11
+ export function parseCidr(value) {
12
+ const [ip, bits] = value.trim().split('/');
13
+ const address = ipToNumber(ip);
14
+ const prefix = bits === undefined ? 32 : Number(bits);
15
+ if (!Number.isInteger(prefix) || prefix < 0 || prefix > 32)
16
+ throw new Error(`'${value}': the prefix must be 0 to 32`);
17
+ const size = 2 ** (32 - prefix);
18
+ const network = Math.floor(address / size) * size;
19
+ return { ip, prefix, network, broadcast: network + size - 1 };
20
+ }
21
+ /** Whether an address lies inside a CIDR ("192.0.2.0/24" or a gateway form "192.0.2.1/24"). */
22
+ export function inSubnet(address, cidr) {
23
+ try {
24
+ const { network, broadcast } = parseCidr(cidr);
25
+ return address >= network && address <= broadcast;
26
+ }
27
+ catch {
28
+ return false;
29
+ }
30
+ }
31
+ /** Whether two CIDRs share any address. */
32
+ export function subnetsOverlap(a, b) {
33
+ const x = parseCidr(a);
34
+ const y = parseCidr(b);
35
+ return x.network <= y.broadcast && y.network <= x.broadcast;
36
+ }
37
+ //# sourceMappingURL=ipv4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipv4.js","sourceRoot":"","sources":["../../src/utils/ipv4.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAEhG,wFAAwF;AACxF,MAAM,UAAU,UAAU,CAAC,EAAU;IACjC,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,SAAS,CAAC,KAAa;IACnC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,+BAA+B,CAAC,CAAC;IACtH,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAClD,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,IAAY;IAClD,IAAI,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/C,OAAO,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,SAAS,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,cAAc,CAAC,CAAS,EAAE,CAAS;IAC/C,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,CAAC;AAChE,CAAC"}
package/dist/version.d.ts CHANGED
@@ -2,4 +2,4 @@
2
2
  * Package version - hardcoded at build time for reliability
3
3
  * Keep in sync with package.json version
4
4
  */
5
- export declare const VERSION = "2.4.4";
5
+ export declare const VERSION = "2.4.5";
package/dist/version.js CHANGED
@@ -2,5 +2,5 @@
2
2
  * Package version - hardcoded at build time for reliability
3
3
  * Keep in sync with package.json version
4
4
  */
5
- export const VERSION = '2.4.4';
5
+ export const VERSION = '2.4.5';
6
6
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coffeerunhobby/mcp-ha-connect",
3
- "version": "2.4.4",
3
+ "version": "2.4.5",
4
4
  "description": "Smart home MCP server for Home Assistant plus Local AI integration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",