Repository navigation
Releases: wsnmm3/dsh-session-keeper
Release list
会话管理 1.2.1 · 包内 README 版本号对齐
会话管理 1.2.1 · 包内 README 版本号对齐
这一版只改文档,代码产物与 1.2.0 逐字节相同(lib/ 全部 20 个文件 md5 一致)。
为什么有这一版
维护者在 awesome-dsh-plugin 的 PR 里指出「README 头部写 1.1.6、package.json 是 1.2.0」。
查下来根因不在仓库里,而在 tarball 里 —— 1.2.0 的 tarball 是在 README 改版之前打的,
包内的 README.md / README.zh.md 头部仍写着 1.1.6。GitHub 上五个 release 附件同理。
npm 不允许同号重发,所以重打一版。
这一版改了什么
- README.md / README.zh.md 头部版本号 1.1.6 → 1.2.1,tarball 安装示例同步指向 dsh-session-keeper-1.2.1.tgz
- CHANGELOG 的 Unreleased 段并入 [1.2.1] — 2026-10-25
- PUBLISHING.md 进度表同步
顺带补齐的文档(1.2.0 之后)
- 不能与上游包同时安装:
@deepseek-ai/dsh-session-categories与本插件抢同一sidebar.workspacesslot、开同一存储域session_categories,cordis 行 id 也不同 —— 装了两份会互相踩 - 置顶会话可抬到分类之上:视图菜单里可切换「置顶到分类上方 / 保留在所属分类」,默认抬升
校验
- 1.2.0 → 1.2.1 包级比对:24 个文件里 20 个逐字节相同,变的只有 CHANGELOG.md / README.md / README.zh.md / package.json
- lib/ ALL IDENTICAL —— 纯文档版,无代码夹带
- 包内 README.md L12 已是 Version 1.2.1
安装
dsh plugin --profile web add dsh-session-keeper
# 或锁定版本:
dsh plugin --profile web add ./dsh-session-keeper-1.2.1.tgz本插件是 ht719/dsh-session-categories 的维护分叉,已移植到当前 DSH,
新增置顶 / 归档分区 / 删除回收站,宿主与网页两半一体。不要与上游包同时安装。
会话管理 1.2.0 · peer 范围修正
会话管理 1.2.0 · peer 范围修正
这次改了什么
peerDependencies 从 "*" 收紧到能匹配预发布版的显式范围
之前 14 个 @deepseek-ai/* 全部声明为 "*"。但 semver 里 "*" 不匹配任何预发布版本,
而 harness 实际提供的 13 个 dsh-* peer 全是 0.2.0-rc.2 这类预发布版,^0.2.0 同样匹配不上。
结果是安装时这些 peer 被静默排除,pnpm 侧表现为 ERESOLVE。
现在改为:
@deepseek-ai/cordis:>=4.0.4 <5.0.0- 其余 13 个:
>=0.2.0-rc.1 <0.3.0-0 || >=0.2.1-alpha.1 <0.4.0-0 - 14 个全部标记
peerDependenciesMeta.optional
semver 实测:0.2.0-rc.2 / 0.2.1-rc.3 / 0.2.1-alpha.5 / 0.2.0 / 0.2.1 / 0.3.0 命中,
0.4.0 / 0.1.0 不命中;cordis 4.0.4 命中。
修正:发布包里的 invariant companion 注册在错误的包名下
lib/invariant.js 里硬编码的 PACKAGE_NAME 是上游 scope 名 @deepseek-ai/dsh-session-categories,
而发行包名是 dsh-session-keeper —— 两者不是同一个 key,宿主侧的 invariant 注册会与上游包撞车。
源码里的常量已改为 dsh-session-keeper,重新构建后产物自带正确名字。
仓库根 package.json 现在自描述为可安装的插件清单
声明了 dsh.bundle 与 dsh.client,去掉了 private,cordis.patch.yml 里的行名与包名一致,
发行布局(lib/typert.host.js、lib/types/*)一并纳入版本控制。
仓库本身就能被插件市场与清单收录流程识别,无需依赖构建工作区。
发行包里不再混入备份文件
npm 打包会强制收录 README*,此前根目录的 README.md.bak-* 会被打进 tarball。
现由 .npmignore 拦截,备份另存于 _backups/。
升级说明
Host 侧接口、回收站八动词、置顶语义均无变化——这次只动依赖声明与发布卫生。
如果你之前用的是 1.1.6–1.1.9 且安装时没报 ERESOLVE,升级到 1.2.0 不需要任何配置改动;
如果装的时候踩过 peer 解析失败,1.2.0 正是修这个的。
安装
npm install dsh-session-keeper上一版
1.1.9 修的是置顶开关导致的侧边栏渲染崩溃(ReferenceError: hoistPinned is not defined)。
会话管理 1.1.9 · 崩溃修复
会话管理 1.1.9 · 崩溃修复
1.1.8 把「置顶到分类上方」开关接进分类树渲染时,hoistPinned 是在 WorkspaceBrowser 组件里读取的状态,却直接被 SessionTree 内部的 renderGroup 使用 —— 跨组件作用域,运行时抛 ReferenceError: hoistPinned is not defined。
整个 sidebar.workspaces slot entry 因此崩溃,侧边栏静默回落到宿主自带的会话 UI,表现就是「置顶抬升和开关都不生效」,而且控制台只留一行 slot entry crashed,很难定位。
修复
该状态改为通过 prop 通道传进 SessionTree,跨组件引用消除,崩溃不再发生。
- Host 侧接口、回收站八动词、置顶语义均无变化;
- 升级到 1.1.9 即可,无需重装配置、无需清理会话。
已验证
- 构建 20 passed / 0 failed,产物校验(语法 / loader / CSS 内联 / side-car / requires)全绿;
- 单元测试 5 / 11 / 17 全过;
- 装机副本与发布包 md5 一致;
- 页面实测:侧边栏 DOM 前缀从宿主回落态变回插件态,视图选项里「置顶到分类上方 / 保留在所属分类」可见可切,置顶会话确实跳到分类之上、切回则落回所属分类。
会话管理 1.1.8 · 置顶抬升
会话管理 1.1.8 · 置顶抬升
置顶会话不再被分类压住:默认抬到分类树最上方,同时在「视图选项」里留了开关,想保持旧行为可以一键切回。
安装
dsh plugin --profile web add dsh-session-keeper或直接装 npm 包:
npm i dsh-session-keeper这一版做了什么
新增
- 置顶会话抬到分类之上。 之前置顶只在所属分类内部前置("Pinned rows lead whatever list they belong to"),分类本身按
category.order排——所以置顶会话被锁死在那一段里,出不了全局顶。现在置顶会话从各分类与「未分类」中抽出,聚合为树顶部的独立置顶段,排在所有分类之前。 - 「视图选项」新增开关。 菜单里加了两项互斥选择:「置顶到分类上方」(默认,1.1.8 的新行为)与**「保留在所属分类」**(1.1.7 的旧行为)。选择持久化在
dsh.session-categories.view.v2里,跟着视图选项一起存。 - 视图选项菜单现在也能管置顶了——和分组方式、排序方式、归档筛选摆在一起,位置一致,不用翻菜单。
变更
- npm 包说明(description)换成中文:「DeepSeek Harness 的会话管理插件:工作区独立的分类树、拖拽排序、置顶、归档分区,以及可撤回的删除回收站。」
- 版本号 1.1.7 → 1.1.8。
验证
- 新增
scripts/test-pin-hoist.mjs:把tree.ts编译后直接跑树构造,覆盖「开:置顶离开分类进全局段」「关:留在原分类且全局段为空」「无置顶:两种模式树相同」等 5 条断言。 - 构建全绿:
build-all20 项通过,verify-build的 SYNTAX / LOADER / CSS INLINE / SIDE-CAR / REQUIRES 全部 OK。 - 部署后产物与构建产物 md5 逐份一致,Host 与客户端两侧同一份代码。
注意事项
- 预发布软件,不承诺跨版本兼容。
- 「彻底删除」不可逆。 回收站里单批删除、清理过期、一键全清都不会留副本。
- 详细变更见 CHANGELOG.md。
会话管理 1.1.7 · 回收站自足
会话管理 1.1.7 · dsh-session-keeper
回收站自足版:把删除回收站的 Host 半边搬进本插件,卸载旧的 dsh-session-recycle 之后回收站照常工作,不再依赖任何外部回收站插件。
安装
dsh plugin --profile web add dsh-session-keeper或直接装 npm 包:
npm i dsh-session-keeper这一版做了什么
修复
- 「卸载
dsh-session-recycle后回收站报 delete-failed / 无法统计删除范围」——根治。 旧结构里本插件只带客户端半边,8 条/session-recycle/*路由全在那个独立插件身上,一卸载客户端就是对着空气打请求。现在五个回收站动词(listRecycledSessions/deleteSessions/undoSessions/purgeBatch/sweepRecycledSessions)加三个 transcript/scan 动词(scanSession/readTranscript/listTrashedSessions)全部改走sessionCategories的 typert Remote,客户端经 API 网关(/api/sessionCategories/*)调用——Host 半边自己服务整个回收站生命周期,单插件自足。 - 设置页整页崩溃(
.filter报错)。Remote 回复是双层包裹({ok, value:{ok, value}}),客户端只剥了一层就对它调.filter,整页带走。现在统一走控制器里既有的两步剥层。 - 所有回收站动词回
input-invalid。客户端给 Remote 桩多包了一层{ request: {...} },而桩的首参本身就是 wire request——剥掉多余包裹。 - 构建产物语法错误导致全部 404。描述符注入脚本曾把
export关键字从TYPERT声明上切下来,留下export // --- comment ---这类悬空残骸,整个 Host 模块 import 即炸。注入改为锚定声明处并自动清理旧残骸。
变更
scripts/pack-release.mjs的 reference 默认值改指本 fork 自己的已装副本(dsh-session-keeper),不再指本 profile 已不存在的上游dsh-session-categories目录;身份改写同时覆盖双引号写法(invariant.js的PACKAGE_NAME)。- 还原字节级校验:删除 → 撤回全链路实测,还原文件与原件 298 B = 298 B,
identical: true。
注意事项
- 预发布软件,不承诺跨版本兼容。
- 「彻底删除」不可逆。 回收站里单批删除、清理过期、一键全清都不会留副本。
- 详细变更见 CHANGELOG.md。
会话管理 1.1.6 · dsh-session-keeper
会话管理 1.1.6 · dsh-session-keeper
DeepSeek Harness 的会话管理插件:工作区范围的分类树、拖拽重排序、置顶、归档分区,以及可撤回的删除回收站。
安装
dsh plugin --profile web add dsh-session-keeper或直接装 npm 包:
npm i dsh-session-keeper这一版做了什么
新增
-
分类可以拖拽排序了。把分类行拖到另一个分类行上,现在调
reorderCategory(sourceId, anchor, half)——Host 侧从第一版就支持(@Remote('reorderCategory')),缺的只是客户端:CategoryRowItem没有onReorderprop,所以落下去直接走了moveCategory,变成改父级而不是排序。跨级拖仍然是「移到那个父级下面」——两种手势靠half区分:落在行的上/下边缘是排序,落在中间带是移动。 -
分类内的会话排序。分类里的会话行现在也能拖。存储键是
category:<id>,写的是 pin 之前的真实顺序(orderedSessionIds),所以置顶状态不会被固化进排序、取消置顶后不会卡在顶上。
修复
-
「有分类快照的工作区,拖拽顺序不生效」。
categoryProjection调buildCategoryTree时读的是 Host 的原始workspaces,而不是已经套过手动序的orderedWorkspaces——凡是带分类快照的工作区,行序完全由categoryProjection决定,group.sessions被丢弃,于是拖了也没用。改成读orderedWorkspaces。 -
分类内拖拽静默失效(键名不匹配)。写入端
setSessionOrder(categoryOrderKey(node.id), …)带category:前缀,读取端view.categoryOrder?.[id]不带——stored === undefined,永远返回原序。存储确实写了、界面确实不动。TypeScript 完全看不出来(两边都是string),tsc 也报不出来。 -
storedAnchorFor:pinned 会话导致的锚点错位。渲染序里 pinned 会话被提前,存储序里没有这个分区——按渲染下标算插入位置会错。
内核
- 修了
13-category-drag.mjs把所有分类当同一个的问题(跨父级拖拽被 Host 有意拒绝,三条断言在对着能跑的代码报红)。 - 三个真拖拽套件(
12/13/14)现在都会先快照localStorage['dsh.session-categories.view.v2']再还原——之前它们会静默改写你自己的排序。 - 活体回归 14/14 全绿,
view mode: restored。
关于这个包名
上游的 dsh-session-categories 在 npm 上属于 ht719,这个账号永远发不了那个名字。所以 fork 用自己的名字发布。
上游 0.1.0 已经跑不起来了:它依赖 @deepseek-ai/dsh-client-runtime,而这个包在当前 dsh 里已被移除——loader 解析失败,sidebar.workspaces slot 挂载崩溃,表现是窗口永远开不完。这个 fork 把客户端移植到了 dsh-client-store / uiWorkspace,补了缺失的 Rows.module.css、修了被截断的 @keyframes row-in,然后在此基础上做了归档分区、回收站、分类拖拽、置顶。
详细移植记录见 FORK-NOTES.md。
注意事项
- 预发布软件,不承诺跨版本兼容。
- 「彻底删除」不可逆。 回收站里单批删除、清理过期、一键全清都不会留副本。
- 视图状态存在
localStorage['dsh.session-categories.view.v2']。排序要先把排序方式切成「手动排序」。 - 删分类只归档会话,不真删。
- 跨 Workspace 拖拽会被拒绝(
anchor-not-found)。 - 不注入全局 CSS、不碰
document.body。 - 如果从旧名
dsh-session-categories换过来:是"换"不是"加"——新旧共存会撞invariants: package "…" is already registered。
许可
MIT。上游版权归 ht719。