Commit Graph
5219 Commits
Author SHA1 Message Date
agessaman eadec38714 fix(webconfig): make the mock answer the whole CLI surface
`get radio.fem.rxgain` returned "unknown config key" from the mock, which reads
as the terminal offering a command that does not exist. It does exist: CommonCLI
implements get and set for it, gated at runtime by Board::canControlLoRaFemLna()
rather than compiled out, so the command is present in every build and the board
answers for itself — "Error: unsupported" where there is no front-end module.

Auditing the whole table found 31 of 70 config keys unanswered, all the ones no
portal form drives: alert.*, bridge.*, owner.info, path.hash.mode, dutycycle and
the rest. Plus 14 verbs (gps, powersaving, sensor, region, clock sync) with no
handler at all. They now live in a "cli" section of the mock config, typed
through the existing lookup tables and stripped from /api/config, which does not
carry them.

Two real bugs behind that:

  - the `set` path gated on whether a key was *readable*, so write-only and
    computed keys (prv.key, dutycycle, radio.fem.rxgain) were rejected as
    unknown. apply_set now owns that decision alone.
  - apply_set accepted anything it did not recognise and replied OK. That
    leniency is what let the gap hide: a CLI `set` on an unknown key looked
    like it worked. It is strict now — verified against every key in
    WC_ALLOWED_SET_KEYS so the form batch is unaffected.

Also mqtt.neighbors / mqtt.neighbors.interval, which the MQTT tab binds but the
mock's config never carried, so that toggle could not round-trip.

webconfig_cli_audit.py keeps the two honest: it drives every command the
autocomplete table offers through /api/cli and fails on anything unanswered.
119 commands, all answered.
2026-08-07 22:52:15 -07:00
agessaman ddf1272348 refactor(webconfig): drop the fake shell prompt from the terminal header
"meshcore@<node>" borrowed the user@host convention without the referents:
there is no user concept here, and the node name is already in the page header
directly above, larger. It was decoration duplicating what was on screen — and
it crowded the header enough that `help` had to be hidden below 430px.

Removing it fits all three buttons on a 375px phone, so that media query goes
with it.
2026-08-07 22:39:02 -07:00
agessaman f0cdd23d40 feat(webconfig): offer the console as a way out of guided setup
Operators who already have a prepared config want to paste it, not tap through
four wizard steps. A quiet `>_` chip in the setup-mode header drops straight
into the terminal; everyone else still sees only the wizard.

That makes the CLI reachable in setup mode, which the previous commit had
deliberately blocked. Setup mode authenticates by proximity to the AP rather
than by password — but the wizard already sets the admin password and rewrites
the node's radio config from there, so the trust boundary is the AP either way,
and refusing the console would only push these operators back to serial.

Onboarding by paste does skip the one thing the wizard makes mandatory: the
admin password, which /api/config enforces before it will arm a reboot. Nothing
in CommonCLI enforces it, so the terminal says so on entry, and confirming a
reboot without a `password` command having run warns again. That is a client-
side reminder, not a gate; wiring the real gate belongs with /api/cli on-device.

The console is a one-way door out of the wizard otherwise, so its header grows
a "← setup" button that goes back.
2026-08-07 22:35:11 -07:00
agessaman 7a24cf950c build(webconfig): strip comments before embedding the portal page
The generator gzipped webui/index.html verbatim, so the page's comments — and
this file is commented heavily by house style — were paying flash rent. A
line-based pass now drops comments, indentation and blank lines before
compressing. The source stays as readable as it was.

Conservative on purpose: only a comment that starts its own line is removed, so
a `//` inside a URL or a `/*` inside a regex can never be mistaken for one.
Line breaks survive, which leaves JS statement boundaries (and the space a
newline contributes between HTML inline elements) exactly as written.

This ships to thousands of devices, so it is not taken on trust:
  - check_stripped() fails the build if the page's structure changed or the
    output shrank implausibly
  - the pass lives in its own module, shared with the mock backend's new
    --minify flag, so the bytes exercised in a browser are the bytes that get
    embedded rather than a second implementation that could drift
  - webconfig_minify.py joins the generator in the freshness hash, so editing
    the stripper forces a regenerate

Today's page: 22,678 -> 17,671 bytes gzipped.
2026-08-07 22:35:00 -07:00
agessaman bf9bc099d5 feat(webconfig): add a terminal CLI tab to the portal
Design prototype, driven entirely by the mock backend — nothing here runs
on-device yet.

