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

桌面外壳 whitewizard856/Deepcat

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

把内核网页界面装进独立窗口,管理托盘与快捷键

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · desktop
装得上吗
本站尚未做安装检查
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 16 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
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。
预览分享卡片长什么样 ↓whitewizard856/Deepcat
分享 · DeepSeek Harness Hub
whitewizard856/Deepcat

把内核网页界面装进独立窗口,管理托盘与快捷键

回到顶部