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

经典会话界面 memoryovo/dsh-codex-ui-classic

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

冻结经典侧边栏并彻底删除会话记录

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
数据截至 2026/10/29·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 6 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 55 处,展示前 30 条)
  • 请求外部主机registry.npmjs.org
    vendor/codex-ui/host.mjs:66
    const metadata = await fetch(`https://registry.npmjs.org/${encoded}`, { signal: AbortSignal.timeout(5e3) });
  • 发起网络请求
    vendor/codex-ui/host.mjs:66
    const metadata = await fetch(`https://registry.npmjs.org/${encoded}`, { signal: AbortSignal.timeout(5e3) });
  • 请求外部主机api.npmjs.org
    vendor/codex-ui/host.mjs:82
    const response = await fetch(`https://api.npmjs.org/downloads/point/${range.start}:${range.end}/${encoded}`, { signal: AbortSignal.timeout(5e3) });
  • 发起网络请求
    vendor/codex-ui/host.mjs:82
    const response = await fetch(`https://api.npmjs.org/downloads/point/${range.start}:${range.end}/${encoded}`, { signal: AbortSignal.timeout(5e3) });
  • 读取本地文件
    vendor/codex-ui/host.mjs:210
    const hostProfileDir = isOfficialDesktopHostEntry(argv[1]) && existsSync(resolve(cwd, "package.json")) ? resolve(cwd) : void 0;
  • 读取本地文件
    vendor/codex-ui/host.mjs:248
    if (typeof pnpm !== "string" || !isAbsolute(pnpm) || !existsSync(pnpm)) return void 0;
  • 读取本地文件
    vendor/codex-ui/host.mjs:270
    const bin = JSON.parse(readFileSync(anchor, "utf8")).bin;
  • 读取本地文件
    vendor/codex-ui/host.mjs:274
    return existsSync(entry) ? entry : void 0;
  • 读取本地文件
    vendor/codex-ui/host.mjs:296
    return JSON.parse(await readFile(resolve(profileDirectory(runtime), "package.json"), "utf8"));
  • 删除本地文件
    vendor/codex-ui/host.mjs:318
    await rm(packagePath, {
  • 读取本地文件
    vendor/codex-ui/host.mjs:360
    const manifest = JSON.parse(await readFile(resolve(root, "node_modules", ...packageName.split("/"), "package.json"), "utf8"));
  • 请求外部主机registry.npmjs.org
    vendor/codex-ui/host.mjs:390
    const response = await fetch(`https://registry.npmjs.org/${encodeURIComponent(packageName)}/${tag}`, { signal: AbortSignal.timeout(5e3) });
  • 发起网络请求
    vendor/codex-ui/host.mjs:390
    const response = await fetch(`https://registry.npmjs.org/${encodeURIComponent(packageName)}/${tag}`, { signal: AbortSignal.timeout(5e3) });
  • 写入本地文件
    vendor/codex-ui/host.mjs:433
    if (next !== source) await writeFile(path, next, "utf8");
  • 写入本地文件
    vendor/codex-ui/host.mjs:571
    await writeFile(pendingPath, `${JSON.stringify({ packages }, void 0, 2)}\n`, "utf8");
  • 删除本地文件
    vendor/codex-ui/host.mjs:581
    await unlink(pendingPath);
  • 写入本地文件
    vendor/codex-ui/host.mjs:584
    await writeFile(pendingPath, `${JSON.stringify({ packages }, void 0, 2)}\n`, "utf8");
  • 写入本地文件
    vendor/codex-ui/host.mjs:609
    await writeFile(manifestPath, `${JSON.stringify(manifest, void 0, 2)}\n`, "utf8");
  • 写入本地文件
    vendor/codex-ui/host.mjs:624
    await writeFile(manifestPath, `${JSON.stringify(manifest, void 0, 2)}\n`, "utf8");
  • 执行外部命令固定命令
    vendor/codex-ui/host.mjs:802
    const killer = spawn("taskkill", [
  • 执行外部命令来自配置/变量
    vendor/codex-ui/host.mjs:899
    if (packageManager !== void 0) return monitorPluginChild(spawn(packageManager.command, [...packageManager.args, ...args], {
  • 执行外部命令来自配置/变量
    vendor/codex-ui/host.mjs:915
    return monitorPluginChild(spawn(process.execPath, [
  • 写入本地文件
    vendor/codex-ui/host.mjs:1548
    await mkdir(dirname(this.newDirectory), { recursive: true });
  • 删除本地文件
    vendor/codex-ui/host.mjs:1605
    await rm(this.temporaryPath, { force: true });
  • 删除本地文件
    vendor/codex-ui/host.mjs:1613
    await rm(extra.path, { force: true });
  • 删除本地文件
    vendor/codex-ui/host.mjs:1624
    await rm(this.newArtifact, { force: true });
  • 删除本地文件
    vendor/codex-ui/host.mjs:1648
    await rm(backup, { force: true });
  • 删除本地文件递归
    host.js:712
    await rm(directory, { recursive: true, force: true })
  • 发起网络请求
    src/client.js:160
    const response = await fetch(`${INSPECT_PATH}?sessionId=${encodeURIComponent(sessionId)}`, { cache: 'no-store' })
  • 发起网络请求
    src/client.js:183
    const response = await fetch(DELETE_PATH, {
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:registry.npmjs.org、api.npmjs.org

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

Codex UI 界面冻结在 1.1.49,收进一个插件,外加真正的删除会话功能

README

由 DeepSeek 最新模型翻译生成
dsh-codex-ui-classic 一个插件,两件事:把 Codex UI 1.1.49 的侧边栏冻结进来,并补上真正能用的「删除会话」。 界面代码就在这个包里,装好之后不再依赖 @michengai/dsh-codex-ui;上游发什么新版都换不掉你现在的样子。 删除也不是归档隐藏——删掉的是会话日志、工程记录与投影缓存。 名字里的 classic 指的就是这一版界面:它冻在 1.1.49,不会再跟着上游变。 界面截图 | 会话菜单里多出「删除会话」 | 有未结束工作时的确认框 | 带家族时按层级勾选 | 三张图都来自真实运行:菜单里多出的红色「删除会话」是侧边栏自己渲染的,本插件只负责让守卫通过;中间那张展示「还有未结束的工作」的提示与「停止并删除」按钮;右边那张是一个带 3 个后代会话的家族树,子智能体(👤 图标)与派生对话(🔗 图标)按层级缩进、逐项勾选。 为什么要把界面搬进来 @michengai/dsh-codex-ui 用自己的一套侧边栏替换了 DSH 官方侧边栏,会话行上的菜单也是它自己渲染的。这带来两个连锁问题: 一、删除入口被守卫挡住。
展开完整文档(README 剩余 1 节)
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。
预览分享卡片长什么样 ↓memoryovo/dsh-codex-ui-classic
分享 · DeepSeek Harness Hub
memoryovo/dsh-codex-ui-classic

冻结经典侧边栏并彻底删除会话记录

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部