dsh-session-colorful-unread-pin-jobs
Verifieddsh-session-colorful-unread-pin-jobs · v1.0.0 · MIT · Web UI
会话标题按状态彩色标记:未读(运行中蓝 / 已完成绿)、置顶(黄)、有存活后台 shell 任务(紫),多状态按语义合成一条渐变;另含「模型更新」排序模式、Deep diving「距 agent 上次输出」第二列与未读会话设置分节。 Colors DSH sidebar session titles by state — unread (blue while running, green when finished), pinned (yellow), live background shell (pur
Install
dsh plugin add dsh-session-colorful-unread-pin-jobs Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Readme
dsh-session-colorful-unread-pin-jobs(会话未读彩色标记 · 置顶 · 后台任务)
中文 | English
用颜色一眼看清侧栏每个会话的状态。 会话标题按状态染色:未读(模型运行中=蓝,已跑完=绿)、置顶(黄)、有存活后台 shell 任务(紫);多种状态并存时按「置顶 → 后台 → 未读」的语义顺序合成一条渐变,从左到右完整呈现。颜色由当前主题的品牌色推导,自动适配明暗主题与黑白主题。
效果



以上为界面示意图(由
assets/mockups/generate.mjs生成,色值取自 DSH 主题 token),非真实截图,不含任何用户会话数据。
亮点
| 状态 | 颜色 | 触发条件 |
|---|---|---|
| 未读 · 运行中 | 品牌蓝渐变 | 模型在任何会话(含当前打开的)里产出内容,且该会话仍在运行 |
| 未读 · 已完成 | 绿渐变 | 上一条的前提消失(会话回到空闲)——任务做完了 |
| 置顶 | 黄渐变 | 会话行「…」菜单 →「置顶」;任何排序模式下都排在最前 |
| 后台任务 | 紫渐变 | 该会话当前有存活的 shell 类后台任务(run_in_background 的 bash 等) |
| 多状态并存 | 黄 → 紫 → 蓝/绿 | 按语义定序合成:置顶色恒在最左、后台色居中、未读色在最右 |
- 不需要盯着看:任务跑完的会话会在侧栏自己由蓝转绿,切换窗口时一眼扫到哪几个会话已经出结果。
- 不打扰、不丢状态:未读与置顶都由服务端持久化,刷新页面、重启进程都保留。
- 纯增量:不接管、不替换官方行为,只给会话行加类、给标题上色;卸载即净。
功能
- 自动未读——模型在**任何会话(含当前打开的)**里产出内容的那一刻(
assistant/chunk内容块 /assistant/message/tool/result白名单),该会话自动染上未读渐变色。颜色区分任务状态:仍在运行=品牌蓝,已跑完回到空闲=绿色(运行态读会话列表 store 的running标志,store 一变即重判)。当前打开会话同样会被标记——这就是「身处会话内也能看到蓝→绿完成信号」的来源。 - 切走清除 / 重点击清除——打开、停留、发送消息都不清除标记;把当前会话从 A 主动切到 B 时清除 A 的标记(本地立即摘除 + 服务端持久化)。身处当前会话时再点一次该会话行也会清除其标记(与原生「选中=消费完成通知」语义一致)。
- 标题状态染色(颜色合成器)——所有观感收敛到一条代码路径:行状态 → 锚点色序列 → 绘制。语义色序自左向右:置顶=黄(最左)→ 有后台 shell=紫(中间)→ 未读=蓝(运行中)/绿(完成,最右)。单独一种状态=整条该色系渐变(未读按主题品牌色推导同族双色;黑白主题自动退化;所有端色做背景对比度守卫);多状态并存按分段模板展开(每段纯色区 + 段间平滑过渡)。渐变由行内样式画在标题元素上,React 重渲染不会重写、无需补绘。渐变色标随实际文字宽自适应:短文字把色标按文字宽压成 px,长文字按容器宽百分比。
- 发送即清(可选,默认关)——设置里打开后,在被标记的会话里发送消息也自动摘除该标记。
- 手动标记——会话行「…」菜单「标记为未读 / 标记为已读」。
- 置顶——会话行「…」菜单「置顶 / 取消置顶」:置顶会话在任何排序模式下(手动拖拽 / 最近更新 / 模型更新)都排在最前;标题染黄色渐变,与未读、后台 shell 并存时按上表顺序合成。置顶状态服务端持久化,切走会话不清除,也不受「发送即清」影响。
- 后台 shell 指示——会话当前有存活的后台 shell 类任务(
bash/pwsh/pty/terminal等,子代理与工作流不算)时,标题加入紫色段;任务结束或取消后紫色自动消失(瞬态、不落盘)。数据源 = host 端后台任务注册表经session/jobs推送到浏览器的镜像,与官方「N 个后台任务运行中」计数同源;镜像缺失时安全降级为不显示。 - 设置分节——设置 →「会话未读」:列出全部未读会话(标题、运行中标记、会话 ID),「刷新」按钮手动更新,逐条「标记已读」,以及「发送即清」开关。
- 「模型更新」排序(第三排序模式)——按会话中模型白名单事件最后落地时间排序,手动拖拽序保留、模型一更新自动上浮。1 分钟容差:一个会话只有领先对方超过 60 秒才允许超越,60 秒内视为平局、保持当前相对顺序(稳定排序)——多会话并行输出时不再互相翻动;缺口首次跨过 1 分钟的那一拍恰好换位一次。官方「最近更新」模式不受影响。
- Deep diving 第二列——会话视图的运行计时器加第二列「距 agent 上次输出」(与「模型更新」同源,1 秒轮询)。
- 纯增量、不触碰核心——会话行原生的绿色完成提示点(运行→空闲上膛、点开会话清除、运行时隐藏)行为完整保留;本插件只加行状态类与标题样式。
安装
dsh plugin --profile web add dsh-session-colorful-unread-pin-jobs@latest
从 GitHub 安装(等价):
dsh plugin --profile web add github:enterhalf/dsh-session-colorful-unread-pin-jobs
卸载:
dsh plugin --profile web remove dsh-session-colorful-unread-pin-jobs
卸载时 bundle 转换、路由、定时器、事件订阅全部还原;未读清单、置顶集与设置保留在 ~/.dsh/storages/dsh-session-colorful-unread-pin-jobs/,重新安装后自动恢复。
原理
- 未读数据平面(服务端持久化)——host 订阅
session/event,白名单事件落地时把非子代理会话(含当前打开)标记未读(幂等,无变化不写盘)。存储为~/.dsh/storages/dsh-session-colorful-unread-pin-jobs/unread.json(原子写、最多 2000 条 FIFO 淘汰,含clearOnSend设置与置顶集topIds)。客户端每 2 秒轮询GET /session-colorful-unread-pin-jobs/list对账(host 为权威),并每轮重报POST /session-colorful-unread-pin-jobs/active(仅跟踪当前打开会话)。 - API 平面(挂在 webServer 路由表)——
GET /session-colorful-unread-pin-jobs/list→{ ok, ids, topIds }POST /session-colorful-unread-pin-jobs/toggle{ id, unread }→{ ok, ids, topIds }POST /session-colorful-unread-pin-jobs/top{ id, top }→{ ok, ids, topIds }GET/POST /session-colorful-unread-pin-jobs/settings→{ ok, clearOnSend }POST /session-colorful-unread-pin-jobs/active{ id: string|null }→{ ok, ids }GET /session-colorful-unread-pin-jobs/timestamps→{ ok, ts: { sessionId: epochMs } }(排序时间戳快照,纯内存)
- UI 经 bundle 转换注入——对侧栏 bundle(
@deepseek-ai/dsh-client-ui-workspace)与会话视图 bundle(新版@deepseek-ai/dsh-client-ui-chat,旧版-conversation自动识别)做锚点字符串替换:注入行属性、菜单条目、排序模式与时间戳轮询等。任一锚点缺失(上游改版)或替换后语法自检失败时保留原始 bundle,页面不受影响;部分段失配按段降级。转换链与兄弟插件(如 dsh-notify)共用同一入口,互不排斥。 - 兼容两代投递架构——旧版按文件 URL 下发时走 HTTP 路由按 mtime+指纹缓存;新版
dsh-client-modules走内容寻址 combo URL,此时唯一通道是把转换结果原子写回盘上client.js再clientModules.rebuilt(id)重新哈希。写入前把原字节存 sidecar,插件卸载时还原。 - 标题状态染色——客户端维护三个状态源:未读集(host 权威、轮询对账)、置顶集(同源)、存活 shell 集(列表 store 的 jobs 镜像)。调色板按 body 主题属性 + 品牌色 alias 推导并做对比度守卫,主题切换自动重绘。
- 置顶排序分区——排序函数在算出顺序后、判定变化前把置顶集分区到最前(组内保序,全排序模式生效)。
限制
- 菜单条目、排序 UI 与行属性依赖当前版本 bundle 的锚点字符串;DSH 大版本升级后需重新校验锚点(
npm run check-anchors)。锚点失效时对应功能消失,页面不受影响。 - 新版 combo 架构下转换结果会写回盘上 bundle:正常装卸自动还原;若宿主进程在卸载前崩溃,盘上文件会残留已转换内容(功能无害,下次加载按幂等标记视为已转换),可凭
~/.dsh/storages/dsh-session-colorful-unread-pin-jobs/bundle-*.client.js.orig手动恢复。 - 染色绘制依赖会话行内标题元素的哈希类名与注入的行属性;升级后类名变化时染色不生效,页面与菜单不受影响。
- 后台 shell 指示依赖 host 端
session/jobs推送镜像;无该镜像的运行时自动不显示,其余功能不受影响。 - 主题自适应依赖主题系统把主题写到 body 主题属性、并以 alias 变量提供品牌色;第三方主题若不经过该机制改色,染色不会跟随。
- 「当前打开」以最后上报的客户端为准:多标签页同时打开不同会话时,只有最后上报者不被自动标记。
- 排序时间戳纯内存(重启清零);未读与置顶持久化。
- 自动未读的判定粒度是「模型白名单事件」:
llm/retry等不产生内容的异常事件不计。
开发
npm run build # 校验并产出 lib/index.js
npm run build:client # 校验并产出 lib/client.js
npm run check-anchors # 离线校验两个 bundle 的全部锚点(含顺序依赖模拟 + 语法自检)
dsh plugin --profile web add /path/to/dsh-session-colorful-unread-pin-jobs
许可
MIT