dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
会话行未读标记:会话菜单新增「标记未读」「取消标记」,在会话标题前钉一个刷新与点开都不会消失的红点(与系统绿点区分),绿点存在时两项禁用,标记经服务端持久化。
在 dsh Web 会话行的 "..." 菜单追加两项,用用户主动的红点钉住「还没处理完」的会话, 与系统绿点(跑完未点开)区分。需求对齐定稿:2026-09-12。
| 会话状态 | 圆点 | 标记未读 | 取消标记 |
|---|---|---|---|
| 绿点(系统「跑完未点开」) | 绿点 | 置灰 | 置灰 |
| 无标记 | — | 可点 | 置灰 |
| 红点(用户主动标记) | 红点 | 置灰 | 可点 |
#D64545),与系统绿点 slot 同位异色。aria-disabled + 原生 disabled。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 缺席)。fiberSessionIdOf)→ aria 标题匹配兜底。/dsh-unread-mark)+ ~/.dsh/dsh-unread-mark-state.json
(原子写:临时文件 + rename)。端点 list / set / clear。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。
dotCount=1,位于被标记会话行,background=rgb(214,69,69)、width=8px。~/.dsh/dsh-unread-mark-state.json 内容随 set/clear 实时更新;list 端点回读一致。completed=true 的会话):逻辑为 isGreen() 读
SessionSummary.completed(剔除运行中/待交互),与官方 tree.ts 的绿点条件一致;
遇到绿点会话时应表现「两项都置灰」。归档会话/分叉会话)与行结构(div[role=treeitem] + fiber
node.id);宿主升级改结构时 fail-soft 降级为「菜单项缺席 / 红点不渲染」,不抛错、不拖死宿主。~/.dsh)。