The portal's form batch is deliberately allowlisted (WebConfigKeys.h), which
leaves everything the serial console can do unreachable from a browser. This
adds a fifth tab holding a real terminal: monospace white-on-black in either
colour scheme, autocomplete over the full ~270-command surface, in-session
history, and a confirmation step for pasted command sequences.

Autocomplete goes past the flasher's <datalist>: rows carry descriptions, Tab
extends to the longest shared prefix before committing to a match, and once
`set <key> ` is complete it switches to completing the VALUE — enums from the
command table, broker presets from /api/presets, packet-type names per CSV
segment. The table is generated from a key list rather than written out per
slot, so mqttN.* tracks active_slots instead of being duplicated six times.

Pasting several lines never mangles the prompt: the lines are parsed (comments,
blank lines and pasted `>` prompts stripped), listed back numbered, and run only
after an explicit confirm. Commands that restart, erase, reflash or move the
node off its network get the same confirmation singly. History is memory-only —
`set wifi.pwd` and `password` pass through it.

/api/cli mirrors the config-save contract (202 + reqid, poll for results) for
the same reason: commands run on the node's main loop, not in the request. The
one difference is that results stream, so a long sequence fills the window as
it executes rather than landing all at once.

The tab is hidden in setup mode, where the portal authenticates by proximity
and no admin password exists yet.
2026-08-07 22:20:18 -07:00
Kevin Le 1bf80992b9 For RAK only, fixed reset pin and honour FORCE_GPS_ALIVE 2026-08-08 11:28:28 +07:00
agessaman 5f57a1fd0e docs(mqtt): add okimesh to broker presets table 2026-08-07 21:17:47 -07:00
agessaman 482d7432c2 docs(mqtt): add okimesh broker presets to the documentation 2026-08-07 21:16:35 -07:00
agessaman 4aea71358f feat(mqtt): add gomesh to broker presets table 2026-08-07 20:54:56 -07:00
agessaman 73507bf5ab feat(mqtt): add gomesh to broker presets table 2026-08-07 20:54:05 -07:00
mikecarper bf62afa240 Add companion terminal mode and LoRa OTA tooling 2026-08-07 19:19:44 -07:00
mikecarper cfdf33b7ca Expand repeater FPF7 to 63 rules 2026-08-07 17:22:21 -07:00
mikecarper 5b0af29ad1 Unify repeater flood policy persistence 2026-08-07 17:01:55 -07:00
mikecarper 11b692abfa Harden firmware recovery and retries
Improve companion BLE delivery and idempotent remote CLI retries, make FPF7 persistence atomic with FPF6 migration, verify staged OTA data on resume, and clarify filter policy wildcard and BlackHole semantics.
2026-08-07 16:24:53 -07:00
agessaman e240543014 docs(mqtt): add atvirastinklas to broker presets table 2026-08-07 15:45:54 -07:00
Martynas Zilinskas 20a4dfb818 Update MQTT preset for atvirastinklas to use GTS_ROOT_R4 certificate 2026-08-07 15:45:54 -07:00
Martynas Zilinskas 4e6483373e Add new MQTT preset for atvirastinklas. 2026-08-07 15:45:54 -07:00
agessaman 808dce3902 docs(mqtt): add atvirastinklas to broker presets table 2026-08-07 15:43:05 -07:00
Adam Gessaman f0195363ca feat(mqtt): add MQTT preset for atvirastinklas
Add new MQTT preset for atvirastinklas.
2026-08-07 15:42:21 -07:00
agessaman d6164e7b96 feat(variants): add I2C sensor pins to Heltec/RAK3112 observers
Match Heltec_v3_sensor and RAK_3112_sensor Wire1 pins (33/34) so
external sensors work on observer_mqtt builds.
2026-08-07 15:12:17 -07:00
agessaman 4fab9099ea feat(variants): add I2C sensor support for Heltec and RAK3112 2026-08-07 15:11:24 -07:00
mikecarper 7f56da7a34 Extend flood policy and harden message retries 2026-08-07 14:26:31 -07:00
mikecarper 687e114828 Expand policy draft sidebar 2026-08-07 11:51:57 -07:00
mikecarper ccdc8ffe4e Add payload reference and policy rail 2026-08-07 11:42:27 -07:00
mikecarper e200aafd83 Tabulate filter policy selectors 2026-08-07 10:26:32 -07:00
mikecarper a30e1e03db Clarify filter policy playground 2026-08-07 10:19:32 -07:00
Martynas Zilinskas 2436229591 Update MQTT preset for atvirastinklas to use GTS_ROOT_R4 certificate 2026-08-07 18:07:41 +03:00
Martynas Zilinskas da7b51f181 Add new MQTT preset for atvirastinklas. 2026-08-07 17:53:58 +03:00
Hacuchino-hash 2af4b3c14a Fix X1 charge status LED always showing charged 2026-08-07 08:08:08 -05:00
mikecarper e2df34e19c Add raw packet decoder 2026-08-07 00:15:27 -07:00
mikecarper ea3b5e16ea Refine filter policy playground 2026-08-06 23:31:25 -07:00
mikecarper 3d26b0b39c Add filter policy playground 2026-08-06 22:34:19 -07:00
ripplebiz 47154f02cb Merge pull request #3122 from Hacuchino-hash/x1-notifications
Add RGB LED and haptic notifications for SenseCAP MeshTracker X1
2026-08-07 15:26:33 +10:00
agessaman bfc43e94f8 feat(station-g3): add repeater and room server observer variants
Adds Station_G3_ESP32_repeater_observer_mqtt and
Station_G3_ESP32_room_server_observer_mqtt, mirroring the known-good
Station G2 observer envs. The two boards are the same family — ESP32-S3,
qio_opi, PSRAM, 16 MB flash, SH1106 display — so the overlay ports across
unchanged: default_16MB.csv partitions, adafruit-full cert bundle,
MQTT bridge + SNMP, and the same lib_deps pinning.

