- Home
- Plugins
- Sessions & Messages
- dsh-codex-ui-classic
dsh-codex-ui-classic
memoryovo/dsh-codex-ui-classic
Ships the Codex UI 1.1.49 sidebar inside the plugin itself, so no upstream release can change the interface, and adds a real delete to the session menu: it provides the remote.workspaceRegistry.deleteSession service, unhides the per-session ... button, and permanently removes the session log, workspace records and projection cache, with subagent and forked conversations selectable in a family-tree dialog. Bundles the Codex UI 1.1.49 sidebar from MichengAI/dsh-codex-ui (Apache-2.0) — do not install both; the delete engine is adapted from Lzcdebear/better-dsh-session-deletetool (MIT).
Install
dsh plugin --profile web add github:memoryovo/dsh-codex-ui-classicREADME
dsh-codex-ui-classic
一个插件,两件事:把 Codex UI 1.1.49 的侧边栏冻结进来,并补上真正能用的「删除会话」。
界面代码就在这个包里,装好之后不再依赖 @michengai/dsh-codex-ui;上游发什么新版都换不掉你现在的样子。
删除也不是归档隐藏——删掉的是会话日志、工程记录与投影缓存。
名字里的 classic 指的就是这一版界面:它冻在 1.1.49,不会再跟着上游变。
界面截图
| 会话菜单里多出「删除会话」 | 有未结束工作时的确认框 | 带家族时按层级勾选 |
|---|---|---|
![]() | ![]() | ![]() |
三张图都来自真实运行:菜单里多出的红色「删除会话」是侧边栏自己渲染的,本插件只负责让守卫通过;中间那张展示「还有未结束的工作」的提示与「停止并删除」按钮;右边那张是一个带 3 个后代会话的家族树,子智能体(👤 图标)与派生对话(🔗 图标)按层级缩进、逐项勾选。
为什么要把界面搬进来
@michengai/dsh-codex-ui 用自己的一套侧边栏替换了 DSH 官方侧边栏,会话行上的菜单也是它自己渲染的。这带来两个连锁问题:
一、删除入口被守卫挡住。 Codex UI 的菜单里其实有删除项,但被一个守卫挡着:
// @michengai/dsh-codex-ui
function hasArchiveSessionDelete(value) {
return value !== null && typeof value === "object"
&& typeof value.deleteSession === "function"
}
canDeleteSession: () => hasArchiveSessionDelete(ctx.get("remote.workspaceRegistry"))
源码注释写得很清楚:「永久删除会话由归档管理插件通过 remote.workspaceRegistry.deleteSession 提供」。而默认安装里没有任何插件提供这个命名空间,所以那一行永远不出现。
二、上游一升级,界面就换了。 Codex UI 2.0.x 是一次重写:dcu-wb-actions、dcu-wb-more、dcu-wb-context-anchor、remote.workspaceRegistry、canDeleteSession 这些钩子在新版里一个都不剩(在 2.0.3 的 lib/client.js 里逐个搜索,命中数都是 0)。也就是说,任何依赖这些接缝的插件都会被一次更新打成废纸。
所以这个包干脆把 1.1.49 的客户端整份内置,自己就是那套界面:上游再怎么改,你看到的还是这一版。
这个插件做什么
1. 内置 1.1.49 的侧边栏(Apache-2.0,见 vendor/codex-ui/NOTICE.md)。
vendor/codex-ui/ 里是原封不动拷过来的 lib/client.js、lib/index.mjs、LICENSE 与 package.json。DSH 一个包只加载一个 Client bundle,所以 scripts/build-client.mjs 把内置的 bundle 拼在自有模块前面:前者仍然以 @michengai/dsh-codex-ui 注册自己,后者用一句 require('@michengai/dsh-codex-ui') 把它取出来,在 apply 里交给同一个 Client context。结果是一个包同时跑起 1.1.49 的界面和本插件的删除功能。
2. 提供 Codex UI 在等的那个服务。
在 Client 端 provide('remote.workspaceRegistry', { deleteSession }),hasArchiveSessionDelete 守卫随之通过,会话菜单重新长出「删除会话」。如果这个命名空间已经被别的插件(例如归档管理插件)以可用的 deleteSession 占用,本插件不会覆盖它——别人那套更完整,不该被遮蔽。
3. 把被藏掉的「⋯」按钮放出来。
会话行本来就有 ⋯ 按钮,但上游自己用样式把它藏了:
.dcu-wb-actions{display:none} /* 只在项目标题悬停、或该行菜单已打开时显示 */
.dcu-wb-context-anchor{opacity:0;pointer-events:none} /* 有盒子,但看不见也点不到 */
原状下只能靠右键唤出菜单。本插件注入一条优先级更高的规则,悬停会话行时 ⋯ 正常显示、可点击,于是右键和三个小点两条路都能调出同一个菜单。
4. 顺手减掉用不到的导航。
内置界面里,专家 / 技能 / 连接器 / 定时任务 / IM 助理 这几项是写死的按钮(不走插槽),本包在构建时把它们删掉——扩展管理面板、折叠栏、搜索面板三处都删;「最近」分组只在有游离会话时才有内容,空着时连标题一起隐藏(有会话时会照常出现,不会把会话藏起来)。内置界面自带的那一页设置(标题就叫 Codex UI,正文是简介加一份「配套管理插件」安装清单)也整页删掉了,设置里不再有这一栏。改动点写在 scripts/build-client.mjs 里,带行号与锚点校验,内置文件本身没被改过。
删除时会发生什么
确认之后,Host 端真的把会话删掉:会话日志目录、工程记录与投影缓存一起移除,并通知前端从列表消失。不是加一个 archived: true 标记。
确认流程:不多弹一个窗
| 会话状态 | 流程 |
|---|---|
| 普通对话 | 菜单 →「删除会话」→ 侧边栏自己的确认框 → 删除完成 |
| 带着子智能体 / 派生对话 | 确认框先关掉,再弹出家族树:按层级列出全部后代会话,逐项勾选,确认按钮上写着「删除 N 个会话」 |
| 还有未结束的工作 | 弹窗顶部标出正在运行的会话,按钮变成「停止并删除」;Host 拒绝时会把最新活动状态回填到弹窗里 |
家族树里每个节点都有图标区分来源:session(本对话)、subagent(子智能体)、member(成员)、chat(派生对话)、linked(关联)。默认全选,可以只留一部分。
安装
从插件市场安装(推荐)
在 DSH 的插件市场里搜 dsh-codex-ui-classic。
从 GitHub 安装
plugin_manager action=install_bundle target=https://github.com/memoryovo/dsh-codex-ui-classic
或者直接用发布包:
plugin_manager action=install_bundle target=https://github.com/memoryovo/dsh-codex-ui-classic/releases/download/v0.3.0/dsh-codex-ui-classic-0.3.0.tgz
本地目录安装
plugin_manager action=install_bundle target=<本仓库的绝对路径>
装好后重开页面即可。
先把
@michengai/dsh-codex-ui停用。 两个插件都会占据sidebar插槽(都以 priority-1注册),同时启用会互相抢位置。本包自带界面,不再需要它:plugin_manager action=set_bundle target=@michengai/dsh-codex-ui enabled=false
依赖
- 运行时不依赖
@michengai/dsh-codex-ui。 界面代码在vendor/里,安装时不会去拉上游包。 - 不依赖
better-dsh-session-deletetool。 删除引擎已内置在host.js里(改编自该项目,MIT)。 - 需要 DSH
>=0.2.0-rc.1 <0.3.0-0,Node^22.19.0 || >=24.0.0。
已知限制
- 被 Harness 占用的会话,删掉之后可能回来。 如果会话此刻还开着(Host 内存里仍有它的 Session/Agent),删除只会清掉磁盘记录;下一次刷新列表时 Host 会把这个仍在内存里的会话重新列出来,之后的任何一次写入还会把它重新落盘。DSH 目前没有向插件开放「释放一个活动会话」的接口,本插件也不打算去拆 Agent 的生命周期。实际表现:关掉该会话所在的窗口/标签,或重启 DSH 之后再删,就是彻底的。
- 内置界面固定在 1.1.49。 这是刻意的:新版的界面与钩子都变了。想要新版请直接装官方 codex-ui,并停用本插件。
session-title子路径插件没有内置。 DSH 一个包只加载一个 Client bundle,同一包再挂一行指不到第二个 bundle;会话标题改用官方提供方,侧边栏本身不受影响。
工作原理
浏览器 Host
───────────────────────────────────── ────────────────────────────────
client.js(一个 bundle,两个模块)
├─ @michengai/dsh-codex-ui ← 内置 1.1.49 侧边栏
│ └─ 会话菜单:canDeleteSession 为真时出现「删除会话」
└─ dsh-codex-ui-classic
├─ provide('remote.workspaceRegistry', { deleteSession })
├─ 家族树弹窗(shell.overlay,order 62)
└─ 样式:放出「⋯」、隐藏空的「最近」
deleteSession(sessionId) ── POST ──▶ /dsh-codex-ui-classic/delete
└─ host.js:会话日志 / 工程记录 / 投影缓存
然后 emit('api-session/removed')
Host 端只暴露四条同源 HTTP 路由(inspect、delete、catalog、delete-batch),都做同源校验;Client 端不直接碰文件系统。
目录结构
dsh-codex-ui-classic/
├─ client.js # 构建产物:内置 bundle + 自有模块(勿手改)
├─ src/client.js # 自有 Client 模块:服务、家族树弹窗、样式
├─ host.js # Host 删除引擎与四条路由
├─ index.js # Host 入口:自有 apply + 内置 apply
├─ scripts/build-client.mjs # 拼装 client.js,并应用导航裁剪
├─ vendor/codex-ui/ # Codex UI 1.1.49 原样拷贝 + NOTICE
├─ locale/ # zh / en 插件元数据
├─ docs/screenshots/ # 截图
└─ cordis.patch.yml
改完 src/client.js 或 scripts/ 之后跑一次:
node scripts/build-client.mjs
致谢
- 界面来自 @michengai/dsh-codex-ui 1.1.49,Apache-2.0。
- 删除引擎改编自 better-dsh-session-deletetool(作者 Lzcdebear,MIT)。
- 家族树、确认框与 Host 路由的取舍沿用该项目的设计。
License
本仓库自有代码为 MIT,见 LICENSE;vendor/codex-ui/ 为 Apache-2.0,见 vendor/codex-ui/LICENSE。
Related plugins
dsh-web-ui (dsh-chat-recovery)
zhu1090093659/dsh-web-ui
billion-context
ranxianglei/billion-context
dsh-synapse
liangmianya/dsh-synapse
dsh-archive-manager
michengai/dsh-archive-manager


