READMESource: main@581def59
dsh-session-time-absolute
把 DSH 侧边栏会话行的时间从相对时间(10分钟)换成绝对时间,来源和格式可配。
功能
总开关:设置页顶部的「启用绝对时间」。关掉后侧边栏立刻还原成宿主自己的相对时间(覆盖前记下了原文,逐格还原,不用刷新),本插件不再改任何行。
时间来源
- 最后活动时间:
ctx.sessions.list的updatedAt,就是宿主画「10分钟」用的同一字段 - 创建时间:host 半边扫描
<DSH_HOME>/sessions/<workspace>/session-<id>/的目录创建时间,经/api/session-time-absolute/created提供给页面
- 最后活动时间:
显示格式:占位符模板,默认
YYYY-MM-DD HH:mm占位符 含义 占位符 含义 YYYY四位年 YY两位年 MM两位月 M不补零月 DD两位日 D不补零日 HH两位时(24) H不补零时 mm两位分 m不补零分 ss两位秒 s不补零秒 字面文字原样保留,不做转义;因此
Date这类词里的大写D会被当作占位符。设置页:设置 → 会话时间,值保存在浏览器
localStorage(键dsh-session-time-absolute.settings.v1),结构{ enabled, source, format }。旧版存下的设置没有enabled字段时按「开」处理,无需迁移。
开销与生命周期
- 关掉开关后彻底退出:不挂
MutationObserver、不订阅ctx.sessions.list、不再扫描 DOM。关的那一刻先跑一趟还原,随即disconnect()+ 退订,之后这个插件对页面零开销。 - 变更过滤:观察器虽然挂在
document.body(subtree),但回调先判断这次变更是否落在data-row-key="session:<id>"的行内、或是否新插进来一条会话行;聊天流式输出、输入框、弹窗这些高频改动不会触发重绘。 - 每帧最多一趟:
requestAnimationFrame合并,一帧内的多次变更只跑一次扫描。 - 只遍历已渲染的行:一趟扫描是
querySelectorAll('[data-row-key^="session:"]'),即侧边栏当前真正画出来的会话行;不会遍历会话库、不读磁盘、不发请求。 - 唯一的宿主调用:只有来源选「创建时间」时才
fetch('/api/session-time-absolute/created')——那是宿主半边对<DSH_HOME>/sessions/**做一次stat扫描,结果缓存 20 秒,并发调用共享同一次扫描;选「最后活动时间」或关掉开关时完全不请求。 - 开关状态与格式只写浏览器
localStorage。 - 面向几千个会话:
- host 侧增量 stat——目录创建时间是不变量,见过的 id 永久缓存,之后扫描只对新目录做
stat,已删除的会话会被摘出字典(1800 个会话实测:首次 19ms,增量 3ms)。 - host 侧 ETag / 304——内容没变只回空响应,几千条字典不必每 30 秒重传一次。
- 新目录的
stat32 路并发,避免几千个 fd 排队;响应只发裸<id>,不再发session-<id>副本(体积减半)。 - client 侧一趟扫描一次
querySelectorAll、一次 store 快照;isTimeSlot走单条正则不 split;格式模板的正则提到模块级;写字优先改文本节点nodeValue而不是整段替换textContent(每 60 行约 40µs,行数线性)。
- host 侧增量 stat——目录创建时间是不变量,见过的 id 永久缓存,之后扫描只对新目录做
行为边界
- 只改带
data-row-key="session:<id>"的行内、class 以_time结尾的时间格;工作区行、hover 卡、搜索页不动。 - 该格
aria-hidden="true"时(宿主正在显示「待审批」等状态文案)不覆盖。 - 关开关时不靠「记下的原文」还原,而是按宿主自己的算法重算相对时间:
dsh-client-ui-primitives.relativeTime(updatedAt, now)的分桶(刚刚 / N分钟 / N小时 / N天 / N个月 / N年)+ workspace 词典的time.*文案,逐字与宿主一致,因此不会出现「关掉后还是绝对时间」的情况。 - 判定「这一格是不是我们写的」:优先看标记属性
data-dsh-sta-applied;没有标记(插件升级前旧版本覆盖过的行)就看文本是否正好等于按当前格式算出的绝对时间。两种情况都会还原;宿主自己画的格子不碰。 - 宿主 React 重渲染把文本改回相对时间时,观察器在下一帧改回。
- 创建时间模式下若某会话还不在缓存里,会节流补拉一次,期间该行暂时显示最后活动时间。
安装
三种方式,装完重启 DSH(或等主机的 client.js 轮询推送 rebuilt)生效。
1. 从 tarball 安装(分发用,推荐)
dsh plugin --profile desktop add "<插件目录>/dist/dsh-session-time-absolute-0.0.1.tgz"
tgz 里是完整包(package.json、cordis.patch.yml、lib/、README.md),可以在任何机器上装。依赖会记成 dsh-session-time-absolute 0.2.1。
2. 从源码目录安装(本机开发)
dsh plugin --profile desktop add file:<插件目录>/dsh-session-time-absolute
3. 从 zip 安装
把 dsh-session-time-absolute-0.0.1.zip 解压到任意目录,再按方式 2 用该目录安装。
file: 与 tarball 安装都是拷贝:改完源码要重新 remove + add(并升版本号)才会同步到 profile。
重新打包
cd <插件目录>/dsh-session-time-absolute
npm pack --pack-destination ../dist
卸载:
dsh plugin --profile desktop remove dsh-session-time-absolute
No comments yet. Be the first to write one.