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:
@@ -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"]
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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 成员列表(分页)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 guild(server)ID:`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 联调。
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user