DeepSeek Harness Hub
← 返回列表

ice-ai-lab/dsh-plugin-codex-ui

DeepSeek 客户端兼容 / 相关生态spec-screened在 GitHub 查看 ↗
未验证

description: "适用于 DeepSeek Harness Web GUI 的 Codex…

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/12 · 已提供中文文档

DeepSeek Harness Web GUI 的 Codex 风格侧边栏皮肤:一个“项目 + 最近”浏览器,一个“新建对话”行,可在不选择项目的情况下启动会话并分配自己的工作目录,以及一个在你发送之前不写入任何内容的草稿编辑器。

综合分
29.5
GitHub 分
29.5
用户评分
★ Stars
0
周下载量
兼容 / 相关生态插件(非 dsh 原生,请按其对应运行时安装)
git clone https://github.com/ice-ai-lab/dsh-plugin-codex-ui.git
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

description: "适用于 DeepSeek Harness Web GUI 的 Codex 风格侧边栏皮肤:一个 Projects + Recents 浏览器,以及一个 New chat 行,它会在一个全新创建的工作目录中启动一个没有项目的真实会话,并在聊天未被使用即被放弃时立即回收该目录。"
kind: "package-reference"

dsh-plugin-codex-ui

适用于 DeepSeek Harness Web GUI 的 Codex 风格侧边栏皮肤。

它将自带的浏览区域替换为两个可折叠分区——Projects 和 Recents——位于单个 New chat 行之下,该行会在不选择项目的情况下启动一个会话,并完全按照 Codex 应用的方式为其分配一个全新的工作目录。

DeepSeek Harness                           ⇤      ← 品牌行(自带外壳,已重命名)
+ 新对话                                          ← 在一个全新的临时目录中启动真实聊天
─────────────────────────────────────────────
项目                                        +      ← 分区标题;点击可折叠
📁 pi                                     ← 每个项目一行,无箭头
📁 dsh-plugin-codex-ui
最近
20260912-135505-27c0                       ← 仅无项目的聊天,仅标题
…                                         显示更多
─────────────────────────────────────────────
⚙ 设置                                             ← 自带设置页脚

两个分区均可折叠,每次折叠状态在重新加载后依然保留,点击某个项目会在其下方展开该项目的聊天。

分区标题和行的呈现方式与 Codex 侧边栏一致:分区标题是一个小巧安静的标签,与下方行图标处于相同的左侧内边距;一行是 32px 高的线条,其标题占据整个宽度——没有箭头,没有相对时间——行图标和标题使用深色 label-primary 文本,而分区标题和已折叠分区的计数保持 label-tertiary。悬停是背景变化,而非颜色变化,当前聊天由其填充的胶囊标记。

它改变了什么

| 界面 | 变化 |
| --- | --- |
| 侧边栏品牌名称 | 显示 DeepSeek Harness,而非本地构建徽章。 |
| 侧边栏浏览区域 | 替换为此插件的 Projects + Recents 浏览器。 |
| 全局面板行 | 隐藏。此皮肤没有 Pull requests / Scheduled / Plugins 行。 |
| 自带的 New Session 按钮 | 在列展开时隐藏,替换为此皮肤的 新对话 行。折叠栏保留自带的图标按钮。 |
| --dsh-sidebar-inline-padding | 从 12px 收紧至 10px。 |

其他一切均为自带外壳:品牌行、折叠动画、36px 栏以及设置页脚均未改动。

安装

需要 DeepSeek Harness 的 web 配置文件(Node ≥ 20)以及 PATH 中的 pnpm,因为 dsh plugin 会在配置文件目录内转发给 pnpm。

从 GitHub 安装
dsh plugin --profile web add github:ice-ai-lab/dsh-plugin-codex-ui

或从本地检出安装
dsh plugin --profile web add /absolute/path/to/dsh-plugin-codex-ui
该包声明了 dsh.bundle.patch,因此 dsh plugin add 会自动将其追加到
dsh.profile.bundles,该层会在下次启动时生效。

