Skip to content

fix: MeshMapper host, MQTT channel map, and MeshCore BLE ghost nodes - #781

Merged
rinchen merged 2 commits into
mainfrom
fix/mqtt-meshmapper-channel-blue-ghost
Aug 3, 2026
Merged

fix: MeshMapper host, MQTT channel map, and MeshCore BLE ghost nodes#781
rinchen merged 2 commits into
mainfrom
fix/mqtt-meshmapper-channel-blue-ghost

Conversation

@rinchen

@rinchen rinchen commented Aug 3, 2026

Copy link
Copy Markdown
Member

Summary

Fixes from a win32 5.25.0 developer support bundle (Nathan / Colorado Mesh layout) covering three product bugs plus triage tooling. There is no Meshtastic↔MeshCore chat bridge in mesh-client; “bridging” failures in that report were MeshCore MQTT uplink / packet logger blocked by MeshMapper TLS.

1. Meshtastic MQTT → wrong channel tab

Symptom: With radio layout ch0=OnTrail (private), ch1= unnamed default public (AQ== / LongFast), ch2=cm-west-slp, MQTT text landed on channel 0 from ~2026-08-01 onward (previously on ch1). Logs had zero mqtt-channel-topic-mismatch / mqtt-unknown-channel-name — topic …/e/LongFast/… resolved as LongFast→0, matching gateway MeshPacket.channel 0.

Cause: Manual Connection Panel lines like LongFast@0=… (or early hardcoded LongFast→0 before radio sync) could stick in channelNameToIndex. Radio sync in updateChannelKeys preserved manual index mappings when applying radio keys, so Colorado’s public-on-slot-1 layout never overwrote the map.

Fix: After applying manual PSK lines, always re-apply radio topic indices so local RF layout is source of truth for inbound MQTT attribution. Manual PSKs are still preserved; only the name→slot map for topics like LongFast is forced from the radio. Bare/LongFast= without @index and Garber-style named-key PSK preservation remain covered by regression tests.

Triage: Expose sanitized main-process channelNameToIndex (no PSKs) via mqtt:getChannelNameToIndex IPC and mqttChannelNameToIndex on Export for GitHub / developer debug snapshots (pushed after updateChannelKeys from useMeshtasticRuntime).

2. MeshMapper MQTT TLS — migrate .cc.net

Symptom: Exact screenshot error on wss://mqtt.meshmapper.cc:443/ws (EPROTO / TLSV1_ALERT_INTERNAL_ERROR). Same session: LetsMesh + Colorado Mesh CONNACK OK; Meshtastic MQTT to mqtt.meshtastic.org OK. Wiki host mqtt.meshmapper.net works; .cc fails TLS (SNI/cert). Client still dialed .cc since #265.

Fix:

  • MESHMAPPER_HOST = 'mqtt.meshmapper.net' (legacy .cc kept only as a migrate-from alias).
  • Persist rewrite on Connection Panel storage migrations when server === mqtt.meshmapper.cc.
  • Presets, docs, and i18n strings updated; empty JWT password remains expected for MeshMapper/LetsMesh.
  • Humanize BoringSSL alert 80 / TLSV1_ALERT_INTERNAL_ERROR / EPROTO to meshcore.mqttHints.tlsHandshake (points users at .net).

3. Meshtastic “Blue” ghost while MeshCore BLE is connected

Symptom: Meshtastic Nodes showed Blue !e3da2e2f Just now, hops 0, MQTT -, same long name as self/Blck. Hardware was MeshCore-flashed; BLE MAC cc:2e:e3:da:2e:2f → lower 32 bits = 0xe3da2e2f. Not a wrong-tab / MeshCore-list mix-up — co-channel hear kept refreshing a stale Meshtastic NodeDB row.

Fix:

  • Helpers: meshcoreBleMacToMeshtasticNodeId / shouldSuppressMeshtasticNodeHear; module connectedMeshcoreBleMac set/cleared from useMeshcoreRuntime on BLE connect/disconnect.
  • Gate Meshtastic last_heard bumps when the node id matches the currently connected MeshCore BLE MAC:
    • RF: applySignalAndHops in meshtasticRawPacketSideEffects
    • MQTT: onNodeUpdate / ensure-node paths in useMeshtasticRuntime
  • Self / unrelated nodes still update; suppress only while that MeshCore peripheral is connected.

