Commit Graph
191 Commits
Author SHA1 Message Date
James RichandClaude Sonnet 5 1433033436 fix(wasm): close detekt/test gaps found while building the webApp module
detekt's source set list never included src/wasmJsMain or src/nonWebMain,
so every prior "detekt clean" claim in this effort never actually scanned
wasmJs code. Found while adding :webApp (whose entire source lives in
wasmJsMain and reported NO-SOURCE forever) and fixed at the root: both
source sets are now scanned repo-wide. Real findings it surfaced are
suppressed with honest, specific justification (embedded js("...") string
interop that static analysis can't see into) or fixed outright — nothing
silenced to dodge a genuine issue.

core:ble's own compileTestKotlinWasmJs had never actually been exercised:
7 of its 9 commonTest files reference Kable directly, which has no wasmJs
target, so they silently never compiled for wasmJs until this pass tried.
Moved them to a new nonWebTest source set, matching this effort's existing
android/jvm/ios-only test pattern elsewhere.

core:repository had a latent iOS-hierarchy trap: a manual nonWebTest
dependsOn edge (needed once core:testing was pulled out of commonTest)
silently disabled Kotlin's default hierarchy template, which is what wires
iosMain to the leaf iOS compilations. Restored the explicit
applyHierarchyTemplate(default) call alongside the manual edge.

Also tried retrofitting every wasmJs-enabled module to wasmJs { browser() }
to satisfy KGP's root npm resolver ahead of the webApp module (see next
commit) — reverted repo-wide: browser() arms each module's
wasmJsBrowserTest task, which allTests then picks up with no
karma/headless-Chrome runner configured anywhere in this repo, a CI-gate
regression that outweighs the benefit. Every wasmJs-enabled module's
comment now explains this explicitly instead of the stale "that's for the
eventual webApp executable" text, which turned out to be wrong.