然后重启 dsh web。 客户端部分在启动时被组合进 window.__DSH_BOOT__,
因此仅刷新页面不会使其生效。

要移除它:

dsh plugin --profile web remove dsh-plugin-codex-ui

两个不只是样式的手势

在没有项目的情况下开始聊天

新对话会在没有项目的情况下开始一个真正的聊天。 它向节点半部分请求一个全新的工作
目录,将该目录注册为一个工作区,在其中创建会话并打开它——即随附的“新建会话”顺序,使用一个读者无需亲自挑选的目录。随后出现的编辑器就是随附的那个,并且完全可用:模型选择器、权限标签、+、@ 以及上下文计量器从第一次按键起就都能工作。

没有模拟编辑器,也没有任何东西被推迟,因为一个你可以选择模型的聊天必须存在,而一个会话不能没有工作目录而存在。目录在聊天创建时被创建。

这就是清理的用途。这一行所铸造的最后一个聊天会被记住,并在读者未使用它而继续前进的那一刻被回收:会话被归档,其工作区注册被移除,其目录被删除。连续点击十次只会留下一个目录,而不是十个。一个被使用过的聊天永远不会被回收——消息使它成为一个普通聊天,而输入的文本会保留它(并保留其行被列出,以便文本仍然可达),直到它被发送或清除。这个皮肤铸造过但随后失去追踪的任何东西——在铸造和记录之间发生崩溃、记录随浏览器存储丢失——会在下次加载时被清扫:这个皮肤根目录下没有任何工作区和任何聊天引用的目录,或者一个只包含未触碰聊天的铸造工作区,超过宽限期后就会被清除。

为什么注册很重要:一个仅以工作目录为根且不属于任何工作区的会话,会被对话视为不完整——编辑器会在“选择一个工作区以开始”后面变得不可用,模型选择器也随之如此。通过工作区进行会得到一个与在项目内启动的聊天逐字节相同的聊天,唯一的区别是它命名的是哪个工作区。

然后,让该工作区不出现在 Projects 中就是这个皮肤的任务,而不是副作用:
节点半部分报告它在其下铸造的目录根,该根内的任何工作区都算作无项目,因此其聊天会落在 Recents 中,而这正是一个没有项目的聊天所属的位置。

Projects

Projects 列出在 DSH 工作区注册表中注册的工作目录。
一个项目行只是一个文件夹图标和一个名称——没有尖括号:文件夹本身承载折叠状态(聊天隐藏时为关闭,显示时为打开),因此该行读起来是一个标记而不是两个。

点击一个项目会展开其聊天;该行的 + 会在其中开始一个新聊天;
🗑 仅移除注册(目录和会话日志保留)。

用该分区的 +(或空状态下的 选择项目 按钮)添加一个:它会立即向 Host 请求其目录选择器,中间没有表单,并采用返回的任何结果。取消选择器不是错误,也不会改变任何东西。

该选择器是 Host 自有的目录选择能力——与随附的“选择工作区”手势使用的是同一个。如果某个组合省略了目录选择包,则添加项目不可用,皮肤会内联说明这一点,而不是静默地什么都不做。

最近

最近列出属于没有项目的聊天——即此皮肤从新对话启动的那些,加上注册表未归入任何项目的任何会话。项目自身的聊天通过展开该项目来访问,因此在这里也列出它们会在两个标题下显示同一个聊天两次。

一旦聊天被归入某个项目,它就会从最近移入该项目,并且自始至终保留自己的工作目录——磁盘上不会移动任何东西。

会话行带有一个悬停显示的 🗑,它的作用是归档该聊天——archiveSession 是 Host 唯一的会话移除方式。该聊天会离开所有分组界面,其日志文件保留在磁盘上。归档是单向的:客户端 API、Host 命令或随附 UI 中都不存在取消归档。因此该控件刻意设为两步——垃圾桶将该行变为问题 归档“”?,并指明它要退役的聊天,只有回答才会归档它。一个单击、单向、悬停显示、位于你正瞄准的行最右边缘的控件是个陷阱;而一个问题不是。

