前言¶
在 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 给出的真机验证步骤:
- 打开 DSH 页面,确认用量栏出现「屏幕常亮」胶囊;控制台
__dshmKeepScreenOn()期望support: "ok"。 - 让 agent 跑超过 2 分钟的任务,或切到「强制常亮」,放置超过系统自动熄屏时间。
- 若屏幕一直亮,说明 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 目录页。