给 DeepSeek Harness Desktop 侧栏会话菜单加一项永久删除:删掉会话日志与投影缓存,并摘除工作区记账,失败时不留半删目录树。侧栏永久删除会话:移除会话日志与投影缓存,失败安全,无运行时依赖。
30.6/100
综合分
1
GitHub 星标
92
npm 周下载
—/5
用户评分
数据截至 2026/10/12 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @nakie-zjm/dsh-session-deletenpm 源 · @nakie-zjm/dsh-session-delete 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · browser
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 25 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包@nakie-zjm/dsh-session-delete @ 0.1.1
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/14 16:19:28
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 15 处,展示前 15 条)
- 读取本地文件src/index.js:207
return { path: await realpath(path), resolved: true }; - 读取本地文件src/index.js:279
const entry = await lstat(sessionDir, { bigint: true }); - 读取本地文件src/index.js:282
realpath(sessionDir), - 读取本地文件src/index.js:283
realpath(dirname(sessionDir)), - 读取本地文件src/index.js:322
await lstat(path); - 写入本地文件src/index.js:349
await rename(sessionDir, staged); - 删除本地文件递归src/index.js:351
await rm(quarantineRoot, { recursive: true, force: true }).catch(() => undefined); - 读取本地文件src/index.js:354
const after = await lstat(staged, { bigint: true }); - 写入本地文件src/index.js:357
await rename(staged, sessionDir).catch(() => undefined); - 删除本地文件递归src/index.js:358
await rm(quarantineRoot, { recursive: true, force: true }).catch(() => undefined); - 删除本地文件递归src/index.js:362
await rm(staged, { recursive: true, force: false }); - 删除本地文件递归src/index.js:369
await rm(quarantineRoot, { recursive: true, force: true }).catch(() => undefined); - 删除本地文件src/index.js:537
await rm(cacheFile, { force: true }); - 发起网络请求lib/client.js:221
const response = await fetch(SESSION_DELETE_ROUTE, { - 发起网络请求src/client.js:204
const response = await fetch(SESSION_DELETE_ROUTE, {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 侧栏会话永久删除
- 删除日志与投影缓存
- 摘除工作区记账
README
由 DeepSeek 最新模型翻译生成@nakie-zjm/dsh-session-delete
给 DeepSeek Harness Desktop 加一个会话永久删除动作。
DSH 只提供「归档」:会话日志是 append-only 的,dsh-session-persistence 没有任何删除方法,dsh-workspace 注册表也没有 removeSession。这个插件把已有的公开服务组合成一个真正的删除操作,并把入口挂到侧栏会话行的 … 菜单里。
安装
包名:@nakie-zjm/dsh-session-delete
方式一:DSH 插件页(推荐,桌面版和 Web 版都适用)
1. 打开 DSH 的 插件 页面;
2. 在「添加插件」里填入包名和版本:
@nakie-zjm/dsh-session-delete@0.1.1
3. 按页面结果操作。桌面版需要完全退出并重启应用——bundle 选择是启动时读取的,配置 HMR 不会重新读 profile 的 package.json。
安装器会自动把包加入 profile 依赖、把 bundle 选进 dsh.profile.bundles,包内的 cordis.patch.yml 随层生效,不需要手改任何配置文件。
展开完整文档(README 剩余 1 节)
@nakie-zjm/dsh-session-delete
给 DeepSeek Harness Desktop 加一个会话永久删除动作。
DSH 只提供「归档」:会话日志是 append-only 的,dsh-session-persistence 没有任何删除方法,dsh-workspace 注册表也没有 removeSession。这个插件把已有的公开服务组合成一个真正的删除操作,并把入口挂到侧栏会话行的 … 菜单里。
安装
包名:@nakie-zjm/dsh-session-delete
方式一:DSH 插件页(推荐,桌面版和 Web 版都适用)
1. 打开 DSH 的 插件 页面;
2. 在「添加插件」里填入包名和版本:
@nakie-zjm/dsh-session-delete@0.1.1
3. 按页面结果操作。桌面版需要完全退出并重启应用——bundle 选择是启动时读取的,配置 HMR 不会重新读 profile 的 package.json。
安装器会自动把包加入 profile 依赖、把 bundle 选进 dsh.profile.bundles,包内的 cordis.patch.yml 随层生效,不需要手改任何配置文件。
方式二:dsh plugin 命令行
dsh plugin --profile desktop add @nakie-zjm/dsh-session-delete@0.1.1
dsh plugin --profile web add @nakie-zjm/dsh-session-delete@0.1.1
官方桌面版的 dsh 命令默认不在 PATH 里,需要先在应用里注册自带的命令(应用菜单中的 Manage dsh Command…),并在完全退出应用后使用 desktop profile。
从 npm 安装时 --profile 换成你自己的 profile 名。
方式三:不用 dsh plugin 的手动兜底
cd ~/.dsh/profiles/desktop # 或你的 profile 目录
pnpm add @nakie-zjm/dsh-session-delete@0.1.1
然后在 ~/.dsh/profiles/desktop/package.json 里确认两处(安装器正常情况下会自己写):
{
"dependencies": { "@nakie-zjm/dsh-session-delete": "0.1.1" },
"dsh": { "profile": { "bundles": [ /* …, / "@nakie-zjm/dsh-session-delete" ] } }
}
重启应用生效。
卸载
dsh plugin --profile desktop remove @nakie-zjm/dsh-session-delete
或在插件页点卸载。卸载只移除插件本身,不会删除任何已有会话。
兼容性
针对 DSH 0.2.0-rc.2 开发与验证。插件依赖下面这些宿主接口,DSH 升级后可能需要跟着更新:
Workspace.detachSession、workspaceRegistry.archiveSession / unarchiveSession / unpinSession、 sessionPersistence.list / resolveCurrentLog、Connection 的 /api exact Fetch 路由注册、 api-session/removed 转发事件、以及客户端插件的 dsh.client 约定与平台种子模块表。
其中只有 resolveCurrentLog 缺失会自动退回布局复刻,其余缺失会降级成警告或明确拒绝,不会静默删错东西。
行为
只加一个入口:会话行悬停出现的 … 菜单里多一项 永久删除(红色,order 500,排在归档 400 之后)。不加行内悬停按钮。
1. 预检:解析会话(先查活动会话,再查持久化列表),并从宿主拿到它真实的日志位置,同时把「能不能安全删」全部判完——这一段有任何拒绝都发生在改动任何状态之前;
2. 确认对话框:显示会话标题和不可恢复的提示,取消不做任何写入;
3. 确认后:
- 会话若还在跑回合:先经注册表自己的归档准入接缝(archiveSession({stopActivity:true}))停掉这些工作,并把借用的归档标记恢复原状(本来没归档就收回,本来就在归档集合里就保留),然后才继续;
- 从工作区记账中摘除(Workspace.detachSession,会持久化并推送变更);
- 从归档集合、置顶集合中摘除;
- 永久删除会话日志目录与投影缓存文档;
- 发出 api-session/removed,浏览器会话列表立即去掉这一行。
不可恢复。 没有回收站、没有备份、没有撤销。
永久删除怎么做到失败也安全
直接 rm -rf 会在中途失败时留下半棵目录树,而 DSH 下一次启动仍会把它当成会话读。
所以删除走两步隔离:
rename(会话目录 → ~/.dsh/sessions/.dsh-session-delete-<随机>/<会话id>/) ← 同卷,原子
→ 重新 lstat 校验身份(dev/ino/birthtimeNs 与改记账前一致;目录 size 会随内容变化,不算身份) → rm(隔离目录, recursive, force:false) → 再 stat 一次确认真的没了
- 身份对不上(删除期间被换掉):放回原位,什么都不删,报 unsafe-location;
- rm 中途失败:报错并告知隔离目录的完整路径,~/.dsh/sessions/ 下不会留下会被误读的目录,只会留下一个 .dsh-session-delete- 待你处理;
- 全部成功才清理隔离目录本身。测试断言:删除完成后 .dsh-session-delete- 一个不剩。
位置与安全
- 位置来自宿主:会话目录优先取 sessionPersistence.resolveCurrentLog(id) 的答案,只有后端答不出来时才退回本插件对布局的复刻(复刻有测试对着真实目录逐条核对)。
后端答案必须满足 <sessions根>/<项目目录>/<会话id>/transcript 的形状,否则拒绝。
- 符号链接防护:删除前用 lstat + realpath 证明目标是真目录、父目录就是 ~/.dsh/sessions/ 下的项目目录、且解析后仍在 sessions 根内(harness home 本身经符号链接 / junction 到达时两边都按解析后的路径比较,不会被误判成越界)。指向别处就拒绝——测试会造一个 junction 指向根外目录,断言拒绝并且目标文件完好无损。
- 拒绝不留副作用:身份检查、位置检查、运行中检查都排在第一次持久化写入之前。
任何拒绝之后,会话仍然在工作区原位、仍然在原有归档/置顶状态,日志一个字节没动。
- 请求加固:只接受 POST + application/json;浏览器请求必须同源且带 x-dsh-session-delete-confirmation: delete-session(链接和 HTML 表单设不了自定义头,所以跨站导航打不到这个分支;同源判定是 Origin 与请求自身 Host 的主机名比对, http 或 https 都算);会话 id 必须匹配 [A-Za-z0-9_-]{1,128};请求体先查 content-length、再核对读到的长度,超过 8 KiB 直接 413。无 Origin 的原生调用方(CLI / Agent 直接 POST loopback)由宿主信任栅栏认证,不需要那个头。
已知边界
- 正在运行的会话:插件会先停掉它的回合再删。停不下来(宿主没提供归档准入接缝,或者停完仍是 live)才拒绝,返回 session-delete/running(HTTP 409),并且此时一个文件都没动,归档状态也和删除前完全一样:本来没归档的仍然没归档,把它的工作停掉再重试即可;本来就在归档集合里的会保持归档,需要先去侧栏的「显示已归档」筛选里取消归档再重试。当前正在对话的这个会话通常属于这一类(它始终 live)。
- 会话的图片/文件附件是内容寻址的全局存储,其它会话可能共享,所以删除不动 ~/.dsh/attachments。这会留下孤儿字节,但不会误删别人的数据。
- 清理中途失败:工作区记账摘除之后,文件步骤(改名 / rm)仍可能失败。此时会话已经不属于任何工作区(侧栏刷新后行会消失),磁盘上可能留下 .dsh-session-delete- 隔离目录或投影缓存文档;错误信息会说明失败原因(已隔离的会给出隔离目录完整路径),重试一次通常能删干净,也可以按路径手工清理。
- session_projcache 的内存表保留该会话那一行直到重启;磁盘文档已删除,且没有日志的会话不会再被水合,所以不影响使用。
- 删掉就没了。要保留内容,请先用官方的 /export 命令导出一份 ZIP。
- 与 dsh-session-delete(vtxf 的同名插件)不能同时装:两者都注册 sidebar.workspaces.session.menu.item,菜单里会出现两个删除项。它侧重目录级批量归档/删除,本插件侧重单会话删除的失败安全与运行中会话的处理。
开发
仓库根就是包根。产物只有 lib/client.js 一个文件:
dsh-session-delete/
package.json main → src/index.js、./client → lib/client.js、dsh.bundle.patch cordis.patch.yml bundle 补丁层:插入一行 Loader entry src/index.js 宿主半(源码 = 产物:删除编排 + /api/session.delete 路由) src/client.js 浏览器半源码:工厂体,用 require/exports/module lib/client.js 浏览器半产物:build-client.mjs 套上 lazy-CJS 外壳 scripts/build-client.mjs 唯一的构建步骤;--check 校验产物是否过期 test/host-half.mjs 宿主半端到端(临时 DSH_HOME,真删文件) test/browser-half.mjs 浏览器半(在 Node 里物化 lib/client.js,桩掉 React 与 fetch) test/verify-endpoint.mjs 对运行中的实例核对路径推导与可达性 test/deployment-check.mjs 对 verify-endpoint 的回归(桩宿主:404 已挂载 / 报错要说清 URL)
宿主半不需要构建:DSH 的 Loader 用 import 加载它,main 直接指向 src/index.js。
浏览器半需要构建:DSH 只服务一个文件(exports["./client"]),它必须自己调用
window.__ModuleLoader__.load({ id, factory }),而模块表没有相对加载器,所以外壳
不能写进源码再 import。外壳由 scripts/build-client.mjs 套上——源码保持可读,产物可复现(npm run build:check 校验产物是否过期)。
npm run build # 生成 lib/client.js
npm test # 宿主半 75 项 + 浏览器半 47 项 + 部署检查 2 项
npm run verify # 对运行中的 DSH 实例核对(需应用在跑)
npm run check # build:check + test,prepublishOnly 会自动跑
npm run verify 不依赖任何机器相关的写死路径:harness home 走 DSH_HOME(默认 ~/.dsh)经插件自己的解析器,base URL 依次取命令行参数、DSH_WEB_URL、再依次探测 19387 / 3000 / 8080 / 8000 / 5173。它只能确认「根目录存在 + 有 DSH 宿主在跑」;无法判断路由是否挂载——未认证请求会被信任栅栏统一挡成 401,无论路由在不在。要判定挂载,请用它在 Web UI 控制台里打印的那条已认证 fetch。
本包没有任何运行时依赖:客户端只用平台种子模块表里的 react、react/jsx-runtime、@deepseek-ai/dsh-client-store、 @deepseek-ai/dsh-client-ui-primitives。
许可
MIT
给 DeepSeek Harness(桌面端和 Web 端)加一个永久删除会话操作。
DSH 只提供归档:会话日志只追加,dsh-session-persistence 不暴露删除,Workspace 注册表也没有 removeSession。这个插件把已有的公开服务组合成真正的删除,并把入口挂到侧边栏会话行的 … 菜单里。
安装
包名:@nakie-zjm/dsh-session-delete
插件页面(推荐): 打开 DSH → Plugins,然后添加 @nakie-zjm/dsh-session-delete@0.1.1。安装器会加上 profile 依赖,在 dsh.profile.bundles 里选中 bundle,包自带的 cordis.patch.yml 会作为一层生效——不用手动改任何配置文件。
桌面端需要完全重启应用,因为 bundle 选择在启动时读取。
命令行:
dsh plugin --profile desktop add @nakie-zjm/dsh-session-delete@0.1.1
dsh plugin --profile web add @nakie-zjm/dsh-session-delete@0.1.1
官方桌面端构建不会把 dsh 放进 PATH;先注册内置命令(应用菜单里的 Manage dsh Command…),完全退出应用后再用 desktop profile。
手动兜底: 在 ~/.dsh/profiles/<profile> 里运行 pnpm add @nakie-zjm/dsh-session-delete@0.1.1,然后确认包名同时出现在该 profile 的 package.json 的 dependencies 和 dsh.profile.bundles 里。
卸载: dsh plugin --profile desktop remove @nakie-zjm/dsh-session-delete,或者用插件页面。卸载永远不会删除已有会话。
兼容性: 针对 DSH 0.2.0-rc.2 构建并验证。
行为
只有一个入口:会话行 … 菜单里一行红色的 Delete permanently(顺序 500,排在 400 的归档之后)。没有悬停按钮。
所有可能拒绝的检查——身份、位置、会话是否在运行——都在第一次持久写入之前跑完,所以拒绝时会让会话保持原样。确认后,会通过注册表自己的归档准入接缝停掉正在运行的回合(把借来的归档标记原样放回——没设置就清掉,设置了就保留),把会话从它的 Workspace 上摘下来,从归档和 pin 集合里移除,删掉它的日志目录和投影缓存,并发出 api-session/removed,让浏览器列表丢掉这一行。
没有撤销。 没有回收站,没有备份。想保留记录就先用 /export 导出。
递归删除是分阶段的:先把会话目录 rename 到它项目目录旁边的隔离目录,在那里重新检查它的身份(dev/ino/birthtimeNs——目录 size 会随内容变化,所以不算身份),然后才删除——这样删除失败也绝不会留下半删的目录树,让 DSH 把它当成会话读出来。
安全
- 目录来自 sessionPersistence.resolveCurrentLog(id);插件自己复刻的那份布局只是兜底。
- 删除任何东西之前,先用 lstat + realpath 证明目标是 sessions 根目录里的真实目录;比较的两边都做了 resolve,所以通过符号链接或 junction 到达的 harness home 不会被误判成越界,而指向外部的 junction 依然会被拒绝。
- 路由只接受 POST + application/json,要求同源浏览器请求(Origin 与请求自身的 Host 匹配,走 http 或 https),并带上 x-dsh-session-delete-confirmation,把会话 id 限定为 [A-Za-z0-9_-]{1,128},解析前先检查 body 长度。
- ~/.dsh/attachments 下的附件按内容寻址、共享使用,所以从不碰它们。
已知限制
- 如果某个会话的 turn 停不下来,会以 session-delete/running(HTTP 409)拒绝,不碰任何文件。它的归档状态与尝试前完全一致:本来就已归档的保持归档(重试前先从侧边栏筛选里取消归档),未归档的只需先停掉它的工作再重试。
- 清理中途失败:移除工作区记账之后,文件步骤(rename / rm)仍可能失败。此时会话已不在任何工作区里(刷新后该行消失),但磁盘上可能残留 .dsh-session-delete-* 隔离目录或投影缓存文档;错误信息会说明哪一步失败(残留隔离目录时会给出其路径),重试通常能完成清理,残留也可以手动删除。
- 无法与 dsh-session-delete(vtxf 的插件)同时安装:两者注册同一个菜单槽位,菜单里会出现两行删除。
开发
npm run build # regenerate lib/client.js
npm test # host half (75 checks) + browser half (47 checks) + deployment check (2)
npm run check # build:check + test — also runs on prepublishOnly
没有运行时依赖:浏览器那一半只用平台 seed 模块。
许可证
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Nakie-zjm/dsh-session-delete
给 DeepSeek Harness Desktop 侧栏会话菜单加一项永久删除:删掉会话日志与投影缓存,并摘除工作区记账,失败时不留半删目录树。侧栏永久删除会话:移除会话日志与投影缓存,失败安全,无运行时依赖。
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 270,422已汉化DSH
71.9
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
可扩展侧边栏工作台omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
★ 4,761已汉化DSH
71.1
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,967已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
这是你的仓库?认领条目