- Add waitIdentifier config (default: 👤) to DirigentConfig and plugin schema - Prompt injection: tells agents to end with 👤 when they need a human reply, warns to use sparingly (only when human is actively participating) - Detection in before_message_write and message_sent hooks - Turn manager: new waitingForHuman state - checkTurn() blocks all agents when waiting - onNewMessage() clears state on human message - Non-human messages ignored while waiting - resetTurn() also clears waiting state - All agents routed to no-reply model during waiting state - Update docs (FEAT.md, CHANGELOG.md, TASKLIST.md, README.md)
4.3 KiB
Dirigent
Rule-based no-reply gate + turn manager for OpenClaw (Discord).
Formerly known as WhisperGate. Renamed to Dirigent in v0.2.0.
What it does
Dirigent adds deterministic logic before model selection and turn-based speaking for multi-agent Discord channels:
-
Rule gate (before_model_resolve)
- Non-Discord → skip
- Sender in bypass list / human list → skip
- Message ends with configured end symbol → skip
- Otherwise → route to no-reply model/provider
-
End-symbol enforcement
- Injects instruction:
Your response MUST end with 🔚… - In group chats, also injects: "If not relevant, reply NO_REPLY"
- Injects instruction:
-
Scheduling identifier (moderator handoff)
- Configurable identifier (default:
➡️) used by the moderator bot - Handoff format:
<@TARGET_USER_ID>➡️(non-semantic, just a scheduling signal) - Agent receives instruction explaining the identifier is meaningless — check chat history and decide
- Configurable identifier (default:
-
Turn-based speaking (multi-bot)
- Only the current speaker is allowed to respond
- Others are forced to no-reply
- Turn advances on end-symbol or NO_REPLY
- If all bots NO_REPLY, channel becomes dormant until a new human message
-
Agent identity injection
- Injects agent name, Discord accountId, and Discord userId into group chat prompts
-
Human @mention override
- When a
humanListuser @mentions agents, temporarily overrides turn order - Only mentioned agents cycle; original order restores when cycle completes
- When a
-
Per-channel policy runtime
- Policies stored in a standalone JSON file
- Update at runtime via
dirigent_policy_set/dirigent_policy_deletetools
-
Discord control actions (optional)
- Private channel create/update + member list
- Via
dirigent_channel_create,dirigent_channel_update,dirigent_member_listtools
Repo layout
plugin/— OpenClaw plugin (gate + turn manager + moderator presence)no-reply-api/— OpenAI-compatible API that always returnsNO_REPLYdiscord-control-api/— Discord admin extension API (private channels + member list)docs/— rollout, integration, run-mode notes, turn-wakeup analysisscripts/— smoke/dev/helper checksMakefile— common dev commands (make check,make check-rules,make test-api,make smoke-discord-control,make up)CHANGELOG.md— milestone summary
Quick start (no Docker)
cd no-reply-api
node server.mjs
Then render config snippet:
node scripts/render-openclaw-config.mjs
See docs/RUN_MODES.md for Docker mode.
Discord extension capabilities: docs/DISCORD_CONTROL.md.
Runtime tools & commands
Tools (6 individual tools)
Discord control:
dirigent_discord_channel_create— Create private channeldirigent_discord_channel_update— Update channel permissionsdirigent_discord_member_list— List guild members
Policy management:
dirigent_policy_get— Get all policiesdirigent_policy_set— Set/update channel policydirigent_policy_delete— Delete channel policy
Turn management is internal to the plugin (not exposed as tools).
See
FEAT.mdfor full feature documentation.
Slash command (Discord)
/dirigent status
/dirigent turn-status
/dirigent turn-advance
/dirigent turn-reset
Config highlights
Common options (see docs/INTEGRATION.md):
listMode:human-listoragent-listhumanList,agentListendSymbolsschedulingIdentifier(default➡️)waitIdentifier(default👤) — agent ends with this to pause all agents until human replieschannelPoliciesFile(per-channel overrides)moderatorBotToken(handoff messages)enableDebugLogs,debugLogChannelIds
Development plan (incremental commits)
- Task 1: project docs + structure
- Task 2: no-reply API MVP
- Task 3: plugin MVP with rule chain
- Task 4: sample config + quick verification scripts
- Task 5: plugin rule extraction + hardening
- Task 6: containerization + compose
- Task 7: plugin usage notes
- Task 8: sender normalization + TTL + one-shot decision
- Task 9: auth-aware no-reply API
- Task 10: smoke test helpers
- Task 11: plugin structure checker
- Task 12: rollout checklist