DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
F

dsh-forget-session-en

Forget Session En

dsh-forget-session 的英文分支。DeepSeek Harness 插件:在会话行的“…”菜单中添加“忘记会话”项。经过两步确认后,它会从侧边栏和磁盘中移除该会话(会话日志、投影缓存、工作区记账数据、已归档/已固定集合)。自 v2.2 起,它首先

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:esketids/dsh-forget-session-en#4bb87ec586183d376746422cb5f20220ebbda243
README兼容性版本

说明

dsh-forget-session 的英文分支。DeepSeek Harness 插件:在会话行的“…”菜单中添加“忘记会话”项。经过两步确认后,它会从侧边栏和磁盘中移除该会话(会话日志、投影缓存、工作区记账数据、已归档/已固定集合)。自 v2.2 起,它会先从 Session store 中分离实时条目(官方分离通道),修复“忘记后会话立即返回未分组”和“文件无法删除”这两个问题。内存数据不受影响。

兼容性与来源证明

Forget Session En 以 dsh-forget-session-en 发布,当前版本为 2.2.1。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/10/23

版本

2.2.1stable
2026/10/23

相关插件

正在加载相关插件…

最新版
2.2.1
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/10/22
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 memory-context 分类下经过校验的插件。

Experimental Session Search@deepseek-ai/dsh-experimental-session-search为 Agents 提供搜索和读取当前工作区早期会话的工具。Hindsight Coding Agents@vectorize-io/hindsight-coding-agents面向编程代理的仅反思式 Hindsight 长期记忆(可插拔支持多种运行框架:opencode、……),自动在后台导入(无需设置 CLI)。Contextdsh-context用于上下文洞察和管理的 DeepSeek Harness 插件,提供上下文仪表板和上下文命令,帮助了解上下文的构成及其演变过程。Mnemondsh-mnemon面向 DeepSeek Harness 的可组合、基于视图的上下文。开箱即用的可插拔来源与策略、分层记忆和自我演进技能。

README

dsh-forget-session-en

English fork of dsh-forget-session by 2026heshao. This fork translates the UI text, code comments, documentation, and error messages to English, and uses its own package, plugin-row, service, and slot IDs so it can be installed alongside the original instead of colliding with it. The behavior is otherwise identical to upstream v2.2.1.

See docs/verification-checklist.md for the verification and troubleshooting checklist.

A DeepSeek Harness (DSH) plugin that adds a "Forget session" item to the session row's "…" menu and removes that session completely from the sidebar and from disk. Data accumulated by the Lingxu memory plugin is not affected. It works on both the desktop and web builds (the plugin UI runs in the same browser rendering layer in both, so behavior is identical).

Compatibility: fully tested on DeepSeek Harness 44.7.0 (host bundles @deepseek-ai/dsh-typert-protocol@0.2.1-rc.2 / cordis 4.0.5); the declared peer range >=0.1.5-rc.1 still covers it, and this version needs no code changes.

Features

Adds exactly one item, in the session row "…" menu:

  • "Forget session" (order 500, placed after the official "Pin / Rename / Branch / Archive" items)
  • Two-step confirmation after clicking: the row becomes "Click again to confirm", and only the next click executes (everything happens inside the menu, with no dialog; failures are shown directly on this row, never silently)
  • On success the row disappears and a top Toast reports the deletion summary (how many artifacts were deleted, how many warnings)
Deleted objectMethod
Running workOfficial workspace/session-stop waterfall (stopActivity archive path)
Live session (inside the Session store)Official entry.detach() internal channel: store.delete + attachments.delete + emitDisposed (new in v2.2; see root cause 3 below)
Workspace accounting (sessionIds in workspace.json)Official detachSession channel (domain write chain)
Archive set / pinned setOfficial unarchiveSession / unpinSession
Session log directory ~/.dsh/sessions/<project key>/<id>Whole-directory delete (including _no-cwd, legacy unprefixed layouts, and in-use retries)
Projection cache shard ~/.dsh/storages/session_projcache/sessions/<id>.jsonDelete
Table entry in the projection cache ~/.dsh/storages/session_projcache.jsonRead-modify-write; everything else is preserved as-is
Resurrected files (leftover handles / recreated by late writes)The Host "resurrection guard" deletes them again automatically within a ~2-minute window
Sidebar session row (client session list)Official sessions.handleSessionRemoved(id) + sessions.refresh()

Data left untouched: Lingxu memory (~/.dsh/.dsh-memory), attachments, and any other session.

What was fixed (why deleted sessions returned to "Ungrouped")

"Ungrouped" = ids in the client session list − the union of all workspace.sessionIds. After gathering evidence package by package from the official source, three resurrection paths were confirmed:

