会话行未读标记:会话菜单新增「标记未读」「取消标记」,在会话标题前钉一个刷新与点开都不会消失的红点(与系统绿点区分),绿点存在时两项禁用,标记经服务端持久化。
安装
# Release 预构建包
dsh plugin --profile web add "https://github.com/yangyizhu8/dsh-unread-mark/releases/download/v0.1.0/dsh-unread-mark-0.1.0.tgz"
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:yangyizhu8/dsh-unread-mark
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
在 dsh Web 会话行的 "..." 菜单追加两项,用用户主动的红点钉住「还没处理完」的会话, 与系统绿点(跑完未点开)区分。需求对齐定稿:2026-09-12。
功能
| 会话状态 | 圆点 | 标记未读 | 取消标记 |
|---|---|---|---|
| 绿点(系统「跑完未点开」) | 绿点 | 置灰 | 置灰 |
| 无标记 | — | 可点 | 置灰 |
| 红点(用户主动标记) | 红点 | 置灰 | 可点 |
- 红点语义:会话标题前 8px 红色圆点(
#D64545),与系统绿点 slot 同位异色。 - 红点不随刷新/点开消失——这是它与绿点的本质区别:只有手动「取消标记」才消失。
- 绿点存在时两项都禁用(用户明确要求);置灰为菜单项半透明 +
aria-disabled+ 原生disabled。
原理(合同依据,dsh 0.1.1-rc.2 实证)
- 绿点判定:
SessionSummary.completed === true且非运行中、无待交互 (ui-workspace/tree.ts:30注释原文:"Finished running while not selected and not yet opened (the green 'done' reminder dot)")。从ctx.sessions.list.getSnapshot().byId[id]读取,无需 DOM 探测。 - 菜单注入:轮询
[role=menu]+ 语义锚(归档会话/分叉会话)→ 克隆末项 wrapper 追加两项 (沿用dsh-session-handoff的 MenuInjector 模式;锚点不匹配即 fail-soft 缺席)。 - 会话身份:React fiber 精确路径(
fiberSessionIdOf)→ aria 标题匹配兜底。 - 持久化:host 半 loopback RPC(channel
/dsh-unread-mark)+~/.dsh/dsh-unread-mark-state.json(原子写:临时文件 + rename)。端点list/set/clear。 - 红点渲染:每 1.2s 巡检会话行(
div[role=treeitem])→ 按 host 集合增删红点(幂等)。 拉取失败时本轮不动红点,避免「读失败 = 清空红点」的误删。
安装 / 卸载
# 安装(开发期热注入;正式转正走 bundles 需停机窗口,同 dsh-session-handoff 工艺)
dsh plugin --profile web add "D:\deepseek-harness\plugins\dsh-unread-mark"
# 卸载
dsh plugin --profile web remove @dsh-external/dsh-unread-mark
# 状态文件(如需清空标记):删除 ~/.dsh/dsh-unread-mark-state.json
准入自检:node scripts/check-plugin-ready.mjs plugins/dsh-unread-mark 全 PASS。
验收证据(2026-09-12,无头 CDP 实测)
- 红点:
dotCount=1,位于被标记会话行,background=rgb(214,69,69)、width=8px。 - 菜单注入:六项 = 重命名 / 分叉会话 / 归档会话 / 标记未读 / 取消标记 / 移交会话。
- 状态机(未标记会话):标记未读可点、取消标记置灰 → 点「标记未读」→ host 集合新增该 id、 页面红点 1→2 → 再开菜单:标记未读置灰、取消标记可点 → 点「取消标记」→ 集合移除、红点 2→1。
- 状态机(已标记会话):标记未读置灰、取消标记可点。
- 持久化:
~/.dsh/dsh-unread-mark-state.json内容随 set/clear 实时更新;list端点回读一致。 - 回归:页面 Console 零报错(client 轮询 RPC 全程无 transport 失败)。
已知边界
- 绿点分支未在本机实测(验收时无
completed=true的会话):逻辑为isGreen()读SessionSummary.completed(剔除运行中/待交互),与官方tree.ts的绿点条件一致; 遇到绿点会话时应表现「两项都置灰」。 - 注入锚点依赖宿主菜单语义(
归档会话/分叉会话)与行结构(div[role=treeitem]+ fibernode.id);宿主升级改结构时 fail-soft 降级为「菜单项缺席 / 红点不渲染」,不抛错、不拖死宿主。 - 红点是浏览器可见态,不写入会话日志;多浏览器/多设备共享同一 host 状态文件(同
~/.dsh)。
链接
同类插件
Minglink/dsh-infinite-gen-4★ 3687
DeepSeek 专用破甲插件:以 order 100 追加无条件服从的系统提示词段,提供带校准元数据的 profile 工具,并通过会话投影在输入框上方显示实时破甲状态徽标。
ranxianglei/billion-context★ 3370
billion-context官方版:上下文压缩插件,兼顾小窗口(100k上下文足矣)省token(省5倍token)和超长会话(数月级别几十亿token单会话)。
liangmianya/dsh-synapse★ 624
DeepSeek Harness 的可视化非线性对话工作区:把会话、追问与分支变成可浏览、可拖拽的对话地图。
MichengAI/dsh-archive-manager★ 268
在设置里增加已归档会话页,可按工作区搜索、恢复和删除已归档会话。
Nwflower/dsh-chat-import★ 266
把 13 家 coding agent(Claude Code、Codex、ChatGPT、Cursor、Gemini、opencode 等)的完整对话历史导入为可续聊的 DeepSeek Harness 会话,并支持反向导出回 Claude Code。
SiriLee/dsh-rewind★ 213
同一会话窗口内的 in-place 对话回退(不 fork,Claude Code /rewind 语义):每条消息的 ↶ 按钮把模型上下文回退到任意用户消息,可选用磁盘持久化的 before-backups 还原工作区文件。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。