Fixes#4547
The Nostr plugin was calling runtime.channel.reply.handleInboundMessage(),
which doesn't exist in the PluginRuntime API. This caused DM processing to
fail with 'handleInboundMessage is not a function'.
Changed to use the correct message dispatch pattern:
1. Build proper MsgContext with finalizeInboundContext()
2. Create reply dispatcher with createReplyDispatcherWithTyping()
3. Dispatch replies with dispatchReplyFromConfig()
This matches the pattern used by other channel extensions like Matrix
and Discord.
The fix ensures:
- DMs are properly routed through the agent pipeline
- Session state is recorded correctly
- Reply text is formatted with markdown table conversion
- Human delay and typing indicators work as expected