Commit Graph
214 Commits
Author SHA1 Message Date
James Rich bd9de9396d feat(remote-shell): own section that runs its own session check
The node gates the shell on its security.admin_key list - the same list the
remote-admin passkey exchange goes through - so opening a shell on a node
that has not authorized this phone got no reply at all.

Remote Shell now has its own section rather than sitting under
Administration, and runs that check itself: the row stays enabled, tapping
it ensures the session and then opens the terminal. Previously the session
was only ever established as a side effect of visiting the remote-admin
screen, so the user had to know to go there first.

Also: openRemoteAdmin and openRemoteShell share one ensureSessionThenNavigate
helper, and the ViewModel now gives up on OPEN after 20 s instead of sitting
in OPENING forever, naming the admin-key requirement when it does.

Verified against meshtasticd: from a node with no session, one tap
establishes the session and lands on a live prompt; with the node stopped,
the watchdog reports 'Session failed' with a Reconnect action.
2026-08-24 15:15:51 -05:00
James Rich e981e8e4df feat(remote-shell): size the PTY from the viewport, make output selectable
OPEN and RESIZE carried a hardcoded 80x24, so the remote shell wrapped to
a width the phone does not have. The viewport is now measured in monospace
cells and the session waits for that measurement, so OPEN carries the real
size - 'stty size' on a medium_phone emulator reports 29 54.

Output sits in a SelectionContainer, so a command's output can be copied
out instead of retyped.
2026-08-24 14:51:59 -05:00
James Rich 5a8028172c feat(remote-shell): show session state, inline the caret, add control keys
Three gaps the rig made obvious:

- The ViewModel tracked a full session lifecycle that nothing rendered, so
  a refused or stalled session was indistinguishable from a working one -
  both are a blank screen. A status bar now reports anything that is not
  OPEN and offers Reconnect.
- Pending input was its own list row, putting the caret under the prompt
  rather than after it, which reads as a hung terminal.
- No way to send Ctrl-C, Tab, Esc or arrows. A key bar sends them, and
  typeControlSequence() bypasses the keystroke debounce so an interrupt is
  not queued behind a 500 ms batch window.

The input sink moved into its own composable with hoisted callbacks.

Verified against meshtasticd: 'uname -s' echoes exactly and returns Linux;
Ctrl-C interrupts and returns a fresh prompt.
2026-08-24 14:42:53 -05:00
James Rich 122a627d76 feat(remote-shell): plain terminal UI, turn-taking, and a correct input sink
Three things stood between the April branch and a working session:

- The CRT theatrics are gone - scanlines, phosphor presets, flicker, and
  the AGSL curvature shader, which rendered the block cursor as a skewed
  amber quad in the corner. The terminal is now monospace text on the app
  theme.
- Turn-taking ('talking stick', RemoteShell.flags) landed on the firmware
  side after this branch was written. DMShellModule marks every session
  turn-managed and withholds output until the peer grants a turn, so a
  client that never grants sees an open session and no prompt, and the
  device re-sends RTS every 250 ms until its TX queue fills. We now grant
  on every frame we originate and answer any request immediately.
- The invisible input sink passed a constant "" as its value, so Compose
  re-delivered characters we had already consumed: 'whoami' reached the
  PTY as 'wwhwhowhoa'. It now tracks what it consumed and forwards the
  delta, mapping a shrinking field to backspaces.

Verified against meshtasticd: session opens, 'whoami' echoes exactly and
returns 'root'.
2026-08-24 14:28:39 -05:00
James Rich df70f6b207 fix(remote-shell): re-integrate the April branch with current APIs
- license header year: the tree standardised on 2026, not 2025-2026
- spotless: ktlint's blank-line-between-when-conditions is new since
- MeshDataHandlerImpl: drop shouldBroadcast, removed with the AIDL
  service rework (#5586); nothing broadcasts on this path any more
- RemoteShellViewModel: DataPacket.nodeNumToDefaultId and
  DataPacket.PKC_CHANNEL_INDEX both moved to NodeAddress
2026-08-24 14:04:07 -05:00
James Rich 4d75e88cec Merge origin/main into remote-shell-revival
Conflicts, all re-integration of the April branch into the current tree:
- MeshDataHandlerImpl/Test: keep main's constructor (ServiceScope, session
  context, geofence/beacon collaborators) and re-add remoteShellHandler.
- Capabilities.kt: re-add supportsRemoteShell, still gated to UNRELEASED.
- strings.xml: main re-sorted the file; re-insert remote_shell and
  phosphor_colour in their sorted positions.
