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

机器人侧栏整合包 Audrey-cn/dsh-bot-codex-ui

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

一次装好 Bot 团队与侧边栏,修好布局冲突

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]!
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
数据截至 2026/11/03·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/05·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 21 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

⚠︎ 实装验证未通过(unknown · 2026/11/3) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 61 处,展示前 59 条)
  • 发起网络请求
    ds-bot/client.js:1162
    response = await fetch(ROUTE, {
  • 写入剪贴板
    ds-bot/client.js:5055
    void navigator.clipboard?.writeText(text).then(() => {
  • 写入剪贴板
    ds-bot/client.js:11938
    var copy = (text) => navigator.clipboard === void 0 ? Promise.resolve(false) : navigator.clipboard.writeText(text).then(() => true, () => false);
  • 写入剪贴板
    ds-bot/client.js:12915
    [[t("Copy conversation ID"), CopyIcon, () => navigator.clipboard?.writeText(bot ? currentPart(bot) : menu.id)]],
  • 写入剪贴板
    ds-bot/client.js:13449
    void navigator.clipboard?.writeText(transcript).then(() => {
  • 写入剪贴板
    ds-bot/client.js:15131
    void navigator.clipboard?.writeText(text).then(() => {
  • 写入本地文件
    ds-bot/dev/characters.mjs:580
    writeFileSync(process.argv[out + 1], `<!doctype html><meta charset="utf-8"><style>body{margin:0;font:13px -apple-system,system-ui,sans-serif;backgroun
  • 写入本地文件
    ds-bot/dev/llm-tap.mjs:30
    if (bodies) mkdirSync(bodies, { recursive: true })
  • 发起网络请求
    ds-bot/dev/llm-tap.mjs:178
    upstreamResponse = await fetch(`${base}${req.url.replace(/^ v1/, '')}`, { method: req.method, headers, body: raw.length > 0 ? raw : undefined })
  • 写入本地文件
    ds-bot/dev/llm-tap.mjs:182
    appendFileSync(log, JSON.stringify({ t: new Date().toISOString(), id, path: req.url, error: error.message }) + '\n')
  • 写入本地文件
    ds-bot/dev/llm-tap.mjs:197
    appendFileSync(log, JSON.stringify({ t: new Date().toISOString(), id, path: req.url, status: upstreamResponse.status }) + '\n')
  • 写入本地文件
    ds-bot/dev/llm-tap.mjs:206
    if (bodies) writeFileSync(path.join(bodies, `${id}-${call.kind}-${String(who).replace(/[^ .-]+/g, '_')}.json`), raw)
  • 写入本地文件
    ds-bot/dev/llm-tap.mjs:207
    appendFileSync(log, JSON.stringify({
  • 写入本地文件
    ds-bot/dev/logo.mjs:29
    mkdirSync(out, { recursive: true })
  • 写入本地文件
    ds-bot/dev/logo.mjs:32
    writeFileSync(file, logo(mode))
  • 读取本地文件
    ds-bot/dev/memory-e2e.mjs:27
    const url = readFileSync(join(HOME, 'web.log'), 'utf8').match(new RegExp(`http://127\\.0\\.0\\.1:${PORT}/\\?token=\\S+`))?.[0]
  • 发起网络请求
    ds-bot/dev/memory-e2e.mjs:29
    cookie = (await fetch(url, { redirect: 'manual' })).headers.getSetCookie().map(value => value.split(';')[0]).join('; ')
  • 发起网络请求
    ds-bot/dev/memory-e2e.mjs:31
    const response = await fetch(`${BASE}/api/bot`, { method: 'POST', headers: { 'content-type': 'application/json', cookie }, body: JSON.stringify({ endp
  • 读取本地文件
    ds-bot/dev/memory-e2e.mjs:51
    const tapLines = () => (args.tap && existsSync(args.tap) ? readFileSync(args.tap, 'utf8').split('\n').filter(Boolean).map(line => JSON.parse(line)) :
  • 读取本地文件
    ds-bot/dev/memory-e2e.mjs:51
    const tapLines = () => (args.tap && existsSync(args.tap) ? readFileSync(args.tap, 'utf8').split('\n').filter(Boolean).map(line => JSON.parse(line)) :
  • 读取本地文件
    ds-bot/dev/memory-e2e.mjs:54
    return existsSync(path) ? readFileSync(path, 'utf8').split('\n').filter(Boolean).map(line => JSON.parse(line)) : []
  • 读取本地文件
    ds-bot/dev/memory-e2e.mjs:54
    return existsSync(path) ? readFileSync(path, 'utf8').split('\n').filter(Boolean).map(line => JSON.parse(line)) : []
  • 写入本地文件
    ds-bot/dev/memory-e2e.mjs:186
    if (args.out) writeFileSync(args.out, JSON.stringify({ memory, results, log, journal: journal() }, null, 2))
  • 写入本地文件
    ds-bot/dev/mock-llm.mjs:65
    mkdirSync(dirname(LOG), { recursive: true })
  • 写入本地文件
    ds-bot/dev/mock-llm.mjs:619
    appendFileSync(LOG, JSON.stringify({ t: new Date().toISOString(), id: ++seq, images: 0, searchApi: { path: req.url, body, auth: req.headers.authorizat
  • 写入本地文件
    ds-bot/dev/mock-llm.mjs:648
    appendFileSync(LOG, JSON.stringify({ t: new Date().toISOString(), id, images, rejectedImages: true, messages: body.messages?.length ?? 0, last: textOf
  • 写入本地文件
    ds-bot/dev/mock-llm.mjs:656
    appendFileSync(LOG, JSON.stringify({ t: new Date().toISOString(), id, images, overflow: true, messages: body.messages?.length ?? 0, last: textOf(body.
  • 写入本地文件
    ds-bot/dev/mock-llm.mjs:662
    appendFileSync(LOG, JSON.stringify({ t: new Date().toISOString(), id, images, auth: true, messages: body.messages?.length ?? 0 }) + '\n')
  • 写入本地文件
    ds-bot/dev/mock-llm.mjs:668
    appendFileSync(LOG, JSON.stringify({ t: new Date().toISOString(), id, images, fail: true, messages: body.messages?.length ?? 0 }) + '\n')
  • 写入本地文件
    ds-bot/dev/read-page-check.mjs:33
    if (outDir) mkdirSync(outDir, { recursive: true })
  • 写入本地文件
    ds-bot/dev/read-page-check.mjs:48
    writeFileSync(join(outDir, `${String(index + 1).padStart(2, '0')}-read.json`), JSON.stringify({ url, ms, ...read }, null, 2))
  • 写入本地文件
    ds-bot/dev/read-page-check.mjs:49
    writeFileSync(join(outDir, `${String(index + 1).padStart(2, '0')}-tool-result.txt`), text)
  • 读取本地文件
    ds-bot/dev/read-pages.mjs:27
    const file = await readFile(join(root, name))
  • 读取本地文件
    ds-bot/dev/shared-home-check.mjs:24
    const saved = () => JSON.parse(readFileSync(join(HOME, 'bot', 'state.json'), 'utf8'))
  • 读取本地文件
    ds-bot/dev/shared-home-check.mjs:28
    const log = readFileSync(join(HOME, 'web.log'), 'utf8')
  • 发起网络请求
    ds-bot/dev/shared-home-check.mjs:31
    const cookie = (await fetch(login, { redirect: 'manual' })).headers.getSetCookie().map(value => value.split(';')[0]).join('; ')
  • 发起网络请求
    ds-bot/dev/shared-home-check.mjs:32
    const web = (endpoint, payload = {}) => fetch(`http://127.0.0.1:${webPort}/api/bot`, {
  • 发起网络请求
    ds-bot/dev/shared-home-check.mjs:37
    const desktop = (endpoint, payload = {}) => page.evaluate(([e, p]) => fetch('api/bot', {
  • 读取本地文件
    ds-bot/dev/smoke.mjs:29
    const readJson = path => JSON.parse(readFileSync(path, 'utf8'))
  • 读取本地文件
    ds-bot/dev/smoke.mjs:32
    return readFileSync(join(HOME, 'mock.jsonl'), 'utf8').split('\n').filter(Boolean).map(line => JSON.parse(line))
  • 读取本地文件
    ds-bot/dev/smoke.mjs:40
    const log = readFileSync(join(HOME, 'web.log'), 'utf8')
  • 发起网络请求
    ds-bot/dev/smoke.mjs:43
    const response = await fetch(url, { redirect: 'manual' })
  • 发起网络请求
    ds-bot/dev/smoke.mjs:51
    const response = await fetch(`${BASE}/api/bot`, {
  • 读取本地文件
    ds-bot/dev/smoke.mjs:273
    try { return readFileSync(join(HOME, 'bot', 'memory', ...path, 'MEMORY.md'), 'utf8') } catch { return '' }
  • 读取本地文件
    ds-bot/dev/smoke.mjs:360
    const folderOf = sessionId => readdirSync(join(HOME, 'sessions')).find(dir => existsSync(join(HOME, 'sessions', dir, sessionId)))
  • 读取本地文件
    ds-bot/dev/smoke.mjs:360
    const folderOf = sessionId => readdirSync(join(HOME, 'sessions')).find(dir => existsSync(join(HOME, 'sessions', dir, sessionId)))
  • 删除本地文件递归
    ds-bot/dev/smoke.mjs:375
    rmSync(project, { recursive: true, force: true })
  • 写入本地文件
    ds-bot/dev/smoke.mjs:439
    if (outFile) writeFileSync(outFile, `${JSON.stringify(transcript, null, 2)}\n`)
  • 发起网络请求
    ds-bot/dev/steward-eval.mjs:177
    const response = await fetch(url, { method: 'POST', headers, body: JSON.stringify(body) })
  • 写入本地文件
    ds-bot/dev/steward-eval.mjs:211
    if (args.out) writeFileSync(args.out, JSON.stringify(results, null, 2))
  • 写入本地文件
    ds-bot/dev/ui-shots.mjs:29
    mkdirSync(outDir, { recursive: true })
  • 执行外部命令固定命令
    ds-bot/dev/ui-shots.mjs:34
    try { return execFileSync('sh', ['-c', `command -v ${name}`], { encoding: 'utf8' }).trim() } catch {}
  • 读取本地文件
    ds-bot/dev/ui-shots.mjs:48
    const log = readFileSync(join(root, `.dsh-test-${target}`, 'web.log'), 'utf8')
  • 发起网络请求
    ds-bot/dev/ui-shots.mjs:75
    const result = await page.evaluate(([e, p]) => fetch('api/bot', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringif
  • 发起网络请求
    ds-bot/web-search.js:376
    return { id, name: shape.name, url: shape.url(base, model), model, auth: shape.auth, request: call => shape.request({ ...call, model }), read: shape.r
  • 发起网络请求
    ds-bot/web-search.js:562
    const call = candidate.request({ query: request.query, maxResults: request.maxResults })
  • 发起网络请求
    ds-bot/web-search.js:567
    response = await deps.fetch(candidate.url, {
  • 发起网络请求
    ds-bot/web-search.js:772
    fetch: (url, init) => fetch(url, init),
  • 发起网络请求
    ds-bot/web-search.js:773
    webFetch: (request, signal) => ctx.web.fetch(request, signal),
扫描于 2026/11/5(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

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

DS Bot 和 Codex 风格侧边栏统一安装,布局冲突已修复。DeepSeek Harness 一个包搞定。

README

由 DeepSeek 最新模型翻译生成
dsh-bot-codex-ui 一次安装,同时搞定 DS Bot 团队和 Codex 风格侧边栏,还修好了两者的布局冲突。 这个插件把改过的 ds-bot(Bot 团队、群聊、记忆)和 dsh-codex-ui 侧边栏皮肤打包成一个 DSH 插件。两个插件分开装时会出现视觉冲突,这里一并修掉。 站在两个巨人的肩膀上:Fei2411/DeepSeek-Bot 和 MichengAI/dsh-codex-ui。 你能得到什么 - DS Bot:一群常驻 Bot,支持群聊、记忆、能力与用量追踪。 - Codex 风格侧边栏:工作区树、搜索、轮次导航,现代布局。 - 修好的布局:输入框、侧边栏页脚、账号入口、会话宽度不再互相打架。
展开完整文档(README 剩余 1 节)
dsh-bot-codex-ui

一次安装,同时搞定 DS Bot 团队和 Codex 风格侧边栏,还修好了两者的布局冲突。

这个插件把改过的 ds-bot(Bot 团队、群聊、记忆)和 dsh-codex-ui 侧边栏皮肤打包成一个 DSH 插件。两个插件分开装时会出现视觉冲突,这里一并修掉。

站在两个巨人的肩膀上:Fei2411/DeepSeek-Bot 和 MichengAI/dsh-codex-ui。

你能得到什么

- DS Bot:一群常驻 Bot,支持群聊、记忆、能力与用量追踪。
- Codex 风格侧边栏:工作区树、搜索、轮次导航,现代布局。
- 修好的布局:输入框、侧边栏页脚、账号入口、会话宽度不再互相打架。

修了什么

| # | 问题(两个插件都装时) | 修复 |
| 1 | 输入框控制行错位,按钮挤成一团 | 恢复官方列结构 |
| 2 | 输入框内部间距不对 | 恢复官方 gap 和 padding |
| 3 | 底部控制带太紧(按钮几乎贴一起) | 恢复 10px 节奏 |
| 4 | 侧边栏页脚堆成两行 | 强制单行 flex |
| 5 | 页脚高度在不同界面间跳变 | 锁定 60px |
| 6 | 横向分隔线在不同模式下不一致 | 在页脚自身声明 |
| 7 | 账号入口比模式标签宽 | 单个 36px 图标;隐藏名称标签 |
| 8 | 模式切换单向(只能在 Agent 模式) | 双标签切换(Agent / DS Bot) |
| 9 | 「连接插件」按钮常驻红色「!」角标 | 移进账号菜单;角标下线 |
| 10 | 会话列比经典 Agent 界面宽 | 移除本地宽度锁定 |

安装

从 GitHub 安装(这个包通过 file: 依赖内置 ds-bot,所以没法发到 npm —— GitHub 就是分发渠道):

dsh plugin --profile web add github:Audrey-cn/dsh-bot-codex-ui

或者从本地检出安装:

dsh plugin --profile web add file:/path/to/dsh-bot-codex-ui

不要单独安装 ds-bot 或 @michengai/dsh-codex-ui —— 这个插件已经内置两者。一起装会出现重复的插件条目。

自检

挂载两秒后,插件会在渲染出的 DOM 里验证自己的布局修复:

1. 输入框行包裹层存在,且是 flex 容器(不是 display:contents)。
2. 侧边栏页脚是单行 flex。
3. 红色警告角标已隐藏。
4. 模式标签已渲染。
5. 账号入口是单个图标(没有名称标签)。

任何一项检查失败,角落会弹出可关闭的红色警告,控制台也会列出哪里出了问题。这样能避免静默失败 —— 也就是 bug 悄悄回来,一点信号都没有。

构建

npm run build # writes client.js
npm run check # 校验 client.js 是否最新

仓库结构

dsh-bot-codex-ui/
package.json dsh.bundle 清单 + 依赖 cordis.patch.yml 挂载 codex-ui + ds-bot + 自检 index.js 宿主桩 src/client/index.js 自检客户端插件 ds-bot/ 内置的 ds-bot 分支(含 10 处布局修复) client.js 构建后的自检包 README.md / LICENSE / NOTICE

上游版本

| 上游 | 版本 | 关系 |
| ds-bot | 0.1.5(内置,已修改) | ds-bot/ 目录 |
| @michengai/dsh-codex-ui | 1.1.36(未修改) | npm 依赖 |

ds-bot 发布新版本时,把改动合并进 ds-bot/ 再重新构建。
布局修复都在 ds-bot/src/client/ 里;具体改动看 git log。

协议

Apache-2.0。第三方署名与修改声明见 LICENSE 和 NOTICE。

免责声明

这是独立的社区项目,与 DeepSeek、Fei2411、MichengAI 没有关联,也未获其认可或赞助。「DeepSeek」「DS Bot」「Codex」是各自所有者的商标。
预览分享卡片长什么样 ↓Audrey-cn/dsh-bot-codex-ui
分享 · DeepSeek Harness Hub
Audrey-cn/dsh-bot-codex-ui

一次装好 Bot 团队与侧边栏,修好布局冲突

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