Docs / i18n

  • docs/troubleshooting.md — MQTT channel map + dual-radio MAC ghost notes
  • docs/meshcore-meshtastic-parity.md — MeshMapper host
  • English + locale strings for TLS hint and MeshMapper hostname

Out of scope

  • Building Meshtastic↔MeshCore message bridging
  • Changing Colorado public-channel RF layout on the radio
  • Unrelated snapshot watermark warnings

Test plan

  • Targeted Vitest for mqtt-manager (Nathan/Colorado LongFast@0→radio@1 matrix), MeshMapper host/preset/JWT, storage migrate, TLS humanize, debug snapshot mqttChannelNameToIndex, MAC helper, raw-packet suppress / non-suppress
  • Pre-commit + pre-push (vitest run --changed) green on this branch
  • Manual: Meshtastic MQTT with public on slot 1 + leftover LongFast@0= → inbound LongFast text on channel 1 after radio configure
  • Manual: MeshCore Connection — MeshMapper preset or hydrated .cc settings → dials .net, WSS connects; packet logger can publish when MQTT shows connected
  • Manual: dual-radio same-band — MeshCore BLE MAC matching a Meshtastic NodeDB id → that row does not refresh “Just now”; other peers + self still update; disconnect MeshCore → bumps resume
  • Manual: Export for GitHub / developer bundle includes mqttChannelNameToIndex (e.g. { "LongFast": 1 }) and no PSKs

Summary by CodeRabbit

  • New Features

    • Added MeshCore BLE handling to prevent duplicate Meshtastic node updates for the connected radio.
    • Added MQTT channel mapping to Meshtastic diagnostics.
    • Added clearer guidance for TLS handshake errors and stale NodeDB entries.
  • Bug Fixes

    • Improved MQTT channel attribution by prioritizing radio configuration.
    • Updated MeshMapper connections to use the .net host, with automatic migration from .cc.
    • Preserved compatibility with legacy MeshMapper host values.

Migrate mqtt.meshmapper.cc to .net (TLS), let radio topic indices win over
manual LongFast@0 for Colorado layouts, expose channelNameToIndex in debug
snapshots, and suppress Meshtastic last_heard for the connected MeshCore BLE MAC.
@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@rinchen, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 41 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: QUIET

Plan: Pro Plus

Run ID: 1ced8d26-03b2-4297-9fd5-2c6d2ac8224f

📥 Commits

Reviewing files that changed from the base of the PR and between c29eedd and 4240a10.

📒 Files selected for processing (10)
  • src/main/mqtt-manager.test.ts
  • src/renderer/lib/connectedMeshcoreBleMac.test.ts
  • src/renderer/lib/connectedMeshcoreBleMac.ts
  • src/renderer/lib/debugSnapshotMeshtasticContext.test.ts
  • src/renderer/lib/meshcoreMqttUserHint.test.ts
  • src/renderer/lib/meshcoreWebBluetoothConnection.ts
  • src/renderer/lib/meshtastic/meshtasticRawPacketSideEffects.test.ts
  • src/renderer/lib/meshtastic/meshtasticRawPacketSideEffects.ts
  • src/renderer/runtime/useMeshcoreRuntime.reconnect.test.ts
  • src/renderer/runtime/useMeshcoreRuntime.ts
📝 Walkthrough

Walkthrough

The change updates MeshMapper host migration, MQTT channel attribution and diagnostics, MeshCore BLE node suppression, and MQTT TLS error classification. It adds IPC and renderer APIs, storage migration logic, runtime state tracking, debug snapshot fields, documentation, and regression tests.

Changes

MQTT channel attribution and diagnostics

Layer / File(s) Summary
Radio-authoritative channel attribution
src/main/mqtt-manager.ts, src/main/mqtt-manager.test.ts
Radio channel slots now override manual topic indices. Tests cover encrypted and JSON traffic attribution.
Channel mapping IPC bridge
src/main/mqtt-manager.ts, src/main/index.ts, src/main/index.ipc-security.test.ts, src/preload/index.ts, src/shared/electron-api.types.ts, src/renderer/vitest.electronApiMock.ts
The channel mapping is exposed through the validated IPC and preload APIs.
Meshtastic channel diagnostics
src/renderer/lib/debugSnapshotMeshtasticContext.ts, src/renderer/lib/debugSnapshot.ts, src/renderer/runtime/useMeshtasticRuntime.ts, src/renderer/lib/debugSnapshot*.test.ts, docs/troubleshooting.md
Meshtastic debug snapshots include the MQTT channel mapping. Troubleshooting guidance documents the mapping and stale NodeDB entries.

