Skip to content

Release 0.1.4a6 - #41

Closed
github-actions[bot] wants to merge 44 commits into
masterfrom
release-0.1.4a6
Closed

github-actions[bot] wants to merge 44 commits into
masterfrom
release-0.1.4a6

Conversation

@github-actions

Copy link
Copy Markdown

Human review requested! This supersedes any earlier open release proposal for this repository.

JarbasAl and others added 30 commits June 23, 2026 19:05
* 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>
)

The <1.0.0 cap let pip resolve the ancient 0.11.1a1 client, which predates
the Noise-v3 handshake and cannot connect to a current crypto-required
HiveMind hub. Bump the floor and cap at <2.0.0 instead of <1.0.0.
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>
@coderabbitai

coderabbitai Bot commented Sep 10, 2026

Copy link
Copy Markdown

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: a1b49b53-a5c0-4156-887e-c9f3d3bae11e

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot closed this Sep 10, 2026
@github-actions
github-actions Bot deleted the release-0.1.4a6 branch September 10, 2026 19:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant