Files
Dirigent/achieve/TASKLIST.md

4.8 KiB
Raw Blame History

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 via resolveDiscordUserId().

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 schedulingIdentifier config 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_write and message_sent handoff 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() and buildSchedulingIdentifierInstruction() 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 whispergate entry if dirigent not found
  • Done: All files updated.

6) Split dirigent_tools into Individual Tools

  • Before: Single dirigent_tools tool with action parameter managing 9 sub-actions.
  • After: 6 individual tools (Discord tools prefixed dirigent_discord_*):
    • dirigent_discord_channel_create — Create private Discord channel
    • dirigent_discord_channel_update — Update channel permissions
    • dirigent_discord_member_list — List guild members
    • dirigent_policy_get — Get all channel policies
    • dirigent_policy_set — Set/update a channel policy
    • dirigent_policy_delete — Delete a channel policy
  • Turn management (status/advance/reset) NOT exposed as tools — purely internal plugin logic, accessible via /dirigent slash 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 humanList user 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.
    • resetTurn clears 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_received handler.

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_write and message_sent: if last char matches wait identifier → setWaitingForHuman(channelId).
  • Turn manager waitingForHuman state:
    • checkTurn() blocks all agents (reason: "waiting_for_human") → routed to no-reply model.
    • onNewMessage() clears waitingForHuman on 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 main directly (was pushed to a branch). Address separately if needed.