Skip to content

dsh-session-colorful-unread-pin-jobs

Verified

dsh-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 等)
多状态并存 黄 → 紫 → 蓝/绿 按语义定序合成:置顶色恒在最左、后台色居中、未读色在最右
  • 不需要盯着看:任务跑完的会话会在侧栏自己由蓝转绿,切换窗口时一眼扫到哪几个会话已经出结果。
  • 不打扰、不丢状态:未读与置顶都由服务端持久化,刷新页面、重启进程都保留。
  • 纯增量:不接管、不替换官方行为,只给会话行加类、给标题上色;卸载即净。

功能

  1. 自动未读——模型在**任何会话(含当前打开的)**里产出内容的那一刻(assistant/chunk 内容块 / assistant/message / tool/result 白名单),该会话自动染上未读渐变色。颜色区分任务状态:仍在运行=品牌蓝,已跑完回到空闲=绿色(运行态读会话列表 store 的 running 标志,store 一变即重判)。当前打开会话同样会被标记——这就是「身处会话内也能看到蓝→绿完成信号」的来源。
  2. 切走清除 / 重点击清除——打开、停留、发送消息都不清除标记;把当前会话从 A 主动切到 B 时清除 A 的标记(本地立即摘除 + 服务端持久化)。身处当前会话时再点一次该会话行也会清除其标记(与原生「选中=消费完成通知」语义一致)。
  3. 标题状态染色(颜色合成器)——所有观感收敛到一条代码路径:行状态 → 锚点色序列 → 绘制。语义色序自左向右:置顶=黄(最左)→ 有后台 shell=紫(中间)→ 未读=蓝(运行中)/绿(完成,最右)。单独一种状态=整条该色系渐变(未读按主题品牌色推导同族双色;黑白主题自动退化;所有端色做背景对比度守卫);多状态并存按分段模板展开(每段纯色区 + 段间平滑过渡)。渐变由行内样式画在标题元素上,React 重渲染不会重写、无需补绘。渐变色标随实际文字宽自适应:短文字把色标按文字宽压成 px,长文字按容器宽百分比。
  4. 发送即清(可选,默认关)——设置里打开后,在被标记的会话里发送消息也自动摘除该标记。
  5. 手动标记——会话行「…」菜单「标记为未读 / 标记为已读」。
  6. 置顶——会话行「…」菜单「置顶 / 取消置顶」:置顶会话在任何排序模式下(手动拖拽 / 最近更新 / 模型更新)都排在最前;标题染黄色渐变,与未读、后台 shell 并存时按上表顺序合成。置顶状态服务端持久化,切走会话不清除,也不受「发送即清」影响。
  7. 后台 shell 指示——会话当前有存活的后台 shell 类任务(bash/pwsh/pty/terminal 等,子代理与工作流不算)时,标题加入紫色段;任务结束或取消后紫色自动消失(瞬态、不落盘)。数据源 = host 端后台任务注册表经 session/jobs 推送到浏览器的镜像,与官方「N 个后台任务运行中」计数同源;镜像缺失时安全降级为不显示。
  8. 设置分节——设置 →「会话未读」:列出全部未读会话(标题、运行中标记、会话 ID),「刷新」按钮手动更新,逐条「标记已读」,以及「发送即清」开关。
  9. 「模型更新」排序(第三排序模式)——按会话中模型白名单事件最后落地时间排序,手动拖拽序保留、模型一更新自动上浮。1 分钟容差:一个会话只有领先对方超过 60 秒才允许超越,60 秒内视为平局、保持当前相对顺序(稳定排序)——多会话并行输出时不再互相翻动;缺口首次跨过 1 分钟的那一拍恰好换位一次。官方「最近更新」模式不受影响。
  10. Deep diving 第二列——会话视图的运行计时器加第二列「距 agent 上次输出」(与「模型更新」同源,1 秒轮询)。
  11. 纯增量、不触碰核心——会话行原生的绿色完成提示点(运行→空闲上膛、点开会话清除、运行时隐藏)行为完整保留;本插件只加行状态类与标题样式。

安装

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.jsclientModules.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