Complete rewrite of the Dirigent plugin turn management system to work correctly with OpenClaw's VM-context-per-session architecture: - All turn state stored on globalThis (persists across VM context hot-reloads) - Hooks registered unconditionally on every api instance; event-level dedup (runId Set for agent_end, WeakSet for before_model_resolve) prevents double-processing - Gateway lifecycle events (gateway_start/stop) guarded once via globalThis flag - Shared initializingChannels lock prevents concurrent channel init across VM contexts in message_received and before_model_resolve - New ChannelStore and IdentityRegistry replace old policy/session-state modules - Added agent_end hook with tail-match polling for Discord delivery confirmation - Added web control page, padded-cell auto-scan, discussion tool support - Removed obsolete v1 modules: channel-resolver, channel-modes, discussion-service, session-state, turn-bootstrap, policy/store, rules, decision-input Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
14 lines
529 B
TypeScript
14 lines
529 B
TypeScript
/** Extract Discord channel ID from slash command context. */
|
|
export function parseDiscordChannelIdFromCommand(cmdCtx: Record<string, unknown>): string | undefined {
|
|
// OpenClaw passes channel context in various ways depending on the trigger
|
|
const sessionKey = String(cmdCtx.sessionKey ?? "");
|
|
const m = sessionKey.match(/:discord:channel:(\d+)$/);
|
|
if (m) return m[1];
|
|
|
|
// Fallback: channelId directly on context
|
|
const cid = String(cmdCtx.channelId ?? "");
|
|
if (/^\d+$/.test(cid)) return cid;
|
|
|
|
return undefined;
|
|
}
|