- 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.8 KiB
4.8 KiB
Dirigent – Fixes & Improvements
Note: Project rename from WhisperGate → Dirigent implies updating all code/docs references (plugin/tool names, strings, files, configs).
1) Identity Prompt Enhancements ✅
- Current prompt only includes agent-id + discord name.
- Add Discord userId to identity injection.
- Done:
buildAgentIdentity()now resolves and includes Discord userId viaresolveDiscordUserId().
2) Scheduling Identifier (Default: ➡️) ✅
- Add a configurable scheduling identifier (default:
➡️). - Update agent prompt to explain:
- The scheduling identifier itself is meaningless.
- When receiving
<@USER_ID>+ scheduling identifier, the agent should check chat history and decide whether to reply. - If no reply needed, return
NO_REPLY.
- Done: Added
schedulingIdentifierconfig field;buildSchedulingIdentifierInstruction()injected for group chats.
3) Moderator Handoff Message Format ✅
- Moderator should no longer send semantic messages to activate agents.
- Replace with:
<@TARGET_USER_ID>+ scheduling identifier (e.g.,<@123>➡️). - Done: Both
before_message_writeandmessage_senthandoff messages now use<@userId>+ scheduling identifier format.
4) Prompt Language ✅
- All prompts must be in English (including end-marker instructions and group-chat rules).
- Done:
buildEndMarkerInstruction()andbuildSchedulingIdentifierInstruction()output English. Slash command help text in English.
5) Full Project Rename ✅
- Project name changed to Dirigent.
- Update all strings across repo:
- plugin name/id →
dirigent - tool name →
dirigent_tools - slash command →
/dirigent - docs, config, scripts, examples
- any text mentions
- dist output dir →
dist/dirigent - docker service →
dirigent-no-reply-api - config key fallback: still reads legacy
whispergateentry ifdirigentnot found
- plugin name/id →
- Done: All files updated.
6) Split dirigent_tools into Individual Tools ✅
- Before: Single
dirigent_toolstool withactionparameter managing 9 sub-actions. - After: 6 individual tools (Discord tools prefixed
dirigent_discord_*):dirigent_discord_channel_create— Create private Discord channeldirigent_discord_channel_update— Update channel permissionsdirigent_discord_member_list— List guild membersdirigent_policy_get— Get all channel policiesdirigent_policy_set— Set/update a channel policydirigent_policy_delete— Delete a channel policy
- Turn management (status/advance/reset) NOT exposed as tools — purely internal plugin logic, accessible via
/dirigentslash commands. - Shared Discord API helper
executeDiscordAction()extracted to reduce duplication. - Done: All tools registered individually with specific parameter schemas.
7) Human @Mention Override ✅
- When a message from a
humanListuser contains<@USER_ID>mentions:- Extract mentioned Discord user IDs from the message content.
- Map user IDs → accountIds via bot token decoding (reverse of
resolveDiscordUserId). - Filter to agents in the current turn order.
- Order by their position in the current turn order.
- Temporarily replace the speaking order with only those agents.
- After the cycle returns to the first agent, restore the original order and go dormant.
- Edge cases handled:
- All override agents NO_REPLY → restore original order, go dormant.
resetTurnclears any active override.- New human message without mentions → restores override before normal handling.
- Mentioned users not in turn order → ignored, normal flow.
- New functions in
turn-manager.ts:setMentionOverride(),hasMentionOverride(). - New helpers in
index.ts:buildUserIdToAccountIdMap(),extractMentionedUserIds(). - Done: Override logic integrated in
message_receivedhandler.
8) Wait for Human Reply ✅
- Added configurable
waitIdentifier(default:👤) to config and config schema. - Prompt injection in group chats: tells agents to end with
👤instead of end symbol when they need a human response. Warns to use sparingly — only when human is actively participating. - Detection in
before_message_writeandmessage_sent: if last char matches wait identifier →setWaitingForHuman(channelId). - Turn manager
waitingForHumanstate:checkTurn()blocks all agents (reason: "waiting_for_human") → routed to no-reply model.onNewMessage()clearswaitingForHumanon human message → normal flow resumes.- Non-human messages ignored while waiting.
resetTurn()also clears waiting state.
- Done: Full lifecycle implemented across turn-manager, rules, and index.
Open Items / Notes
- User requested the previous README commit should have been pushed to
maindirectly (was pushed to a branch). Address separately if needed.