Root causeMechanismCountermeasure
Windows live-deletion raceOnce a session has been opened there is a write handle / cross-process lease: rm on the directory reports EBUSY/EPERM, v1 failed silently → files remained → the registry re-adopted them after a restart; and a late append from the live teardown after deletion could recreate the deleted directoryVerification re-check after deletion, with backoff retries for in-use errors; set up a resurrection guard: exponential backoff starting at 2s (capped at 32s) and periodic re-checks for a total window of ~130s, immediately deleting any recreated directory
Client list resurrectionThe Host's session.list still lists live sessions; any client refreshList (triggered on reconnect) merges the deleted rows backAfter deletion, call the official sessions.refresh() to reload the baseline, so the resurrected row is removed again before it becomes visible
Live entry never detached (root-fixed in v2.2)SessionStore has no public remove API: once a session enters the store, session.list (which merges live + persisted sessions) always lists it — after deletion it immediately returns to "Ungrouped"; and the persistence writer holds a write handle that keeps the disk busy, so rm gets EBUSY and even the resurrection guard deleting for ~130s is wastedUse the official entry.detach() carried by every store entry (= store.delete + attachments.delete + emitDisposed): this both removes the row from session.list (official api-session/removed frame) and releases the persistence write handle — only then does the disk deletion actually work

v2 once also added extra remote endpoints such as "session health check / empty-shell sweep / audit inventory", but they were never mounted with the client contract; clicking them only produced a typert gateway error, making them a useless surface — they have all been removed, and the contract surface keeps only the single delete method.

Remote contract

The forgetSessionEn service exposes only one method:

MethodParametersBehavior
delete{ sessionId }Full waterfall deletion (authoritative state + disk artifacts + resurrection guard)

Installation

Install from npm with the official DSH command (whichever profile you install into is where it takes effect):

dsh plugin --profile web add dsh-forget-session-en

Or install directly from the repository:

dsh plugin --profile web add github:esketids/dsh-forget-session-en

Restart DSH after installation for it to take effect (replace the value after --profile with the profile name you actually use).

Uninstall

dsh plugin --profile web remove dsh-forget-session-en

remove also removes the dependency and the patch layer; after restarting DSH the menu returns to its original state.

How it works (for maintainers)

  • Host half (lib/index.js): a TypertRemoteService named forgetSessionEn with inject: ["workspaceRegistry"]. delete() goes through the official state channels (stop / unarchive / unpin / live detach / detach), then deletes disk artifacts using the same path algorithm as session-persistence-jsonl (projectKey + encodeSegment) (retrying in-use errors with backoff + verification re-check), cleans the projection cache, and finally sets up the resurrection guard. It never edits workspace.json by hand — accounting is done through the registry's official mutate write chain. Live removal obtains the entry via ctx.get("sessions").store (a public class field Map) and calls entry.detach(), which is equivalent to the official SessionStore.detachEntered.
  • Browser half (lib/client.js): a window.__ModuleLoader__ bundle; ctx.remote.$mount mounts a contract with only the single delete method (strict codec writes both keys); ctx.slots.inject("sidebar.workspaces.session.menu.item", ...) registers the menu row. Toasts use primitives.Toast, rendered through a module-level toast bus + a resident shell.overlay component (React hooks must never be called inside apply() — there is no dispatcher outside a render context, which makes the whole fiber FAILED).
  • Resurrection guard: started after a successful delete() (whether or not this pass removed everything); each step re-checks the log directory (located by project key when cwd is known, otherwise a full scan) and the shard cache, and a successful deletion also clears the shard. An explicit delete of the same session resets the guard.

Tests

cd <this repository directory>
node test/verify.mjs

With an isolated HOME (DSH_FORGET_SESSION_HOME points at a temporary directory), 15 assertions cover: the contract surface contains only delete, the full delete waterfall (live flush/detach, directory/shard/table entry/workspace detach), zero collateral damage to normal sessions, idempotency, missing-argument errors, and the resurrection guard deleting a recreated directory.

The test needs @deepseek-ai/cordis and @deepseek-ai/dsh-typert-protocol (peer dependencies, supplied by DSH) and can be run directly inside a profile where this plugin is installed.

Known limitations

  • The official DSH design is "archive sessions, never delete them" (see the dsh-client-ui-workspace README); this plugin is a user-level addition beyond the official channels.
  • If the deleted session is live in this process: buffered events are first flushed to disk, then the session is detached from the store via entry.detach() (the official dispose channel closes the persistence write handle). Late writes from the teardown within the guard window (~130s) are deleted afterwards. Deleting idle sessions is recommended.
  • For the session search index (session-query-sqlite), when openAt is not never, deleted session rows converge automatically on the next _reconcile (any search) — the persisted list no longer contains the id, and the index clears it through persistentDeletes; openAt: never (the default) is in-memory and self-heals.

License

MIT