NOMAD Bridge v0.1.3: runtime hardening, Companion adverts, memory and configuration UI - #5
yellowcooln wants to merge 28 commits into
Conversation
# Conflicts: # README.md # meshcore_nomad_bridge/__init__.py # openhop-plugin.json # pyproject.toml
Harden NOMAD bridge production runtime for v0.1.3
Update since the previous PR revisionPushed Better packet utilization
Useful final chunks instead of a notice-only packet
Plain-text cleanup
Improved default radio prompt
NOMAD's existing global knowledge-base setting remains authoritative. No plugin knowledge-base toggle, NOMAD API modification, or Repeater change was added. Documentation and compatibility
Verification
Hosted Python 3.10 and Python 3.12 PR checks both passed for |
Ready for reviewThis PR is now ready for review, promoting Since the previous update,
Verified
The PR includes the documented runtime hardening, bounded conversation memory, default-off one-shot mode, allowlist behavior, configuration UI/help, Companion adverts, improved radio packet packing/Markdown cleanup, and concise knowledge-base-aware prompt. The previous detailed update remains the change-by-change record for those features. Release version remains 0.1.3. Both hosted checks are green at CI: https://github.com/openhop-dev/openhop-nomad-plugin/actions/runs/34707743897 |
- MeshCoreClient.get_contacts() and remove_contact() for Companion contact management - ContactsControl layer reads config.json requests, executes via meshcore, publishes to runtime.json - Favorites persistence via nomad_favorites.json - UI: new Contacts tab with refresh, list, favorite/unfavorite, remove actions - 18 unit tests for contacts_control and meshcore_client parsing
The Contacts tab added by the address-book feature shifted the tab count from 4 to 5. Updated the tab count assertion, tab navigation to Companion device, and added a navigation back to the Companion tab before layout bounding-box checks.
Summary
Promote the accumulated
devchanges tomainfor NOMAD Bridge 0.1.3. This includes the production-runtime work merged in #2, follow-up transport/pacing improvements, a refreshed configuration UI, bounded per-sender conversation memory, manual Companion adverts, and revised defaults.This is a draft release-promotion PR. The plugin has already been installed and tested on live hardware, and the operator confirms it works. No release has been published by this PR. The final version is plain
0.1.3; intermediate local test-version commits do not represent additional releases.Relationship to the hardening PR (#2)
The original contributor work is retained in history, not replaced wholesale. #2 began with
3605b96(runtime hardening) andde76d0b(reply pacing), received follow-up fixes, and was merged intodevasd25eca0.Used and retained from that work
openhop-core==1.1.1dependency pin.Improved during the hardening PR before merge
aiohttpplus a dedicatedaiodns/c-ares resolver. Supports HTTP(S) DNS names, Docker hostnames, IPv4, and bracketed IPv6 without blocking Pythongetaddrinfoexecutor work.http://nomad_admin:8080and the default Companion endpoint to127.0.0.1:5050, preserving explicit configuration/environment overrides.Deliberately changed after the hardening PR
Older statements in #2 about mandatory one-shot mode, deny-all empty lists, or the earlier Companion port are historical, not the current behavior.
New and updated functionality
Configuration page
(i)indicators and accessible expandable help. Opening checkbox help does not toggle the checkbox.Per-sender conversation memory
/newand/resetclear the sender's conversation, subject to the normal admission/rate controls.Manual Companion adverts
Defaults and packaging
0.1.3; Python >=3.10; Core remains pinned to1.1.1.aiohttp>=3.14.3,<4andaiodns>=3.2,<5.127.0.0.1:5050; NOMADhttp://nomad_admin:8080; existing explicit endpoints remain unchanged.mainis not introduced by this PR; the release-helper delta is Python 3.10 TOML compatibility.Verification
Known limitations / draft follow-ups
settings.one_shot is False, matching the requested default. The exact workflow smoke step passed locally against a freshly built and isolated installed wheel; hosted Python 3.10 and Python 3.12 checks both passed on356a14b.92bf7b1: pinned Playwright 1.62.0 and Chromium/system dependencies are installed before pytest. Both jobs passed; Python 3.12 ran the browser tests without skips (75-second job), while Python 3.10 retained its two browser skips (31-second job).356a14b.pip --upgradeinstallation can retain old Python code when replacing a different build of the same version, even while extracted UI files change. Such same-version replacement needs an explicit reinstall plus restart; a version label alone is insufficient evidence. Distinct0.1.3+test.1builds were used during testing, but this PR remains0.1.3as requested..localreachability depends on the deployment's resolver/network setup.The draft remains open for review; live installation and functional testing have already been performed and confirmed working by the operator.