MeshMapper host migration

Layer / File(s) Summary
MeshMapper host compatibility
src/renderer/lib/letsMeshJwt.ts, src/renderer/lib/letsMeshJwt.test.ts
The canonical host is now mqtt.meshmapper.net. The legacy .cc host remains recognized and can be migrated.
Stored connection migration
src/renderer/lib/connectionPanelStorageMigrations.ts, src/renderer/lib/connectionPanelStorageMigrations.test.ts
Stored MeshMapper settings are rewritten, persisted, and marked as migrated.
Preset and documentation updates
src/renderer/lib/meshcoreMqttPresets.test.ts, docs/meshcore-meshtastic-parity.md
The preset and documentation use the .net host. Tests cover its connection settings.

MeshCore BLE node suppression

Layer / File(s) Summary
BLE identity and node ID matching
src/renderer/lib/connectedMeshcoreBleMac.ts, src/renderer/lib/meshcoreBleMacMeshtasticNodeId.ts, src/renderer/lib/meshcoreBleMacMeshtasticNodeId.test.ts
The active BLE MAC is stored and converted to a Meshtastic node ID for matching.
BLE connection state wiring
src/renderer/runtime/useMeshcoreRuntime.ts
Connection, disconnect, and serial auto-connect paths update or clear the BLE MAC.
Meshtastic event suppression
src/renderer/lib/meshtastic/meshtasticRawPacketSideEffects.ts, src/renderer/runtime/useMeshtasticRuntime.ts, src/renderer/lib/meshtastic/meshtasticRawPacketSideEffects.test.ts
Matching node events no longer create stubs or update signal, persistence, diagnostics, or MQTT state.

MQTT TLS error hints

Layer / File(s) Summary
TLS handshake error classification
src/renderer/lib/meshcoreMqttUserHint.ts, src/renderer/lib/meshcoreMqttUserHint.test.ts
EPROTO and OpenSSL TLS alert patterns map to the TLS handshake hint.

Estimated code review effort: 3 (Moderate) | ~30 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Renderer
  participant Preload
  participant IPC
  participant MQTTManager
  participant DebugSnapshot
  Renderer->>Preload: getChannelNameToIndex()
  Preload->>IPC: invoke mqtt:getChannelNameToIndex
  IPC->>MQTTManager: getChannelNameToIndex()
  MQTTManager-->>IPC: sanitized channel mapping
  IPC-->>Renderer: channel mapping
  Renderer->>DebugSnapshot: store mapping in Meshtastic context
  DebugSnapshot-->>Renderer: include mapping in debug snapshot
Loading
sequenceDiagram
  participant MeshCoreRuntime
  participant BLEState
  participant MeshtasticRuntime
  participant MeshtasticSideEffects
  MeshCoreRuntime->>BLEState: store connected BLE MAC
  MeshtasticRuntime->>BLEState: read connected BLE MAC
  MeshtasticRuntime->>MeshtasticRuntime: compare node ID with BLE-derived ID
  MeshtasticRuntime-->>MeshtasticSideEffects: suppress matching node event
  MeshtasticSideEffects-->>MeshtasticRuntime: skip signal and persistence updates
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the three primary fixes: the MeshMapper host, MQTT channel mapping, and MeshCore BLE ghost nodes.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/mqtt-meshmapper-channel-blue-ghost

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Note

Quiet mode is enabled, so only the most important comments were posted inline. Other review comments are grouped below.

🟡 Other comments (3)
src/main/mqtt-manager.test.ts-1369-1369 (1)

1369-1369: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Remove the any casts from the direct MQTTManager private accesses.

Inlines 1360, 1369, 1380, 1392, 1424, 1432, and 1465 cast through any to reach _doConnect, channelNameToIndex, and onMessage. Use test-only interfaces with narrowed member shapes and cast through unknown for these internal accesses. Keep getChannelNameToIndex() for public channel-index reads.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/main/mqtt-manager.test.ts` at line 1369, Replace the any casts used for
direct MQTTManager private accesses in the affected tests with test-only
interfaces describing the needed _doConnect, channelNameToIndex, and onMessage
members, casting through unknown to those interfaces. Preserve
getChannelNameToIndex() for public channel-index reads and update all referenced
access sites consistently.

Source: Coding guidelines

src/renderer/lib/debugSnapshotMeshtasticContext.test.ts-1-1 (1)

1-1: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Restore the jsdom test environment.

The change removes the file-level jsdom directive. This file matches src/renderer/**/*.test.{ts,tsx}. Keep the directive or configure jsdom for this test file.

As per coding guidelines, renderer tests must use jsdom. As per path instructions, renderer tests must use jsdom.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/lib/debugSnapshotMeshtasticContext.test.ts` at line 1, Restore
the file-level jsdom environment directive in
debugSnapshotMeshtasticContext.test.ts, or otherwise configure this test file to
run under jsdom, while leaving the existing Vitest imports and test behavior
unchanged.

