mirror of
https://github.com/zvx-echo6/meshai.git
synced 2026-08-26 17:31:34 +00:00
* feat(dashboard): Phase A — 4-section nav; move Scheduled Broadcasts + Danger Zones off Routing Regroup nav into GENERAL/MESHTASTIC/MESHCORE/DOCUMENTATION (<=5 pages each, MT & MC mirror). Consolidate via tabs (Places, Nodes & Health, Contacts & Companion) reusing existing components. Move Band Conditions, cold-start, and fire digest to per-mesh Scheduled Broadcasts pages; move Danger Zones to its own page. Routing keeps its sending rules unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(dashboard): Phase B — clean identical Routing grids; relocate per-family gating to Data Feeds Meshtastic Routing becomes an always-visible pure-delivery grid matching MeshCore (no master-toggle expand/collapse). Per-family gating (enable/ severity/freshness/cooldown) moves to a Family Settings section on Data Feeds. Sending rules + Notification Rules unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(dashboard): Phase C — MeshCore bot-behavior parity (observe channels / ignore contacts / DMs) Add meshcore context (observe channels by name, ignore contacts, DM policy) and wire the MeshCore inbound path to honor it, mirroring Meshtastic's observe/ignore filtering. Symmetric "Bot behavior" sections on both Connection pages. Meshtastic path unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(dashboard): Phase D — dedupe Environment/Adapter Config into one Data Feeds surface Curated family panels are the single home for the shared adapter keys; Adapter Config becomes an Advanced/raw escape hatch (owned keys no longer double-editable). Surface include_in_llm_context per adapter. Fix the adapter-config array-vs-object parsing (fire digest values now load). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(dashboard): Phase E — Activity Log (per-mesh broadcast feed); remove subscription backend Replace Alerts with an Activity Log fed by per-mesh broadcast logging (transport+channel+success on mesh_broadcasts_out, additive migration). Remove the entire subscription backend (commands, DM dispatch, storage, API) and its UI. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Matt Johnson <mj@k7zvx.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
37 lines
1.4 KiB
Python
37 lines
1.4 KiB
Python
"""Transport factory: build the correct MeshTransport from config."""
|
|
|
|
from .base import MeshTransport
|
|
|
|
|
|
def build_transport(config, meshcore_context=None) -> MeshTransport:
|
|
"""Instantiate and return the active MeshTransport derived from config.
|
|
|
|
The active transports are derived from the connection config, not a
|
|
separate mode flag:
|
|
|
|
- Meshtastic is always the base transport.
|
|
- MeshCore is active when ``config.meshcore_host`` is a non-empty string.
|
|
- Both configured → CompositeTransport wrapping both.
|
|
- MeshCore host blank (default) → Meshtastic only.
|
|
|
|
Args:
|
|
config: A ConnectionConfig (or duck-compatible object).
|
|
meshcore_context: Optional MeshCoreContextConfig for the MeshCore
|
|
passive-context / bot-behavior filter (None = pass-through).
|
|
|
|
Returns:
|
|
A concrete MeshTransport instance ready to be connected.
|
|
"""
|
|
from meshai.connector import MeshtasticTransport
|
|
meshtastic = MeshtasticTransport(config)
|
|
|
|
meshcore_host = getattr(config, "meshcore_host", "") or ""
|
|
if meshcore_host.strip():
|
|
from meshai.transport.meshcore_transport import MeshCoreTransport
|
|
from meshai.transport.composite_transport import CompositeTransport
|
|
return CompositeTransport(
|
|
[meshtastic, MeshCoreTransport(config, meshcore_context=meshcore_context)],
|
|
config=config,
|
|
)
|
|
|
|
return meshtastic
|