🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

会话菜单增强 Silentforfar/dsh-session-menu

DeepSeek Harness
Silentforfar13 天前有提交已提供中文文档扫描:含敏感能力

为会话右键菜单加上导出、定位目录、标记未读与永久删除

29.7/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/24 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Silentforfar/dsh-session-menu
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · other
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 13 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 6 处,展示前 6 条)
  • 发起网络请求
    client.js:213
    const probe = await fetch(route, { method: 'HEAD' })
  • 读取本地文件
    purge.js:37
    return (await stat(target)).isDirectory()
  • 读取本地文件
    purge.js:54
    entries = await stat(sessionRoot)
  • 写入本地文件
    purge.js:93
    await mkdir(trashRoot, { recursive: true })
  • 写入本地文件
    purge.js:94
    await rename(sessionDir, destination)
  • 写入本地文件
    purge.js:99
    await rename(cacheFile, `${destination}.projcache.json`)
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 插件包:会话右键菜单扩展——导出日志、打开工作区文件夹、标记未读、永久删除。

README

由 DeepSeek 最新模型翻译生成
会话菜单增强(Session menu extras) Session menu extras — 给 DSH 会话的上下文菜单加上导出记录、打开工作目录、标记为未读、永久删除,并在行上显示未读小圆点。 一个 DSH 插件包(DeepSeek Harness 插件)。 从 DSH 插件市场安装 1. 打开 DSH Web 侧栏的 Plugins,在 Experimental plugins 旁边选 More,打开 Custom plugin markets。 2. 打开 Discover 标签页,添加这个索引源: https://silentforfar.github.io/dsh-market-index/index.json 3. 在列表里找到 Session menu extras(@silentforfar/dsh-session-menu),点安装。 直接从本仓库安装 把下面这行 spec 传给 plugin_manager 的 install_bundle(或你的配置档里对应的安装方式): git+https://github.com/Silentforfar/dsh-session-menu.git#<commit-sha> 用本仓库历史里完整的 40 位 commit SHA,这样安装会被钉住,可复现。 环境要求。
展开完整文档(README 剩余 1 节)
会话菜单增强(Session menu extras)

Session menu extras — 给 DSH 会话的上下文菜单加上导出记录、打开工作目录、标记为未读、永久删除,并在行上显示未读小圆点。

一个 DSH 插件包(DeepSeek Harness 插件)。

从 DSH 插件市场安装

1. 打开 DSH Web 侧栏的 Plugins,在 Experimental plugins 旁边选 More,打开 Custom plugin markets。
2. 打开 Discover 标签页,添加这个索引源:

https://silentforfar.github.io/dsh-market-index/index.json

3. 在列表里找到 Session menu extras(@silentforfar/dsh-session-menu),点安装。

直接从本仓库安装

把下面这行 spec 传给 plugin_manager 的 install_bundle(或你的配置档里对应的安装方式):

git+https://github.com/Silentforfar/dsh-session-menu.git#<commit-sha>

用本仓库历史里完整的 40 位 commit SHA,这样安装会被钉住,可复现。

环境要求。 DSH 0.2.1-rc.2 或更新的桌面端(Windows/macOS/Linux)构建。永久删除那一项会把会话日志移进 <DSH_HOME>/trash/sessions/,而不是直接删掉。

协议。 MIT。本 README 其余部分用中文介绍这个插件。

给侧栏会话行的「…」菜单补充几项动作。

| 菜单项 | 行为 |
| 导出记录 | 下载 dsh-session-<id>.zip(会话 + 子会话 + 附件),走 Host 的 /api/session.export |
| 打开工作目录 | 在资源管理器里定位这个会话的 cwd(仅桌面端、且会话有目录时出现) |
| 标记为未读 / 标记为已读 | 本机未读标记,未读会话标题前显示小圆点;切到该会话后自动清除 |
| 永久删除 | 二次确认后把会话日志目录移进 DSH 回收站,列表里当场消失 |

右键打开菜单

在侧栏的会话行上点右键,会打开这一行自己的「…」菜单(和点右侧省略号完全一样的气泡)。

实现方式:DSH 没有给行提供右键菜单的扩展点,所以插件在 document 的捕获阶段监听 contextmenu,命中 [data-row-key^="session:"] 的行时阻止默认菜单,并点一下该行自己的菜单按钮——复用宿主菜单的全部内容(含本插件新增的行),菜单出现在省略号的位置,而不是鼠标处。

空白的新建会话行、工作区行和其它区域不拦截,保持浏览器/宿主默认行为。

会话列表永远展开

工作区里的会话默认只显示 5 个,多出来的折叠成「展开其余 N 个会话 / 收起」。
本插件让它始终全部展开、并且不显示「收起」:

