dsh-notify
baka-world
DeepSeek Harness desktop notification plugin (notify-send / D-Bus)
PROJECT TOPICS
PROJECT README
⚠️⚠️ 安全警告(必读)⚠️⚠️
本插件可以通过 QQ 远程执行命令、截图、查看文件——权限很大,请务必注意:
- 必须配置白名单:
allowedUsers留空 = 任何 QQ 号都能控制你的电脑。 安装后第一件事:在 DSH 设置页「QQ 远程」面板的控制白名单里添加你自己的 QQ 号(或编辑~/.dsh/qq-remote.json的allowedUsers)。- 强烈建议使用小号:机器人 QQ 请用小号 / 专用机器人号,不要用日常主号。 QQ 机器人框架(NapCat 等)存在被风控甚至封号的风险;且插件权限极大,小号出问题不会影响你的主号与账号资产。
装上这个插件,你的 QQ 就能变成 DSH 的遥控器:出门在外用手机发条消息就能让电脑干活 —— 派任务、跑命令、看进度、收截图;想聊天时它又能变成陪你闲聊的 AI 搭子。登录失效不用折腾命令行,打开设置面板扫码即恢复。
⚠️ 前置依赖(必装):本插件不包含 QQ 协议实现,需要先安装并运行 NapCat(或 Lagrange.OneBot / go-cqhttp / LLOneBot 等 OneBot 11 实现)作为 QQ 桥。NapCat 未运行时插件无法收发 QQ 消息,面板会显示"NapCat 未启动"。
NapCat 与插件联动三步:
- 安装 NapCat(Linux:https://im.qq.com/linuxqq 装 QQ 后用 NapCat 官方脚本注入,或用 NapCat.Shell;Windows/macOS 用官方安装包),启动并手机扫码登录机器人 QQ
- 打开 NapCat WebUI(默认
http://127.0.0.1:6099/webui)→ 网络配置 → 新增 WebSocket 服务端:监听127.0.0.1:3001(路径/ws,消息格式 array)——与插件默认wsUrl一致- 启动 DSH + 插件后,DSH 设置页「QQ 远程」面板会显示"已连接";若 NapCat 登录失效,面板可直接扫码恢复
💡 安装提示:直接把这个仓库链接发给你的 AI 编程助手(Codex、Claude Code 等),它能按本 README 自行完成安装与配置。
| 能力 | 命令 / 工具 | 说明 |
|---|---|---|
| 执行命令 | /exec <shell> |
在电脑上执行 shell 命令并回传输出(可配置超时/工作目录) |
| 派发任务 | /ask <任务>(私聊直接发消息也行) |
注入当前 DSH agent 会话,agent 开始执行 |
| 查看进度 | /status /progress [n] |
agent 状态 / 最近进度事件回放 |
| 阶段汇报 | 自动 | phase 模式:轮次小结/完成总结/出错即时/长任务心跳,不刷屏 |
| 会话管理 | /sessions /session <序号\|标题\|id> /title |
标题化会话列表、按序号/标题/ID 切换、重命名 |
| 新建会话 | /newsession <id> |
在当前工作区新建 agent 会话并切换(生命周期挂 DSH 根进程) |
| AI 聊天 | /chat on\|off /chat <名字> |
纯净聊天模式:直连模型像人一样回复,多聊天会话、记忆持久化 |
| 聊天特化会话 | /chatbind on\|off |
把指定 DSH 会话绑定为聊天特化:发消息=直接聊天(角色可自定义),其他会话不受影响 |
| 取消任务 | /cancel |
中止 agent 当前工作 |
| 截图回传 | /screenshot |
截屏(xdg-desktop-portal / grim / scrot…)并以图片消息发送 |
| Agent 主动汇报 | qq_report qq_screenshot |
agent 在会话里可主动向 QQ 发送文本 / 截图 |
| QQ 图形开关 | /panel + 设置页「QQ 远程」 |
实时状态、一键重新登录、登录失效自动弹出二维码扫码恢复 |
| 一键安装 | scripts/install.sh |
自动构建 + npm 依赖 + 装配注册,跨平台自包含 |
| 命令 | 说明 | 缩写 |
|---|---|---|
/help |
查看全部命令(含缩写对照) | /h |
/ping |
连通性测试 | /pong |
/status |
查看 agent 状态 | /st |
/sessions |
列出会话(标题+ID+状态) | /ss |
/session <序号\|标题\|id> |
切换目标会话 | /s |
/title <名称> |
给当前目标会话重命名 | /rename |
/newsession <id> |
新建会话并切换 | /ns |
/ask <任务> |
派发任务(私聊直接发消息也行) | /task |
/cancel |
取消当前任务 | /x |
/exec <命令> |
在电脑上执行 shell 命令 | /run |
/progress [n] |
查看最近进度 | /pg |
/screenshot |
截图并发送给你 | /sc |
/quiet on\|off |
开关进度自动推送 | /q |
/chat on\|off |
纯净聊天模式(/chat <名字> 切换会话) |
— |
/chatbind on\|off |
聊天特化会话(直接聊天) | /cb |
/panel |
打开 QQ 控制面板 | /pn |
| 项目 | 要求 |
|---|---|
| Node.js | ≥ 22(使用内置 WebSocket / fetch,零 npm 依赖) |
| 宿主 | DeepSeek Harness(DSH)环境,提供 @deepseek-ai/* peer 依赖 |
| QQ 桥 | 任一 OneBot 11 实现(NapCat / Lagrange.OneBot / go-cqhttp / LLOneBot) |
| 平台 | Linux 完整支持;macOS / Windows 核心功能可用(见下) |
平台支持情况:
git clone https://github.com/ASAKAFENG/dsh-qq-remote
cd dsh-qq-remote
bash scripts/install.sh
自动完成:构建 → 安装到 DSH profile → 注册 loader 条目 → 生成配置模板(~/.dsh/qq-remote.json),重启 DSH 生效。
bash scripts/build.sh(纯 JS,无编译依赖)dev_inject_plugin(或 loader 装配),插件名 @dsh-external/dsh-qq-remotews://127.0.0.1:3001/ws),
路径与插件 wsUrl 保持一致;配置了 token 时 WS 走 ?access_token=、HTTP 走 Authorization: Bearer配置有两种方式:插件 Config(loader 注入时传入)或覆盖层文件 ~/.dsh/qq-remote.json
(免改代码、即时生效,热重载后应用):
{
"wsUrl": "ws://127.0.0.1:3001/ws",
"allowedUsers": [123456789],
"groupPrefix": "/",
"privatePlainAsTask": true,
"autoReport": true,
"reportMode": "phase",
"chatSystemPrompt": "你是用户通过 QQ 联系的一位聊天伙伴。回复要像真人 QQ 聊天一样:简短自然、口语化、有来有回,不要使用列表/表格/标题等正式格式,不要提及你是 AI、模型或助手。",
"chatHistoryLimit": 0,
"chatMaxChars": 0,
"chatSessionNames": []
}
说明:
chatSystemPrompt是聊天模式的人设提示词,默认只约束"像真人聊天"的回复格式,可自由替换成任何角色(如 AI 女友、助理、猫娘…);chatHistoryLimit/chatMaxChars为0表示上下文无限制(全量发送);chatSessionNames由/chatbind命令自动维护,一般无需手改。
完整配置项见 USAGE.md(含 reportMode/phaseIntervalMs/chatSessionNames 等全部字段)。
~/.dsh/qq-remote.json,把 allowedUsers 改成你的 QQ 号(默认示例 [123456789] 会放行任意消息,务必替换)127.0.0.1:3001 的 WebSocket 服务端并已扫码登录机器人 QQ/ping → 回复 pong 即成功;发 /help 查看全部命令| 想做什么 | 发什么 |
|---|---|
| 派发任务 | /ask 帮我整理桌面文件(或私聊直接发消息) |
| 查看进度 | /status / /progress |
| 截图看屏幕 | /screenshot |
| 执行命令 | /exec ls -la |
| AI 聊天 | /chat on(/chat off 退出) |
| 会话管理 | /sessions / /session <标题或id> / /title 新名字 |
| 控制面板 | /panel(或设置页「QQ 远程」) |
💡 进度会自动推送到 QQ(
/quiet off可关);设置页可增删控制白名单;uninstall.sh --purge可彻底卸载。
优先调用 xdg-desktop-portal 的 Screenshot(GNOME Wayland 非交互截屏,无需额外安装);
失败则依次尝试自定义 screenshotCommand、grim、scrot、maim、import、gnome-screenshot。
test/onebot-mock.mjs 是一个本地 OneBot 模拟服务端,用于无 QQ 环境下的端到端验证:
cd test && npm i # 安装 ws(仅测试依赖)
node test/onebot-mock.mjs 3001
# 另一个终端:node test/onebot-mock.mjs 的 stdin 输入:
# msg 123456 /exec echo hello
# msg 123456 /screenshot
allowedUsers 务必配置为你的 QQ 号,否则任何给你机器人发消息的人都能控制电脑/exec 可执行任意命令;execAllowed: false 可整体禁用napcat.js 及面板按钮、下载源、机器人 QQ 号输入全部移除)——插件回归纯远程控制职责,NapCat 由用户自行安装(README 摘要给出前置依赖提醒与联动三步)loadNapCat.js 加载 ${NAPCAT_BOOTMAIN}/napcat.mjs,但服务把 NAPCAT_BOOTMAIN 指向了 launcher 目录(~/.dsh/napcat-linux)——实际 napcat.mjs 在 napcat/ 子目录(符号链接)里 → ERR_MODULE_NOT_FOUNDNAPCAT_BOOTMAIN 与 WorkingDirectory 直接指向 NapCat 实际根目录(~/.dsh/napcat),LD_PRELOAD 仍指向 launcher 的 soRefreshQRcode 强制换新码node napcat.mjs 直启会失败(--no-sandbox 传给 node / 找不到 QQ 资源)libnapcat_launcher.so(按架构)→ 建立 ~/.dsh/napcat-linux/(含 napcat 符号链接)→ 服务改为 LD_PRELOAD=launcher /opt/QQ/qq --no-sandbox + NAPCAT_BOOTMAIN-q <QQ号> 是否写入)~/.dsh/qq-remote.json 失败时前端显示真实错误(此前显示"已保存"但刷新后丢失)-q QQ号)时自动重写并重启——填了 QQ 号后重新引导即可生效,无需手动改服务-q <QQ号> 启动时只跑 WebUI 模式,不会生成登录二维码-q <QQ号>(快速登录/二维码),保存到 ~/.dsh/qq-remote.json(napcatQQ)~/.dsh/napcat(此前引导装到哪就探测不到哪)~/.dsh/qq-remote.json 即时生效)GET/POST /qq-remote/napcat/settings:镜像列表单一事实源,支持自定义 URL 校验(http/https/file)napcatDownloadUrl(默认官方 GitHub Release,可换镜像或本地文件路径);手动预下载 ~/.dsh/NapCat.Shell.zip 自动跳过下载webui_not_found/waiting → 引导按钮隐藏napcat_not_running 现在严格按"服务正在运行"判断(unit 不存在或 inactive 都显示引导按钮);/qq-remote/status 新增 napcatActive 字段区分"服务存在"与"正在运行"Cannot read properties of undefined (reading 'dirname') —— os.path.dirname 误用修正为 path.dirnamenapcatInstallDir 时只信任配置值,不再扫描其他候选dsh-napcat.service → 启动 → 二维码自动出现,扫码即登录/qq-remote/status 现在区分 napcat_not_running / webui_not_found / stale_qrcode / waiting,设置页与完整面板直接显示原因,不再无限"等待"/proc/<pid>/cwd 与 NAPCAT_WORKDIR 反推 NapCat 工作目录;~/.config/napcat 等路径补充scripts/ 子目录 —— 根目录不再有 install.sh,市场正确识别为 cordis-plugin(此前会被误判为「脚本型」,跳过构建/依赖/注册/更新/卸载全管线)lib/ 构建产物,市场安装无需构建弹窗、直接复制使用main / repository / files(含 scripts)对齐规范;npm 包名唯一性已确认bash scripts/install.sh(卸载 bash scripts/uninstall.sh,诊断 bash scripts/repair.sh)index.js(装配)+ util/onebot/chat/commands/panel/qrgen 六模块,行为完全一致(本机全量回归:消息链路 9/9、面板路由、QR 生成器交叉验证)uninstall.sh 增强 —— 移除 patch 条目 + 删除安装目录(含 junction)+ 清理注入器 registry + 清理 profile package.json 残留(dependencies/bundles);bash uninstall.sh --purge 可连配置与聊天记忆一起删除test/e2e.mjs 一键跑消息链路 + QR 生成器验证(cd test && node e2e.mjs)disabled: true 的旧条目(卸载残留),重新安装时自动移除 disabled 恢复启用cordis.patch.yml 前自动备份为 cordis.patch.yml.bak-install,任何意外可一键回滚repair.sh 诊断工具:列出 patch 全部插件条目、检测旧版 install.sh 造成的残缺结构(子行被删)、提示皮肤类条目是否缺失、发现备份文件时给出恢复命令;安装完成时自动运行检查GetQQLoginQrcode API 主动获取二维码并本地生成 PNG(内置零依赖 QR 生成器);Docker / 自定义目录 / 任意安装方式都能显示二维码.config/QQ/NapCat、macOS 路径、systemd NAPCAT_WORKDIR 反推全覆盖webuiPort / webuiToken 配置项(默认自动探测,一般无需配置)inject: [webServer, tools](cordis.patch.yml / install.sh 模板);插件代码增加 webServer 未就绪的延迟重试 + 防重复注册 —— 通过 dsh plugin 官方安装后 /qq-remote/* 路由必定注册~/.dsh/qq-remote.json,即时生效安装/卸载
[]、精确幂等匹配、原子替换(临时文件+rename)exports["./client"] 指向 lib/client.js(唯一路径),安装后强制校验存在dsh.bundle.patch 声明:支持 dsh plugin 官方安装流程(profile bundle 装配)uninstall.sh:移除 patch 条目 + 删除安装目录 + 清理注入器 registry(防重启复活)- insert: 块:重复安装后 patch 文件保持干净(幂等且不留垃圾行)体验
新功能
http://127.0.0.1:3080/qq-remote/panel(完整面板,/panel 命令可获取链接)/st /ss /s /ns /cb /pg /sc /q /x /run /task /h /pn,/help 查看对照/chat <名字>)、记忆持久化(~/.dsh/qq-remote-chats/)、上下文无限制/chatbind):指定会话直接聊天回复,其他会话不受影响/sessions 显示标题,/session <序号|标题|id> 切换,/title 重命名,/newsession 新建install.shBug 修复
reading 'kind'):消息缺少 source 字段导致 LLM 管道报错/newsession 创建的会话随插件重载消失:改为根上下文创建,生命周期独立[object Object]:正确读取标题对象locale.t is not a function):改用新版 locale API(ctx.locale.bind)平台
/exec、/ask、阶段进度汇报、截图回传、qq_report/qq_screenshot 工具、零 npm 依赖CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。