Skip to content
dsh.fish
Bundle

dsh-eac-popup

当任意会话的 agent 向用户提问(ask_user_question)、请求审批或有会话任务完成时,把 EAC 任务栏图标常亮高亮(非闪烁,直到窗口回前台熄灭)并自动切换会话;显式点击时置顶 EAC 窗口(保持原窗口大小状态);提供 /activate 端点供 EAC 主进程通知联动

Source
qiyeren
stars
1 stars
License
MIT
Updated
Updated 5 days ago

Readme

# dsh-eac-popup

当任意会话的 agent 向用户提问(`ask_user_question`)或请求审批、或有会话任务完成时,自动把 **DeepSeek Harness EAC** 的任务栏图标**常亮高亮**(非闪烁,直到窗口回到前台才熄灭)、自动切换到对应会话;显式点击(提问/审批/通知按钮)时还会把窗口弹到最上层(保持原窗口大小状态)。

When any session's agent asks the user a question (`ask_user_question`), requests approval, or a session task completes, automatically keeps the **DeepSeek Harness EAC** taskbar icon steadily highlighted (not blinking, until the window returns to the foreground), switches to the corresponding session; explicit clicks (question/approval/notification button) also bring the window to the front (preserving its previous size state).

---

## ✨ 功能特性 / Features

- 🔔 **窗口置顶** — 显式点击场景下 EAC 窗口弹到最上层(仅当最小化时还原;最大化/普通窗口保持原状)
- 💡 **任务栏常亮高亮** — 通知弹出/提问/审批时任务栏图标**持续高亮(非闪烁)**(`FlashWindow`),**直到窗口进入前台自动熄灭**
- 🔀 **自动切换会话** — 界面自动切到对应会话(`sessions.open`,含跨工作区)
- 🖱️ **通知弹出即触发** — 会话完成通知一弹出,立即常亮高亮 + 切会话(不抢焦点)
- 🌐 **全会话覆盖** — Host 级挂载,任意会话触发均生效
- ♻️ **持久生效** — 随 web-desktop profile 加载,重启 EAC 后依然工作

## 🎯 触发条件 / Triggers

| 场景 | 事件 |
|---|---|
| 任一会话的 agent 调用提问工具 | `tools/pre-execute` + `exec.name === 'ask_user_question'` |
| 任一会话请求审批 | `approval/request` |
| EAC 会话完成通知弹出 | 主进程补丁调 `GET /dsh-eac-popup/activate?sessionId=<id>&pop=0`(常亮高亮+切会话,不抢焦点) |
| 窗口聚焦兜底(用户回到 EAC) | 主进程补丁调 `GET /dsh-eac-popup/activate?sessionId=<id>&pop=1`(弹窗+常亮高亮+切会话) |

常亮高亮带 **5 秒防抖**(高频提问不刷屏);会话切换每条都生效。

### 通知联动 / Notification integration

本插件提供 `GET /dsh-eac-popup/activate?sessionId=xxx&pop=0|1` 端点:`pop=1` 弹窗+常亮高亮+切会话;`pop=0` 仅常亮高亮+切会话(不抢焦点)。窗口已在前台时调用会自动恢复高亮(幂等安全)。

**需要配套的 EAC 主进程补丁**(见仓库 `patches/` 或 EAC 定制补丁流程):修改 `main.js` 的会话完成通知——弹出时立即调 `activate?pop=0`;窗口聚焦兜底时调 `activate?pop=1`。

## 🖥️ 平台要求 / Requirements

- **Windows**(依赖 `user32.dll`:`SetWindowPos` / `SetForegroundWindow` / `FlashWindowEx`)
- DeepSeek Harness EAC(web-desktop profile)
- 插件运行在 DSH Host 进程,无需额外依赖

## 📦 安装 / Install

### 方式一:EAC 插件市场(推荐)

在 EAC 设置 → 插件 中通过插件市场搜索 `dsh-eac-popup` 安装。

### 方式二:dsh 命令行

```bash
# 在你的任意工作目录执行(不要 cd 到 profile 目录)
dsh plugin --profile web-desktop add https://github.com/qiyeren/dsh-eac-popup
```

然后重启 EAC。

### 方式三:手动

1. 把本仓库复制到 `~/.dsh/plugins/dsh-eac-popup/`
2. 在 `~/.dsh/profiles/web-desktop/cordis.patch.yml` 追加:

```yaml
- insert:
    - id: eac-popup
      name: dsh-eac-popup
```

3. 在 profile 的 `package.json` dependencies 中加入:

```json
"dsh-eac-popup": "file:C:/Users/<你的用户名>/.dsh/plugins/dsh-eac-popup"
```

4. 重启 EAC。

## 🗑️ 卸载 / Uninstall

1. 从 `cordis.patch.yml` 移除 `eac-popup` 行
2. 删除 `~/.dsh/plugins/dsh-eac-popup/` 目录
3. 重启 EAC

## 🔧 工作原理 / How it works

```
[HOST]  tools/pre-execute / approval/request / activate?pop=1(显式点击)
              │   /activate?pop=0(通知弹出,不抢焦点)
              ▼
        会话 ID 入队 + spawn PowerShell
              │                        ▼
              │            user32: 弹窗(仅pop=1) + FlashWindow(TRUE)
              │                                  = 任务栏常亮高亮直到窗口回前台
              │
[CLIENT] 每 500ms 轮询 /dsh-eac-popup/poll ◄──────┘
              │
              ▼
        sessions.open(会话ID)  →  界面自动切换(含跨工作区)
```

- Host 端监听事件,把会话 ID 写入队列,同时 spawn PowerShell:`pop=1` 时置顶抢前台(AttachThreadInput 绕过 Win11 前台锁),随后 `FlashWindow(hwnd, TRUE)` 任务栏**常亮高亮**(非闪烁)直到窗口进入前台(在前台时调用则恢复,幂等安全)
- `/dsh-eac-popup/activate` 端点供 EAC 主进程调用:通知弹出 `pop=0`(不抢焦点),窗口聚焦兜底 `pop=1`
- Client 端(`__ModuleLoader__` bundle)每 500ms 轮询取队列,调用 `sessions.open(id)` 切到对应会话
- 双通道轮询:优先 `host.call` RPC,无 harness 环境自动回退 HTTP `fetch('/dsh-eac-popup/poll')`;队列非破坏性(按 seq 去重 + 2 分钟保留)

## 📁 文件结构 / Files

```
dsh-eac-popup/
├── index.mjs          # Host 半端:事件监听 + PowerShell 窗口操作
├── lib/client.js      # Client 半端:轮询 + sessions.open
├── cordis.patch.yml   # 组合补丁(插件管理器自动应用)
├── package.json
└── README.md
```

## 📄 License

[MIT](./LICENSE)

Install

dsh plugin --profile web add github:qiyeren/dsh-eac-popup

Profile: web

  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source