core:ui's MeshtasticNavigationSuite gained an optional visibleDestinations
parameter (default: today's full tab set) so a host can hide a tab it has
no entry provider for without a per-platform expect/actual — needed by
webApp, which omits Map.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-31 04:42:26 -05:00
James Rich 1f92259f6d feat(database): enable wasmJs with real OPFS-backed persistence
Room 3.0.2 + androidx.sqlite:sqlite-web:2.7.0's WebWorkerSQLiteDriver, backed by real
SQLite compiled to WASM (@sqlite.org/sqlite-wasm) running in a dedicated Web Worker
(core/database/worker/{package.json,worker.js}), persisting via OPFS -- same shape
already proven end-to-end this session (insert survives a full page reload) against
the upstream danysantiago/room-web-demo reference. Uses the same nonWebMain
hierarchy-split pattern already proven for core:ble.

DatabaseManager (multi-device switching, legacy-DB migration, cross-transport merge)
is built entirely on DatabaseDataStore (a DataStore<Preferences> wrapper), and
androidx.datastore.preferences has zero wasmJs variant at any published version --
not a temporary gap, the Preferences type itself doesn't resolve for that target. That
whole orchestrator is out of scope for a web client (no BLE/USB device-switching story
exists there), so it moves to nonWebMain unchanged, alongside DatabaseDataStore and its
Koin module. wasmJs gets a new SingleDatabaseProvider: one real, persistent,
non-switching MeshtasticDatabase, nothing to switch between.

BusyTimeoutSQLiteDriver turned out not to be platform-neutral as originally assumed:
androidx.sqlite.SQLiteDriver.open() is suspend on androidx.sqlite's own webMain branch,
non-suspend everywhere else (confirmed from androidx.sqlite:sqlite:2.7.0's own
sources) -- split into two independent, identically-shaped classes rather than one
shared implementation, since the suspend-modifier difference means actual can't
paper over it (same "disjoint compilations" shape as core:ble's
BleServiceExtensions.kt).

getInMemoryDatabaseBuilder()/getDatabaseDirectory()/deleteDatabase()/getFileSystem()
fail loudly or return best-effort placeholders on wasmJs -- confirmed via grep that
their only real caller, DatabaseManager, lives entirely in nonWebMain now, so nothing
wasmJs-reachable needs them to do anything real. Same "fail loudly, don't silently
return wrong data" precedent as core:resources' getString().

androidApp/desktopApp needed a small, necessary addition: registering the new
CoreDatabaseNonWebModule alongside the existing CoreDatabaseModule, since without it
neither platform would have a DatabaseDataStore Koin binding anymore.

Verified independently twice: compileKotlinWasmJs/compileTestKotlinWasmJs pass;
full regression (android/jvm/iOS compiles, allTests -- with the ~21 moved
DatabaseManager*/DAO tests confirmed actually executing via real test-report output,
not just exit code) passes; androidApp and desktopApp both compile clean with the new
DI wiring; detekt/spotlessCheck clean across core:database and both app modules. No
real browser round-trip test was run against this exact worker.js (accepted as a
stretch goal, not required for this pass).
2026-08-30 20:50:59 -05:00
James Rich f78268581e feat(messaging): mark unread, swipe row actions, and pinned conversations (#6857) 2026-08-24 20:44:07 +00:00
James Rich 1ab4da0fa6 feat(messaging): per-contact drafts and a quieter composer (#6851) 2026-08-24 10:43:59 -05:00
James RichandClaude Sonnet 5 99075c5dbe feat(hardware): fetch the maintenance UF2 manifest from the API, digest-pinned (#6803)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 17:58:51 +00:00
James RichandClaude Sonnet 5 4651c85361 feat(hardware): fetch bootloader OTA quirks from the API, seeded from the bundled asset (#6802)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 13:23:32 +00:00
James RichandClaude Fable 5 459eb61948 fix(database): give every SQLite connection a busy timeout (#6809)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 12:42:59 +00:00
James RichandClaude Fable 5 b6213f94ec fix(database): rebuild the packet FTS index after the schema-52 table recreation (#6808)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 12:23:57 +00:00
James Rich 3796787cdf fix(database): raise default cache limit and warn before eviction (#6742) 2026-08-17 17:37:51 +00:00
James Rich 2df817db7a fix(node): make node-list search case-insensitive for non-ASCII names (#6753) 2026-08-17 17:37:23 +00:00
James RichandClaude Opus 5 19bb682c9c feat(firmware): add nRF52/RP2040 factory erase and OTAFIX bootloader upgrade over USB (#6526)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 16:43:07 +00:00
Jeremiah K 41414f832f fix(discovery): restore radio state after interrupted scans (#6717) 2026-08-15 23:49:38 +00:00
Jeremiah K e9d09a3380 fix(lifecycle): harden packet admission and transport ownership (#6716) 2026-08-15 21:44:17 +00:00
simulationstation 2f387369c1 fix(messaging): disambiguate sender-scoped packet IDs (#6624) 2026-08-13 13:50:37 +00:00
James RichandClaude Fable 5 b3e3804b78 fix(database): recover from Room's silent connection-pool wedge (#6608) (#6658)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 03:08:37 +00:00
James RichandClaude Opus 5 d5848ad5e0 fix(database): bound withDb execution so one wedged callback can't stall every write (#6661)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 20:45:10 +00:00
James RichandClaude Fable 5 dda971b5ce fix(messaging): time out orphaned "Sending..." messages into a retryable failure (#6630)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 02:10:30 +00:00
simulationstation fd8414abe3 fix(database): delete nodes and metadata atomically (#6623) 2026-08-12 01:36:57 +00:00
Jeremiah K 2f191868e9 fix(database): recover wedged observer pools (#6540) 2026-08-01 21:39:16 +00:00
James RichandClaude Opus 5 07d253130b refactor(di): replace Koin string qualifiers with distinct types (#6522)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 20:56:07 +00:00
James RichandClaude Opus 5 2d20cd8a47 fix(ui): give rx_snr real presence semantics end to end (#6523)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 16:40:41 +00:00
James RichandClaude Opus 5 39139398e6 fix(model): rssi explicit presence for protobufs 2.7.26.138 (#6498)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 21:12:28 +00:00
James RichandClaude Opus 5 6c32af9a84 test: revive 80 dormant tests in eight abstract Common*Test classes (#6501)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 21:11:42 +00:00
James RichandClaude Opus 5 b4105e3e3f fix(event): honor disabled node events, gate brand URLs, observe the manifest (#6499)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 21:09:13 +00:00
James RichandClaude Opus 5 4c3196c29a fix(connections): dedupe recent-TCP and reaction list keys (#6494)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 16:19:07 +00:00
James RichandClaude Opus 5 c75223c43a fix(messaging): use mesh time for message timestamps and grouping (#6422)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-24 22:12:13 +00:00
James RichandClaude Opus 4.8 bfbf74df1e fix(channels): store channel set per-device to stop cross-device duplicates (#4623) (#6409)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 13:57:39 -05:00
Jeremiah K 8cf8214162 fix(hardware): throttle repeated catalog refreshes for cache misses (#6399) 2026-07-24 16:29:10 +00:00
Jeremiah K 09555a4398 fix(node): reconcile stale identity replays after renumbering (#6259) 2026-07-22 23:53:43 +00:00
Jeremiah K 602b9b086f fix(database): reduce write-lane pressure from one-shot reads (#6255) 2026-07-22 16:50:41 +00:00
Jeremiah K 1bf25121ca fix(database): make DB updates atomic across device switches (#6256) 2026-07-21 14:36:00 +00:00
James RichandClaude Opus 4.8 c0cf5a6da9 fix(database): make the injected DiscoveryDao follow the active database (#6236)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 00:48:45 +00:00
James RichandClaude Opus 4.8 e48640e473 fix(database): route all one-shot DB writes through the merge drain barrier (#6233)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 00:12:57 +00:00
James RichandClaude Opus 4.8 4e48e64e78 fix(database): make completed cross-transport merges retry-idempotent (#6231)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 23:40:17 +00:00
James RichandClaude Fable 5 bc5719c8a7 fix(database): migrate device identity across firmware 2.8 renumbering (#6228)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 22:54:54 +00:00
James RichandClaude Fable 5 5b0d046d42 feat(firmware): nightly preview channel behind the hidden-features unlock (#6225)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 19:41:19 +00:00
James RichandClaude Fable 5 97935eb30d fix(database): force Room single-connection pool on all platforms (#6202)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 18:43:02 +00:00
James RichandClaude Fable 5 efbd70d591 build: apply Gradle/Kotlin best-practices audit fixes (#6200)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 18:39:53 +00:00
James RichandClaude Fable 5 1d91a9f22c fix(service): route notification quick-replies through the send pipeline; drop dead parcelize plugin (#6196)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 15:24:31 +00:00
James RichandClaude Fable 5 7115c176d4 fix(discovery): restore radio home config after an interrupted scan (#6192)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 13:48:04 +00:00
James RichandClaude Opus 4.8 f6a3f091ed test(database): exercise the Room migration chain in CI (#6191)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-10 13:22:42 +00:00
James RichandClaude Fable 5 0a3e000252 fix: address 2.8.0 release-audit findings (#6189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 12:41:54 +00:00
Jeremiah K a3a8397134 fix(database): recover firmware metadata reads after DB pool churn (#6177) 2026-07-09 23:36:27 +00:00
James RichandClaude Opus 4.8 9e55cdb3eb feat: wire up event-firmware metadata API (offline-first) + post-event firmware reminder (#6162)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 23:53:32 +00:00
Jeremiah K e12c4a579d fix(runtime): harden BLE profile, OTA setup, and DB access (#6126) 2026-07-07 19:58:43 +00:00
James Rich 33fbb9f7fc chore: fix build warnings and migrate deprecated APIs (#6130) 2026-07-07 18:17:42 +00:00
James RichandClaude Opus 4.8 6b58a975ef feat(node): label power channels and fix pressure axis scale (#6111)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 16:40:00 +00:00
James RichandClaude Opus 4.8 4ea3f27e8c test: activate dead NodeInfoDao tests (#6113)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 15:13:24 +00:00
James RichandClaude Opus 4.8 4a9f85bf5e feat(database): unify device database across transports (#6096)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 01:41:29 +00:00
Ben Meadors d815d6d363 feat(messaging): translate chat messages in-place with on-device ML Kit (google flavor only) (#6103) 2026-07-06 01:03:38 +00:00