James Rich
352cce6603
docs: update MIGRATION-REMAINING.md — Room cleanup complete (97%)
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
19eba729f7
chore(database): Room migration 39→40 — drop legacy node tables
...
- Remove my_node, nodes, metadata tables via AutoMigration with @DeleteTable
- Parameterize all 34 PacketDao queries to accept myNodeNum directly
- Delete NodeInfoDao, NodeEntity, MyNodeEntity, MetadataEntity
- Delete CommonNodeInfoDaoTest (dead)
- Rewrite PacketRepositoryImpl to inject NodeRepository for myNodeNum
- Rewrite CommonPacketDaoTest and CommonPacketRepositoryTest
- Update MigrationTest to remove nodeInfoDao usage
- Update core/database README to reflect current schema
SDK is now sole source of truth for all node data.
Room only stores messages, logs, and user annotations.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
1dd3637b50
refactor: eliminate NodeInfoReadDataSource, use NodeRepository directly
...
MeshLogRepositoryImpl was the sole external consumer of
NodeInfoReadDataSource — it only needed myNodeNum to identify the
local node in logs. Replace with NodeRepository.myNodeInfo (already
SDK-backed via SdkNodeRepositoryImpl).
PacketRepositoryImpl referenced NodeInfoDao.MAX_BIND_PARAMS — inlined
as a private constant since it's just the SQLite bind-param limit.
With zero external consumers remaining, delete:
- NodeInfoReadDataSource interface
- SwitchingNodeInfoReadDataSource implementation
The Room NodeInfoDao/NodeEntity/MyNodeEntity remain in the database
module for now (internal tests + migration history) but have no
external dependents — ready for a future Room migration 40 to DROP.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
a0ee9e8399
docs: update MIGRATION-REMAINING.md with latest cleanup status
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
10425e8c4e
refactor: delete dead broadcast Constants.kt and unused actionReceived
...
Constants.kt re-exported MeshtasticIntent constants for the deleted
ServiceBroadcasts system. No consumers remain after broadcast removal.
Also remove MeshService.actionReceived() companion method (no callers).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
f0aa99eaff
refactor: delete POC ViewModels and stale references
...
- Delete SdkConfigViewModel, SdkMessagingViewModel, SdkTelemetryViewModel (unused POC)
- Delete RadioClientViewModel, SdkNodeListViewModel (POC logging only)
- Remove POC VM instantiation from Main.kt
- Delete NoopRadioInterfaceService (superseded by SdkRadioInterfaceService)
- Delete dead app/test/Fakes.kt (both classes unused)
- Fix stale KDoc references to MeshConnectionManager, RadioInterfaceService.connectionState
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
3cdad0da28
refactor: delete transport layer and dead intermediaries, slim RadioInterfaceService
...
- Delete entire transport layer: BleRadioTransport, TcpRadioTransport,
SerialRadioTransport, StreamTransport, HeartbeatSender, StreamFrameCodec,
AndroidRadioTransportFactory, BaseRadioTransportFactory, MockRadioTransport,
NopRadioTransport, BleReconnectPolicy, TcpTransport, SerialTransport
- Delete MeshConfigHandler interface + impl (replaced by RadioConfigRepository)
- Delete RadioTransportCallback, RadioTransport, RadioTransportFactory interfaces
- Delete FakeRadioTransport, RadioTransportTest, MeshConfigHandlerImplTest
- Delete UseCase tests (impls restored, tests for deleted patterns removed)
- Slim RadioInterfaceService interface: remove transport internals, keep only
device-address/connection surface needed by Scanner and connections UIs
- Create SdkRadioInterfaceService: thin SDK-backed impl delegating to
RadioPrefs + RadioClientAccessor
- Update NoopRadioInterfaceService to match slimmed interface
- Update JvmUsbScanner to use SDK's JvmSerialPorts.list() instead of
deleted SerialTransport.getAvailablePorts()
- Remove DesktopRadioTransportFactory from desktop DI module
- Fix NodeListViewModel: replace RadioInterfaceService with RadioPrefs
- Fix MeshServiceOrchestratorTest: align with updated constructor params
- Fix UIViewModel: use emptyFlow() for meshActivity (SDK doesn't emit
raw transport-level activity events)
All targets compile clean, all JVM + Android unit tests pass.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
74ba959b24
feat: DRY SDK integration — shared bridge, Desktop cutover, dead infra deletion
...
Major architectural changes:
1. SHARED KMP BRIDGE (core/data/radio/):
- RadioClientAccessor: Platform-agnostic interface for SDK RadioClient
- SdkRadioController: Shared RadioController impl (replaces per-platform copies)
- SdkStateBridge: Shared SDK→repository bridge (event dispatch, node sync)
- SdkPacketHandler: Thin SDK-backed PacketHandler for MQTT/XModem/History
2. DESKTOP SDK CUTOVER:
- DesktopRadioClientProvider: TCP + Serial transport support
- Removed DirectRadioControllerImpl (old desktop radio path)
- Desktop now shares the same SDK bridge code as Android
3. DEAD INFRASTRUCTURE DELETION (~5,100 LOC removed):
- PacketHandlerImpl, MeshDataHandlerImpl, MeshRouterImpl
- CommandSenderImpl, MeshActionHandlerImpl, MeshConfigFlowManagerImpl
- MeshConnectionManagerImpl, AdminPacketHandlerImpl
- ServiceBroadcasts (Android intent-based pub/sub)
- NodeRepositoryImpl (Room-backed, replaced by SdkNodeRepositoryImpl)
- 8 trivial UseCases (SetLocale, SetTheme, ToggleAnalytics, etc.)
- All associated test files for deleted impls
- Deleted interfaces: AdminPacketHandler, CommandSender, MeshActionHandler,
MeshConfigFlowManager, MeshConnectionManager, MeshRouter, ServiceBroadcasts
4. NEW FEATURES:
- NodeMetadataEntity + Room migration 38→39 (persistent favorites/notes)
- AppMetadataRepository (clean access to node metadata)
- MessagePersistenceHandler (focused rememberDataPacket for StoreForward)
All three targets compile clean: :app:compileGoogleDebugKotlin,
:desktop:compileKotlin, :core:data:jvmTest passes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
2c438b9a3f
docs: add MIGRATION-REMAINING.md tracking clean-break progress
...
Documents completed phases (A-G partial), remaining blockers,
and recommended execution order for full SDK migration.
Key remaining items:
- Desktop SDK migration (unblocks ~2,000 LOC deletion)
- Module restructuring (unblocks VM direct-binding)
- 22 VM migrations to RadioClient
- 4 deferred UseCase deletions
- Phase C completion (packet flow cleanup)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
2162e0a340
feat: full SDK integration — drop AIDL, eliminate pipeline, SDK-backed nodes
...
Phase 1: Drop AIDL
- Delete all 6 .aidl files (core/api/src/main/aidl/)
- Strip binder object from MeshService (onBind returns null)
- Simplify MeshServiceClient to lifecycle observer (no AIDL binding)
- Remove meshService field from AndroidServiceRepository
- Delete ServiceClient, AndroidRadioControllerImpl, FakeIMeshService,
IMeshServiceContractTest
Phase 2: Migrate TAK to RadioController
- GenericCoTHandler: RadioController replaces CommandSender
- TAKMeshIntegration: RadioController replaces CommandSender
- CoreTakServerModule: DI updated
Phase 3: Port remaining consumers
- MeshConnectionManagerImpl: RadioController, remove time sync/passkey
(SDK handles internally), wrap telemetry in coroutine
- MeshConfigFlowManagerImpl: remove CommandSender dependency, use 0L
for currentPacketId
- RefreshLocalStatsAction: RadioController for widget telemetry
- EnsureRemoteAdminSessionUseCase: serviceRepository.onServiceAction()
replaces meshActionHandler
Phase 4: Delete dead pipeline
- Delete FromRadioPacketHandler interface + FromRadioPacketHandlerImpl
- Delete MeshMessageProcessor interface + MeshMessageProcessorImpl
- Delete related tests
- Remove MeshMessageProcessor dep from MeshActionHandlerImpl
- Keep CommandSender/MeshRouter/MeshActionHandler for
DirectRadioControllerImpl (desktop target)
Phase 5: SDK-backed NodeRepository
- New SdkNodeRepositoryImpl: in-memory StateFlow backed by NodeManager
- SDK handles persistence via its own SqlDelight storage
- Deactivate Room-backed NodeRepositoryImpl (@Single removed)
- NodeManagerImpl propagates myNodeNum to SdkNodeRepositoryImpl
- Cold start: brief empty state until SDK emits snapshot (<1s)
- Node notes: in-memory for POC (does not survive process death)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
9319b0c3a3
refactor: tighten SDK integration — eliminate old pipeline indirection
...
SdkStateBridge:
- Remove redundant manual proto decode (telemetry/position/user) — SDK's
NodeChange flow already provides updated NodeInfo with all fields
- Forward raw packets to meshPacketFlow for RadioConfigViewModel + TAK
- Handle ServiceActions directly via SDK AdminApi (Favorite, Ignore, Mute,
Reaction, ImportContact, SendContact, GetDeviceMetadata)
- Bypasses entire CommandSender → MeshActionHandler → MeshRouter chain
MeshServiceOrchestrator:
- Remove radioInterfaceService.connect() — SDK owns transport now
- Remove receivedData → messageProcessor wiring — SDK handles packets
- Remove serviceAction → actionHandler subscription — SdkStateBridge handles
- Remove resetReceivedBuffer — no raw byte pipeline to drain
- Retain: TAK integration, database init, service notifications
- Remove unused constructor params (serviceRepository, messageProcessor, router)
Architecture after this commit:
- All in-app flows: Feature VM → RadioController → SdkRadioControllerImpl → SDK
- ServiceActions: UI → ServiceRepository.onServiceAction → SdkStateBridge → SDK
- AIDL binder: only remaining path to old CommandSender/MeshActionHandler (for
external 3rd-party app compat only)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
f5e2aabc00
feat: add SdkRadioControllerImpl and SdkStateBridge for SDK hard cutover
...
Replace the legacy AIDL-based AndroidRadioControllerImpl with an SDK-backed
implementation that delegates all operations through RadioClient:
SdkRadioControllerImpl:
- Full RadioController interface impl (~35 methods)
- Local admin ops → SDK AdminApi/TelemetryApi/RoutingApi
- Remote admin ops → raw MeshPacket via RadioClient.send()
- Registered as @Single(binds = [RadioController::class]) in Koin
SdkStateBridge:
- Bridges SDK reactive flows (connection, nodes, packets, events) into
ServiceRepository and NodeManager for legacy UI compatibility
- Connection state mapping (SDK states → app ConnectionState enum)
- Node snapshot/added/updated/removed → NodeManager
- Inbound telemetry/position/user packets → NodeManager handlers
- Events (reboot, security warnings, drops) → notification layer
AndroidRadioControllerImpl:
- @Single annotation disabled (commented out) to prevent Koin conflict
- Class retained for reference/fallback
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
384746cc75
feat: enrich Android POC with SDK integration improvements
...
- RadioClientProvider: support BLE, TCP, and Serial transports via
InterfaceId routing; handle MOCK/NOP gracefully
- SdkNodeListViewModel: use SDK's MeshNode model for 20+ enriched
fields (isOnline, battery, position, signal quality, etc.)
- SdkConfigViewModel: remove Gap G workaround (_localConfigOverrides),
add reactive channels StateFlow from SDK
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
dd67120b5c
refactor(radio): use SDK BleTransport(address) factory (Gap F resolved)
...
Replace the two-step buildPeripheralForSavedAddress() + BleTransport(peripheral, address)
with the new SDK factory BleTransport(address) { autoConnectIf { true } }.
The SDK's transport-ble androidMain now exposes BleTransport(address: String,
builderAction: PeripheralBuilder.() -> Unit) directly, removing the need for
the core:ble workaround. The autoConnectIf { true } flag preserves bonded-device
behavior (avoids GATT 133 on reconnect without a fresh advertisement).
Gap F note removed from RadioClientProvider KDoc — gap is resolved in SDK.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
8b459881e0
feat: integrate meshtastic-sdk POC vertical slice
...
Wires core flows to the meshtastic-sdk (0.1.0-SNAPSHOT) while keeping the
legacy path alive. Goal: prove the SDK works with a real Android app and
surface API deficiencies.
Build:
- settings.gradle.kts: composite build inclusion for meshtastic-sdk
(../meshtastic-sdk) with dependency substitution for all SDK artifacts
- libs.versions.toml: sdk = "0.1.0-SNAPSHOT", mavenCentral snapshots repo
- app/build.gradle.kts: sdk-core, sdk-proto, sdk-transport-ble,
sdk-storage-sqldelight dependencies
Bootstrap:
- MeshUtilApplication: AndroidContextHolder.context set in onCreate()
before startKoin so SqlDelightStorageProvider can locate app files
- RadioClientProvider (@Single, binds SdkClientLifecycle): mutex-serialized
rebuildAndConnect(), strips 'x' prefix from BLE devAddr, holds
RadioClient StateFlow
- RadioClientViewModel: exposes RadioClientProvider to UI layer
SDK ViewModels (POC quality, compile-verified):
- SdkNodeListViewModel: NodeChange.Snapshot/Added/Updated/Removed → UiNode
- SdkMessagingViewModel: sendText() via client.sendText(), incomingText
via client.textMessages (Gap B — now fixed in SDK)
- SdkConfigViewModel: configBundle reads, setConfig/setOwner writes,
loadChannels() via admin, Gap G workaround (local override map)
- SdkTelemetryViewModel: TelemetryApi.observe(NodeId), requestDeviceMetrics
Service lifecycle:
- SdkClientLifecycle interface in core:service (avoids reverse dep from
service → app); RadioClientProvider implements it
- MeshService.onDestroy: calls sdkClientLifecycle.disconnect() before
serviceJob.cancel()
- BlePeripheralFactory.kt in core:ble: public buildPeripheralForAddress()
wrapper (Gap F workaround; proper fix needed in SDK transport-ble)
SDK gaps discovered and logged:
Gap B - textMessages flow (FIXED in SDK feat/meshtastic-android-integration-gaps)
Gap C - channels StateFlow (no reactive cache, only admin.listChannels())
Gap F - BleTransport MAC string factory (requires live Peripheral today)
Gap G - configBundle not refreshed after editSettings writes
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
213c380514
refactor(firmware): replace PlatformBackHandler with NavigationBackHandler ( #5376 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 20:01:40 +00:00
github-actions[bot]
8d621bc6f4
docs: update CHANGELOG.md ( #5374 )
...
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-05-06 14:24:26 -05:00
renovate[bot]
0b75fd4140
chore(deps): update paging to v3.5.0 ( #5375 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-06 14:20:43 -05:00
renovate[bot]
d28d684d05
chore(deps): update compose-multiplatform to v1.11.1 ( #5371 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-06 14:18:59 -05:00
renovate[bot]
2f2a71587d
chore(deps): update androidx.camera.viewfinder:viewfinder-compose to v1.6.1 ( #5370 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-06 14:06:21 -05:00
github-actions[bot]
78b9a942dc
docs: update CHANGELOG.md ( #5363 )
...
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
v2.7.14-closed.26
v2.7.14-internal.87
v2.7.14-open.8
2026-05-06 12:11:32 -05:00
renovate[bot]
f547be6cbf
chore(deps): update room to v3.0.0-alpha04 ( #5368 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-06 12:10:34 -05:00
renovate[bot]
8434b57613
chore(deps): update androidx.camera:camera-view to v1.6.1 ( #5367 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-06 12:10:10 -05:00
James Rich
3c75510f01
fix(mqtt): harden TLS enforcement, add user CA trust, and improve error diagnostics ( #5365 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 12:09:49 -05:00
renovate[bot]
f97900b558
chore(deps): update org.jetbrains.androidx.navigation3:navigation3-ui to v1.1.1 ( #5364 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-06 12:07:52 -05:00
James Rich
3e55579250
chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) ( #5357 )
...
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com >
2026-05-06 12:02:01 -05:00
renovate[bot]
7db0f9a032
chore(deps): update jetbrains.lifecycle to v2.11.0-beta01 ( #5359 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-06 11:55:26 -05:00
James Rich
086c9afbaf
feat: desktop-only build isolation for Flatpak packaging ( #5360 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
Co-authored-by: Austin <vidplace7@gmail.com >
2026-05-06 12:43:35 -04:00
renovate[bot]
94e3901bd4
chore(deps): update compose-multiplatform to v1.11.0-rc01 ( #5358 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-06 10:13:14 -05:00
renovate[bot]
5a303e148c
chore(deps): update agp to v9.2.1 ( #5361 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-06 10:12:58 -05:00
renovate[bot]
7021984281
chore(deps): update com.android.tools:common to v32.2.1 ( #5362 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-06 10:12:49 -05:00
github-actions[bot]
d8ed204800
docs: update CHANGELOG.md ( #5356 )
...
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
v2.7.14-closed.25
v2.7.14-open.7
v2.7.14-internal.86
2026-05-04 16:11:00 -05:00
James Rich
2de57a9e81
feat: align theme with Design Standards v1.3, remove contrast setting ( #5355 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-04 16:10:06 -05:00
github-actions[bot]
1a6774d67c
docs: update CHANGELOG.md ( #5353 )
...
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
v2.7.14-internal.85
2026-05-04 15:03:54 -05:00
James Rich
82926fd734
feat: event firmware easter egg with ambient branding ( #5354 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-04 19:37:47 +00:00
James Rich
78ff3f599c
chore(ble): don't surface ui message when canceling scope ( #5352 )
2026-05-04 17:23:57 +00:00
github-actions[bot]
c9d633f1d3
docs: update CHANGELOG.md ( #5351 )
...
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
v2.7.14-internal.84
2026-05-04 11:48:25 -05:00
James Rich
fa3437b147
chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) ( #5349 )
...
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com >
2026-05-04 11:45:11 -05:00
renovate[bot]
fca1fd8248
chore(deps): update org.meshtastic:mqtt-client to v0.3.6 ( #5350 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-04 11:44:42 -05:00
github-actions[bot]
e70396f55f
docs: update CHANGELOG.md ( #5348 )
...
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-05-04 11:33:13 -05:00
Copilot
f51e046043
Add Meshtastic design standards as a skill ( #5346 )
...
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com >
Co-authored-by: jamesarich <2199651+jamesarich@users.noreply.github.com >
2026-05-04 11:32:42 -05:00
James Rich
26c50258da
chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) ( #5347 )
...
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com >
2026-05-04 11:30:59 -05:00
github-actions[bot]
7d9f0e9682
docs: update CHANGELOG.md ( #5345 )
...
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-05-03 20:16:53 -05:00
renovate[bot]
08ff14235d
chore(deps): update org.meshtastic:mqtt-client to v0.3.5 ( #5344 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
v2.7.14-closed.24
v2.7.14-internal.83
v2.7.14-open.6
2026-05-04 00:23:57 +00:00
github-actions[bot]
744dab07fc
docs: update CHANGELOG.md ( #5342 )
...
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
v2.7.14-open.5
v2.7.14-internal.82
v2.7.14-closed.23
2026-05-03 15:20:36 -05:00
renovate[bot]
82562f8028
chore(deps): update org.meshtastic:mqtt-client to v0.3.4 ( #5343 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-03 15:18:31 -05:00
renovate[bot]
94540aabb1
chore(deps): update vico to v3.2.0-next.3 ( #5341 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-03 15:17:55 -05:00
James Rich
f1423e4ee2
chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) ( #5339 )
...
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com >
2026-05-03 14:51:57 -05:00
github-actions[bot]
1b8b94d4db
docs: update CHANGELOG.md ( #5336 )
...
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
v2.7.14-internal.81
v2.7.14-open.4
v2.7.14-closed.22
2026-05-02 14:38:20 -05:00
James Rich
1c984d54f4
chore: Integrate MQTT logging with Kermit and enhance PII sanitization ( #5338 )
2026-05-02 18:53:19 +00:00