- 侧栏把每组的可见条数存在组件内部的 watermark 里(没有对外接口),所以插件用 MutationObserver 盯住 button[data-row-key^="overflow:"][aria-expanded="false"],一出现就点它,直到该组全部展开(观察回调在绘制前运行,正常看不到闪烁);
- 展开后宿主会把同一个按钮变成「收起」,插件用一条样式把它隐藏:
button[data-row-key^="overflow:"][aria-expanded="true"]{display:none!important}。

注意:watermark 是组件状态,切换面板/折叠侧栏导致会话树重挂载时会回到默认值,观察器会立刻再展开一次(可能看到一次 300ms 的展开动画)。

分叉来源与同名副本标记

DSH 的「在新对话中分支 / 分叉会话」会把父会话到那一刻为止的整段事件历史复制进新会话(buildForkSeed),新会话在列表里却和普通会话长得一模一样。本插件在会话标题后面补两个小胶囊:

| 胶囊 | 出现条件 | 含义 |
| ⤷ 分叉自 <父标题>(窄栏只显示 ⤷) | 该会话的 parentId 存在(Host 的 parentSessionId)且不是子代理 | 这个会话是从哪个会话分叉出来的;悬停提示说明分叉复制历史 |
| 同名 ×N(窄栏只显示 ×N) | 有 N(>1)个非空会话共用同一个标题 | 常见于分叉副本;悬停提示说明它们各写各的日志 |

实现要点:

- 行组件只在标题前提供了一个 16px 的 leading 位(被状态点/未读点占用),没有标题旁的扩展位,所以标记是插进行 DOM 的:找到 [data-row-key^="session:"],在第二个子节点(标题 span)后面插入 .dsm-badges;
- 标题优先:整组最多占行宽的 42%;行宽小于 360px 时只显示 ⤷ / ×N 的紧凑形态,完整文案放在 title 悬停提示里;只有把侧栏拉宽(行宽 ≥ 360px)才展开 ⤷ 分叉自 … 全文;
- React 重渲染会把行结构刷新,插件用 MutationObserver(120ms 节流)对账:文本没变就不动 DOM,变了才重写;行消失或不再满足条件就删掉;
- 数据来自客户端会话列表 ctx.sessions.list.getSnapshot().byId[id].parentId (Host api-session.list 的 parentSessionId),不额外发请求;
- 子代理会话(origin === 'subagent')不显示分叉胶囊,避免与宿主自己的层级展示重复。

永久删除怎么实现的

DSH 的会话持久化接口故意没有删除 API(见 dsh-session-persistence 的 “No deletion or retention API”),所以这一项是带外维护:

1. 客户端菜单行 /purge-session <session-id>(会话 ID 由命令参数给出,不是当前会话);
2. 如果该会话还有活着的 Agent,直接拒绝(文件被占用时一样会失败并提示);
3. 在持久化根目录里按会话 ID 的编码找到 <root>/<project>/<encoded-id>/,移动到 %USERPROFILE%\.dsh\trash\sessions/<时间戳>-<id>/;
4. 顺带把投影缓存 %USERPROFILE%\.dsh\storages\session_projcache\sessions/<id>.json 也移进回收站;
5. 向客户端发一条 api-session/removed(Host 在会话销毁时用的同一条事件),侧栏当场移除这一行,不需要刷新页面。

要点:

- 是移动不是删除,事后可以从回收站目录手工恢复;
- 删除完成后侧栏立刻移除该行(Host 发出 api-session/removed),不用刷新页面;
- 子会话不会级联删除,会变成孤儿;父会话不会被改写;
- 如果改过持久化根目录,需要在插件配置里加 sessionRoot,否则会报“没有找到日志目录”;
- 附件对象是内容寻址、可能被多个会话共享,不会被回收。

命令本身也可以直接在输入框敲:

/purge-session session-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

为什么没有「在新窗口中打开 / 移动到分组 / 开始侧边任务」

- 在新窗口中打开:DSH 的 Web 端没有会话深链,新窗口只会打开空白首页。
- 移动到分组:分组就是工作区,按 cwd 归属,没有把单个会话挪到别的工作区的接口。
- 开始侧边任务:右侧栏是浏览器/终端/文档面板,没有「侧边会话」这种对象。

已有的菜单项(不重复实现)

置顶(100)、重命名(200)、分叉会话(300)、归档(400)、复制 Session ID(450);本插件按 460 / 470 / 500 / 600 插在它们后面。

结构

index.js Host 端:/purge-session 命令 purge.js 会话目录定位与移入回收站(可单测) client.js 四个菜单行 + 未读圆点 locale/zh.json Plugins 页展示的标题与描述 locale/en.json icon.svg cordis.patch.yml 插入插件行
预览分享卡片长什么样 ↓Silentforfar/dsh-session-menu
分享 · DeepSeek Harness Hub
Silentforfar/dsh-session-menu

为会话右键菜单加上导出、定位目录、标记未读与永久删除

这是你的仓库?认领条目

回到顶部