Feature 1: Split dirigent_tools - Replace monolithic dirigent_tools (9 actions) with 9 individual tools - Discord: dirigent_channel_create, dirigent_channel_update, dirigent_member_list - Policy: dirigent_policy_get, dirigent_policy_set, dirigent_policy_delete - Turn: dirigent_turn_status, dirigent_turn_advance, dirigent_turn_reset - Extract shared executeDiscordAction() helper Feature 2: Human @mention override - When humanList user @mentions agents, temporarily override turn order - Only mentioned agents cycle, ordered by their turn order position - Original order restores when cycle returns to first agent or all NO_REPLY - New: setMentionOverride(), hasMentionOverride(), extractMentionedUserIds() - New: buildUserIdToAccountIdMap() for reverse userId→accountId resolution Bump version to 0.3.0
Dirigent Plugin
Hook strategy
message:receivedcaches a per-session decision from deterministic rules.before_model_resolveappliesproviderOverride + modelOverridewhen decision says no-reply.before_prompt_buildprepends end-marker instruction + scheduling identifier instruction when decision allows speaking.
Rules (in order)
- non-discord -> skip
- bypass sender -> skip
- end symbol matched -> skip
- else -> no-reply override
Config
See docs/CONFIG.example.json.
Required:
noReplyProvidernoReplyModel
Optional:
enabled(default true)discordOnly(default true)listMode(human-list|agent-list, defaulthuman-list)humanList(default [])agentList(default [])channelPoliciesFile(per-channel overrides in a standalone JSON file)schedulingIdentifier(default➡️) — moderator handoff identifierenableDirigentPolicyTool(default true)
Unified optional tool:
dirigent_tools- Discord actions:
channel-private-create,channel-private-update,member-list - Policy actions:
policy-get,policy-set-channel,policy-delete-channel - Turn actions:
turn-status,turn-advance,turn-reset
- Discord actions:
bypassUserIds(deprecated alias ofhumanList)endSymbols(default ["🔚"])enableDiscordControlTool(default true)discordControlApiBaseUrl(defaulthttp://127.0.0.1:8790)discordControlApiTokendiscordControlCallerIdenableDebugLogs(default false)debugLogChannelIds(default [], empty = all channels when debug enabled)
Per-channel policy file example: docs/channel-policies.example.json.
Policy file behavior:
- loaded once on startup into memory
- runtime decisions read memory state only
- direct file edits do NOT affect memory state
dirigent_toolspolicy actions update memory first, then persist to file (atomic write)
Moderator handoff format
When the current speaker NO_REPLYs, the moderator bot sends: <@NEXT_USER_ID>➡️
This is a non-semantic scheduling message. The scheduling identifier (➡️ by default) carries no meaning — it simply signals the next agent to check chat history and decide whether to speak.
Slash command (Discord)
/dirigent status
/dirigent turn-status
/dirigent turn-advance
/dirigent turn-reset
Debug logging:
- set
enableDebugLogs: trueto emit detailed hook diagnostics - optionally set
debugLogChannelIdsto only log selected channel IDs