fix: resolve transformers import error and Nemotron API 404 noise
GitHub Actions
bce23ea
- Downgrade transformers to <4.46.0 to avoid is_torch_fx_available import error (removed in 4.45+)
- Wrap Nemotron backend initialization in try-catch to suppress 404 errors when NVIDIA_API_KEY is not configured
- Both issues were causing noise in production logs without affecting functionality
- Expand app.py _seed_corpus() to ingest main docs/ folder (CAPABILITY_CONTRACT, GLOSSARY, M01-M13, X01-X04, OVERVIEW, ARCHITECTURE, roadmap, etc.)
- Content-addressed deduplication via BLAKE3 (automatic no-op on re-ingest)
- Integrated with Ask tab RAG query + routing traces
- Enhanced bus capability.py with trust levels and request context
- Improved RAG service ingestion flow with doc_cid tracking
- Updated UI ask.py and mesh.py tabs for better query visualization
- Settings tab shows active corpus and document count
- Updated tasks.md with completion status
Add all-to-all internet mesh over relay hub (P1-P3) + user-story screenshot proof
GitHub Actions
8f53c4c
Quality improvements: Unicode chars, Token class, imports, type hints, formatting
GitHub Actions
3f78ea8
- Ruff formatting applied to all 158 files
- Fixed Unicode character ambiguities (RUF001)
- Removed duplicate methods in _EchoBackend class
- Updated Token dataclass with proper type hints
- Fixed unused imports and parameter shadowing
- Improved optional import handling
- 47% reduction in ruff lint violations (51 → 27)
- All tests passing, no regressions
feat: real node-to-node HTTP peering (local <-> HF Space)
GitHub Actions
8231854
Wires the previously-scaffolded mesh end-to-end so a local node can peer
with the public HF Space and route real llm.chat/rag.query/moe.* calls.
- HttpBusTransport: bus.transport.call() now forwards to remote peers via
POST /bus/v1/call (in-process delivery still used for same-process nodes)
- DiscoveryService: adds discovery.peer.add (fetch /manifest + register
remote caps) and discovery.peers capabilities
- node.py: default to HttpBusTransport; register DiscoveryService on every node
- app.py: mount /bus/v1/call, /bus/v1/capabilities, /manifest, /health into
the Gradio FastAPI app so the HF Space bus is reachable on its public port
- test_http_peer_routing.py: two real uvicorn nodes peer and route over HTTP
fix: easter-egg ticker now properly works in Gradio app
GitHub Actions
d6ca3a2
Moved ticker CSS/HTML/JS to module-level constant that gets injected
at app startup. This bypasses Gradio's iframe isolation that was
preventing the keydown listener from working.
- Ticker positioned as fixed overlay at bottom of page
- Smooth slide-in animation when pressing 'e'
- Won't trigger while typing in input fields
- Works across all tabs in the Gradio app
feat: WebLLM browser agent with PeerJS mesh, HybridRAG, news signals, and easter-egg ticker
GitHub Actions
78cc96f
- webagent/: complete browser-only app (no backend)
- WebLLM ReAct agent with tool-calling (search, scrape, summarize, remember, schedule, RAG)
- PeerJS over-internet mesh (anchor + roster gossip + reclaim failover)
- News RSS ingest with CORS proxy throttling, signal scoring (war/cyber/space/aviation/earth/finance), custom alerts
- HybridRAG integration (localStorage-persisted BM25+phonetic+Levenshtein+n-gram+sentence-window)
- Tab UI (Agent/News/Mesh) with model selector, chat, mesh peers, signal sharing
- Press 'e' to toggle live news ticker overlay (easter-egg)
- Python Phase 1 fixes (unstaged from prior session):
- hearthnet/services/llm/backends/hf_local.py: local Ollama/llama.cpp backend
- hearthnet/services/chat/service.py: chat routing
- hearthnet/services/demo.py: demo service
- app.py: Gradio web UI
- hearthnet/node.py: node initialization
- hearthnet/ui/tabs/ask.py: ask tab UI
Screenshots: 37/38 passed (1 pre-existing rag-trace failure)
New files:
- app_nemotron.py: second Gradio Space for Nemotron Document Intelligence
Custom purple-orange UI, structured extraction, Q&A, summarise, push-to-mesh
Targets: NVIDIA RTX 5080 (Nemotron), Off Brand badge, Tiny Titan (8B)
- hearthnet/ui/tabs/nemotron.py: Nemotron tab (embeddable in main app)
- hearthnet/services/llm/backends/modal_backend.py: Modal serverless GPU backend
Calls deployed Modal endpoint (MODAL_ENDPOINT env var)
- scripts/modal_deploy.py: one-command Modal endpoint deployment
- docs/IMPROVEMENTS.md: GPT-4o rating 8.3/10, 29 improvements, prize matrix
Changes:
- hearthnet/node.py install_services(): auto-wire Nemotron (NVIDIA_API_KEY),
MiniCPM (MINICPM_URL), Modal (MODAL_ENDPOINT) backends from env vars
- README.md: +tags nemotron/minicpm/modal, expanded hackathon section with
NVIDIA/OpenBMB/Modal sponsor prize targeting table
- tasks.md: updated test count (489), added June 11 entry
feat: impl_ref §22 gap-fill — all missing symbols implemented
GitHub Actions
38cba90
M12 CLI (9 new commands):
- log (follow mode + snapshot), erase (--keep-keys, --yes)
- rag list/ingest/reindex subgroup
- invite create/redeem subgroup
- version command
- _bus_call helper for bus/v1/call POST
node.py:
- ManifestPublisher class (periodic mDNS+UDP re-publish, triggered on registry change)
- PeriodicTask class (generic async interval runner)
- Removed 2nd duplicate NodeManifest that had leaked back via junk merge
M04 LLM backends (3 new files):
- lmstudio.py — LmStudioBackend wraps OpenAICompatBackend (localhost:1234/v1)
- hf_api.py — HfApiBackend (HF Inference API, HEARTHNET_HF_TOKEN opt-in)
- anthropic_api.py — AnthropicApiBackend (claude-3-haiku/sonnet, ANTHROPIC_API_KEY opt-in)
M01 Identity:
- CommunityPolicy, CommunityMember, RevokedEntry dataclasses added to manifest.py
- Exported from identity/__init__.py
M08 UI:
- hearthnet/ui/theme.py — hearthnet_theme (purple/dark), emergency_theme (red)
- hearthnet/ui/topology.py — TopologyComponent with push_trace/push_to…
feat: X01/X02/X06/X09/M02/M22 wiring + conformance suite + mobile PWA + 22 new tests
GitHub Actions
9505822
HearthNode.start() / stop() (node.py):
- 15-step startup: EventLog (X02), mDNS+UDP discovery (M02), Detector.start(),
HttpServer (X01), gossip sync loop, WebSocket pubsub wiring (X06)
- Detector.run() -> Detector.start() fix; EventLog.close() in stop()
- Removed duplicate HearthNode class that was shadowing start()/stop()
ProtocolService (hearthnet/services/protocol/service.py):
- protocol.version.list@1.0 — returns contract_versions, impl info, started flag
- protocol.conformance.report@1.0 — runs X09 check suite in-process
- Registered in install_demo_services() and install_services()
ConformanceRunner (hearthnet/conformance/):
- runner.py — 21 checks across suite 1.0/2.0/3.0, fast mode skips
unregistered capabilities, structured ConformanceReport.as_dict()
- Checks: protocol, embed, rag, file, market, llm, chat, moe, model, plant tool,
ocr/trans/rerank (Phase 2), moe.register/model.status (Phase 3)
Mobile PWA (hearthnet/ui/mobile/):
- static.py — PWA_MANIFEST, SERVICE_WORKE…
feat: Phase 3 wired + plant tool + MoE bus + model distribution always-on
GitHub Actions
c91b229
MoeService (M27):
- hearthnet/services/moe/service.py — wraps MoeRouter as bus service
- Capabilities: moe.route, moe.register, moe.list, moe.handoff
- Registered in both install_demo_services() and install_services()
PlantIdentificationService (M21 tool):
- hearthnet/services/tools/plant.py — tool.plant_identify on the bus
- Priority: local vision.describe + llm.complete > HF Inference API > unavailable
- PLANT_TOOL_DEFINITION for ToolExecutor (LLM mid-gen tool call)
- HEARTHNET_HF_TOKEN env var enables HF Inference API (opt-in)
ModelDistributionService (M26):
- Always registered — auto-creates BlobStore in ~/.hearthnet/blobs if no store given
- install_demo_services() uses tmpdir BlobStore for test isolation
- No longer requires blob_store=... to be passed explicitly
node.py:
- install_demo_services() now registers MoeService, PlantIdentificationService,
ModelDistributionService (tmpdir store — no disk writes persist)
- install_services() now registers MoeService, PlantIdentific…
fix: 0 test failures; FileService; real RagService; emergency probe; chat return
GitHub Actions
4aaae80
TESTS:
- conftest.py: nest_asyncio.apply() fixes Python 3.13 + pytest-asyncio 0.26
event-loop isolation — was causing 32 cross-test failures; now 102 passed 0 failed
- pyproject.toml: asyncio_mode=strict + asyncio_default_fixture_loop_scope=function
SERVICES (no mocks, no fakes in production):
- hearthnet/services/__init__.py: import real RagService not demo.RagService
- hearthnet/services/files/: new FileService providing file.put/file.get/file.list/
file.delete via bus (BLAKE3 CID, in-memory or disk store)
- node.py: register FileService in both install_demo_services and install_services
- marketplace: add market.delete capability (alias for expire)
UI BUGS FIXED:
- ui/tabs/chat.py: add missing return in except block (was returning None on error)
- ui/tabs/emergency.py: wire Run Connectivity Probe button with sync probe +
show results; was defined but never connected
- ui/tabs/settings.py: gen_invite gracefully handles missing nacl/community manifest
APP.PY (HF Space):
- Reg…
feat: BitTorrent-style model weight distribution; no fake LLM in production
GitHub Actions
d4978df
ModelDistributionService (hearthnet/services/llm/model_distribution.py):
- model.advertise@1.0 — announces which GGUF/Ollama model files a node holds
- model.list@1.0 — list models available on any peer node
- model.chunk_read@1.0 — serve one CID-addressed chunk of a model file
- model.pull@1.0 — download a model from a peer via chunked blob transfer
- model.status@1.0 — check progress of in-flight pull job
- Auto-scans ~/.ollama/models manifests and models_dir/*.gguf on start()
- CID-addressed (BLAKE3 content hash) — same model from two sources = same CID
- Pull job runs as asyncio background task; progress tracked in PullJob dataclass
- After successful pull, model is registered locally and the node starts
advertising it to further peers (seeder effect)
LlmService cleanup:
- _EchoBackend labeled FOR TESTS ONLY — never used in production paths
- New _UnavailableBackend: returns clear error instead of silent echo when no
real backend is configured ('configure Ollama /…