Repository navigation
Release 0.1.4a6 - #41
Closed
github-actions[bot] wants to merge 44 commits into
Closed
github-actions[bot] wants to merge 44 commits into
github-actions[bot] wants to merge 44 commits into
Conversation
* feat!: port to hivemind-bus-client 2.x and package for release
Port the bridge from the pre-rename jarbas_hive_mind<=0.8.0 client to the
modern hivemind-bus-client (HiveMessageBusClient). The bridge now owns a bus
client, emits utterances via emit(Message(...)) and receives replies via
on_mycroft('speak', ...) / on_mycroft('hive.complete_intent_failure', ...),
instead of subclassing the old HiveMindTerminal websocket factory.
Add pyproject.toml with a dynamic version (attr) and version.py with a
START/END_VERSION_BLOCK, a click-based CLI + console entry point
(hivemind-hackchat-bridge), and pin the real deps (hivemind-bus-client,
ovos-bus-client, ovos-utils, websocket-client, click).
Wire the gh-automations reusable workflows (build/license/publish/release)
referenced @dev, add a network-free smoke test suite, LICENSE, and refresh
the README/docs for the new CLI.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* test: add real end-to-end tests (HiveMind hub + live hack.chat)
Add two genuine e2e tests under tests/e2e/, replacing reliance on the
network-free smoke suite alone:
(A) test_hivemind_e2e.py — boots a REAL hivemind-core hub via hivescope's
loopback topology and drives the bridge's production HiveMessageBusClient over
an actual localhost WebSocket. Nothing on the HiveMind side is mocked
(handshake, encryption, whitelist ACL, reverse routing). Proves the full
round-trip: inbound hack.chat msg -> bridge emits recognizer_loop:utterance ->
hub agent replies speak -> reverse-routed to the real client -> bridge
on_mycroft("speak") -> captured outbound hack.chat reply. Only the hack.chat
side is faked.
(B) test_hackchat_live.py — connects the bridge's real HackChat client to a
live hack.chat channel (random nick + channel, anonymous, no account), posts a
message from a second anonymous ws client, and asserts the bridge receives and
forwards it. Self-skips with a clear reason when wss://hack.chat egress is
unavailable (network-gated); never importorskips a real dependency.
Wire into CI via a dedicated e2e_tests.yml that pre-installs hivescope from the
fix/loopback-whitelist-only-connection branch (published build lacks the
loopback whitelist-only + get_client_by_id fixes) and an `e2e` extra in
pyproject. build_tests.yml now runs only the smoke suite.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs: add operator-setup guide (anonymous hack.chat, hub registration, run, network-only live e2e)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
hivemind-bus-client >=1.0.13a1 defaults connect()'s handshake_max_retries to None, which retries the handshake indefinitely. A stalled/unreachable hub or a wrong password left the bridge hanging forever with no way out. Add a handshake_max_retries constructor kwarg (default 10, stored on self) and pass it into connect(). Mirrors the fix applied to HiveMind_mattermost_bridge PR #18. Fail-before: reverted only the source change and confirmed test_connect_uses_bounded_handshake_retries fails (AssertionError: assert 'handshake_max_retries' in {}); restoring the fix makes all 6 smoke tests pass. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* docs: make the hub allow-msg whitelist step explicit A freshly registered client is denied every message type until whitelisted. This is the most common reason a bridge connects but never replies, and it was missing from the docs. Also document the real failure modes seen in production (stale Noise pin, invalid api key, reconnect worker) and the isolated-identity requirement for running multiple bridges on one host. * Add Dockerfile for containerized deployment Adds a Dockerfile for HiveMind-HackChatBridge, grounded in the VERIFIED-WORKING ser9 deployment (~/hivemind-bridges/, systemd unit hivemind-bridge-*.service) — env-var driven, no baked secrets, hivemind-bus-client sourced from this repo's own pin (see in-file TODO on the upstream <1.0.0 upper-bound conflict where applicable). * ci: build and publish the container image to GHCR
* docs: make the hub allow-msg whitelist step explicit A freshly registered client is denied every message type until whitelisted. This is the most common reason a bridge connects but never replies, and it was missing from the docs. Also document the real failure modes seen in production (stale Noise pin, invalid api key, reconnect worker) and the isolated-identity requirement for running multiple bridges on one host. * Add Dockerfile for containerized deployment Adds a Dockerfile for HiveMind-HackChatBridge, grounded in the VERIFIED-WORKING ser9 deployment (~/hivemind-bridges/, systemd unit hivemind-bridge-*.service) — env-var driven, no baked secrets, hivemind-bus-client sourced from this repo's own pin (see in-file TODO on the upstream <1.0.0 upper-bound conflict where applicable).
A freshly registered client is denied every message type until whitelisted. This is the most common reason a bridge connects but never replies, and it was missing from the docs. Also document the real failure modes seen in production (stale Noise pin, invalid api key, reconnect worker) and the isolated-identity requirement for running multiple bridges on one host.
> 🤖 Auto-generated by Claude Opus 5 (claude-opus-5) via Claude Code — NOT human-reviewed. Verify before acting.
JarbasHackChatBridge.__init__() calls self.bus.connect(), which already
starts the HiveMind websocket reconnect lifecycle in a background thread.
JarbasHackChatBridge.run() then called self.bus.run_forever(), which tries
to claim that same lifecycle a second time on newer hivemind-bus-client
releases (>=1.0.x). Those releases guard the reconnect worker against a
double start and raise RuntimeError("HiveMind websocket reconnect worker
is already running"), so the bridge churns forever and never stabilizes.
connect() already does the connecting (non-blocking, in a thread);
run_forever() was only ever needed to block the calling thread. Replace
the run_forever() call with a simple sleep loop so the process still
blocks, without re-starting the worker.
Verified against a live hivemind-core 4.13.9a1 hub: before this fix the
bridge repeatedly logged "reconnect worker is already running" and never
reached a stable connected state; after the fix it connects and stays
connected.
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…caps (#32) Bumps hivemind-bus-client, ovos-bus-client, ovos-utils, and the e2e hivescope floor to versions proven to resolve and pass tests together, and drops the stale hivemind-bus-client <2.0.0 upper cap. Also raises the e2e hivemind round-trip fixture's satellite password from "hackchat-pass" to a strong multi-word passphrase: the bumped poorman-handshake now enforces a 40-bit password-strength floor and was rejecting the old weak test password, causing test_real_hivemind_round_trip to fail/hang. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…git branch (#34) The e2e workflow pinned hivescope to fix/loopback-whitelist-only-connection via pre_install_pip. That branch was merged into hivescope and deleted, so uv/pip now fails with "failed to fetch branch or tag" on every e2e run (3.10-3.13) on dev. The loopback whitelist-only + get_client_by_id fixes it needed are published in hivescope 0.8.0a1, which the [e2e] extra already pins (hivescope>=0.8.0a1). Drop the git install and let that floor pin govern; update the stale comments in the workflow, pyproject.toml, and AGENTS.md that described the branch dependency. Verified locally: `uv pip install --prerelease=allow -e ".[test,e2e]"` resolves hivescope==0.8.0a1 from PyPI with no git fetch. tests/e2e (minus the live hack.chat test) passes: 1 passed, 1 deselected. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
|
Important Review skippedBot user detected. To trigger a single review, invoke the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Advanced Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Human review requested! This supersedes any earlier open release proposal for this repository.