dsh-session-deck
Codex 风格侧边栏:项目和对话共用的置顶区、置顶/项目/组件 三段可折叠分区、小铃铛活动视图(含最后一条回答的预览)、可为每个项目换 Emoji 图标。
Install
dsh plugin --profile web add dsh-session-deck
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
[English](README.md) | 简体中文
dsh-session-deck
管理你的整个工作区,而不只是某一条对话。 给 DeepSeek Harness 的 Codex 风格侧边栏:
把项目和对话一起收进一个置顶区、一键把侧边栏切成「最近使用」、给每个项目换自己的图标、
用不到的分区可以整块收起。

效果图
侧边栏 —— 置顶区、项目分区、组件分区 · 活动视图 —— 小铃铛
!带置顶区、项目分区与收起的组件分区的侧边栏 · !活动视图:最近使用的对话,带回答预览
(用插件自己的样式表 + 应用真实主题变量渲染,数据为示例数据 —— 图里没有你的真实会话名或路径。)
为什么做这个
DSH 的侧边栏是按项目组织的,只用一个项目时没问题,一旦同时做几件事就难受:
- 内置的 pin 只能把对话排到它自己的项目里——没有地方放「我现在真正在推的那几条」;
- 你最常用的项目停在它当初被创建的位置,而且每个项目都长一个样(同一个文件夹图标);
- 想找「昨天改的那个」只能一路滚树;
- 底部越堆越多的小组件,收不掉。
所以这个插件补了四件事:一个置顶区、一个最近视图、每个项目一个图标、可以收起的分区。
它给了什么
置顶区(置顶) · 把一条对话或整个项目收进所有项目之上的一个区。置顶的项目可以就地展开、列出它自己的对话——和下面的项目行一样,但不用滚下去找。点行即跳转,✕ 取消置顶,表头可折叠。
活动视图(🔔) · 工作区那排图标的最后一个:点开把侧边栏切成最近使用——按天分组(今天 / 昨天 / 星期X / 日期),每条两行(标题 + 项目,下面是最后一条回答的开头),运行中的会话带圆点;点一条只做导航,视图保持打开,可以连着挑好几条。
项目图标 · 把项目的文件夹图标换成任意 Emoji——侧边栏项目行和目录选择器都生效。Codex 风格的选择器:最近用过、分类标签、图标网格、还原默认。
一处改、处处同步 · 改对话名、跑完一轮、换项目图标——所有视图立刻跟上:置顶区和活动视图每一行都按实时数据解析,正在工作的对话显示框架自带的运行圆环。
可折叠分区 · 插件(顶部那排插件面板入口)、置顶、项目(内置的项目列表)、组件(侧边栏底部的小组件)都能从各自的表头收起 / 展开,并且记住状态。
侧边栏长什么样
┌ 工作区 🔍 ⌘ 📁+ 🔔 ← 铃铛打开活动视图 │ ▾ 置顶 3 ← 置顶区(对话 + 项目) │ ▸ 🎨 设计系统 项目 │ 📘 把缓存层从内存换成 SQLite 会话 │ 🌈 我没发现现在有什么这个左侧… 会话 │ ──────────────────────────────────── │ ▾ 项目 9 ← 内置项目列表,可折叠 │ 📁 pdf │ 🚀 前沿方向研究 │ 首页动效方案 3天 └ ⋯ 底部小组件 ⋯ ▸ 组件 ← 底部小组件,可折叠
怎么用
1. 置顶 —— 鼠标移到对话行,点动作条里的 ☆;或移到项目行,点铅笔左边的 ☆。置顶区会出现在最上面,
表头可以收起整块,✕ 取消单条。
2. 最近使用 —— 点工作区那排图标最后的小铃铛。挑一条对话,视图不会关,可以连着挑;
再点铃铛或右上角 ✕ 回到项目列表。
3. 项目图标 —— 鼠标移到项目行点铅笔(或直接在行上右键)打开选择器:点一个 Emoji、或用系统表情面板
(⌃⌘Space)粘贴、或「还原默认」;目录选择器里的文件夹行同样可用。
4. 折叠 —— 点任意分区表头(置顶 / 项目 / 组件),状态按 DSH home 记住。
安装
# 从 npm(也可以在 App 的「添加插件」对话框里直接填包名) dsh plugin --profile desktop add dsh-session-deck # 或直接从本仓库装(不走 npm) dsh plugin --profile desktop add github:Timebro9999/dsh-session-deck
装完重启桌面端(或刷新窗口)一次,之后随 profile 加载。
同样的写法也能填进 App 里的插件页面(它接受 GitHub 目标);加 #v0.1.1 可以锁定某个 release,而不是跟着
main 分支走:
dsh plugin --profile desktop add github:Timebro9999/dsh-session-deck#v0.1.1
插件市场里的收录来自索引
awesome-dsh-plugin(市场读它的 plugins.json)。
投稿只加一个文件:data/plugins/Timebro9999__dsh-session-deck.yml,本仓库放在 [marketplace/](marketplace),
提 PR 用 [scripts/open-marketplace-pr.sh](scripts/open-marketplace-pr.sh)。
宿主要求
DSH 宿主 · 0.2.0-rc.1(实测通过)或 0.1.7-rc.2;同一份 bundle 在桌面端与 Web 客户端都能跑
Profile · 任意 profile —— 示例里用的是 desktop
宿主 Node · ^22.19.0 或 >=24(即 DSH 自带的版本,插件不再额外要求)
运行时依赖 · 无 —— lib/client.js 是直接操作 DOM 的 CommonJS,原样加载,没有构建步骤
客户端服务 · 不强制(inject: [])。sessions / workspaces / uiWorkspace / locale 存在时就用,缺了也能画,只是数据少一些
浏览器 API · localStorage、MutationObserver、requestAnimationFrame、Intl.Segmenter
平台 · macOS / Windows / Linux —— 纯浏览器端,无原生代码
网络 · 运行时零联网(无遥测、无远端调用)
绑定什么 · 内置侧边栏的 DOM:[data-row-key^="workspace:"] / [data-row-key^="session:"] 行、分区标题、列表滚动容器、侧边栏底部。外壳改版可能移动这些锚点 —— 这是升级唯一可能弄坏的地方
存储 · 只用浏览器 localStorage(dsh-session-deck:v1、dsh-session-deck:previews:v3)
界面文案跟随 DSH 自己的语言(先读语言服务,再读界面实际渲染的文案,最后才是浏览器),所以它和 App 其余部分一样是中文或英文。
实现方式
插件不注册任何插槽、也不需要任何客户端服务(inject: [])。它是一个 DOM overlay:找到内置的行
([data-row-key^="workspace:"]、session:)、分区标题、列表滚动容器和侧边栏底部,
用行自带的按钮样式长出控件,并画出框架没有的状态。DOM 之外要的数据,按需从客户端服务读取
(ctx.get('sessions' | 'workspaces' | 'uiWorkspace' | 'locale'))。
它插入的每个节点都带 data-dsh-session-deck 标记,所以后一次挂载会回收前一个实例留下的节点——
框架重载 bundle 时不会卸载旧的客户端实例。这段探索的工作笔记(锚点、被镜像的内置 CSS、踩过的坑、
以及把页面状态编码进插槽 id 的远程探针)放在 [docs/implementation.md](docs/implementation.md)。
存储
都在浏览器 localStorage 里(按 DSH home 划分):
键 · 内容
dsh-session-deck:v1 · { emoji, recent, pinnedSessions, pinnedProjects, expandedProjects, pinnedCollapsed, workspaceCollapsed, widgetsCollapsed }
dsh-session-deck:previews:v3 · 每条对话的回答预览,按它的 updatedAt 做标记
项目图标故意存两份键——知道 workspaceId 的界面用 id 键,只知道文件夹名的界面用 name:<文件夹名>,
两者互相回退,任一处设置都会在所有界面生效。
开发
npm test # 148 + 7 条断言,零依赖
测试会把真实的 lib/client.js 装到「假的模块加载器 + 假的 DOM + 假的客户端上下文 + 假的会话记录」上,
然后逐个驱动每个界面:注册、图标绘制、各种触发器、选择器、置顶区、分区、活动视图(包括消息的哪一部分
会变成预览)、语言处理和卸载 / 重载安全。CI 在 Node 22 与 24 上跑。
卸载
dsh plugin --profile desktop remove dsh-session-deck
插件不写任何宿主状态:卸掉、重载,界面就回到原样。
许可
MIT
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::3,最后更新 2026-11-06