把内核网页界面装进独立窗口,管理托盘与快捷键
30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add whitewizard856/Deepcat该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 41 处,展示前 40 条)
- 写入本地文件build.mjs:34
mkdirSync(join(root, 'dist', 'renderer'), { recursive: true }) - 读取本地文件src/main/armor.ts:29
const text = readFileSync(join(promptsDir, file), 'utf8').trim() - 读取本地文件src/main/armor.ts:40
const raw = JSON.parse(readFileSync(join(userData, 'armor.json'), 'utf8')) as { enabled?: unknown } - 写入本地文件src/main/armor.ts:49
mkdirSync(userData, { recursive: true }) - 写入本地文件src/main/armor.ts:50
writeFileSync(join(userData, 'armor.json'), JSON.stringify({ enabled }, null, 2), 'utf8') - 读取本地文件src/main/index.ts:70
const raw = readFileSync(join(dir, 'package.json'), 'utf8').replace(/^ FEFF/, '') - 读取本地文件src/main/index.ts:96
if (!existsSync(source)) return false - 读取本地文件src/main/index.ts:98
if (!existsSync(join(profile, 'package.json'))) return false - 读取本地文件src/main/index.ts:101
for (const entry of readdirSync(source, { withFileTypes: true })) { - 读取本地文件src/main/index.ts:105
if (existsSync(target)) { - 删除本地文件递归src/main/index.ts:110
rmSync(target, { recursive: true, force: true }) - 读取本地文件src/main/index.ts:140
if (!existsSync(source)) return - 写入本地文件src/main/index.ts:143
mkdirSync(dest, { recursive: true }) - 删除本地文件递归src/main/index.ts:151
rmSync(target, { recursive: true, force: true }) - 写入本地文件src/main/kernel-config.ts:55
mkdirSync(kernelHome, { recursive: true }) - 写入本地文件src/main/kernel-config.ts:57
writeFileSync( - 读取本地文件src/main/kernel-config.ts:106
if (personaPrefix !== null && personaPrefix.trim() !== '' && templatesDir !== undefined && existsSync(templatesDir)) { - 读取本地文件src/main/kernel-config.ts:108
for (const file of readdirSync(templatesDir)) { - 读取本地文件src/main/kernel-config.ts:111
const template = readFileSync(join(templatesDir, file), 'utf8') - 写入本地文件src/main/kernel-config.ts:131
mkdirSync(kernelHome, { recursive: true }) - 写入本地文件src/main/kernel-config.ts:132
writeFileSync(join(kernelHome, 'cordis.patch.yml'), `${lines.join('\n')}\n`, 'utf8') - 读取本地文件src/main/kernel.ts:83
if (!existsSync(KERNEL_BIN)) { - 读取本地文件src/main/kernel.ts:92
const nodePath = existsSync(KERNEL_NODE) ? KERNEL_NODE : process.execPath - 执行外部命令来自配置/变量src/main/kernel.ts:96
const child = spawn(nodePath, args, { - 发起网络请求src/main/kernel.ts:223
const response = await fetch(`http://${HOST}:${port}/`, { - 写入本地文件src/main/log-file.ts:22
mkdirSync(dir, { recursive: true }) - 写入本地文件src/main/log-file.ts:27
appendFileSync(path, `${new Date().toISOString()} ${line}\n`, 'utf8') - 读取本地文件src/main/log-file.ts:28
if (statSync(path).size > MAX_BYTES) rotate(path) - 写入本地文件src/main/log-file.ts:39
renameSync(`${path}.${String(index)}`, `${path}.${String(index + 1)}`) - 写入本地文件src/main/log-file.ts:45
renameSync(path, `${path}.1`) - 读取本地文件src/main/sessions.ts:40
const stat = statSync(file) - 读取本地文件src/main/sessions.ts:42
const text = decodeFrames(readFileSync(file)) - 读取本地文件src/main/sessions.ts:81
workspaces = readdirSync(root) - 读取本地文件src/main/sessions.ts:91
entries = readdirSync(dir) - 读取本地文件src/main/shortcuts.ts:14
const raw = JSON.parse(readFileSync(join(userData, 'shortcuts.json'), 'utf8')) as unknown - 写入本地文件src/main/shortcuts.ts:28
writeFileSync(join(userData, 'shortcuts.json'), JSON.stringify(overrides, null, 2), 'utf8') - 读取本地文件src/main/theme.ts:39
return normalize(JSON.parse(readFileSync(join(userData, 'theme.json'), 'utf8'))) - 写入本地文件src/main/theme.ts:48
writeFileSync(join(userData, 'theme.json'), JSON.stringify(appearance), 'utf8') - 读取本地文件src/main/window-state.ts:16
const raw = JSON.parse(readFileSync(join(userData, 'window-state.json'), 'utf8')) as Partial<WindowState> - 写入本地文件src/main/window-state.ts:31
writeFileSync(join(userData, 'window-state.json'), JSON.stringify(state), 'utf8')
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
Deepcat - 全权由大肥鱼开发的 DeepSeek Harness 桌面壳(其实全是大肥鱼干活。)
README
由 DeepSeek 最新模型翻译生成Deepcat
大肥鱼自研的 DeepSeek Harness 桌面外壳。其实主要是破了个甲。好了接下来全是大肥鱼自己写的。
它是什么
- 一个 Electron 窗口,里面装的是官方 dsh 内核的 Web UI,但壳完全是我们自己的。
- 壳负责:窗口、标题栏、托盘、快捷键、外观、启动与失败状态、内核进程生命周期。
- 内核是外部进程,路径可配(DSH_SHELL_KERNEL),换内核不用改壳。
目录
src/
main/ 主进程 index.ts app 生命周期、窗口、IPC、accelerator kernel.ts 内核子进程:启动 / 就绪 / token 抓取 / 停止 tray.ts 托盘 window-state.ts 窗口位置记忆 theme.ts 外观三档 + 持久化 config.ts 内核路径、端口、超时 preload/ index.ts contextBridge(渲染层唯一入口) webview.ts webview 内快捷键转发 renderer/ App.tsx 壳框架:标题栏 + 内容区 + 启动态 + 命令面板 + 设置 styles.css 设计 token 与组件样式 tools/ make-ico.mjs PNG → ICO build.mjs esbuild 三端打包
下载
装好即用,不需要额外配置。
展开完整文档(README 剩余 1 节)
Deepcat 大肥鱼自研的 DeepSeek Harness 桌面外壳。其实主要是破了个甲。好了接下来全是大肥鱼自己写的。 它是什么 - 一个 Electron 窗口,里面装的是官方 dsh 内核的 Web UI,但壳完全是我们自己的。 - 壳负责:窗口、标题栏、托盘、快捷键、外观、启动与失败状态、内核进程生命周期。 - 内核是外部进程,路径可配(DSH_SHELL_KERNEL),换内核不用改壳。 目录 src/ main/ 主进程 index.ts app 生命周期、窗口、IPC、accelerator kernel.ts 内核子进程:启动 / 就绪 / token 抓取 / 停止 tray.ts 托盘 window-state.ts 窗口位置记忆 theme.ts 外观三档 + 持久化 config.ts 内核路径、端口、超时 preload/ index.ts contextBridge(渲染层唯一入口) webview.ts webview 内快捷键转发 renderer/ App.tsx 壳框架:标题栏 + 内容区 + 启动态 + 命令面板 + 设置 styles.css 设计 token 与组件样式 tools/ make-ico.mjs PNG → ICO build.mjs esbuild 三端打包 下载 装好即用,不需要额外配置。 - Deepcat Setup <version>.exe —— 安装版,选目录、建快捷方式、带卸载程序。 - Deepcat <version>.exe —— 便携版,双击就跑。 - Deepcat-Setup-<version>.7z —— 安装包的压缩副本,解压密码 catness。 两个包都已经把内核带在里面,也带着自带的内容层与插件层,装完就是成品。 内核 vendor/kernel/ 是 DeepSeek Harness 内核的本地副本,不在这个仓库里(0.54 GB,且版权属于上游)。克隆之后要自己放: 从官方 dsh 安装目录拷一份过来 Copy-Item -Recurse <dsh 根目录> vendor\kernel 或者不拷,直接指到已有的内核: $env:DSH_SHELL_KERNEL = 'D:\dsh' 源码里没有任何一行 import 内核代码,壳通过子进程 + HTTP 跟它说话,所以换内核版本不用改壳。 开发 npm install node node_modules\electron\install.js # 首次:补 Electron 二进制 npm run build npx electron . 打包 npm run dist 产物在 release/:Deepcat Setup <version>.exe(NSIS 安装包)、Deepcat <version>.exe(portable)。 快捷键 | 快捷键 | 作用 | | Ctrl+K | 命令面板(焦点在聊天框里也能用) | | Ctrl+, | 设置 | | Esc | 关闭浮层 | 设计 - 画布跟随系统;壳层与内容层由同一套机制驱动,可自由切换 跟随系统 / 深色 / 浅色。 - 深色画布 #151517、浅色 #fff,强调色仅用于状态与主操作。 - 参考:Linear 的克制、Raycast 的命令面板、Claude Desktop 的正文留白、Cursor 的信息密度。 更多背景见 ARCH.md。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
whitewizard856/Deepcat
把内核网页界面装进独立窗口,管理托盘与快捷键
相关插件 · 桌面端
Codex 任务面板chuspeeism/dashi-taskboard
现代化可灵活嵌入的任务面板,支持 Codex、DeepSeek Harness
★ 3,409已汉化DSH
71.7
多智能体自进化开发平台Prism-Shadow/penguin-harness
统一、稳定的 Agent 自进化框架全自动优化:任意模型 · 任意算法 · 任意 Benchmark
★ 3,111已汉化DSH
71.1
桌面宠物PC2005-cloud/dsh-pet
DSH 桌面宠物:一行命令装好即用的透明动画小桌宠,支持多开、大小位置随心配置;还内置 DIY 素材链,能用 AI…
★ 5,341已汉化DSH
71
多端 Agent 工作台GCWing/OpenBitFun
OpenBitFun 是一个高度可定制的开源 Agent 工作台,让任务按你的方式持续推进。
★ 3,449已汉化DSH
70.8
DSH Desktopanywhere-labs/dsh-desktop
为 DeepSeek Harness DSH 插件生态打造的现代化桌面端解决方案。万物皆「插件」,桌面本身也是「插件」。
★ 34,532已汉化DSH
70.7
桌面宠物伴侣OpenPetsHQ/openpets
桌面伴侣平台,带宠物、插件,还能选配本地智能体集成。
★ 1,353已汉化DSH
70.2