Bundle
dsh-task-overlay
DeepSeek Harness 任务悬浮窗:独立于 DSH 窗口的桌面状态浮窗(目标 / Todo 进度 / 待确认与完成提醒),并在 DSH 侧栏提供启停开关。Windows 桌面浮窗部分仅支持 Windows。
- Source
- gg947919490-byte
- License
- MIT
- Updated
- Updated 7 days ago
Readme
# dsh-task-overlay · 任务悬浮窗
在 **DSH 窗口之外**放一个桌面悬浮窗,实时显示当前任务状态;并在 DSH 侧栏提供一个启停开关。
- **目标状态**:phase(进行中 / 已暂停 / 受阻 / 已完成)、objective、第 N/M 轮、受阻原因
- **Todo 进度**:进度条 + 清单(✔ 已完成 / ◐ 进行中 / ○ 待办)
- **提醒**:N 个会话等待你确认、N 个会话已完成未查看(跨所有会话)
- 最小化或关闭 DSH 后,桌面浮窗依然存在;DSH 完全退出后它会显示「DSH 未运行」但窗口不消失
> 桌面浮窗(PowerShell + WPF)**仅支持 Windows**;DSH 内的开关与状态推送跨平台。
## 安装
**插件市场(推荐)**:先安装市场插件 [dshmarket](https://github.com/dsh-market/dsh-market),
然后在 DSH 里 **设置 → Plugin Market** 搜索 `dsh-task-overlay` 一键安装。
**DSH 官方插件页**:安装框填 `github:gg947919490-byte/dsh-task-overlay`,
或贴 Release 里 `dsh-task-overlay.tgz` 的直链。
**CLI**:
```sh
dsh plugin add gg947919490-byte/dsh-task-overlay
```
安装后 **刷新一次 DSH 页面**(F5)即可在侧栏底部看到「桌面浮窗」开关。
## 使用
| 入口 | 操作 |
|---|---|
| DSH 侧栏底部「桌面浮窗」开关 | 点击启停桌面浮窗(绿点=运行中) |
| 浮窗标题栏 `▾` / `▸` | 展开详情 / 收成 190×32 迷你胶囊 |
| 拖动浮窗标题栏 | 移动位置(位置与折叠状态会记住) |
| 浮窗 `✕` | 关闭浮窗进程(可在 DSH 侧栏开关重新打开) |
首次手动启动(不经 DSH 开关):双击 `desktop\launch-overlay.cmd` 或 `desktop\launch-overlay.vbs`。
开机自启:把 `launch-overlay.vbs` 的快捷方式放进 `shell:startup`。
## 工作原理
```
DSH GUI(客户端插件,拥有完整会话状态)
│ POST 压缩快照 → 127.0.0.1:45123(2 秒心跳,变化即时推送)
▼
桌面浮窗(独立 WPF 进程 + 内置 TCP 监听)
▲
│ 侧栏开关 → 同源相对路径 /task-overlay/control(start/stop/toggle/status)
DSH 宿主(本包宿主半边)—— start 用 spawn 拉起浮窗,stop 发 {"cmd":"stop"} 优雅关闭
```
- 数据不来自宿主投影(root 上下文读不到会话作用域的 `todos`/`goal`),而由 GUI 客户端推送。
- 浮窗判断 DSH 存活用三段式:≤20 秒实时;>20 秒保留最后一帧并标注数据年龄;>150 秒且宿主端口拒连才显示「DSH 未运行」。
## 配置项
| 位置 | 参数 | 默认 | 说明 |
|---|---|---|---|
| `dsh/client.js` | `BRIDGE_URL` | `http://127.0.0.1:45123/task-overlay` | 客户端推送地址,需与浮窗 `-Port` 一致 |
| `desktop/task-overlay.ps1` | `-Port` | `45123` | 桥接监听端口 |
| 同上 | `-DshPort` | `19387` | 宿主端口,用于存活探测 |
| 同上 | `-Width` | `300` | 展开态宽度(200–520) |
| 同上 | `-StateFile` | `~/.dsh/task-overlay/desktop-window.json` | 位置/折叠记忆 |
## 安全说明
- 宿主控制接口只绑定 webServer 自身监听地址(默认 `127.0.0.1`),并校验请求 `Origin` 为同源或 `dsh-app://app`,防止任意网页 CSRF 启停。
- `start` 只执行包内固定脚本路径,不接受任何外部输入拼接。
- 桥接端口(45123)无鉴权,仅绑定回环;本机进程可伪造显示数据或触发关闭,属已知限制。
## 排查
- 最近一帧快照:`~/.dsh/task-overlay/last-payload.json`
- 浮窗没出现:确认 DSH 已刷新(F5)、侧栏开关显示「开」;或手动跑 `desktop\launch-overlay.cmd`
- 端口被占:改 `-Port` 并同步 `dsh/client.js` 的 `BRIDGE_URL`
## 开发备注(DSH 0.2.0-rc.2 实测)
- 客户端 bundle 为**手写零构建**:`window.__ModuleLoader__.load({ id: 包名, factory })`,只 require 平台种子模块。
- 宿主行必须指向**包根**;`apply` 必须**同步**;宿主代码热生效需**换新包名**(Node ESM 按解析路径缓存)。
- 宿主 `spawn` 子进程**不要用 `detached: true`**(pwsh 会立即退出)。
- 本包不声明 peer,避免版本兼容校验把整包判为不兼容。
## License
MIT
Install
dsh plugin --profile web add github:gg947919490-byte/dsh-task-overlay
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-task-overlay from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.