cf9be6014524c66a09129e328bf3652d4e85b1cc
When a speaker finishes with an end symbol, the turn was only advanced in the message_sent hook. But by that time, the message had already been broadcast to other agents, whose before_model_resolve ran with the old turn state, causing them to be blocked by the turn gate (forced no-reply). Fix: - Move turn advance for both NO_REPLY and end-symbol cases to before_message_write, which fires before the message is broadcast. - Guard 1: Only the current speaker can advance the turn (accountId check). - Guard 2: Only process assistant messages (role check). before_message_write fires for incoming user messages too, which contain end symbols from other agents and would cause cascading turn advances. - Use sessionTurnHandled set to prevent double-advancing in message_sent.
Revert "Merge pull request 'fix: use systemPrompt instead of prependContext for end marker instruction' (#5) from fix/moderator-and-system-prompt into feat/turn-based-speaking"
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%