Verified the G3 partition signature is byte-identical to the G2 observer's,
so the OTA partition-compatibility gate treats them the same. Both envs
build clean (1.67 MB of the 6.25 MB app slot, 28% RAM) and produce the full
CI artifact set via build.sh: .bin, -merged.bin and .partsig. Observer env
discovery now finds 32 envs (was 30) and the ArduinoJson pin check covers
both new sections.

Docs: added the G3 build commands and the two partition-table rows to
MQTT_IMPLEMENTATION.md.
2026-08-06 18:55:51 -07:00
mikecarper df2dd41512 Scope preference saves to changed settings 2026-08-06 15:33:40 -07:00
agessaman 23066573e5 fix(station-g3): expose FEM gain preferences 2026-08-06 15:29:14 -07:00
agessaman 269ecc2c06 fix(boards): restore Station G2 GPS UART pin mapping
Match MCU RX=7 / TX=15 used by G3; the prior
values were an accidental revert of 0920dc66.
2026-08-06 09:02:19 -07:00
Huw Duddy 623422694b Merge pull request #3121 from liamcottle/config/disable-companion-cad
Disable CAD on Companion Firmware until it's configurable
2026-08-06 22:40:37 +10:00
Hacuchino-hash 335ebf546d Add SPA06 barometer telemetry and charge status LED for MeshTracker X1 2026-08-06 07:27:05 -05:00
Hacuchino-hash 3abe415cf7 Add RGB LED and haptic notifications for SenseCAP MeshTracker X1 2026-08-06 07:27:05 -05:00
liamcottle dee133d647 disable cad on companion until it's configurable 2026-08-07 00:19:18 +12:00
Liam Cottle 9b4a591ec4 Merge pull request #3120 from recrof/patch-2
ThinkNode M6: Remove QSPIFLASH=1 build flag to fix companion roles
2026-08-06 22:54:24 +12:00
Rastislav Vysoky e4fbd386af ThinkNode M6: Remove QSPIFLASH=1 build flag to fix companion roles
M6 doesn't have flash chip available, so companion roles fail to start.
2026-08-06 12:37:21 +02:00
mikecarper 63e7b2ce8e Fix Mesh America hardware aliases 2026-08-06 01:48:18 -07:00
mikecarper 7369d1889d Shorten Mesh America version labels 2026-08-06 00:45:30 -07:00
mikecarper 5bf267234d Clarify Mesh America firmware profiles 2026-08-06 00:12:56 -07:00
mikecarper 5885848cf0 Label Heltec v4 companion FEM variants 2026-08-05 23:30:52 -07:00
mikecarper cbd5d75128 Update Mesh America catalogs for 1.16.09 2026-08-05 23:26:20 -07:00
ripplebiz f4ec1d48b1 Merge pull request #3112 from Hacuchino-hash/add-meshtracker-x1
Add support for Seeed SenseCAP MeshTracker X1 (LR2021)
2026-08-06 16:04:18 +10:00
agessaman b8585bdcb8 feat(mqtt): increase built-in MQTT preset count to 31 2026-08-05 20:03:58 -07:00