Add mesh diagnostics: /ping, /trace, and topology map

- New protocol types ping=0x26 / pong=0x27 (9-byte payload: 8-byte nonce
  + origin TTL) with per-peer inbound rate limiting (5 per 10s)
- /ping @name reports RTT and hop count, 10s timeout
- /trace @name prints the estimated path from gossiped directNeighbors
- Topology map sheet (circular Canvas layout) reachable from App Info
- Ping/pong ride the deterministic directed-relay path like DMs
- Tests: payload round-trip, hop-count math, command output, edge
  normalization, layout

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
jack
2026-07-06 20:00:55 +02:00
co-authored by Claude Fable 5
parent 7341696280
commit 6056d20a13
21 changed files with 1147 additions and 10 deletions
+132
View File
@@ -5171,6 +5171,54 @@
}
}
},
"app_info.network.title" : {
"comment" : "Section header for network diagnostics in the app info sheet",
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "network"
}
}
}
},
"app_info.network.topology.description" : {
"comment" : "Row description for the mesh topology map",
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "map of peers and links learned from mesh announces"
}
}
}
},
"app_info.network.topology.hint" : {
"comment" : "Accessibility hint for the mesh topology row",
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "opens the mesh topology map"
}
}
}
},
"app_info.network.topology.title" : {
"comment" : "Row title opening the mesh topology map",
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "mesh topology"
}
}
}
},
"app_info.privacy.ephemeral.description" : {
"extractionState" : "manual",
"localizations" : {
@@ -15425,6 +15473,18 @@
}
}
},
"content.commands.ping" : {
"comment" : "Description of the /ping command in the suggestions panel",
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "measure round-trip time to a mesh peer"
}
}
}
},
"content.commands.slap" : {
"extractionState" : "manual",
"localizations" : {
@@ -15604,6 +15664,18 @@
}
}
},
"content.commands.trace" : {
"comment" : "Description of the /trace command in the suggestions panel",
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "estimate the mesh path to a peer"
}
}
}
},
"content.commands.unblock" : {
"extractionState" : "manual",
"localizations" : {
@@ -35194,6 +35266,66 @@
}
}
},
"topology.caption" : {
"comment" : "Caption under the mesh topology map",
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "estimated from gossiped neighbor lists (up to 10 per peer) — your device is highlighted"
}
}
}
},
"topology.empty" : {
"comment" : "Empty state of the mesh topology map",
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "no mesh links yet — the map fills in as peer announces arrive"
}
}
}
},
"topology.refresh" : {
"comment" : "Accessibility label of the topology refresh button",
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "refresh topology"
}
}
}
},
"topology.summary" : {
"comment" : "Topology map summary: number of peers and links",
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "%1$ld peers · %2$ld links"
}
}
}
},
"topology.title" : {
"comment" : "Title of the mesh topology map sheet",
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "mesh topology"
}
}
}
},
"verification.my_qr.accessibility_label" : {
"extractionState" : "manual",
"localizations" : {