dsh-codex-sidebar
DSH(DeepSeek Harness)左侧栏的「消息视图」插件:把侧栏里的全部会话按 优先级 / 昨天 / 星期X / 更早 重新分段排列,工作区行收起来,顶行留下一颗铃铛负责切换。
拿到的是一个独立插件,不依赖任何主题或皮肤插件。本机的 dsh-claude-style 已经去掉日期分组与顶行铃铛 (见「与 dsh-claude-style 的共存」),所以装了主题也由本插件独占列表。

功能
- 按日期分段:把宿主切到扁平分组,按更新时间把会话排进段落,段落之间插标题(今天这一段叫「优先级」)。
- 优先级段落:正在运行的会话强制排进最前一段并置顶,今天的会话跟在后面 —— 正在看的会话不会被埋进「更早」。
- 两行式会话行:每行显示标题 + 一条该会话最新消息的预览(见 src/date-view.js 的 renderPreview)。 悬停时标题横滚、预览保持不变。
- 工作区标签:扁平后没有分组标题了,每行右侧补一个工作区名标签交代归属;未分组会话标「未分组」。
- 覆盖全部会话:所有工作区与未分组会话都进来,不再有「屏蔽工作区」。
- 铃铛开关:工作区行右侧一颗铃铛切换消息视图;开着时常亮,有会话在跑时点一个小绿点(不写数字)。
- 默认不接管:装好后侧栏仍是宿主原本的工作区视图,只有按下铃铛才切到消息视图;选择写进本地存储,下次启动沿用。
- 随界面语言:段落标题跟随宿主语言(中文 / 英文),宿主语言晚就绪或中途切换都会跟上。
安装
需要 DSH ≥ 0.2.0,并把 pnpm 放进 PATH(桌面 App 的运行时自带一份,见本节末尾)。
dsh plugin --profile <profile> add github:mengzhongjie/dsh-codex-sidebar
dsh plugin 装完依赖后会自动把包装进 profile 的 dsh.profile.bundles;插件自带的
cordis.patch.yml 随 bundle 一起生效,不用手工改配置。装完重启宿主;桌面 App 的关窗
不会退进程,要 Cmd+Q 退出后重开。桌面 App 自己管理的 profile(desktop)也走同一条命令。
在仓库里改代码、要装本地目录时:
node scripts/install.mjs --profile codexprobe # 装
node scripts/install.mjs --profile codexprobe --uninstall # 卸
脚本把 link:<本目录> 写进 profile 的 dependencies、把包名加进 dsh.profile.bundles,
并在 node_modules 下建符号链接;同样重启宿主生效。
桌面 App 的 pnpm 在 ~/.dsh/dsh-runtimes/dsh-primary-runtime/dependencies/pnpm/bin/pnpm.cjs,
包一层脚本放进 PATH 即可:
#!/bin/sh
exec node ~/.dsh/dsh-runtimes/dsh-primary-runtime/dependencies/pnpm/bin/pnpm.cjs "$@"
与 dsh-claude-style 的共存
dsh-claude-style 原本也内置一份「铃铛 + 日期分组」。主题仓库 dsh-claude-style(本地克隆) 已把日期分组特性与顶行铃铛整份删掉,只保留自定义缩放,规则因此变成:
| 事项 | 行为 |
|---|---|
| 列表 | 由本插件独占:主题看到 body[data-codex-sidebar-date-view] 就不再把它改回工作区分组(workspace-view 的 reconcile 与 healGrouping、active-first 的 reorder 三处都让位) |
| 铃铛 | 只有本插件这一颗;主题的旧铃铛已不存在 |
| 按下态 | 读本插件自己的状态(bellPressed) |
| 让位条件 | 只有主题仍然自带日期视图时才让位:body 上有 data-dsh-claude-date-groups,或页面上还找得到主题铃铛(src/coexist.js 的 themeHasDateView())。主题删掉日期视图后本插件照常接管 |
持久化
只用 localStorage 一个键(dsh-codex-sidebar.settings):
| 键 | 类型 | 默认 | 作用 |
|---|---|---|---|
| dateViewEnabled | boolean | false | 是否处在消息视图;按铃铛会改写它 |
进入消息视图时会把宿主的原分组方式备份到 dsh-codex-sidebar.group-before-date-view。 上次异常退出留下扁平状态的话,下次启动会自动还原(只在备份还在、且当前确实仍是 flat 时才动手)。
开发
node scripts/build.mjs # 构建 lib/client.js(esbuild;react 走宿主工厂的 require,列为 external)
node scripts/build.mjs --watch
| 文件 | 职责 |
|---|---|
| src/entry.js | 组装、MutationObserver 调度、solo/dormant 判定与让位、启动自愈、卸载还原 |
| src/date-view.js | 消息视图核心:分桶、排序、插标题、工作区标签、两行式预览、退出还原 |
| src/topbar.js | 工作区行右侧的铃铛(插进宿主的 headerActions 里,避开宿主图标) |
| src/sidebar-dom.js | 侧栏 DOM 定位:工作区行 / 扁平列表容器 / 座位 span / 会话 id |
| src/view-store.js | 宿主视图 store 的读写(setGroupBy)、原分组备份与恢复 |
| src/host-data.js | 读宿主 sessions / workspaces 服务快照(运行中、更新时间、标题、工作区名) |
| src/settings.js | localStorage 读写与订阅 |
| src/locale.js | 中英文案与语言解析(订阅宿主 locale 服务) |
| src/coexist.js | 主题检测、主题日期铃铛定位、themeHasDateView()(主题是否仍自带日期视图) |
| src/styles.js | 注入的全部样式(全部走宿主 token,浅色/深色自适应) |
| src/constants.js | 常量:属性名、类名、存储键、默认设置 |
验证
用 Playwright 直连一个测试 profile 的页面,探针脚本按真实 DOM 断言:
dsh --profile codexprobe --port 49800 --no-open > .debug/probe-web.log 2>&1 &
URL=$(grep -o 'http://127.0.0.1:49800/?token=[^ ]*' .debug/probe-web.log | tail -1)
env -u all_proxy -u ALL_PROXY -u http_proxy -u HTTP_PROXY -u https_proxy -u HTTPS_PROXY \
PLAYWRIGHT_BROWSERS_PATH=$PWD/.playwright-browsers \
node .debug/probe-solo.mjs "$URL"
现成的探针在 .debug/(开发期脚本,不随版本库分发):probe-solo.mjs(无主题:铃铛进出消息视图、段落标题、预览)、 probe-two-envs.mjs(两个隔离 profile 对照:无主题 / 带主题)、probe-height.mjs 与 probe-overlap.mjs(行高与叠字几何)。
已知限制
- 结果依赖宿主私有 DOM 契约(data-row-key、座位 span、flatList 容器),宿主大改版可能失效; 选择器集中在 src/constants.js 与 src/sidebar-dom.js,方便一处改完。
- 桌面 App 没有窗口级缩放的对外通道,页面缩放只能走 CSS;本插件已不提供缩放(那是主题的能力)。
- 若把主题还原成带日期视图的版本,本插件会重新让位:那时列表由主题的日期视图负责。
更新记录
2026-11-03 提交插件市场:向 awesome-dsh-plugin 提了 PR #11641,条目是
data/plugins/mengzhongjie__dsh-codex-sidebar.yml(category: ui,带 180px 图标);仓库同时补了assets/icon-180.png(由 assets/icon.svg 渲染)与screenshots.json(1 张截图,供市场详情页展示)。2026-11-03 0.3.1 收录前整理:仓库转为公开、补 MIT 许可;安装说明改成
dsh plugin --profile <profile> add github:mengzhongjie/dsh-codex-sidebar(装完自动登记 bundle),scripts/install.mjs只负责本地目录安装,并顺手清掉旧版写在cordis.patch.yml里的重复 insert; README 截图换成示例文案,不再出现真实会话名与账号名。2026-11-02 19:00 主题让位、本插件接管:本机主题仓库删掉日期分组特性、设置页「日期布局」与顶行铃铛; 主题侧补三处让位守卫(reconcile / healGrouping / active-first reorder),本插件把
data-codex-sidebar-date-view标记提到扁平化之前写,避免主题把扁平分组改回去。桌面 profile 换上本地构建的主题、装上本插件后, 无主题与带主题两个隔离环境都量到 6 段标题 / 46 行 / 0 重叠,桌面镜像(desktopprobe)同样是 46 个座位。2026-11-02 预览与滑动:预览文本先过
src/preview-text.js去 markdown 记号(粗体/行内代码/标题/列表/链接/表格), 标题悬停滑动改成「滑一次停在尾巴上」,两端用遮罩淡出,不再来回摆也不再硬切。2026-11-02 插件图标:
package.json加"icon": "./assets/icon.svg",图标是渐变圆角方块上的三条消息条 + 右上角铃铛。2026-11-02 20:05 版本 0.2.0:整页缩放整份移除(
src/zoom.js、src/portal-fit.js与宿主半边的缩放路由一起删掉), 设置里只剩一个开关;lib/index.js收成空壳,只为让 bundle patch 的条目仍能加载。2026-11-02 消息视图改造:取消设置页与齿轮、取消缩放与「屏蔽工作区」;消息视图对全部工作区与未分组会话开放; 会话行改两行式(标题 + 最新消息预览);首段改名「优先级」。
2026-11-02 与主题共存:有主题时让位(不动列表),铃铛转给主题的日期视图;无主题时切本插件的消息视图。
2026-11-02 17:58 回滚:桌面 App 在运行中替换 bundle 连续崩溃两次,代码回滚到 5788b88; 「铃铛始终切本插件的视图 + 借主题标记」与「主题下会话行叠字修复」两笔改动随之中止,崩溃日志与教训见
交接-dsh-codex-sidebar.md。2026-11-02 20:20 bugfix:清掉设置页时代遗留的死样式/死文案/skipWorkspaces; 预览中段的
##、表格分隔行、>记号不再漏出(宿主投影是单行 120 字符,行首规则够不到); 没装 superagent 的宿主里不再有 20 行会话悬在第一个日期标题前面(跳过条件加上「确实装了」的判据)。2026-11-02 悬停抖动修复:标题节点复用 + 只比较自有节点顺序 + 忽略自有变更的 MutationObserver, 抖动前约 1500 次/秒的 DOM 变动降到 0(有主题环境 1 次)。
许可
MIT,见 LICENSE。
No comments yet. Be the first to write one.