New src/commands module: event-driven listener on COMMAND_CHANNEL (env, default 2 "testowy") that dispatches exact #command matches through a single-registration-point registry. First command: #ping → replies #pong! (DM back to sender when present, else broadcast, always on the command channel).
MeshService gains optional commands wiring via attachCommands() (CommandModule factory injects MeshService one-way — no forwardRef; verified empirically that NestJS 12's injector leaves forwardRef cycles null)
Reply routing v1: directed to sender / broadcast fallback, rides COMMAND_CHANNEL via sendText 4th arg
Event-driven CommandService dispatches exact case-sensitive #command
matches on COMMAND_CHANNEL (default 2) through a single-registration-point
registry; first command #ping -> #pong!. Replies ride COMMAND_CHANNEL:
directed DM back to the sender when present, else broadcast. Failing
handler/send only logs a warn.
DI: CommandModule's factory injects MeshService and attaches itself via
MeshService.attachCommands() — a constructor-level cycle leaves one side
null in NestJS 12's injector (verified), so no forwardRef is used.
Tests 106 -> 121; docs synced (AGENTS.md, MESHTASTIC.md, README).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
New
src/commandsmodule: event-driven listener on COMMAND_CHANNEL (env, default 2 "testowy") that dispatches exact#commandmatches through a single-registration-point registry. First command:#ping→ replies#pong!(DM back to sender when present, else broadcast, always on the command channel).attachCommands()(CommandModule factory injects MeshService one-way — no forwardRef; verified empirically that NestJS 12's injector leaves forwardRef cycles null)