- NodesNavigation/AdministrationSection: union both sides.
2026-08-24 12:35:09 -05:00
James RichandClaude Fable 5 9665eafe41 fix(metrics): eliminate the Vico canvas restore underflow crash (#6847)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 10:49:41 +00:00
James RichandClaude Fable 5 a0e18bf1fb feat(privacy): shield sensitive UI content from non-tool accessibility services (#6794)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 17:34:02 +00:00
James RichandClaude Fable 5 4d9cf8ec18 fix: derive temperature unit from locale temperature preference, not distance system (#6775)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 23:42:36 +00:00
James BeechingandClaude Sonnet 5 c8d9795885 feat(node): label SNR quality on the Node Details signal row (#6703)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 17:43:07 +00:00
James RichandClaude Sonnet 5 7bc6722510 fix(node): confirm before clearing a node's position track (#6745)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 16:00:53 +00:00
Jeremiah K e9d09a3380 fix(lifecycle): harden packet admission and transport ownership (#6716) 2026-08-15 21:44:17 +00:00
James Rich e8af75e09b feat(icons): add Material icons for custom SF Symbols and fix soil telemetry icons (#6722) 2026-08-15 19:40:10 +00:00
James RichandClaude Opus 5 7114dd3d5b refactor(compose): adopt keyed SideEffect and drop redundant config write-back effects (#6684)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 18:53:04 +00:00
James RichandClaude Opus 5 72f2d39e9d chore(compose): follow-ups from the Compose 1.12 bump (#6678)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 18:35:30 +00:00
James RichandClaude Opus 5 e330442dd5 feat(node): surface incomplete nodes with a badge and show them by default (#6673)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 15:56:40 +00:00
James RichandClaude Opus 5 2a3d04c498 test(node): give the compass lifecycle waits a CI-sized budget (#6670)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 11:56:17 +00:00
James RichandClaude Opus 5 492afbde5c fix(telemetry): repoint 1-Wire temperature at per-channel fields, adopt ADC voltage (#6653)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-12 19:39:54 +00:00
James RichandClaude Opus 5 bc7634bd81 fix(ui): restore bottom time-axis height at large font scales (#6656)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-12 19:26:30 +00:00
James RichandClaude Fable 5 9fa9f1e341 feat(analytics): report key user interactions as named RUM actions (#6654)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 19:11:44 +00:00
James RichandClaude Fable 5 62237342a6 fix(ui): locale-aware unit formatting and message-view font scaling (design audit) (#6629)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 13:23:40 +00:00
simulationstation 9613ba91a7 fix(node): stop compass updates while backgrounded (#6620) 2026-08-12 12:11:37 +00:00
James RichandClaude Fable 5 5a69ac101e chore: remove orphaned SatelliteCountInfo composable (#6633)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 12:07:43 +00:00
James RichandClaude Fable 5 4e30fb5cd5 fix(node): chart environment metrics in the user's display units (#6634)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 02:10:28 +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 d714b22571 chore(deps): bump protobufs to 2.7.26.140 (optional rx_time) (#6510)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 18:08:24 +00:00
James RichandClaude Opus 5 c7ca45fe93 fix(ui): stop discarding measured-zero sensor and RSSI readings (#6507)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 19:49:31 -05: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 72ca3313d8 fix(node): disambiguate signal-log packet keys (#6492)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 15:11:09 +00:00
James RichandClaude Opus 5 a828e9d513 feat(node): show AQI in the air quality graph and table (#6434)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-25 21:25:22 +00:00
James RichandClaude Opus 5 a4be81c3a9 feat(node): group related metric cards into vertical columns (#6431)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-25 19:24:31 +00:00
James RichandClaude Opus 5 d9b9ce6e8a fix(node): show node counts without truncation (#6433)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-25 19:23:37 +00:00
James RichandClaude Sonnet 5 609732b622 fix(node): respect display units for position ground speed (#6376)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-22 22:34:50 +00:00
James RichandClaude Sonnet 5 aa1edae4b2 fix(node-metrics): apply full typography style instead of fontSize-only (#6375)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-22 22:30:05 +00:00
James RichandClaude Opus 4.8 26582710ba fix(node): stop metric-card trailing values crushing to one-char-per-line (#6374)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 22:04:56 +00:00
James RichandClaude Fable 5 beac608d9f fix: keep cached data flowing when api.meshtastic.org is down (#6335)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 07:56:30 -05:00
James RichandClaude Opus 4.8 0632993386 revert(map): back out per-waypoint DM/channel recipient picker (#6218) (#6284)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 22:25:30 +00:00
James RichandClaude Opus 4.8 40a9f227b9 fix: stabilize traceroute map node identity & fix log metric alignment (#6270)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 11:10:09 +00:00
Joey Leake 8f3bf001cc feat(map): send a waypoint as a DM or to a specific channel (#6218) 2026-07-11 17:17:30 +00:00
James Rich 0d82d76744 chore: strip ponytail: comment markers from the codebase (#6221) 2026-07-11 11:54:33 +00:00
James RichandClaude Opus 4.8 228fa8a368 fix: dedup node lists to prevent LazyColumn duplicate-key crash (#6193)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-10 13:31:54 +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
James RichandClaude Opus 4.8 ae0bdd9e97 feat(node): histogram of nodes per hop distance (#5745) (#6146)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 02:13:38 +00:00
James RichandClaude Opus 4.8 0964a0b345 feat(node): show CO₂ sensor temperature & humidity on Air Quality page (#6143)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 01:57:35 +00:00
James RichandClaude Opus 4.8 9cfe72ec3c fix(metrics): air-quality chart legend follows plotted data, not selection (#6145)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 01:11:53 +00:00
James RichandClaude Opus 4.8 17501048b4 feat(map): Site Planner coverage integration — import + estimate (#6136)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 23:24:14 +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 Sonnet 5 1dce09f0ae feat: compute EPA NowCast AQI from PM2.5 history (#6102)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-06 02:27:51 +00:00
James RichandClaude Sonnet 5 4d07bc6641 fix: derive phone-UI units from OS locale, not radio display config (#6101)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-06 01:36:55 +00:00