Sources: Coding guidelines, Path instructions

src/renderer/lib/debugSnapshotMeshtasticContext.test.ts-25-29 (1)

25-29: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Add coverage for the known-empty map state.

The contract distinguishes null for an unknown map from {} for a known empty map. These tests cover null and a non-empty map only. Add a behavioral assertion that sets {} and verifies that the builder preserves {}.

As per coding guidelines, behavioral changes must ship with a passing test. As per path instructions, tests should prefer behavioral assertions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/lib/debugSnapshotMeshtasticContext.test.ts` around lines 25 -
29, Add a behavioral test alongside the existing mqttChannelNameToIndex tests
that calls setDebugSnapshotMeshtasticContext with an empty map, then builds the
context via buildDebugSnapshotMeshtasticContextFromRuntime and asserts
mqttChannelNameToIndex remains {} rather than becoming null or another fallback.

Sources: Coding guidelines, Path instructions

🧹 Nitpick comments (1)
src/renderer/lib/meshcoreMqttUserHint.test.ts (1)

38-44: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Exercise each TLS matcher independently.

The test input contains all three patterns. Because the production condition uses ||, EPROTO matches first. The test does not verify TLSV1_ALERT_INTERNAL_ERROR or OPENSSL_internal:TLSV1_ALERT independently.

Add separate inputs for each pattern.

Suggested test change
   it('returns tlsHandshake hint for EPROTO / TLSV1_ALERT_INTERNAL_ERROR', () => {
-    const out = meshcoreMqttUserFacingHint(
-      'write EPROTO 30458176:error:10000438:SSL routines:OPENSSL_internal:TLSV1_ALERT_INTERNAL_ERROR:../../third_party/boringssl/src/ssl/tls_record.cc:486:SSL alert number 80',
-    );
-    expect(meshcoreUserMessageKey(out)).toBe('meshcore.mqttHints.tlsHandshake');
+    for (const message of [
+      'write EPROTO',
+      'TLSV1_ALERT_INTERNAL_ERROR',
+      'OPENSSL_internal:TLSV1_ALERT',
+    ]) {
+      expect(
+        meshcoreUserMessageKey(meshcoreMqttUserFacingHint(message)),
+      ).toBe('meshcore.mqttHints.tlsHandshake');
+    }
   });

As per path instructions, **/*.test.ts tests should prefer behavioral assertions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/lib/meshcoreMqttUserHint.test.ts` around lines 38 - 44, Update
the test for meshcoreMqttUserFacingHint to exercise each TLS matcher
independently: add separate behavioral cases whose inputs contain only EPROTO,
only TLSV1_ALERT_INTERNAL_ERROR, and only OPENSSL_internal:TLSV1_ALERT, and
assert each returns the tlsHandshake user-message key.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/renderer/lib/meshtastic/meshtasticRawPacketSideEffects.ts`:
- Around line 82-84: Move the shouldSuppressMeshtasticNodeHear guard from
applySignalAndHops() into handleRawPacket(), after validating from and after
deps.touchLastData() but before raw-packet diagnostics, packet-path recording,
or setSignalTelemetry(). Ensure suppressed packets return before all packet-wide
side effects, and add assertions verifying diagnostics and setSignalTelemetry()
are not called for them.

In `@src/renderer/runtime/useMeshcoreRuntime.ts`:
- Line 3069: Update the MeshCore connection lifecycle around
attemptMeshcoreReconnect(), handleMeshcoreConnectionLost(), and successful BLE
attachment to consistently track the canonical BLE MAC or node identity across
Linux, macOS, and Windows. Set the identity after every successful BLE attach,
including Linux Web Bluetooth connections without blePeripheralId, and clear it
on connection loss or failed replacement so stale values cannot suppress
Meshtastic updates. Add coverage for loss, reconnect, failed replacement, and
Linux Web Bluetooth.

---

Other comments:
In `@src/main/mqtt-manager.test.ts`:
- Line 1369: Replace the any casts used for direct MQTTManager private accesses
in the affected tests with test-only interfaces describing the needed
_doConnect, channelNameToIndex, and onMessage members, casting through unknown
to those interfaces. Preserve getChannelNameToIndex() for public channel-index
reads and update all referenced access sites consistently.

In `@src/renderer/lib/debugSnapshotMeshtasticContext.test.ts`:
- Line 1: Restore the file-level jsdom environment directive in
debugSnapshotMeshtasticContext.test.ts, or otherwise configure this test file to
run under jsdom, while leaving the existing Vitest imports and test behavior
unchanged.
- Around line 25-29: Add a behavioral test alongside the existing
mqttChannelNameToIndex tests that calls setDebugSnapshotMeshtasticContext with
an empty map, then builds the context via
buildDebugSnapshotMeshtasticContextFromRuntime and asserts
mqttChannelNameToIndex remains {} rather than becoming null or another fallback.

---

Nitpick comments:
In `@src/renderer/lib/meshcoreMqttUserHint.test.ts`:
- Around line 38-44: Update the test for meshcoreMqttUserFacingHint to exercise
each TLS matcher independently: add separate behavioral cases whose inputs
contain only EPROTO, only TLSV1_ALERT_INTERNAL_ERROR, and only
OPENSSL_internal:TLSV1_ALERT, and assert each returns the tlsHandshake
user-message key.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: QUIET

Plan: Pro Plus

Run ID: 8a8346d2-7591-4c42-81e0-af81f39f139f

📥 Commits

Reviewing files that changed from the base of the PR and between d98a956 and c29eedd.

⛔ Files ignored due to path filters (16)
  • src/renderer/locales/cs/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/de/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/en/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/es/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/fr/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/id/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/it/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/ja/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/ko/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/nl/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/pl/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/pt-BR/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/ru/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/tr/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/uk/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/zh/translation.json is excluded by !src/renderer/locales/**
📒 Files selected for processing (27)
  • docs/meshcore-meshtastic-parity.md
  • docs/troubleshooting.md
  • src/main/index.ipc-security.test.ts
  • src/main/index.ts
  • src/main/mqtt-manager.test.ts
  • src/main/mqtt-manager.ts
  • src/preload/index.ts
  • src/renderer/lib/connectedMeshcoreBleMac.ts
  • src/renderer/lib/connectionPanelStorageMigrations.test.ts
  • src/renderer/lib/connectionPanelStorageMigrations.ts
  • src/renderer/lib/debugSnapshot.test.ts
  • src/renderer/lib/debugSnapshot.ts
  • src/renderer/lib/debugSnapshotMeshtasticContext.test.ts
  • src/renderer/lib/debugSnapshotMeshtasticContext.ts
  • src/renderer/lib/letsMeshJwt.test.ts
  • src/renderer/lib/letsMeshJwt.ts
  • src/renderer/lib/meshcoreBleMacMeshtasticNodeId.test.ts
  • src/renderer/lib/meshcoreBleMacMeshtasticNodeId.ts
  • src/renderer/lib/meshcoreMqttPresets.test.ts
  • src/renderer/lib/meshcoreMqttUserHint.test.ts
  • src/renderer/lib/meshcoreMqttUserHint.ts
  • src/renderer/lib/meshtastic/meshtasticRawPacketSideEffects.test.ts
  • src/renderer/lib/meshtastic/meshtasticRawPacketSideEffects.ts
  • src/renderer/runtime/useMeshcoreRuntime.ts
  • src/renderer/runtime/useMeshtasticRuntime.ts
  • src/renderer/vitest.electronApiMock.ts
  • src/shared/electron-api.types.ts

Comment thread src/renderer/lib/meshtastic/meshtasticRawPacketSideEffects.ts Outdated
Comment thread src/renderer/runtime/useMeshcoreRuntime.ts Outdated
Move MeshCore MAC suppress earlier in raw-packet handling, clear/restore the
connected BLE identity across loss/reconnect/Linux Web BT, and tighten related
tests (typed MQTT private access, empty channel map, per-matcher TLS hints).
@rinchen
rinchen merged commit 0b47a9a into main Aug 3, 2026
12 checks passed
@rinchen
rinchen deleted the fix/mqtt-meshmapper-channel-blue-ghost branch August 3, 2026 16:14
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