Files
Dirigent/plugin/commands/command-utils.ts
hzhang b5196e972c feat: rewrite plugin as v2 with globalThis-based turn management
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>
2026-04-08 22:41:25 +01:00

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;
}