dshm-keep-screen-on:Agent 跑任务时让 DSHM 屏幕保持常亮

前言

在 HarmonyOS 上用 DSHM 跑 agent 或后台任务时,系统仍会在超时后自动熄屏。长任务需要盯着进度或随时介入,反复解锁既打断节奏,也容易错过中间状态。改 ArkTS、动客户端成本高;若 WebView 支持标准 Screen Wake Lock,可以在页面侧用插件把「有任务在跑就常亮」做成可配置行为。下面介绍社区插件 dshm-keep-screen-on(维护者 yinghan-123,分类:客户端):在 agent / 后台任务活跃时,由 ArkWeb 页面持有 navigator.wakeLock.request("screen"),减少系统自动熄屏;任务结束后带宽限期释放,也可在用量栏手动选模式。

这是什么

dshm-keep-screen-on 是 DSHM 端的「屏幕常亮桥」:Host 侧检测 agent 与后台任务是否仍在运行,页面侧按模式申请或释放 Wake Lock。README 写明这是纯插件方案——不碰 ArkTS、不改客户端,依赖页面标准 API;已在真机验证 ArkWeb 对该 API 支持为 support=ok 且申请成功。

插件与 dshm-keepalive 分工不同:本插件只处理屏幕自动熄灭,不处理后台冻结。

默认行为

Host 根据活动状态决定是否应常亮;页面在 auto 模式下跟随该结论申请锁。

条件 页面行为
存在 status === "running" 的 agent(主 agent / subagent / workflow 子代理) 持有 Wake Lock
存在 running / stopping 的后台任务(如 run_in_background、后台 subagent) 同上
最后一个任务结束 再保持 graceMs(默认 60s)后释放
页面切到后台 浏览器自动释放,回前台重新申请
页面关闭或 DSHM 退出 随页面消失,无系统级残留

模式可在 always(强制常亮)、auto(默认)、off(本插件不申请)之间切换。

用量栏与交互

安装后,DSH 输入框下方用量胶囊区域(conversation.composer.dock)会多一个「屏幕常亮」图标按钮,与同排用量项同款。

点图标弹出菜单:

菜单项 含义
强制常亮 mode 为 always:无论是否有任务,一直常亮
任务时自动 mode 为 auto(默认):有 agent/后台任务在跑才常亮,全部结束后宽限 60s 释放
关闭 mode 为 off:本插件不申请常亮

当前模式打勾;菜单顶部显示实时状态(如 强制中、任务中 · 常亮、已关闭、支持但未生效、未就绪)。v0.2.1 起改为「图标 + 菜单」,因窄屏下胶囊文字易被 flex 压掉,状态与选项集中在菜单内;胶囊保留图标、状态色与右上角状态点。

页面与 Host 通过 8s 轮询同步状态;点击模式后进入 8s 保护窗,避免旧轮询结果覆盖用户选择。诊断可在控制台执行 __dshmKeepScreenOn(),返回 mode、active、snapshotAgeMs、pendingMode、pollErrors 等。

安装与启用

DSHM 端侧安装(README 给出的命令,由 Host 假壳接住):

pnpm add github.com/yinghan-123/dshm-keep-screen-on

也可在 设置 → 插件 → 安装插件 输入框填写同样的 github.com/yinghan-123/dshm-keep-screen-on。

装完后需 划掉后台并重开 DSHM(客户端 bundle 仅在启动时扫描插件)。卸载:设置 → 插件 → 卸载 dshm-keep-screen-on,再重开。

当前 package.json 版本为 0.2.1,许可证 MIT,要求 Node >=20。

典型用法

用量栏

日常在输入框下方点「屏幕常亮」图标,按场景选「任务时自动」「强制常亮」或「关闭」即可。

页面控制台

__dshmKeepScreenOn()                  // 查看支持与当前状态
__dshmKeepScreenOn.mode('always')     // 强制常亮
__dshmKeepScreenOn.mode('auto')       // 任务时自动
__dshmKeepScreenOn.mode('off')        // 关闭本插件

HTTP(同源)

fetch('/dshm-keep-screen-on', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({ action: 'set', mode: 'always' })
}).then(r => r.json()).then(console.log)

GET /dshm-keep-screen-on 返回 mode、graceMs、runningAgents、liveJobs 以及页面最近一次上报的 client.support / client.state 等。POST 还支持 action: 'report'、enabled、graceMs 调整、ping 探活。Origin 与 Host 不一致时返回 403。

Host 日志目录:$DSH_HOME/screen-on/screen-on.log,含页面上报与常亮开关记录。

验证与边界

README 给出的真机验证步骤:

  1. 打开 DSH 页面,确认用量栏出现「屏幕常亮」胶囊;控制台 __dshmKeepScreenOn() 期望 support: "ok"。
  2. 让 agent 跑超过 2 分钟的任务,或切到「强制常亮」,放置超过系统自动熄屏时间。
  3. 若屏幕一直亮,说明 Wake Lock 方案成立;若状态为 held 但屏幕仍熄灭,可能是 ArkWeb 未把锁落到系统层,README 提到可再走方案 B(ArkTS 桥 window.setWindowKeepScreenOn),本插件 Host 侧已具备活动判定与宽限期逻辑。

适用注意:

  • 插件在 当前 DSH 进程权限 下运行;安装前请自行查看 GitHub 源码 与 MIT 许可证。
  • 页面在后台时锁会被浏览器释放,保的是 前台看着页面 的场景。
  • 不修改 DSH 核心行为,也不写系统设置。

DSH 生态强调「一切皆插件」;社区目录 SkillHub 插件页 为独立站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dshm-keep-screen-on 把「有 agent / 后台任务时常亮、结束带宽限期释放」接到 DSHM 用量栏与标准 Wake Lock 上,适合在 HarmonyOS 移动端长时间盯任务、又不想改客户端的同学。详情与更新见 GitHub 仓库 与 SkillHub 目录页。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