@mp-consulting/homebridge-ai-kit 2.0.2 → 2.1.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/README.md CHANGED
@@ -15,7 +15,7 @@ The AI building blocks that don't need MCP also ship on their own as [`@mp-consu
15
15
  - [Packages](#packages)
16
16
  - [Features](#features)
17
17
  - [Providers](#providers)
18
- - [Homebridge plugin](#homebridge-plugin)
18
+ - [Homebridge plugin](#homebridge-plugin) · [MCP tokens](#mcp-tokens)
19
19
  - [MCP server](#mcp-server)
20
20
  - [Library API](#library-api)
21
21
  - [Security](#security)
@@ -29,13 +29,13 @@ This repository is an npm workspace that publishes two packages, both at version
29
29
  | Package | Use it for | Runtime dependencies |
30
30
  |---|---|---|
31
31
  | [`@mp-consulting/homebridge-ai-core`](packages/ai-core) | **Homebridge plugins.** The plugin-UI Assistant routes (`registerAiRoutes` from `./plugin`), providers, redaction, prompts, config and the Assistant features (everything except `runAgent`). | `ajv` only |
32
- | `@mp-consulting/homebridge-ai-kit` (this package) | **Homebridge Glass UI and MCP.** Everything in ai-core (re-exported) plus the MCP server, `runAgent`, the `HomebridgeAiKit` Homebridge plugin and `mcpClientSnippets`. | ai-core, `@modelcontextprotocol/sdk`, `socket.io-client`, `zod`, `@homebridge/plugin-ui-utils` |
32
+ | `@mp-consulting/homebridge-ai-kit` (this package) | **Homebridge Glass UI and MCP.** Everything in ai-core (re-exported) plus the MCP server, `runAgent`, the `HomebridgeAiKit` Homebridge plugin and `mcpClientSnippets`. | ai-core, `@modelcontextprotocol/sdk`, `socket.io-client`, `zod`, `undici`, `@homebridge/plugin-ui-utils` |
33
33
 
34
34
  Plugins should depend on **ai-core**, so installing them doesn't pull in the MCP SDK, socket.io or zod. ai-kit stays backward compatible: its `.` and `./plugin` exports re-export everything ai-core has under the same names, so code that imports from ai-kit keeps working.
35
35
 
36
36
  ## Features
37
37
 
38
- **MCP tools** (31): accessories (list, get, control with value checks, room layout), server (status, restart, pairing, cached accessories), child bridges (list, restart, stop, start), config (read with secrets redacted, full write, partial `patch_config`), plugins (list, search, versions, schema, changelog, install, update, uninstall), system info and logs (recent lines, regex search).
38
+ **MCP tools** (32): accessories (list, get, control with value checks, room layout, sensor history), server (status, restart, pairing, cached accessories), child bridges (list, restart, stop, start), config (read with secrets redacted, full write, partial `patch_config`), plugins (list, search, versions, schema, changelog, install, update, uninstall), system info and logs (recent lines, regex search).
39
39
 
40
40
  **MCP resources** you can subscribe to: `homebridge://accessories`, `homebridge://logs/recent`, `homebridge://status`. Changes arrive over the Homebridge UI's socket.io namespaces, or by polling when the socket can't be used.
41
41
 
@@ -86,7 +86,10 @@ Then open its settings in the Homebridge UI. The settings page edits the `Homebr
86
86
  "port": 8582,
87
87
  "token": "…", // bearer token MCP clients must send
88
88
  "homebridgeUrl": "http://127.0.0.1:8581",
89
- "homebridgeToken": "hbg_…" // Glass UI API token the tools act with
89
+ "homebridgeToken": "hbg_…", // Glass UI API token the tools act with
90
+ "homebridgeTokenId": "…", // written by Glass UI so it can revoke that token; leave as is
91
+ "homebridgeCertFingerprint": "AB:CD:…", // https UI with a self-signed certificate: its SHA-256 fingerprint
92
+ "homebridgeCertPath": "/path/to/certificate.pem" // or a PEM with the UI's certificate or its CA
90
93
  }
91
94
  }
92
95
  }
@@ -94,6 +97,36 @@ Then open its settings in the Homebridge UI. The settings page edits the `Homebr
94
97
 
95
98
  With `mcp.http.enabled`, the plugin serves MCP at `http://<host>:<port>/mcp` while Homebridge runs. It needs a client token (`mcp.http.token` or `HOMEBRIDGE_AI_MCP_TOKEN`) and Homebridge credentials: a Glass UI API token in `homebridgeToken`, or the `HOMEBRIDGE_*` environment variables. A read-only API token gives clients read-only access.
96
99
 
100
+ ### MCP tokens
101
+
102
+ The MCP server uses two different tokens:
103
+
104
+ | Token | What it is for | Stored in |
105
+ |---|---|---|
106
+ | **Client token** | What Claude, Cursor or another MCP client must send (`Authorization: Bearer …`) to reach the HTTP MCP server | `mcp.http.token` (or `HOMEBRIDGE_AI_MCP_TOKEN` for the CLI) |
107
+ | **Homebridge API token** | What the MCP server sends to the Homebridge UI to run its tools. Its scope decides what clients can do: `read` gives read-only tools, `admin` gives all of them | `mcp.http.homebridgeToken` (or `HOMEBRIDGE_TOKEN` for the CLI) |
108
+
109
+ Where to set or generate them:
110
+
111
+ - **Homebridge Glass UI 2.0.0-beta.6 or later:** *Settings → Assistant → MCP server* generates the client token, creates the Homebridge API token in one click (read-only or admin, revoked again when you replace or remove it), and shows the client configs. Each secret is shown once; after that the page only says whether one is set.
112
+ - **This plugin's settings page:** *Generate* creates a client token. Paste a Homebridge API token created in Glass UI under *Users → API Tokens*.
113
+ - **The CLI:** set `HOMEBRIDGE_AI_MCP_TOKEN` and `HOMEBRIDGE_TOKEN` (see [MCP server](#mcp-server)), e.g. `HOMEBRIDGE_AI_MCP_TOKEN=$(openssl rand -base64 24)`.
114
+
115
+ Glass UI also stores `homebridgeTokenId`, the id of the API token it created, so it can revoke the token when you replace or remove it. The settings page keeps it (and any other field it doesn't show) when it saves.
116
+
117
+ #### Homebridge UI over HTTPS with a self-signed certificate
118
+
119
+ Node refuses a self-signed certificate, so the MCP server can't reach a Homebridge UI served that way until you tell it which certificate to trust. Verification is never turned off: the setting only applies to the server's requests to the Homebridge UI.
120
+
121
+ | Setting | CLI | What it trusts |
122
+ |---|---|---|
123
+ | `mcp.http.homebridgeCertFingerprint` | `HOMEBRIDGE_CERT_FINGERPRINT` | Exactly the certificate with this SHA-256 fingerprint (pinned). Any other certificate, even a valid one, is refused with an error that shows both fingerprints. |
124
+ | `mcp.http.homebridgeCertPath` | `HOMEBRIDGE_CERT_PATH` | The certificates in this PEM file, on top of the public CAs: the UI's own self-signed certificate (accepted under any host name, e.g. `127.0.0.1`) or the CA that issued it (with the normal host name check). |
125
+
126
+ Get the fingerprint on the Homebridge machine with `openssl x509 -noout -fingerprint -sha256 -in <certificate.pem>` (Glass UI's self-signed certificate is `<storage>/ssl-certs/certificate.pem`); colons and case don't matter. Setting both requires the chain to validate against the PEM and the certificate to match the fingerprint. Update the fingerprint when the certificate is renewed. Both only apply to an `https` URL. Resource subscriptions then follow changes by polling, since the socket.io connection keeps Node's default verification.
127
+
128
+ Changes to `mcp.http` apply after a Homebridge restart, since the plugin starts the HTTP server when Homebridge loads it. Treat both tokens like passwords: anyone with the client token can use every tool the Homebridge API token allows.
129
+
97
130
  ### Assistant routes for other plugins
98
131
 
99
132
  A plugin's custom UI server can offer the Assistant with one call. Import the routes from `@mp-consulting/homebridge-ai-core/plugin` (ai-kit's `./plugin` re-exports them, but plugins should depend on the slimmer ai-core). The browser side is `MpKit.ai` from [`@mp-consulting/homebridge-ui-kit`](https://github.com/mp-consulting/homebridge-ui-kit):
@@ -133,6 +166,8 @@ With a `requestId`, the server streams `ai:chunk` `{ requestId, delta }` events,
133
166
  | `HOMEBRIDGE_USERNAME` / `HOMEBRIDGE_PASSWORD` | UI login, when no token is set |
134
167
  | `HOMEBRIDGE_READ_ONLY` | `true` removes every tool that changes something |
135
168
  | `HOMEBRIDGE_TIMEOUT_MS` | Request timeout (default `30000`) |
169
+ | `HOMEBRIDGE_CERT_FINGERPRINT` | SHA-256 fingerprint of an `https` Homebridge UI's self-signed certificate to trust (pinned). See [self-signed certificates](#homebridge-ui-over-https-with-a-self-signed-certificate) |
170
+ | `HOMEBRIDGE_CERT_PATH` | PEM file with the `https` Homebridge UI's certificate or its CA to trust |
136
171
  | `HOMEBRIDGE_AI_MCP_TOKEN` | Bearer token required by `--http` |
137
172
 
138
173
  ### stdio (Claude Desktop, Claude Code, Cursor)
@@ -174,7 +209,7 @@ claude mcp add --transport http homebridge http://127.0.0.1:8582/mcp --header "A
174
209
 
175
210
  | Group | Tools |
176
211
  |---|---|
177
- | Accessories | `list_accessories` (filter by `room`, `type`, `name`, `manufacturer`, `excludeManufacturer`), `get_accessory`, `set_accessory`, `get_accessory_layout` |
212
+ | Accessories | `list_accessories` (filter by `room`, `type`, `name`, `manufacturer`, `excludeManufacturer`), `get_accessory`, `set_accessory`, `get_accessory_layout`, `get_accessory_history` |
178
213
  | Server | `get_homebridge_status`, `get_server_status`, `restart_homebridge`, `get_pairing_info`, `get_cached_accessories`, `remove_cached_accessory`, `reset_cached_accessories` |
179
214
  | Child bridges | `list_child_bridges`, `restart_child_bridge`, `stop_child_bridge`, `start_child_bridge` |
180
215
  | Config | `get_config`, `update_config`, `patch_config` |
@@ -183,6 +218,7 @@ claude mcp add --transport http homebridge http://127.0.0.1:8582/mcp --header "A
183
218
  | Logs | `get_recent_logs`, `search_logs` |
184
219
 
185
220
  - `set_accessory` checks the value against the characteristic first (format, min/max, step, valid values, write permission), coerces `"50"` to `50` or `1` to `true`, and explains what is wrong instead of sending a bad value.
221
+ - `get_accessory_history` returns an accessory's recorded sensor values (temperature, humidity, light level, battery, air quality, power, energy) over the last `hours` (default 24, up to 8760), optionally for one characteristic `type`. Per series it gives `count`, `min` / `max` (value and when), the time-weighted `avg`, `last`, and the `points` averaged down to `maxPoints` (default 48, 2–500), with times in UTC to the minute. It needs Homebridge Glass UI (`GET /api/accessories/:uniqueId/history`), which records these values while Homebridge runs in insecure mode.
186
222
  - `patch_config` changes one platform or accessory block (found by `platform`/`accessory` plus `name`); objects merge, `null` removes a key, and `__REDACTED__` keeps the current secret.
187
223
  - `install_plugin`, `update_plugin` and `uninstall_plugin` start a job on the Homebridge UI and wait up to two minutes for it; `get_plugin_job` follows a longer one. They need Homebridge Glass UI (`POST /api/plugins/install|update|uninstall`, `GET /api/plugins/jobs/:id`).
188
224
  - The log tools need a Homebridge install managed by [hb-service](https://github.com/homebridge/homebridge-config-ui-x/wiki/Homebridge-Service-Command).
@@ -235,6 +271,7 @@ Everything in this table except `runAgent` comes from `@mp-consulting/homebridge
235
271
  - **HTTP is locked down.** The HTTP transport requires a bearer token, compares it in constant time and binds to `127.0.0.1` by default.
236
272
  - **`update_config` rejects incomplete configs**, and regex log searches run in a worker thread that is killed after 5 seconds.
237
273
  - The server warns if `HOMEBRIDGE_URL` sends credentials over plain `http` to a non-local host.
274
+ - **TLS verification stays on.** A self-signed Homebridge UI certificate is trusted only through `HOMEBRIDGE_CERT_FINGERPRINT` / `HOMEBRIDGE_CERT_PATH` (or the matching `mcp.http` settings), and only for the requests to the Homebridge UI; a certificate that doesn't match is refused.
238
275
 
239
276
  ## Migrating from homebridge-mcp-server
240
277
 
@@ -121,6 +121,27 @@
121
121
  "x-sensitive": true,
122
122
  "description": "An API token from Homebridge Glass UI (Settings, API tokens) the MCP tools act with. Use a read-only token to block changes.",
123
123
  "condition": { "functionBody": "return model.mcp && model.mcp.http && model.mcp.http.enabled;" }
124
+ },
125
+ "homebridgeTokenId": {
126
+ "title": "Homebridge API token id",
127
+ "type": "string",
128
+ "readonly": true,
129
+ "description": "Set by Homebridge Glass UI when it creates the API token above, so it can revoke that token when you replace or remove it. Leave it as is.",
130
+ "condition": { "functionBody": "return model.mcp && model.mcp.http && model.mcp.http.enabled && !!model.mcp.http.homebridgeTokenId;" }
131
+ },
132
+ "homebridgeCertFingerprint": {
133
+ "title": "Trusted certificate fingerprint (SHA-256)",
134
+ "type": "string",
135
+ "placeholder": "AB:CD:EF:…",
136
+ "description": "For a Homebridge UI served over HTTPS with a self-signed certificate: the certificate's SHA-256 fingerprint (openssl x509 -noout -fingerprint -sha256 -in cert.pem). Only that exact certificate is trusted; any other is refused.",
137
+ "condition": { "functionBody": "return model.mcp && model.mcp.http && model.mcp.http.enabled;" }
138
+ },
139
+ "homebridgeCertPath": {
140
+ "title": "Trusted certificate file (PEM)",
141
+ "type": "string",
142
+ "placeholder": "/var/lib/homebridge/ssl-certs/certificate.pem",
143
+ "description": "Alternatively, a PEM file with the Homebridge UI's own certificate or the CA that issued it. It is trusted in addition to the public certificate authorities.",
144
+ "condition": { "functionBody": "return model.mcp && model.mcp.http && model.mcp.http.enabled;" }
124
145
  }
125
146
  }
126
147
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../../src/mcp/create-server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAa/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAM5C,eAAO,MAAM,OAAO,QAAU,CAAC;AAa/B,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAE,aAAkB,GAAG,SAAS,CAS7F;AAED,2FAA2F;AAC3F,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE1D"}
1
+ {"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../../src/mcp/create-server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAc/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAM5C,eAAO,MAAM,OAAO,QAAU,CAAC;AAc/B,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAE,aAAkB,GAAG,SAAS,CAS7F;AAED,2FAA2F;AAC3F,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE1D"}
@@ -2,6 +2,7 @@ import { createRequire } from 'node:module';
2
2
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { createRegistrar } from './tools/helpers.js';
4
4
  import { register as registerAccessories } from './tools/accessories.js';
5
+ import { register as registerHistory } from './tools/history.js';
5
6
  import { register as registerServer } from './tools/server.js';
6
7
  import { register as registerConfig } from './tools/config.js';
7
8
  import { register as registerPlugins } from './tools/plugins.js';
@@ -17,6 +18,7 @@ const { version } = createRequire(import.meta.url)('../../package.json');
17
18
  export const VERSION = version;
18
19
  const TOOL_GROUPS = [
19
20
  registerAccessories,
21
+ registerHistory,
20
22
  registerServer,
21
23
  registerConfig,
22
24
  registerPlugins,
@@ -1 +1 @@
1
- {"version":3,"file":"create-server.js","sourceRoot":"","sources":["../../src/mcp/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,gGAAgG;AAChG,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAwB,CAAC;AAEhG,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,MAAM,WAAW,GAAoB;IACnC,mBAAmB;IACnB,cAAc;IACd,cAAc;IACd,eAAe;IACf,cAAc;IACd,YAAY;IACZ,kBAAkB;IAClB,oBAAoB;CACrB,CAAC;AAYF,MAAM,UAAU,YAAY,CAAC,MAAwB,EAAE,UAAyB,EAAE;IAChF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;QACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC;IACD,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5E,eAAe,CAAC,MAAM,CAAC,CAAC;IACxB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,OAAO,CAAC,KAAyB;IAC/C,OAAO,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"create-server.js","sourceRoot":"","sources":["../../src/mcp/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,gGAAgG;AAChG,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAwB,CAAC;AAEhG,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,MAAM,WAAW,GAAoB;IACnC,mBAAmB;IACnB,eAAe;IACf,cAAc;IACd,cAAc;IACd,eAAe;IACf,cAAc;IACd,YAAY;IACZ,kBAAkB;IAClB,oBAAoB;CACrB,CAAC;AAYF,MAAM,UAAU,YAAY,CAAC,MAAwB,EAAE,UAAyB,EAAE;IAChF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;QACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC;IACD,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5E,eAAe,CAAC,MAAM,CAAC,CAAC;IACxB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,OAAO,CAAC,KAAyB;IAC/C,OAAO,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * HTTP client for the Homebridge Config UI REST API.
3
3
  * Handles JWT authentication, token refresh, and all API calls.
4
4
  */
5
- import type { Accessory, CachedAccessory, ChildBridge, Plugin, PluginJob, Room } from './types.js';
5
+ import type { Accessory, AccessoryHistory, CachedAccessory, ChildBridge, Plugin, PluginJob, Room } from './types.js';
6
6
  export interface LogTail {
7
7
  /** The last `maxBytes` of the log, decoded as UTF-8. May start mid-line when truncated. */
8
8
  text: string;
@@ -28,6 +28,17 @@ export interface HomebridgeClientOptions {
28
28
  timeoutMs?: number;
29
29
  /** The fetch to call Homebridge with, e.g. one that trusts a self-signed certificate. Default: the global fetch. */
30
30
  fetch?: typeof fetch;
31
+ /**
32
+ * SHA-256 fingerprint of the certificate an https Homebridge UI presents, trusted even when
33
+ * self-signed (pinned: any other certificate is refused). Default: `HOMEBRIDGE_CERT_FINGERPRINT`.
34
+ * Ignored when `fetch` is given.
35
+ */
36
+ certFingerprint?: string;
37
+ /**
38
+ * PEM file with the Homebridge UI's own certificate or the CA that issued it, trusted on top
39
+ * of the public roots. Default: `HOMEBRIDGE_CERT_PATH`. Ignored when `fetch` is given.
40
+ */
41
+ certPath?: string;
31
42
  }
32
43
  export declare class HomebridgeClient {
33
44
  private readonly baseUrl;
@@ -38,6 +49,8 @@ export declare class HomebridgeClient {
38
49
  /** In-flight login/refresh, shared so concurrent callers don't each log in. */
39
50
  private renewal;
40
51
  constructor(options?: HomebridgeClientOptions);
52
+ /** A fetch trusting the configured certificate, or undefined when none is configured. */
53
+ private static trustedFetch;
41
54
  /** The Homebridge UI base URL, without a trailing slash. */
42
55
  get url(): string;
43
56
  /** A warning to surface at startup if the configured URL is unsafe, else null. */
@@ -59,6 +72,17 @@ export declare class HomebridgeClient {
59
72
  private request;
60
73
  getAccessories(): Promise<Accessory[]>;
61
74
  getAccessory(uniqueId: string): Promise<Accessory>;
75
+ /**
76
+ * Recorded sensor values of one accessory (Glass UI only).
77
+ * @param options.hours How far back, 24 by default (Glass UI keeps `accessoryHistory.retentionDays`, 7 by default).
78
+ * @param options.type Only this characteristic, e.g. `CurrentTemperature`.
79
+ * @param options.maxPoints Glass UI averages each series down to at most this many points (2–5000, default 500).
80
+ */
81
+ getAccessoryHistory(uniqueId: string, options?: {
82
+ hours?: number;
83
+ type?: string;
84
+ maxPoints?: number;
85
+ }): Promise<AccessoryHistory>;
62
86
  getAccessoryLayout(): Promise<Room[]>;
63
87
  setAccessoryCharacteristic(uniqueId: string, characteristicType: string, value: string | number | boolean): Promise<unknown>;
64
88
  getHomebridgeStatus(): Promise<unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"homebridge-client.d.ts","sourceRoot":"","sources":["../../src/mcp/homebridge-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"homebridge-client.d.ts","sourceRoot":"","sources":["../../src/mcp/homebridge-client.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@
2
2
  * HTTP client for the Homebridge Config UI REST API.
3
3
  * Handles JWT authentication, token refresh, and all API calls.
4
4
  */
5
+ import { readFileSync } from 'node:fs';
6
+ import { createTrustedFetch } from './tls.js';
5
7
  const DEFAULT_TIMEOUT_MS = 30_000;
6
8
  /**
7
9
  * Returns a warning when credentials would cross the network unencrypted, i.e.
@@ -24,6 +26,9 @@ export function insecureTransportWarning(url) {
24
26
  ? null
25
27
  : `HOMEBRIDGE_URL uses plain http to a non-local host (${url.host}); your Homebridge credentials will be sent unencrypted.`;
26
28
  }
29
+ function nonEmpty(value) {
30
+ return value?.trim() || undefined;
31
+ }
27
32
  export class HomebridgeClient {
28
33
  baseUrl;
29
34
  auth;
@@ -71,7 +76,33 @@ export class HomebridgeClient {
71
76
  throw new Error(`HOMEBRIDGE_TIMEOUT_MS must be a positive number of milliseconds, got ${timeout}`);
72
77
  }
73
78
  this.baseUrl = url.replace(/\/+$/, '');
74
- this.fetchImpl = options.fetch;
79
+ this.fetchImpl = options.fetch ?? HomebridgeClient.trustedFetch(parsed, options);
80
+ }
81
+ /** A fetch trusting the configured certificate, or undefined when none is configured. */
82
+ static trustedFetch(url, options) {
83
+ const fingerprint = nonEmpty(options.certFingerprint ?? process.env.HOMEBRIDGE_CERT_FINGERPRINT);
84
+ const certPath = nonEmpty(options.certPath ?? process.env.HOMEBRIDGE_CERT_PATH);
85
+ if (!fingerprint && !certPath) {
86
+ return undefined;
87
+ }
88
+ if (url.protocol !== 'https:') {
89
+ throw new Error('HOMEBRIDGE_CERT_FINGERPRINT and HOMEBRIDGE_CERT_PATH only apply to an https HOMEBRIDGE_URL');
90
+ }
91
+ let certificatePem;
92
+ if (certPath) {
93
+ try {
94
+ certificatePem = readFileSync(certPath, 'utf8');
95
+ }
96
+ catch (error) {
97
+ throw new Error(`Cannot read the certificate file HOMEBRIDGE_CERT_PATH (${certPath}): ${error.message}`, { cause: error });
98
+ }
99
+ }
100
+ try {
101
+ return createTrustedFetch({ fingerprint, certificatePem });
102
+ }
103
+ catch (error) {
104
+ throw new Error(`Cannot trust the Homebridge UI certificate: ${error.message}`, { cause: error });
105
+ }
75
106
  }
76
107
  /** The Homebridge UI base URL, without a trailing slash. */
77
108
  get url() {
@@ -223,6 +254,22 @@ export class HomebridgeClient {
223
254
  async getAccessory(uniqueId) {
224
255
  return this.request('GET', `/api/accessories/${encodeURIComponent(uniqueId)}`);
225
256
  }
257
+ /**
258
+ * Recorded sensor values of one accessory (Glass UI only).
259
+ * @param options.hours How far back, 24 by default (Glass UI keeps `accessoryHistory.retentionDays`, 7 by default).
260
+ * @param options.type Only this characteristic, e.g. `CurrentTemperature`.
261
+ * @param options.maxPoints Glass UI averages each series down to at most this many points (2–5000, default 500).
262
+ */
263
+ async getAccessoryHistory(uniqueId, options = {}) {
264
+ const query = new URLSearchParams();
265
+ for (const [key, value] of Object.entries(options)) {
266
+ if (value !== undefined) {
267
+ query.set(key, String(value));
268
+ }
269
+ }
270
+ const qs = query.size ? `?${query}` : '';
271
+ return this.request('GET', `/api/accessories/${encodeURIComponent(uniqueId)}/history${qs}`);
272
+ }
226
273
  async getAccessoryLayout() {
227
274
  return this.request('GET', '/api/accessories/layout');
228
275
  }
@@ -1 +1 @@
1
- {"version":3,"file":"homebridge-client.js","sourceRoot":"","sources":["../../src/mcp/homebridge-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAQlC;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAQ;IAC/C,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GACT,IAAI,KAAK,WAAW;QACpB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvB,IAAI,KAAK,KAAK;QACd,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAClB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QACxB,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC;QACvC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,KAAK;QACV,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,uDAAuD,GAAG,CAAC,IAAI,0DAA0D,CAAC;AAChI,CAAC;AAqBD,MAAM,OAAO,gBAAgB;IACV,OAAO,CAAS;IAChB,IAAI,CAAW;IACf,SAAS,CAAS;IAClB,SAAS,CAA2B;IAC7C,KAAK,GAAkB,IAAI,CAAC;IACpC,+EAA+E;IACvE,OAAO,GAAyB,IAAI,CAAC;IAE7C,YAAY,UAAmC,EAAE;QAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACxB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC;QAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC,qBAAqB,CAAC;QAE/D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC/D,CAAC;aAAM,IAAI,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACjD,IAAI,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,gBAAgB,CAAE,EAAE,CAAC;QAClF,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC,mBAAmB,CAAC;YAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC,mBAAmB,CAAC;YAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;YACpG,CAAC;YACD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;YACpG,CAAC;YACD,IAAI,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QACpD,CAAC;QAED,IAAI,MAAW,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,8CAA8C,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAChG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,wEAAwE,OAAO,EAAE,CAAC,CAAC;QACrG,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;IACjC,CAAC;IAED,4DAA4D;IAC5D,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,kFAAkF;IAClF,IAAI,gBAAgB;QAClB,OAAO,wBAAwB,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,mEAAmE;IAEnE,2EAA2E;IACnE,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,IAAY,EAAE,OAAoB,EAAE;QACrE,IAAI,CAAC;YACH,6EAA6E;YAC7E,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;gBAC/D,GAAG,IAAI;gBACP,MAAM;gBACN,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;aAC5C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAC5D,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,SAAS,OAAO,MAAM,IAAI,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACjH,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvG,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,IAAI,IAAI,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC;IAED,mEAAmE;IAE3D,KAAK,CAAC,YAAY;QACxB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,EAAE;YACrD,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;SACrF,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA6B,CAAC;QAC5D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,0EAA0E;QAC1E,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,EAAE;gBACvD,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;iBACtC;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA6B,CAAC;YAC5D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,UAAU,CAAC,KAAoB;QAC3C,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,KAAK,CAAC,KAAK,IAAI,EAAE;YAC3B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAChB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,mEAAmE;IAEnE,kGAAkG;IAClG,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC,KAAM,CAAC;IACrB,CAAC;IAED,oFAAoF;IAC5E,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,IAAY,EAAE,IAAc;QACpE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAClC,0EAA0E;YAC1E,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1C,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,OAAO,GAAG,GAAsB,EAAE;YACtC,MAAM,OAAO,GAA2B;gBACtC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;aACtC,CAAC;YAEF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;YAC/C,CAAC;YAED,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;gBAC7B,OAAO;gBACP,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aAC5D,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;QAC7B,IAAI,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;QAE1B,kEAAkE;QAClE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtD,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACjC,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,MAAM,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;QACnF,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,KAAK,CAAC,OAAO,CAAc,MAAc,EAAE,IAAY,EAAE,IAAc;QAC7E,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAEvD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC1D,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC7C,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;QACjC,CAAC;QAED,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiB,CAAC;IAC5C,CAAC;IAED,mEAAmE;IAEnE,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC,OAAO,CAAc,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,OAAO,IAAI,CAAC,OAAO,CAAY,KAAK,EAAE,oBAAoB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,OAAO,IAAI,CAAC,OAAO,CAAS,KAAK,EAAE,yBAAyB,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,0BAA0B,CAC9B,QAAgB,EAChB,kBAA0B,EAC1B,KAAgC;QAEhC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,oBAAoB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EAAE;YAC7E,kBAAkB;YAClB,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED,mEAAmE;IAEnE,KAAK,CAAC,mBAAmB;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,gCAAgC,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,OAAO,IAAI,CAAC,OAAO,CAAoB,KAAK,EAAE,gCAAgC,CAAC,CAAC;IAClF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,qBAAqB,CAAC,IAAY,EAAE,SAAkB;QAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,cAAc,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,kCAAkC,kBAAkB,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;IACtG,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,sCAAsC,CAAC,CAAC;IACrE,CAAC;IAED,mEAAmE;IAEnE,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,OAAO,CAA0B,KAAK,EAAE,oBAAoB,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAe;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;IAED,mEAAmE;IAEnE,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,OAAO,CAAW,KAAK,EAAE,cAAc,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAW,KAAK,EAAE,uBAAuB,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAkB;QACnC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,uBAAuB,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,UAAkB;QACxC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,uBAAuB,kBAAkB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC/F,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,UAAkB;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,8BAA8B,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAkB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,0BAA0B,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,OAAgB;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,sBAAsB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,OAAgB;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,qBAAqB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAY;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,wBAAwB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAY,KAAK,EAAE,qBAAqB,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,mEAAmE;IAEnE,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,CAAC,OAAO,CAAgB,KAAK,EAAE,sCAAsC,CAAC,CAAC;IACpF,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,kBAAkB,CAAC,MAAoC,EAAE,QAAgB;QAC7E,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,eAAe,MAAM,IAAI,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,mEAAmE;IAEnE,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,wCAAwC,CAAC,CAAC;IACvE,CAAC;IAED,mEAAmE;IAEnE;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,6CAA6C,CAAC,CAAC;QACzF,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACxC,CAAC;QAED,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC;YACzB,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;YAC1B,yEAAyE;YACzE,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,QAAQ,EAAE,CAAC;gBACpE,IAAI,IAAI,MAAM,CAAC,KAAK,EAAG,CAAC,UAAU,CAAC;YACrC,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACnG,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,GAAG,QAAQ,EAAE,CAAC;IACtE,CAAC;CACF"}
1
+ {"version":3,"file":"homebridge-client.js","sourceRoot":"","sources":["../../src/mcp/homebridge-client.ts"],"names":[],"mappings":"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"}
@@ -8,5 +8,7 @@ export type { HttpServerOptions, RunningHttpServer } from './http.js';
8
8
  export { LIVE_TOPICS, createLiveSource } from './live.js';
9
9
  export type { LiveOptions, LiveSource, LiveTopic, LiveWatch } from './live.js';
10
10
  export { RESOURCE_URIS } from './resources.js';
11
- export type { Accessory, CharacteristicInfo, ChildBridge, PluginJob, Room } from './types.js';
11
+ export { createTrustedFetch } from './tls.js';
12
+ export type { TrustOptions } from './tls.js';
13
+ export type { Accessory, AccessoryHistory, CharacteristicInfo, ChildBridge, PluginJob, Room } from './types.js';
12
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACpD,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACpD,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC"}
package/dist/mcp/index.js CHANGED
@@ -4,4 +4,5 @@ export { runHttpFromEnv, runStdioServer } from './stdio.js';
4
4
  export { MCP_PATH, runHttpServer } from './http.js';
5
5
  export { LIVE_TOPICS, createLiveSource } from './live.js';
6
6
  export { RESOURCE_URIS } from './resources.js';
7
+ export { createTrustedFetch } from './tls.js';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Trusting a Homebridge UI served over HTTPS with a self-signed certificate,
3
+ * without turning off certificate verification for anything else: the fetch
4
+ * built here is handed to HomebridgeClient only. Global fetch, the providers
5
+ * and every other connection keep Node's normal verification.
6
+ */
7
+ export interface TrustOptions {
8
+ /**
9
+ * SHA-256 fingerprint of the certificate the server must present, as
10
+ * `openssl x509 -noout -fingerprint -sha256` prints it (colons and case don't matter).
11
+ */
12
+ fingerprint?: string;
13
+ /** PEM certificate(s) to trust in addition to the public roots: the server's own (self-signed) certificate or the CA that issued it. */
14
+ certificatePem?: string;
15
+ }
16
+ /**
17
+ * `AB:CD:…` (64 hex digits, upper case) as Node reports `fingerprint256`.
18
+ * Accepts colons, spaces, any case and an `sha256` / `SHA256 Fingerprint=` prefix.
19
+ */
20
+ export declare function normalizeFingerprint(value: string): string;
21
+ /** The SHA-256 fingerprints of every certificate in a PEM file. Throws when it holds none. */
22
+ export declare function pemFingerprints(pem: string): string[];
23
+ /**
24
+ * A fetch that trusts the given certificate (by fingerprint and/or PEM) on
25
+ * top of Node's defaults. Only requests made with it are affected.
26
+ */
27
+ export declare function createTrustedFetch(options: TrustOptions): typeof fetch;
28
+ //# sourceMappingURL=tls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tls.d.ts","sourceRoot":"","sources":["../../src/mcp/tls.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wIAAwI;IACxI,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED,8FAA8F;AAC9F,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAMrD;AAsED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,KAAK,CAKtE"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Trusting a Homebridge UI served over HTTPS with a self-signed certificate,
3
+ * without turning off certificate verification for anything else: the fetch
4
+ * built here is handed to HomebridgeClient only. Global fetch, the providers
5
+ * and every other connection keep Node's normal verification.
6
+ */
7
+ import { X509Certificate } from 'node:crypto';
8
+ import { checkServerIdentity, rootCertificates } from 'node:tls';
9
+ import { Agent, buildConnector, fetch as undiciFetch } from 'undici';
10
+ const PEM_BLOCK = /-----BEGIN CERTIFICATE-----[\s\S]+?-----END CERTIFICATE-----/g;
11
+ /**
12
+ * `AB:CD:…` (64 hex digits, upper case) as Node reports `fingerprint256`.
13
+ * Accepts colons, spaces, any case and an `sha256` / `SHA256 Fingerprint=` prefix.
14
+ */
15
+ export function normalizeFingerprint(value) {
16
+ const hex = value
17
+ .trim()
18
+ .replace(/^sha-?256(\s*fingerprint)?\s*[=:/]?\s*/i, '')
19
+ .replace(/[\s:]/g, '');
20
+ if (!/^[0-9a-f]{64}$/i.test(hex)) {
21
+ throw new Error(`The certificate fingerprint must be a SHA-256 fingerprint (64 hex digits, colons optional), got "${value}"`);
22
+ }
23
+ return hex.toUpperCase().match(/../g).join(':');
24
+ }
25
+ /** The SHA-256 fingerprints of every certificate in a PEM file. Throws when it holds none. */
26
+ export function pemFingerprints(pem) {
27
+ const blocks = pem.match(PEM_BLOCK);
28
+ if (!blocks) {
29
+ throw new Error('no PEM certificate found');
30
+ }
31
+ return blocks.map((block) => new X509Certificate(block).fingerprint256);
32
+ }
33
+ /** A peer certificate's fingerprint; undefined when the server sent none. */
34
+ function peerFingerprint(peer) {
35
+ return peer.fingerprint256 || undefined;
36
+ }
37
+ function mismatch(host, actual, expected) {
38
+ return new Error(`Refusing to connect: the certificate presented by ${host} has SHA-256 fingerprint ${actual ?? '(none)'}, not the pinned ${expected}. ` +
39
+ 'If the Homebridge UI certificate was renewed, update the configured fingerprint.');
40
+ }
41
+ /**
42
+ * The undici connect option for `options`.
43
+ *
44
+ * - With a PEM: the chain must validate against the public roots plus that PEM.
45
+ * When a fingerprint is also set, the leaf must match it; otherwise a leaf
46
+ * that is itself in the PEM (a self-signed certificate) is accepted under any
47
+ * host name, and any other leaf goes through the normal host name check.
48
+ * - With only a fingerprint: the leaf must match it exactly (certificate
49
+ * pinning), checked once the handshake is done and before any request is sent.
50
+ */
51
+ function connectOption(options) {
52
+ const expected = options.fingerprint ? normalizeFingerprint(options.fingerprint) : undefined;
53
+ if (options.certificatePem) {
54
+ const pem = options.certificatePem;
55
+ const trusted = new Set(pemFingerprints(pem));
56
+ return {
57
+ connect: {
58
+ ca: [...rootCertificates, pem],
59
+ checkServerIdentity: (host, peer) => {
60
+ const actual = peerFingerprint(peer);
61
+ if (expected) {
62
+ return actual === expected ? undefined : mismatch(host, actual, expected);
63
+ }
64
+ return actual && trusted.has(actual) ? undefined : checkServerIdentity(host, peer);
65
+ },
66
+ },
67
+ };
68
+ }
69
+ if (!expected) {
70
+ throw new Error('Set a certificate fingerprint or a certificate file to trust');
71
+ }
72
+ // The chain of a self-signed certificate can't validate, so it is not
73
+ // required to: the exact leaf is, which is stricter. No TLS session reuse,
74
+ // so every connection presents its certificate.
75
+ const base = buildConnector({ rejectUnauthorized: false, maxCachedSessions: 0 });
76
+ return {
77
+ connect: (opts, callback) => {
78
+ base(opts, (error, socket) => {
79
+ if (error) {
80
+ callback(error, null);
81
+ return;
82
+ }
83
+ if (opts.protocol === 'https:') {
84
+ const actual = peerFingerprint(socket.getPeerCertificate());
85
+ if (actual !== expected) {
86
+ socket.destroy();
87
+ callback(mismatch(opts.hostname, actual, expected), null);
88
+ return;
89
+ }
90
+ }
91
+ callback(null, socket);
92
+ });
93
+ },
94
+ };
95
+ }
96
+ /**
97
+ * A fetch that trusts the given certificate (by fingerprint and/or PEM) on
98
+ * top of Node's defaults. Only requests made with it are affected.
99
+ */
100
+ export function createTrustedFetch(options) {
101
+ const agent = new Agent(connectOption(options));
102
+ const trustedFetch = (input, init) => undiciFetch(input, { ...init, dispatcher: agent });
103
+ return trustedFetch;
104
+ }
105
+ //# sourceMappingURL=tls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tls.js","sourceRoot":"","sources":["../../src/mcp/tls.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AAYrE,MAAM,SAAS,GAAG,+DAA+D,CAAC;AAElF;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,GAAG,GAAG,KAAK;SACd,IAAI,EAAE;SACN,OAAO,CAAC,yCAAyC,EAAE,EAAE,CAAC;SACtD,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,oGAAoG,KAAK,GAAG,CAAC,CAAC;IAChI,CAAC;IACD,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC;AAC1E,CAAC;AAED,6EAA6E;AAC7E,SAAS,eAAe,CAAC,IAAqB;IAC5C,OAAO,IAAI,CAAC,cAAc,IAAI,SAAS,CAAC;AAC1C,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,MAA0B,EAAE,QAAgB;IAC1E,OAAO,IAAI,KAAK,CACd,qDAAqD,IAAI,4BAA4B,MAAM,IAAI,QAAQ,oBAAoB,QAAQ,IAAI;QACrI,kFAAkF,CACrF,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,aAAa,CAAC,OAAqB;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7F,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,EAAE,CAAC,GAAG,gBAAgB,EAAE,GAAG,CAAC;gBAC9B,mBAAmB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;oBAClC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;oBACrC,IAAI,QAAQ,EAAE,CAAC;wBACb,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;oBAC5E,CAAC;oBACD,OAAO,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACrF,CAAC;aACF;SACF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,sEAAsE;IACtE,2EAA2E;IAC3E,gDAAgD;IAChD,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC;IACjF,OAAO;QACL,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC1B,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBAC3B,IAAI,KAAK,EAAE,CAAC;oBACV,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBACtB,OAAO;gBACT,CAAC;gBACD,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC/B,MAAM,MAAM,GAAG,eAAe,CAAE,MAAoB,CAAC,kBAAkB,EAAE,CAAC,CAAC;oBAC3E,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;wBACxB,MAAM,CAAC,OAAO,EAAE,CAAC;wBACjB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;wBAC1D,OAAO;oBACT,CAAC;gBACH,CAAC;gBACD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAqB;IACtD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,CAAC,KAAwC,EAAE,IAAwC,EAAE,EAAE,CAC1G,WAAW,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACrD,OAAO,YAAuC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { AccessoryHistory, RegisterTools } from '../types.js';
2
+ type Point = [number, number];
3
+ /** Average `points` into at most `maxPoints` buckets of equal time (as Glass UI does). */
4
+ export declare function downsample(points: Point[], maxPoints: number): Point[];
5
+ /**
6
+ * Min, max, last and a time-weighted average of one series. Values are recorded
7
+ * when they change, so each one holds until the next (the last one until `to`).
8
+ */
9
+ export declare function summarize(points: Point[], to: number): {
10
+ count: number;
11
+ min: {
12
+ value: number;
13
+ at: string;
14
+ };
15
+ max: {
16
+ value: number;
17
+ at: string;
18
+ };
19
+ avg: number;
20
+ last: {
21
+ value: number;
22
+ at: string;
23
+ };
24
+ };
25
+ /** The compact form returned to the model: a summary per series plus its downsampled points. */
26
+ export declare function compactHistory(history: AccessoryHistory, hours: number, maxPoints: number): {
27
+ note?: string | undefined;
28
+ uniqueId: string;
29
+ from: string;
30
+ to: string;
31
+ hours: number;
32
+ series: {
33
+ points: [string, number][];
34
+ count: number;
35
+ min: {
36
+ value: number;
37
+ at: string;
38
+ };
39
+ max: {
40
+ value: number;
41
+ at: string;
42
+ };
43
+ avg: number;
44
+ last: {
45
+ value: number;
46
+ at: string;
47
+ };
48
+ unit?: string | undefined;
49
+ description?: string | undefined;
50
+ type: string;
51
+ }[];
52
+ };
53
+ export declare const register: RegisterTools;
54
+ export {};
55
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/history.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAcnE,KAAK,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAY9B,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,EAAE,CAgBtE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;EAyBpD;AAED,gGAAgG;AAChG,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBzF;AAED,eAAO,MAAM,QAAQ,EAAE,aA2CtB,CAAC"}
@@ -0,0 +1,127 @@
1
+ import { z } from 'zod';
2
+ import { READ, errorMessage, handle, jsonResult } from './helpers.js';
3
+ /** Glass UI keeps at most 365 days of history. */
4
+ const MAX_HOURS = 24 * 365;
5
+ /** Asked of Glass UI (its maximum), so min/max/avg come from (nearly) every sample. */
6
+ const FETCH_POINTS = 5000;
7
+ const DEFAULT_POINTS = 48;
8
+ const MAX_POINTS = 500;
9
+ const NO_HISTORY = 'No values were recorded for this accessory in this period. Glass UI records temperature, humidity, light level, battery, ' +
10
+ 'air quality, power and energy readings, needs Homebridge in insecure mode, and keeps them for accessoryHistory.retentionDays (7 by default).';
11
+ /** `2026-10-04T03:15Z`: minute precision is plenty and saves tokens. */
12
+ function at(t) {
13
+ return `${new Date(t).toISOString().slice(0, 16)}Z`;
14
+ }
15
+ function round(value, digits = 2) {
16
+ const f = 10 ** digits;
17
+ return Math.round(value * f) / f;
18
+ }
19
+ /** Average `points` into at most `maxPoints` buckets of equal time (as Glass UI does). */
20
+ export function downsample(points, maxPoints) {
21
+ if (points.length <= maxPoints) {
22
+ return points;
23
+ }
24
+ const from = points[0][0];
25
+ const span = points.at(-1)[0] - from + 1;
26
+ const buckets = new Map();
27
+ for (const [t, v] of points) {
28
+ const index = Math.min(maxPoints - 1, Math.floor(((t - from) / span) * maxPoints));
29
+ const bucket = buckets.get(index) ?? { t: 0, sum: 0, n: 0 };
30
+ bucket.t += t;
31
+ bucket.sum += v;
32
+ bucket.n++;
33
+ buckets.set(index, bucket);
34
+ }
35
+ return [...buckets.entries()].sort(([a], [b]) => a - b).map(([, { t, sum, n }]) => [Math.round(t / n), sum / n]);
36
+ }
37
+ /**
38
+ * Min, max, last and a time-weighted average of one series. Values are recorded
39
+ * when they change, so each one holds until the next (the last one until `to`).
40
+ */
41
+ export function summarize(points, to) {
42
+ let min = points[0];
43
+ let max = points[0];
44
+ let weighted = 0;
45
+ let duration = 0;
46
+ points.forEach(([t, v], i) => {
47
+ if (v < min[1]) {
48
+ min = points[i];
49
+ }
50
+ if (v > max[1]) {
51
+ max = points[i];
52
+ }
53
+ const held = Math.max(0, (points[i + 1]?.[0] ?? to) - t);
54
+ weighted += v * held;
55
+ duration += held;
56
+ });
57
+ const last = points.at(-1);
58
+ const avg = duration > 0 ? weighted / duration : points.reduce((sum, [, v]) => sum + v, 0) / points.length;
59
+ return {
60
+ count: points.length,
61
+ min: { value: round(min[1]), at: at(min[0]) },
62
+ max: { value: round(max[1]), at: at(max[0]) },
63
+ avg: round(avg),
64
+ last: { value: round(last[1]), at: at(last[0]) },
65
+ };
66
+ }
67
+ /** The compact form returned to the model: a summary per series plus its downsampled points. */
68
+ export function compactHistory(history, hours, maxPoints) {
69
+ const series = history.series
70
+ .filter((s) => s.points.length > 0)
71
+ .map((s) => ({
72
+ type: s.type,
73
+ ...(s.description ? { description: s.description } : {}),
74
+ ...(s.unit ? { unit: s.unit } : {}),
75
+ ...summarize(s.points, history.to),
76
+ points: downsample(s.points, maxPoints).map(([t, v]) => [at(t), round(v)]),
77
+ }));
78
+ return {
79
+ uniqueId: history.uniqueId,
80
+ from: at(history.from),
81
+ to: at(history.to),
82
+ hours,
83
+ series,
84
+ ...(series.length ? {} : { note: NO_HISTORY }),
85
+ };
86
+ }
87
+ export const register = (tool, client) => {
88
+ tool('get_accessory_history', {
89
+ title: 'Get accessory history',
90
+ description: 'Recorded sensor values of an accessory over time: temperature, humidity, light level, battery, air quality, power and energy. ' +
91
+ 'Returns, per characteristic, min / max (with when), the time-weighted average, the last value and the points averaged down to maxPoints. ' +
92
+ 'Times are UTC. Use it for questions like "why was the living room cold last night". Use list_accessories first to find the uniqueId. ' +
93
+ 'Needs Homebridge Glass UI.',
94
+ inputSchema: {
95
+ uniqueId: z.string().min(1).describe('The unique identifier of the accessory'),
96
+ hours: z.number().positive().max(MAX_HOURS).optional().describe('How far back to look, in hours (default 24)'),
97
+ type: z
98
+ .string()
99
+ .regex(/^[\w.-]{1,64}$/, 'A characteristic type such as CurrentTemperature')
100
+ .optional()
101
+ .describe("Only this characteristic (e.g. 'CurrentTemperature', 'CurrentRelativeHumidity', 'BatteryLevel'). Default: all recorded ones"),
102
+ maxPoints: z
103
+ .number()
104
+ .int()
105
+ .min(2)
106
+ .max(MAX_POINTS)
107
+ .optional()
108
+ .describe(`Points per series after averaging (default ${DEFAULT_POINTS}). The summary always uses every recorded value`),
109
+ },
110
+ annotations: READ,
111
+ }, handle('getting accessory history', async ({ uniqueId, hours = 24, type, maxPoints = DEFAULT_POINTS }) => {
112
+ let history;
113
+ try {
114
+ history = await client.getAccessoryHistory(uniqueId, { hours, type, maxPoints: FETCH_POINTS });
115
+ }
116
+ catch (error) {
117
+ // Glass UI answers an unknown uniqueId with no series; a 404 means the
118
+ // endpoint itself is missing (homebridge-config-ui-x has none).
119
+ if (/ error 404 /.test(errorMessage(error))) {
120
+ throw new Error(`${errorMessage(error)} (accessory history needs Homebridge Glass UI)`, { cause: error });
121
+ }
122
+ throw error;
123
+ }
124
+ return jsonResult(compactHistory(history, hours, maxPoints));
125
+ }));
126
+ };
127
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/mcp/tools/history.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,20 @@ export interface Accessory {
17
17
  serviceCharacteristics?: CharacteristicInfo[];
18
18
  values?: Record<string, unknown>;
19
19
  }
20
+ /** `GET /api/accessories/:uniqueId/history` (Glass UI). Times are epoch ms. */
21
+ export interface AccessoryHistory {
22
+ uniqueId: string;
23
+ from: number;
24
+ to: number;
25
+ series: Array<{
26
+ /** Characteristic type, e.g. `CurrentTemperature`. */
27
+ type: string;
28
+ description?: string;
29
+ unit?: string;
30
+ /** `[epoch ms, value]`, oldest first, averaged down to at most `maxPoints`. */
31
+ points: Array<[number, number]>;
32
+ }>;
33
+ }
20
34
  export interface Room {
21
35
  name: string;
22
36
  services: Array<{
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/plugin/platform.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAMlE,iHAAiH;AACjH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAClD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAClD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,KAAK,EAAE,oBAAoB,GAAG,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC;CAC7E;AAED,qBAAa,aAAa;IAOtB,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAQ;IACxC,OAAO,CAAC,IAAI,CAAgC;IAC5C,2DAA2D;IAC3D,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAqB;gBAGtB,GAAG,EAAE,cAAc,EACpC,SAAS,EAAE,OAAO,EAClB,GAAG,EAAE,WAAW;IAiBlB,4EAA4E;IAC5E,kBAAkB,IAAI,IAAI;IAE1B,OAAO,CAAC,SAAS;YAcH,SAAS;CAyBxB"}
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/plugin/platform.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAMlE,iHAAiH;AACjH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAClD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAClD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,KAAK,EAAE,oBAAoB,GAAG,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC;CAC7E;AAED,qBAAa,aAAa;IAOtB,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAQ;IACxC,OAAO,CAAC,IAAI,CAAgC;IAC5C,2DAA2D;IAC3D,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAqB;gBAGtB,GAAG,EAAE,cAAc,EACpC,SAAS,EAAE,OAAO,EAClB,GAAG,EAAE,WAAW;IAiBlB,4EAA4E;IAC5E,kBAAkB,IAAI,IAAI;IAE1B,OAAO,CAAC,SAAS;YAcH,SAAS;CAgCxB"}
@@ -58,10 +58,17 @@ export class AiKitPlatform {
58
58
  let client;
59
59
  try {
60
60
  const url = http.homebridgeUrl || process.env.HOMEBRIDGE_URL || DEFAULT_HOMEBRIDGE_URL;
61
- client = new HomebridgeClient(http.homebridgeToken ? { url, token: http.homebridgeToken } : { url });
61
+ client = new HomebridgeClient({
62
+ url,
63
+ ...(http.homebridgeToken ? { token: http.homebridgeToken } : {}),
64
+ certFingerprint: http.homebridgeCertFingerprint,
65
+ certPath: http.homebridgeCertPath,
66
+ });
62
67
  }
63
68
  catch (error) {
64
- this.log.error(`MCP over HTTP not started: ${error.message}. Set a Homebridge API token in the AI Kit settings.`);
69
+ const message = error.message;
70
+ const hint = /HOMEBRIDGE_(USERNAME|PASSWORD)/.test(message) ? ' Set a Homebridge API token in the AI Kit settings.' : '';
71
+ this.log.error(`MCP over HTTP not started: ${message}.${hint}`);
65
72
  return;
66
73
  }
67
74
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/plugin/platform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/plugin/platform.ts"],"names":[],"mappings":"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"}
@@ -135,6 +135,18 @@
135
135
  <div class="form-text">Create one in Glass UI. A read-only token blocks changes.</div>
136
136
  </div>
137
137
  </div>
138
+ <div class="row g-3 mb-3">
139
+ <div class="col-sm-6">
140
+ <label class="form-label mp-label" for="http-hb-cert-fingerprint">Trusted certificate fingerprint</label>
141
+ <input class="form-control font-monospace" id="http-hb-cert-fingerprint" placeholder="AB:CD:EF:…" autocomplete="off" spellcheck="false">
142
+ <div class="form-text">For an https Homebridge UI with a self-signed certificate: its SHA-256 fingerprint. Only that certificate is trusted.</div>
143
+ </div>
144
+ <div class="col-sm-6">
145
+ <label class="form-label mp-label" for="http-hb-cert-path">Trusted certificate file</label>
146
+ <input class="form-control" id="http-hb-cert-path" placeholder="/var/lib/homebridge/ssl-certs/certificate.pem" spellcheck="false">
147
+ <div class="form-text">Or a PEM file with the UI's certificate or its CA.</div>
148
+ </div>
149
+ </div>
138
150
  </div>
139
151
 
140
152
  <ul class="nav nav-tabs mp-tabs" role="tablist">
@@ -33,16 +33,23 @@
33
33
  return obj;
34
34
  }
35
35
 
36
- /** The block as edited in the form. */
36
+ /**
37
+ * The block as edited in the form. Fields the form doesn't show (e.g. the
38
+ * `homebridgeTokenId` Glass UI stores to revoke its API token) are kept.
39
+ */
37
40
  function readForm() {
38
- const http = clean({
41
+ const mcp = Object.assign({}, block.mcp);
42
+ const http = clean(Object.assign({}, mcp.http, {
39
43
  enabled: $('http-enabled').checked,
40
44
  host: $('http-host').value.trim(),
41
45
  port: num($('http-port').value),
42
46
  token: $('http-token').value.trim(),
43
47
  homebridgeUrl: $('http-hb-url').value.trim(),
44
48
  homebridgeToken: $('http-hb-token').value.trim(),
45
- });
49
+ homebridgeCertFingerprint: $('http-hb-cert-fingerprint').value.trim(),
50
+ homebridgeCertPath: $('http-hb-cert-path').value.trim(),
51
+ }));
52
+ mcp.http = http;
46
53
  const provider = $('provider').value;
47
54
  return clean(Object.assign({}, block, {
48
55
  platform: PLATFORM,
@@ -53,7 +60,7 @@
53
60
  baseUrl: provider === 'openai-compatible' ? $('baseUrl').value.trim() : undefined,
54
61
  contextTokens: provider === 'openai-compatible' ? num($('contextTokens').value) : undefined,
55
62
  maxOutputTokens: num($('maxOutputTokens').value),
56
- mcp: { http: http },
63
+ mcp: mcp,
57
64
  }));
58
65
  }
59
66
 
@@ -72,6 +79,8 @@
72
79
  $('http-token').value = http.token || '';
73
80
  $('http-hb-url').value = http.homebridgeUrl || '';
74
81
  $('http-hb-token').value = http.homebridgeToken || '';
82
+ $('http-hb-cert-fingerprint').value = http.homebridgeCertFingerprint || '';
83
+ $('http-hb-cert-path').value = http.homebridgeCertPath || '';
75
84
  }
76
85
 
77
86
  function refreshVisibility() {
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@mp-consulting/homebridge-ai-kit",
3
3
  "displayName": "Homebridge AI Kit",
4
- "version": "2.0.2",
5
- "description": "AI toolkit for Homebridge \u2014 an MCP server that lets AI assistants control accessories, manage plugins and monitor Homebridge, plus the shared AI building blocks used by Homebridge Glass UI and MP Consulting plugins.",
4
+ "version": "2.1.0",
5
+ "description": "AI toolkit for Homebridge — an MCP server that lets AI assistants control accessories, manage plugins and monitor Homebridge, plus the shared AI building blocks used by Homebridge Glass UI and MP Consulting plugins.",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
8
8
  "types": "dist/index.d.ts",
@@ -70,8 +70,9 @@
70
70
  "dependencies": {
71
71
  "@homebridge/plugin-ui-utils": "^2.2.6",
72
72
  "@modelcontextprotocol/sdk": "^1.30.0",
73
- "@mp-consulting/homebridge-ai-core": "^2.0.2",
73
+ "@mp-consulting/homebridge-ai-core": "^2.1.0",
74
74
  "socket.io-client": "^4.8.4",
75
+ "undici": "^7.30.0",
75
76
  "zod": "^4.5.4"
76
77
  },
77
78
  "devDependencies": {