b1e546ada6cb297466a1032fa81c0fc64a4c307f
Add a dedicated moderator Discord bot that sends handoff messages when the current speaker says NO_REPLY. This solves the wakeup problem. Flow: 1. Agent A is current speaker, receives message 2. Agent A responds with NO_REPLY 3. Plugin detects NO_REPLY in message_sent hook, advances turn to Agent B 4. Plugin sends via moderator bot: '轮到(@AgentB)了,如果没有想说的请直接回复NO_REPLY' 5. This real Discord message triggers Agent B's session 6. Turn manager allows Agent B to respond Implementation: - moderatorBotToken config field for the moderator bot's Discord token - userIdFromToken() extracts Discord user ID from bot token (base64) - resolveDiscordUserId() maps accountId → Discord user ID via account tokens - sendModeratorMessage() calls Discord REST API directly - message_received ignores moderator bot messages (transparent to turn state) - Moderator bot is NOT in the turn order
WhisperGate
Rule-based no-reply gate for OpenClaw.
What it does
WhisperGate adds a deterministic gate before model selection:
- If message is not from Discord → skip gate
- If sender is in bypass user list → skip gate
- If message ends with configured end-symbol → skip gate
- Otherwise switch this turn to a no-reply model/provider
The no-reply provider returns NO_REPLY for any input.
Repo layout
plugin/— OpenClaw plugin (before_model_resolve hook)no-reply-api/— OpenAI-compatible minimal API that always returnsNO_REPLYdiscord-control-api/— Discord 管理扩展 API(私密频道 + 成员列表)docs/— rollout, integration, run-mode notesscripts/— 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 扩展能力见:docs/DISCORD_CONTROL.md。
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%