1. Turn order now activates via moderator on first creation (discovery-based),
ensuring no agent consumes messages before the turn list is ready.
All agents are blocked (dormant) until moderator sends handoff to first speaker.
2. channel-private-create: pre-populates turn order from allowedUserIds,
filtering to only bot accounts (excluding humans and moderator).
Immediately activates first speaker via moderator handoff.
3. channel-private-update: updates turn order when members are added/removed.
If current speaker is removed, activates next available speaker.
4. Any member (human or bot) can now trigger turn activation when dormant,
not just humans. Human messages still reset the cycle.
5. Added resolveAccountIdByUserId helper to map Discord user IDs back to
account names from bot tokens.
6. turn-manager: added initTurnOrderPrePopulated, updateTurnMembers,
activateFirstSpeaker, hasTurnState exports.
- Fix channelId extraction: ctx.channelId is platform name ('discord'), not
the Discord channel snowflake. Now extracts from conversation_label field
('channel id:123456') and sessionKey fallback (':channel:123456').
- Fix extractDiscordChannelId: support 'discord:channel:xxx' format in
addition to 'channel:xxx' for conversationId/event.to fields.
- Fix sender identification in message_received: event.from returns channel
target, not sender ID. Now uses event.metadata.senderId for humanList
matching so human messages correctly reset turn order.
- Fix per-channel turn order: was using all server-wide bot accounts from
bindings, causing deadlock when turn landed on bots not in the channel.
Now dynamically tracks which bot accounts are seen per channel via
message_received and only includes those in turn order.
- Always save sessionChannelId/sessionAccountId mappings in before_model_resolve
regardless of turn check result, so downstream hooks can use them.
- Add comprehensive debug logging to message_sent hook.