diff --git a/NEW_FEAT.md b/NEW_FEAT.md new file mode 100644 index 0000000..b305783 --- /dev/null +++ b/NEW_FEAT.md @@ -0,0 +1,34 @@ +# New Feature Requests + +## 1) Multi-Message Mode (human multi-message) + +### Config +- **Multi-message start marker**: configurable, default **↗️** +- **Multi-message end marker**: configurable, default **↙️** +- **Multi-message prompt marker**: configurable, default **⤵️** + +### Logic +- When a **human** message contains the **start marker**: + - Pause **turn manager** in that channel. + - All agents in the channel reply using **no-reply** model. + - Channel enters **multi-msg mode**. +- In multi-msg mode: + - Each human message triggers **moderator bot** to reply with the **prompt marker**. + - Continues until a human message contains the **end marker**. +- When a human message contains the **end marker**: + - **Turn manager** resumes for that channel. + - **Moderator** sends the **scheduler marker** prompting the next agent to speak. + +--- + +## 2) Shuffle Mode (turn order reshuffle) + +### Config / Command +- Maintain `shuffling: boolean` **per Discord channel**. +- Slash command: `/turn-shuffling [on | off]` to view/control. + +### Logic +- When shuffle is **on**: + - After the **last speaker** in the turn list speaks, + - Shuffle the **turn order list**. + - Constraint: **the previous last speaker must NOT become the first speaker** after shuffle. diff --git a/TASKLIST.md b/TASKLIST.md deleted file mode 100644 index 7e7395a..0000000 --- a/TASKLIST.md +++ /dev/null @@ -1,86 +0,0 @@ -# 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.