该行立即消失是此皮肤自己的行为:会话列表不携带归档集合,因此该集合从 Workspace 投影读取并在此处减去——与随附的浏览区域完全一样。

无项目的工作目录位于何处

$DSH_HOME/codex-workspaces/-/     # $DSH_HOME defaults to ~/.dsh

刻意不使用其他侧边栏皮肤所用的 scratch 目录:两个插件共享一个根目录会让任一方的清理删除另一方的活动会话目录。

没有任何东西会自动清理此目录,其中也没有任何内容显示为项目——无项目聊天出现在最近下,这正是预期的形态。当你不再想要某个聊天时,手动删除其目录。

一个值得知道的后果:每次点击新对话都会生成一个新目录并注册它,因此工作区注册表会为每个无项目聊天增加一行——新聊天意味着新工作目录,就像 Codex 应用所做的那样。这些行不会出现在项目中,但它们是真实的注册;移除一个(🗑 仅对项目有效,因此请使用随附的工作区 UI 或 workspace.json)会移除注册并保留目录和聊天日志。

自定义
字标。 lib/client.js 定义了 BrandName;修改它返回的字符串。

不隐藏全局面板行。 从 lib/client.js 的 CSS 中删除这一行:

nav[class="_panelList"] { display: none !important; }

它存在是因为动态加载的客户端插件可能会注册一个全局面板行(Pull requests / Scheduled / Plugins 行就是这样到达侧边栏的)。默认组合不注册任何面板行,所以有了这条规则,侧边栏只显示 Projects 和 Recents;去掉它之后,插件贡献的任何面板行又变得可达了。

这个皮肤不做什么

随附的浏览器还提供会话搜索、重命名、分叉、拖拽重排序和子代理谱系。这个皮肤刻意不提供其中任何一项——它是一个皮肤,不是第二个浏览器。(它确实提供删除聊天,因为一个你无法修剪的列表不是一个你拥有的列表。)如果你需要其余功能,请移除该插件。(在 lib/client.js 中将 SHADOW_PRIORITY 设置为高于 0,会把两个被占用的单元格交还给随附实现,从而在不卸载的情况下关闭该皮肤。)

工作原理

Node 部分(lib/index.js)在 harness web 服务器上暴露两个 exact 路由——分配一个工作目录(并报告根目录以及其下已经创建的所有内容),以及删除此插件分配的目录。名称完全由服务器生成,删除只接受名称,并且每个名称都会被验证为单个路径段,并在解析后重新检查是否包含在内。任何调用方提供的路径都不会到达文件系统。浏览器部分在加载时扫描所读取的列表,就是用它来区分一个没有任何引用的目录和一个有活跃工作所在的目录。
* 浏览器部分(lib/client.js)占用两个 single 槽位:
sidebar.brand.name 用于字标,sidebar.workspaces 用于浏览区域。single 槽位是被占用而不是被组合的——注册表会拒绝在同一优先级上的第二次注册——因此这个皮肤以 SHADOW_PRIORITY(-10)注册,最低优先级者渲染。如果插件被卸载,或者此条目在渲染崩溃后让出,随附浏览器会无需重新加载就收回该单元格。
* 减法通过 CSS 实现,而不是遮蔽组件。移除随附的面板行和随附的 New Session 按钮是一种减法,而为此遮蔽整个 sidebar 槽位将意味着重新实现品牌行、折叠动画、侧边栏和设置脚注——这是这个皮肤没有意见的四个随附行为。

验证源代码

npm run check          # node --check on both halves of the plugin

生态系统

这个插件按照 harness 要求第三方发布的方式发布:仓库带有 dsh-plugin 主题以便被发现,安装通过 dsh plugin add github:… 进行,而不是向核心仓库提交拉取请求,后者
不接受外部 PR。

许可证

MIT

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群