ac65d7e03678146d840f0c1e19c48620c29d72a5
Reviewed-on: #13
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
-
Per-channel policy runtime
- Policies stored in a standalone JSON file
- Update at runtime via
dirigent_tools(memory first → persist to file)
-
Discord control actions (optional)
- Private channel create/update + member list
- Unified via
dirigent_tools
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
Tool: dirigent_tools
Actions:
policy-get,policy-set-channel,policy-delete-channelturn-status,turn-advance,turn-resetchannel-private-create,channel-private-update,member-list
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➡️)channelPoliciesFile(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
Description
Languages
TypeScript
75.7%
JavaScript
23.8%
Shell
0.4%
Makefile
0.1%