Files
meshtastic-web/apps/web/public/devices/seeed-sensecap-indicator.svg
T
Ben MeadorsandGitHub bbe9a0d5cd feat(protobufs): sync to firmware-current and consume workspace package (#1097)
* feat(protobufs): sync to firmware-current and consume workspace package

Sync the vendored .proto sources to firmware-current (v2.7.25+48), regenerate the v2 TS bindings, and consume the workspace @meshtastic/protobufs (workspace:*) in place of the stale JSR 2.7.20 — finishing the monorepo migration (core was already workspace:*).

Includes the one required breaking-change fix: admin nodedb_reset changed int32 to bool, so resetNodes() now sends value: true.

* build(protobufs): vendor generated bindings for workspace consumers

The package is consumed via workspace:* — its exports point at the TS source, which imports ./dist/meshtastic/*_pb.ts — so the generated output must exist at build time. CI builds web/core with no codegen step and the runners have no buf CLI, so the bindings are vendored here (kept gitignored; lint/format skip them). Regenerate with: pnpm --filter @meshtastic/protobufs gen

* fix(protobufs): clean script removes the actual generated output dir

buf writes bindings to packages/ts/dist, but clean was removing a non-existent root dist — so it never cleaned stale output. Addresses Copilot review feedback.

* refactor: move web app packages/web -> apps/web

Aligns the web app with the apps/web layout (matching the Vercel web-test Root Directory and the SDK-migration direction). Pure directory move plus root config: pnpm-workspace (adds apps/*), vitest projects, root tsconfig reference, and the pr/release-web/nightly workflows. vercel.json moved with the app. Build + 36 validation tests green.

* feat: config fields, module pages, key verification, telemetry capture

Incorporates the firmware-current feature work onto the protobuf foundation: new config fields (Display message bubbles; LoRa fem_lna_mode + serial_hal_only; Telemetry air_quality_screen_enabled); 4 new ModuleConfig pages (TrafficManagement, StatusMessage, TAK, RemoteHardware); the manual Key Verification flow (sendKeyVerification + ClientNotificationDialog stages + Verify Key button); live telemetry capture (nodeDB addDeviceMetrics) and admin hardening (toggleMutedNode, graceful PortNum default); plus the sdk-preview ConfigEditor demo and store/config tests. Build + lint + format + 131 tests green.

* chore: drop #1062 (unsaved-change-detection) to match upstream revert

#1062 was merged to main by accident (per @danditomaso) and is being reverted. Reverse-applied its diff here via 3-way so #1097 stays consistent with where main is headed, while keeping the feature changes layered on the same files (deviceStore/changeRegistry). Build + 131 tests + lint + format green.

* fix(nodes): clean up SNR display in node table and map popup

SNR is a ratio measured in dB, not dBm (which is absolute power); the
node table and map popup both mislabeled it and crammed three values
together: '0dBm/50%/50raw'. The trailing '%/raw' pair was the same
heuristic ((snr+10)*5) shown twice — once clamped, once not.

Render SNR in dB rounded to one decimal, color-coded by a 0-100%
signal-quality heuristic (green/yellow/red), with the quality percentage
as a muted secondary. Drop the redundant raw value. Adds unit.db; this
matches the existing SNRTooltip, which already renders dB.
2026-06-15 13:23:28 -05:00

547 lines
12 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" viewBox="713.62 574.61 677 692.34">
<defs><style>
.cls-1 {
fill: #d3d3d3;
}
.cls-2 {
fill: #bfbfbe;
}
.cls-3 {
fill: #b0b0af;
}
.cls-4 {
fill: #e5e5e3;
}
.cls-5 {
fill: #353535;
}
.cls-6, .cls-7 {
fill: none;
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-6 {
stroke-width: 1.65px;
}
.cls-7 {
stroke-width: 3px;
}
.cls-8 {
fill: #cccccb;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><path
class="cls-1"
d="M742.78,1220.62c-19.75-8.13-31.52-23.69-26.5-40.61l69.29-233.38a11,11,0,0,1,2.09,4.35l4.07,19.26"
></path><path
class="cls-2"
d="M790,962.24l-65.73,221.37a30.26,30.26,0,0,0,33.33,38.56L842.4,1210"
></path><path
class="cls-3"
d="M807.29,1043.86l-30.5,104.26-18.71,2.1,30-98.73a3,3,0,0,0-2.87-3.87,6.45,6.45,0,0,1-6.16-8.36l16.23-52.36Z"
></path><polygon
class="cls-3"
points="828.12 1142.37 783.87 1147.34 809.96 1056.49 828.12 1142.37"
></polygon><path
class="cls-3"
d="M775.27,1153.34,761.91,1199a3.68,3.68,0,0,1,0-2.11,5.17,5.17,0,0,0-5-6.53h-2.43a6.34,6.34,0,0,1-6.07-8.19l8.14-26.82Z"
></path><polygon
class="cls-3"
points="839.03 1193.99 768.37 1201.28 782.36 1152.58 829.2 1147.52 839.03 1193.99"
></polygon><path
class="cls-4"
d="M1375,1178.08c-9.54,7.22-39,20.08-59.5,23.23l-414.72,63.57A48.48,48.48,0,0,1,846,1227l-7-33L795.25,986.9,787.66,951a10,10,0,0,0-2.09-4.35l-9.8-11.87a10,10,0,0,1-2.09-4.35L718.39,668.87c-.1-.45-.18-.91-.26-1.36a26.13,26.13,0,0,1,14.41-27.36l36.79-18.33c11.15-5.55,21.79-6.71,34.35-7.73Z"
></path><path
class="cls-1"
d="M1235.26,576.22a28.15,28.15,0,0,1,29.92,21.84l123.06,543.61a35.82,35.82,0,0,1-29.51,43.32L944,1248.56a48.48,48.48,0,0,1-54.77-37.89L770.75,650.17A29.51,29.51,0,0,1,797,614.67Z"
></path><path
class="cls-5"
d="M802.91,657.25,916.05,1194.5a17,17,0,0,0,19.22,13.33l426-64.41a14.6,14.6,0,0,0,12-17.67L1257.48,615.46a14.27,14.27,0,0,0-15.18-11.05L813.65,642.73A12.07,12.07,0,0,0,802.91,657.25Z"
></path><path
class="cls-6"
d="M802.91,657.25,916.05,1194.5a17,17,0,0,0,19.22,13.33l426-64.41a14.6,14.6,0,0,0,12-17.67L1257.48,615.46a14.27,14.27,0,0,0-15.18-11.05L813.65,642.73A12.07,12.07,0,0,0,802.91,657.25Z"
></path><path
class="cls-7"
d="M1235.26,576.22a28.15,28.15,0,0,1,29.92,21.84l123.06,543.61a35.82,35.82,0,0,1-29.51,43.32L944,1248.56a48.48,48.48,0,0,1-54.77-37.89L770.75,650.17A29.51,29.51,0,0,1,797,614.67Z"
></path><path
class="cls-7"
d="M803.68,614.09c-12.56,1-23.2,2.18-34.35,7.73l-36.79,18.33a26.12,26.12,0,0,0-14.41,27.36c.08.46.16.91.26,1.36l55.29,261.54a10,10,0,0,0,2.09,4.35l9.8,11.87a10,10,0,0,1,2.09,4.35L846,1227a48.48,48.48,0,0,0,54.77,37.89l414.72-63.57c20.54-3.15,50-16,59.5-23.22"
></path><path
class="cls-7"
d="M742.78,1220.62c-19.75-8.13-31.52-23.69-26.5-40.61l69.29-233.38"
></path><path
class="cls-7"
d="M790,962.24l-65.73,221.37a30.26,30.26,0,0,0,33.33,38.56L842.4,1210"
></path><ellipse
class="cls-8"
cx="837.63"
cy="1070.6"
rx="2.7"
ry="3.34"
transform="translate(-119.45 105.29) rotate(-6.72)"
></ellipse><ellipse
class="cls-8"
cx="776.45"
cy="893.91"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="783.68"
cy="890.78"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="790.92"
cy="887.66"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="798.15"
cy="884.53"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="805.38"
cy="881.4"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="774.39"
cy="883.96"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="781.62"
cy="880.84"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="788.85"
cy="877.71"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="796.08"
cy="874.58"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="803.31"
cy="871.46"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="772.32"
cy="874.01"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="779.56"
cy="870.89"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="786.79"
cy="867.76"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="794.02"
cy="864.64"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="801.25"
cy="861.51"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="770.26"
cy="864.07"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="777.49"
cy="860.94"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="784.72"
cy="857.81"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="791.95"
cy="854.69"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="799.18"
cy="851.56"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="768.2"
cy="854.12"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="775.43"
cy="850.99"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="782.66"
cy="847.87"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="789.89"
cy="844.74"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="797.12"
cy="841.61"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="766.13"
cy="844.17"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="773.36"
cy="841.05"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="780.59"
cy="837.92"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="787.82"
cy="834.79"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="795.05"
cy="831.67"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="764.07"
cy="834.23"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="771.3"
cy="831.1"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="778.53"
cy="827.97"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="785.76"
cy="824.85"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="792.99"
cy="821.72"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="762"
cy="824.28"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="769.23"
cy="821.15"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="776.46"
cy="818.03"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="783.69"
cy="814.9"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="790.92"
cy="811.77"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="759.94"
cy="814.33"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="767.17"
cy="811.21"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="774.4"
cy="808.08"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="781.63"
cy="804.95"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="788.86"
cy="801.83"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="757.87"
cy="804.38"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="765.1"
cy="801.26"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="772.33"
cy="798.13"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="779.57"
cy="795.01"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="786.8"
cy="791.88"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="755.81"
cy="794.44"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="763.04"
cy="791.31"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="770.27"
cy="788.18"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="777.5"
cy="785.06"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="784.73"
cy="781.93"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="753.74"
cy="784.49"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="760.97"
cy="781.36"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="768.21"
cy="778.24"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="775.44"
cy="775.11"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="782.67"
cy="771.98"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="751.68"
cy="774.54"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="758.91"
cy="771.42"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="766.14"
cy="768.29"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="773.37"
cy="765.16"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="780.6"
cy="762.04"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="749.62"
cy="764.6"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="756.85"
cy="761.47"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="764.08"
cy="758.34"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="771.31"
cy="755.22"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="778.54"
cy="752.09"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="747.55"
cy="754.65"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="754.78"
cy="751.52"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="762.01"
cy="748.4"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="769.24"
cy="745.27"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="776.47"
cy="742.14"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="841.13"
cy="1084.42"
rx="2.7"
ry="3.34"
transform="translate(-121.04 105.8) rotate(-6.72)"
></ellipse><ellipse
class="cls-8"
cx="844.62"
cy="1098.25"
rx="2.7"
ry="3.34"
transform="translate(-122.63 106.3) rotate(-6.72)"
></ellipse></g>
</svg>