dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Windows 上的原神 / 崩坏3 / 崩坏:星穹铁道 / 绝区零日常自动化:每个游戏一个计划任务,分别驱动 BetterGI、game-daily 技能族、三月七助手或绝区零「一条龙」;带逐游戏开关、前台守护、只在出问题时介入的运行期值守,以及每游戏固定一个汇报会话、后续结果追加进去。需要 DSH 桌面端,并预先安装对应外部引擎。
简体中文 | English
DSH 桌面端插件:把「原神 / 崩坏3 / 崩坏:星穹铁道」的每日自动化收进设置页一个面板里 —— 顶部切游戏、每游戏一个默认关闭的代理开关、按游戏配排班,保存后自动建立 Windows 计划任务,到点无人值守地跑一轮日常,跑完弹通知并(可选)开一个会话向你汇报。
从源码安装(推荐):先把仓库 clone 到本地任意目录,再让 Harness 的 plugin_manager 指向该目录(它自己完成 package 安装与 bundle 选择;不要手写 profile 的 package.json / cordis.patch.yml):
git clone https://github.com/gychen-NJU/dsh-game-daily.git
plugin_manager action: install_bundle target: <clone 下来的 dsh-game-daily 目录>
开发期(link 到某个 profile,改代码即时生效;改完仍需重启桌面端才会重新加载代码):
dsh plugin --profile web add link:<本仓库目录>
装好后:设置 → 游戏日常。插件包声明了 dsh.bundle.patch 与 dsh.client,profile 的 dsh.profile.bundles 会列出 dsh-game-daily。
把下面这句直接发给你的 DSH Agent:
帮我把 https://github.com/gychen-NJU/dsh-game-daily 装进当前 DSH 桌面端:clone 到本地目录后用 plugin_manager install_bundle 指向该目录,装完确认「设置 → 游戏日常」出现并跑一次依赖体检,缺什么按提示修好。
Agent 会自己完成 clone、install_bundle、确认插件已激活,并按依赖体检结果补齐 BetterGI / computer-use / 技能等外部条件。
BetterGI.exe)。超时指「一轮最多跑多久」(5–180 分钟,默认原神 150、崩3/星铁 45);计划任务的系统执行时限会自动设为「超时 + 10 分钟」,而那 5 分钟的余量留给插件自己收尾。report.json(状态、模式、步骤、证据、结论)与 stdout 尾部。设置页 ──POST /api/game-daily/apply──▶ 写 state.json + automation/tasks.json
│
└─▶ automation/game-daily-register.ps1(提权一次)
└─▶ Windows 计划任务 game-daily-<game>
每天 HH:MM 触发
│
▼
node automation/run-headless.mjs --game <id>
│ spawn
▼
dsh --profile headless --patch automation/headless-overlay.yml "<prompt>"
│
▼
按引擎执行(原神走 BetterGI;崩3 走 game-daily-hi;崩铁走三月七小助手 M7A)
│
▼
<stateDir>/runs/<game>/<runId>/{meta.json,report.json,stdout.log,screens/}
│ 插件每 60s reconcile
▼
记录历史 → Windows 通知 → (可选)在每个游戏**固定一个**汇报会话里追加结果(首次创建,之后复用;会话被删会自动重建)
汇报投递的每一步(saved= / alive= / 已追加到 … 或 复用失败:<原因>;改为新建)都会写进 <stateDir>/automation/report.log:Host 的 logger 不落盘,排查「为什么又新建会话」只看这一个文件即可。
headless 侧通过 --patch 叠加 overlay 注入对应 MCP(原神 bettergi / 绝区零 zzz-od / 崩铁 m7a),并带 DSH_PERMISSION_MODE=danger-full-access 实现无人值守;崩3/星铁没有 wincu 时按技能说明用提权助手(scripts/run-step.mjs --ps)。
报告是唯一判定依据:report.json 的 status 为 success / partial / failed / timeout;插件只认这个文件,不猜进程退出码。
看门狗:run-headless.mjs 在「超时 − 5 分钟」到点时会主动停掉 headless、写一份兜底 report.json(status=timeout)再退出,避免被系统执行时限强杀后什么都不留下。
兜底对账:如果某轮连兜底报告都没写(比如被手动结束或崩溃),reconcile 会在进程确已退出、且已过 3 分钟宽限后,补一条 failed 历史并发通知,不再静默。
前台守护:每轮运行开始时,插件从 automation/keep-foreground.ps1 起一个 1 秒轮询的守护进程,游戏窗口被别的窗口抢走时立即拉回(四级回退:SetForegroundWindow → AttachThreadInput → 模拟 Alt → SwitchToThisWindow),结束/停止时写 .stop 自动退出;日志在 <stateDir>/automation/guard-<game>.log。面板排班卡里有「前台守护」开关(ui.foregroundGuard,默认开)。
进程收尾(真实模式):一轮跑完会关掉该游戏的进程(原神连同 BetterGI.exe),减少后台占用;开始新一轮前会先关掉其它游戏(Get-Process + Stop-Process -Force),若上一轮还在跑,计划任务会等它收尾(默认最多 20 分钟,DSH_GAME_DAILY_WAIT_MS 可调)而不是两边互相抢窗口。演练模式不动任何进程。
/api/game-daily)| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /state | 全部游戏状态 + 任务摘要(计划任务信息走缓存,不阻塞) |
| GET | /probe?games=genshin,hi | 依赖体检结果 |
| POST | /ui | 保存界面偏好(如 lastGame、reportSessions) |
| POST | /apply | 保存排班并重建计划任务;{dryRun:true} 只打印将注册的动作、不落盘 |
| POST | /disable | 移除某游戏(或全部)计划任务并关闭开关 |
| POST | /run | 立即运行一次:`{game, mode:'real' |
| POST | /stop | 停止该游戏的运行进程 |
| POST | /run-task | 立刻触发已注册的计划任务(由任务管理器跑,而不是插件直启) |
| POST | /install | 修复动作:{action:'install-bettergi-skill'} 装技能、{action:'install-bettergi-mcp'} 下载+注册、{action:'fix-bettergi-mcp'} 只注册;其它 action 生成修复会话 |
| GET | /runs?game=genshin | 历史运行摘要 |
| GET | /run?id=<runId> | 单次运行的 report/meta/stdout 全文 |
| GET | /update | 检查更新:返回 {current, latest, hasUpdate, repo, releases, checkedAt}(30 分钟缓存,?force=1 强制刷新) |
| POST | /update | 立即更新:有 .git 走 git pull --ff-only,否则下载 zip 覆盖;返回 {from, to, method, restartRequired} |
| POST | /reconcile | 手动触发一次对账(平时每 60s 自动跑) |
$DSH_HOME/game-daily/(默认 %USERPROFILE%\.dsh\game-daily)
state.json(原子写)、runs/<game>/<runId>/、automation/{tasks.json,game-daily-register.ps1,register-result.json,headless-overlay.yml,run-headless.log}、notifications.log| 变量 | 默认 | 用途 |
|---|---|---|
DSH_HOME | %USERPROFILE%\.dsh | DSH 主目录 |
DSH_PROFILE | desktop | 用来检查 headless / 插件的 profile 名 |
DSH_SKILLS_ROOT | %USERPROFILE%\.agents\skills | 技能目录(game-daily 家族) |
DSH_GAME_DAILY_DEV | — | 1 = 开发隔离:状态目录加 /dev、任务前缀 game-daily-dev- |
DSH_GAME_DAILY_STATE_DIR | $DSH_HOME/game-daily | 覆盖状态目录 |
DSH_GAME_DAILY_TASK_PREFIX | game-daily- | 覆盖计划任务名前缀 |
DSH_GAME_DAILY_BETTERGI_MCP | 自动解析(见下) | bettergi MCP 服务器脚本的显式路径(优先级最高) |
DSH_GAME_DAILY_BETTERGI | D:\software\BetterGI\BetterGI.exe | BetterGI 安装位置(体检用) |
为了让「装好插件 = 工具齐全」,两份原神配套工具直接打进插件包,安装插件时就已经在:
| 位置 | 内容 |
|---|---|
tools/bettergi-mcp/bettergi-mcp.mjs | 原神 bgi_* 工具的 MCP 服务器(单文件、零依赖,约 100KB,29 个工具) |
tools/bettergi-control/ | bettergi-control 技能(SKILL.md + references/ + 15 个 bgi-*.ps1) |
dsh-mcp-client 配置追加到当前 profile 的 cordis.patch.yml(先备份成 cordis.patch.yml.bak-gd-<时间戳>,写后回读校验,已存在则不重复写),重启 DSH 生效——不需要联网。%USERPROFILE%\.agents\skills\bettergi-control\SKILL.md 缺失(或脚本不足 10 个)时,面板给出「安装 bettergi-control(插件自带)」按钮;点一下就是纯本地目录拷贝(旧目录备份成 bettergi-control.bak-<时间戳>),不联网。技能目录可用 DSH_SKILLS_ROOT 覆盖。gychen-NJU/bettergi-mcp 与 gychen-NJU/bettergi-control 只作为上游来源/更新通道:只有当插件内的自带副本缺失(安装不完整)时,插件才会去 GitHub 取单文件(mcp)或 zip(skill)兜底。DSH_GAME_DAILY_BETTERGI_MCP 环境变量 → 状态目录 vendor/(手动覆盖/更新)→ 插件自带副本 → 同级 dsh-betterGI 工作区(开发机布局)。git clone https://github.com/gychen-NJU/bettergi-mcp,然后 DSH_GAME_DAILY_BETTERGI_MCP=<clone 目录>\bettergi-mcp.mjs。绝区零的画面识别与点击交给 ZenlessZoneZero-OneDragon(下称「一条龙」)。它在本机跑一个 HTTP 后端(默认 http://127.0.0.1:23001),插件自带一个零依赖 MCP 服务器 tools/zzz-od-mcp/zzz-od-mcp.mjs,把这个后端包装成 agent 可调用的工具(mcp__zzz-od__*,12 个:health/status/window/applications/operations/enter/run_one_dragon/run_app/wait/stop/close_game/server)。
automation/zzz-server.ps1(提权启动/停止后端)、技能说明 skills/zzz-od-control/SKILL.md 都在插件包里,不需要额外从别的仓库拉取。git clone(没有 git 就下 zip)+ uv sync + 写基础配置(config/01/game.yml、game_account.yml)。默认装到 D:\software\ZenlessZoneZero-OneDragon,不会装进系统盘;可用 DSH_GAME_DAILY_ZZZ_ROOT 指定别的位置(同样拒绝 C 盘)。首次安装要下几百 MB、耗时几分钟,按钮会一直显示「处理中…」。装完位置会记录到 <stateDir>/zzz-root.txt,后续体检与运行都以它为准。zzz_health → zzz_window →(窗口无效时 zzz_enter)→ zzz_run_one_dragon → 循环 zzz_wait → zzz_status;跑完插件自动关游戏、停后端。已知坑:游戏停在标题界面直接跑一条龙,第一个应用(邮件)会报「未能识别当前画面」,所以必须先 zzz_enter 进到「大世界-普通」。config/<实例>/one_dragon/charge_plan.yml 补成两条计划:①代理人计划(每次按 card_num 5 张卡结算 = 100 电量,plan_times 3 ≈ 300 电量,材料没满时把电量刷完)②紧跟着一条「区域巡防」(驱动盘本,plan_times 4 ≈ 240 电量)。驱动盘副本由 ~/.dsh/game-daily/zzz-fallback.json 的 missionTypeName 决定(node automation/zzz-fallback.mjs --list 查表、--mission <名字> 切换),其中 trainedCharacter 只用于汇报。于是材料一旦够了,剩下的电量会自然落在驱动盘上。
<stateDir>/zzz-fallback.json 里写 {"missionTypeName": "怪兽与怪客"}(默认值),或用 node automation/zzz-fallback.mjs --mission <副本名>;--list 可看 15 个副本与对应套装。node automation/zzz-fallback.mjs --dry-run;查看当前配置与文件位置:--config。missionTypeName 后残留的旧计划会被一条龙依次跑完,导致一天刷两个本、多耗电量);②默认把 restore_charge 改成「不使用」,不会再动用储蓄电量——电量不够时一条龙干净结束(需要时可改 zzz-fallback.json 的 restoreCharge)。
charge_plan.yml.bak-gd-disc-<时间戳>;一条龙每轮开跑前会重读配置,所以改完下一次运行即生效,不需要重启后端。设置页顶部有一条版本栏:打开面板时会自动去 GitHub 读最新的 package.json,和本地版本比对。
.git 的安装走 git pull --ff-only,没有 git 则下载 zip 覆盖,只覆盖插件文件,不动 node_modules 与用户数据)。x.y.z 与 x.y.z-pre(prerelease 视为更小);检查失败不弹错,只在版本栏提示「检查更新失败」。D:\software\BetterGI,可在面板里改)+ 随插件自带的 bettergi-control 技能与 bettergi-mcp(见上);BetterGI 没有 HTTP API,只能命令行/配置组驱动。game-daily 家族技能 + 提权助手(坐标点击被拦时按技能说明改用 computer-use)。%USERPROFILE%\Games\March7thAssistant,非默认目录时把路径写进 state 目录的 m7a-root.txt,或设 DSH_GAME_DAILY_M7A_ROOT)+ 插件自带的 tools/m7a-control 技能与 tools/m7a-mcp;M7A 负责全部画面识别与点击,Agent 只值守、异常介入和汇报。体检缺依赖时点「让 DSH 协助安装」由 Agent 下载、配置并引导用户本人确认免责声明;安装目录一定先问你,默认不装 C 盘(解压后约 1.5GB)。 体力用途固定为「培养目标」(角色突破/行迹材料、遗器与位面饰品):build_target_enable=true,instance_type 与 activity_gardenofplenty_instance_type 都是「拟造花萼(赤)」,不打拟造花萼(金)的信用点与角色经验;要改这个口径只能由用户明确要求。D:\software\ZenlessZoneZero-OneDragon,缺失可一键自动安装)+ 提权的一条龙后端;插件自带 MCP 与技能,游戏本体仍需自己安装。插件可以直接用 GitHub 源码安装;如果想出现在插件市场的下载排行里、并让 dsh plugin add dsh-game-daily 走 npm,可以发布到 npm:
.github/workflows/publish.yml —— 建 Release(Tag vX.Y.Z)自动发布;手动触发默认只做 dry-run。NPM_TOKEN —— 在 npmjs.com 建 Granular Access Token 时权限必须选 Read and write,不要选 Read and write (stage only)(stage-only 只能进暂存队列,npm publish 会报 E_STAGE_REQUIRED);Packages 选 All packages 并勾 Bypass 2FA。若改用 npm 的 Trusted Publishing(OIDC),可以不加 secret,工作流里的 id-token: write 会提供来源证明。npm version patch(或 minor / major)→ git push --follow-tags → 在 GitHub 用同一个 Tag 建 Release。node test/smoke.mjs 和 npm publish --dry-run,再 npm publish --provenance;prepublishOnly 也会跑一遍 smoke,坏包不会发出去。data/plugins/<owner>__<repo>.yml 的 PR 即可(本插件已据此提交)。node test/smoke.mjs # 纯 Node 冒烟(不触网、不弹 UAC)
node --check index.js # 语法自检
lib/ 全部是纯 Node 模块(无第三方依赖);client.js 是 Harness 的 lazy client 工厂(window.__ModuleLoader__.load),只注册 settings.section 一个 slot。
MIT © 2026 gychen-NJU