feat: complete Dirigent rename + all TASKLIST items

- Task 1: Identity prompt now includes Discord userId
- Task 2: Added configurable schedulingIdentifier (default: ➡️)
- Task 3: Moderator handoff uses <@userId>+identifier instead of semantic messages
- Task 4: All prompts/comments/help text converted to English
- Task 5: Full project rename WhisperGate → Dirigent across all files

Breaking: config key changed from plugins.entries.whispergate to plugins.entries.dirigent
Breaking: channel policies file renamed to dirigent-channel-policies.json
Breaking: tool name changed from whispergate_tools to dirigent_tools
This commit is contained in:
zhi
2026-03-03 10:10:27 +00:00
parent 2afb982c04
commit af33d747d9
32 changed files with 291 additions and 1434 deletions

View File

@@ -1,10 +1,10 @@
{
"plugins": {
"load": {
"paths": ["/path/to/WhisperGate/dist/whispergate"]
"paths": ["/path/to/Dirigent/dist/dirigent"]
},
"entries": {
"whispergate": {
"dirigent": {
"enabled": true,
"config": {
"enabled": true,
@@ -13,8 +13,8 @@
"humanList": ["561921120408698910"],
"agentList": [],
"endSymbols": ["🔚"],
"channelPoliciesFile": "~/.openclaw/whispergate-channel-policies.json",
"noReplyProvider": "whisper-gateway",
"channelPoliciesFile": "~/.openclaw/dirigent-channel-policies.json",
"noReplyProvider": "dirigentway",
"noReplyModel": "no-reply",
"enableDiscordControlTool": true,
"enableWhispergatePolicyTool": true,
@@ -29,7 +29,7 @@
},
"models": {
"providers": {
"whisper-gateway": {
"dirigentway": {
"apiKey": "<NO_REPLY_API_TOKEN_OR_PLACEHOLDER>",
"baseUrl": "http://127.0.0.1:8787/v1",
"api": "openai-completions",
@@ -52,7 +52,7 @@
{
"id": "main",
"tools": {
"allow": ["whispergate"]
"allow": ["dirigent"]
}
}
]

View File

@@ -2,8 +2,8 @@
目标:补齐 OpenClaw 内置 message 工具当前未覆盖的两个能力:
> 现在可以通过 WhisperGate 插件内置的可选工具 `discord_control` 直接调用(无需手写 curl
> 注意:该工具是 optional需要在 agent tools allowlist 中显式允许(例如允许 `whispergate` 或 `discord_control`)。
> 现在可以通过 Dirigent 插件内置的可选工具 `discord_control` 直接调用(无需手写 curl
> 注意:该工具是 optional需要在 agent tools allowlist 中显式允许(例如允许 `dirigent` 或 `discord_control`)。
1. 创建指定名单可见的私人频道
2. 查看 server 成员列表(分页)

View File

@@ -1,8 +1,8 @@
# WhisperGate Implementation Notes
# Dirigent Implementation Notes
## Decision path
WhisperGate evaluates in strict order:
Dirigent evaluates in strict order:
1. channel check (discord-only)
2. bypass sender check

View File

@@ -1,4 +1,4 @@
# WhisperGate Integration (No-touch Template)
# Dirigent Integration (No-touch Template)
This guide **does not** change your current OpenClaw config automatically.
It only generates a JSON snippet you can review.
@@ -7,9 +7,9 @@ It only generates a JSON snippet you can review.
```bash
node scripts/render-openclaw-config.mjs \
/absolute/path/to/WhisperGate/plugin \
/absolute/path/to/Dirigent/plugin \
openai \
whispergate-no-reply-v1 \
dirigent-no-reply-v1 \
561921120408698910
```
@@ -23,7 +23,7 @@ Arguments:
The script prints JSON for:
- `plugins.load.paths`
- `plugins.entries.whispergate.config`
- `plugins.entries.dirigent.config`
You can merge this snippet manually into your `openclaw.json`.
@@ -32,20 +32,20 @@ You can merge this snippet manually into your `openclaw.json`.
For production-like install with automatic rollback on error (Node-only installer):
```bash
node ./scripts/install-whispergate-openclaw.mjs --install
node ./scripts/install-dirigent-openclaw.mjs --install
# or wrapper
./scripts/install-whispergate-openclaw.sh --install
./scripts/install-dirigent-openclaw.sh --install
```
Uninstall (revert all recorded config changes):
```bash
node ./scripts/install-whispergate-openclaw.mjs --uninstall
node ./scripts/install-dirigent-openclaw.mjs --uninstall
# or wrapper
./scripts/install-whispergate-openclaw.sh --uninstall
./scripts/install-dirigent-openclaw.sh --uninstall
# or specify a record explicitly
# RECORD_FILE=~/.openclaw/whispergate-install-records/whispergate-YYYYmmddHHMMSS.json \
# node ./scripts/install-whispergate-openclaw.mjs --uninstall
# RECORD_FILE=~/.openclaw/dirigent-install-records/dirigent-YYYYmmddHHMMSS.json \
# node ./scripts/install-dirigent-openclaw.mjs --uninstall
```
Environment overrides:
@@ -66,15 +66,15 @@ The script:
- writes via `openclaw config set ... --json`
- creates config backup first
- restores backup automatically if any install step fails
- restarts gateway during install, then validates `whisper-gateway/no-reply` is visible via `openclaw models list/status`
- restarts gateway during install, then validates `dirigentway/no-reply` is visible via `openclaw models list/status`
- writes a change record for every install/uninstall:
- directory: `~/.openclaw/whispergate-install-records/`
- latest pointer: `~/.openclaw/whispergate-install-record-latest.json`
- directory: `~/.openclaw/dirigent-install-records/`
- latest pointer: `~/.openclaw/dirigent-install-record-latest.json`
Policy state semantics:
- channel policy file is loaded once into memory on startup
- runtime decisions use in-memory state
- use `whispergate_policy` tool to update state (memory first, then file persist)
- use `dirigent_policy` tool to update state (memory first, then file persist)
- manual file edits do not auto-apply until next restart
## Notes

View File

@@ -1,15 +1,15 @@
# PR Summary (WhisperGate + Discord Control)
# PR Summary (Dirigent + Discord Control)
## Scope
This PR delivers two tracks:
1. WhisperGate deterministic no-reply gate for Discord sessions
1. Dirigent deterministic no-reply gate for Discord sessions
2. Discord control extension API for private-channel/member-list gaps
## Delivered Features
### WhisperGate
### Dirigent
- Deterministic rule chain:
1) non-discord => skip

View File

@@ -8,17 +8,17 @@ node scripts/package-plugin.mjs
Output:
- `dist/whispergate/index.ts`
- `dist/whispergate/rules.ts`
- `dist/whispergate/openclaw.plugin.json`
- `dist/whispergate/README.md`
- `dist/whispergate/package.json`
- `dist/dirigent/index.ts`
- `dist/dirigent/rules.ts`
- `dist/dirigent/openclaw.plugin.json`
- `dist/dirigent/README.md`
- `dist/dirigent/package.json`
## Use packaged plugin path
Point OpenClaw `plugins.load.paths` to:
`/absolute/path/to/WhisperGate/dist/whispergate`
`/absolute/path/to/Dirigent/dist/dirigent`
## Verify package completeness

View File

@@ -1,4 +1,4 @@
# WhisperGate Rollout Checklist
# Dirigent Rollout Checklist
## Stage 0: Local sanity
@@ -29,5 +29,5 @@
## Rollback
- Disable plugin entry `whispergate.enabled=false` OR remove plugin path
- Disable plugin entry `dirigent.enabled=false` OR remove plugin path
- Keep API service running; it is inert when plugin disabled

View File

@@ -1,6 +1,6 @@
# Run Modes
WhisperGate has two runtime components:
Dirigent has two runtime components:
1. `plugin/` (OpenClaw plugin)
2. `no-reply-api/` (deterministic NO_REPLY service)
@@ -20,7 +20,7 @@ Then configure OpenClaw provider `baseURL` to `http://127.0.0.1:8787/v1`.
```bash
./scripts/dev-up.sh
# or: docker compose up -d --build whispergate-no-reply-api
# or: docker compose up -d --build dirigent-no-reply-api
```
Stop:

View File

@@ -1,4 +1,4 @@
# WhisperGate 测试记录报告(阶段性)
# Dirigent 测试记录报告(阶段性)
日期2026-02-25
@@ -6,19 +6,19 @@
本轮覆盖:
1. WhisperGate 基础静态与脚本测试
1. Dirigent 基础静态与脚本测试
2. no-reply-api 隔离集成测试
3. discord-control-api 功能测试dryRun + 实操)
未覆盖:
- WhisperGate 插件真实挂载 OpenClaw 后的端到端E2E
- Dirigent 插件真实挂载 OpenClaw 后的端到端E2E
---
## 二、测试环境
- 代码仓库:`/root/.openclaw/workspace-operator/WhisperGate`
- 代码仓库:`/root/.openclaw/workspace-operator/Dirigent`
- OpenClaw 配置来源:本机已有配置(读取 Discord token
- Discord guildserverID`1368531017534537779`
- allowlist user IDs
@@ -29,7 +29,7 @@
## 三、已执行测试与结果
### A. WhisperGate 基础测试
### A. Dirigent 基础测试
命令:
@@ -95,7 +95,7 @@ make check check-rules test-api
## 五、待测项(下一阶段)
### 1) WhisperGate 插件 E2E需临时接入 OpenClaw 配置)
### 1) Dirigent 插件 E2E需临时接入 OpenClaw 配置)
目标:验证插件真实挂载后的完整链路。
@@ -113,7 +113,7 @@ make check check-rules test-api
### 2) 回归测试
- discord-control-api 引入后,不影响 WhisperGate 原有流程
- discord-control-api 引入后,不影响 Dirigent 原有流程
- 规则校验脚本在最新代码继续稳定通过
### 3) 运行与安全校验
@@ -127,4 +127,4 @@ make check check-rules test-api
## 六、当前结论
- 新增 Discord 管控能力(私密频道 + 成员列表)已完成核心测试,可用。
- 项目剩余主要测试工作集中在 WhisperGate 插件与 OpenClaw 的真实 E2E 联调。
- 项目剩余主要测试工作集中在 Dirigent 插件与 OpenClaw 的真实 E2E 联调。

View File

@@ -2,7 +2,7 @@
## Context
WhisperGate implements turn-based speaking for Discord group channels where multiple AI agents coexist. Only one agent (the "current speaker") is allowed to respond at a time. Others are silenced via a no-reply model override.
Dirigent implements turn-based speaking for Discord group channels where multiple AI agents coexist. Only one agent (the "current speaker") is allowed to respond at a time. Others are silenced via a no-reply model override.
## The Problem
@@ -12,7 +12,7 @@ When the current speaker responds with **NO_REPLY** (decides the message is not
1. A message arrives in the Discord channel
2. OpenClaw routes it to **all** agent sessions in that channel simultaneously
3. The WhisperGate plugin intercepts at `before_model_resolve`:
3. The Dirigent plugin intercepts at `before_model_resolve`:
- Current speaker → allowed to process
- Everyone else → forced to no-reply model (message is "consumed" silently)
4. Current speaker processes the message and returns NO_REPLY

View File

@@ -1,4 +1,4 @@
# WhisperGate Quick Verification
# Dirigent Quick Verification
## 1) Start no-reply API
@@ -15,7 +15,7 @@ npm start
curl -sS http://127.0.0.1:8787/health
curl -sS -X POST http://127.0.0.1:8787/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"whispergate-no-reply-v1","messages":[{"role":"user","content":"hi"}]}'
-d '{"model":"dirigent-no-reply-v1","messages":[{"role":"user","content":"hi"}]}'
```
Or run bundled smoke check: