v0.0.15
Highlights
- Makes the Home Assistant WebSocket receiver idempotent when another Hermes process for the same profile already serves the configured endpoint.
- Keeps real port conflicts visible when the listener belongs to a foreign service, another profile, an unidentified/older receiver, or a different WebSocket path.
- Reports
runningonly after a successful bind rather than after any completed startup attempt.
Profile and lifecycle safety
- Resolves receiver enablement, host, port, path, and authentication through Hermes’ profile-scoped secret environment, preventing launch-profile credentials from leaking into multiplexed profiles.
- Preserves the owning profile’s context for Assist callbacks and exposes an opaque profile identity through
/healthfor safe cross-process duplicate detection. - Rebinds forced reloads to the new plugin context instead of retaining stale module callbacks.
- Stops the receiver on plugin unload, closes active Home Assistant sockets, cancels in-flight Assist requests, terminates the receiver thread, and releases captured plugin state.
- Cleans up connection tracking when a peer resets during the initial WebSocket greeting.
Validation
- 184 tests passed locally.
- Real Hermes
PluginManagertests covered conflicting profile configuration/authentication, callback scope, cross-profile refusal, and unload during an in-flight Assist request. - Python 3.11 and 3.12 GitHub CI passed on the release commit.
- Wheel and source distribution contents passed the repository release-integrity checks.
- Independent release-blocker review returned
READYfor the merged implementation.
Contributor credit
Thanks to Joel Silva (@byjaps) for the original receiver bind/idempotency work in #47. Joel’s commits and authorship are preserved in the merge history.
Full changelog: v0.0.14...v0.0.15