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

桌面宠物伙伴 vortioxetine213/dsh-coo-pet

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

把 Coopanion 的桌宠接进 DeepSeek Harness DSH。

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

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

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add vortioxetine213/dsh-coo-pet
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · tool
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 11 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-coo-pet(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22.13.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/22 11:42:45

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

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 39 处,展示前 38 条)
  • 执行外部命令固定命令
    lib/assets.mjs:48
    const text = execFileSync('reg', ['query', key, '/s', '/f', 'Coopanion'], {
  • 读取本地文件
    lib/assets.mjs:71
    const looksRight = (root) => !!root && existsSync(join(root, PET_PKG, 'web', 'pet.html'));
  • 读取本地文件
    lib/assets.mjs:200
    for (const entry of readdirSync(dir, { withFileTypes: true })) {
  • 读取本地文件
    lib/assets.mjs:208
    const s = statSync(full);
  • 读取本地文件
    lib/assets.mjs:245
    const hasCopy = existsSync(petHtml);
  • 读取本地文件
    lib/assets.mjs:249
    oldStamp = readFileSync(stampFile, 'utf8').trim();
  • 读取本地文件
    lib/assets.mjs:256
    if (!existsSync(join(src, 'pet.html'))) return { ok: false, reason: `没在 ${src} 找到桌宠页面素材` };
  • 删除本地文件递归
    lib/assets.mjs:259
    rmSync(dest, { recursive: true, force: true });
  • 写入本地文件
    lib/assets.mjs:260
    mkdirSync(dest, { recursive: true });
  • 写入本地文件
    lib/assets.mjs:263
    writeFileSync(stampFile, stamp);
  • 写入本地文件
    lib/assets.mjs:279
    if (patched.text !== before) writeFileSync(appFile, patched.text);
  • 读取本地文件
    lib/brain.mjs:60
    if (!existsSync(this.file)) return;
  • 读取本地文件
    lib/brain.mjs:61
    const lines = readFileSync(this.file, 'utf8').split('\n').filter(Boolean).slice(-KEEP);
  • 写入本地文件
    lib/brain.mjs:73
    mkdirSync(dirname(this.file), { recursive: true });
  • 写入本地文件
    lib/brain.mjs:74
    appendFileSync(this.file, `${JSON.stringify({ role, text, at: new Date().toISOString() })}\n`);
  • 写入本地文件
    lib/brain.mjs:84
    writeFileSync(this.file, '');
  • 读取本地文件
    lib/coo.mjs:60
    if (!existsSync(file)) return null;
  • 读取本地文件
    lib/coo.mjs:61
    const cfg = JSON.parse(readFileSync(file, 'utf8'));
  • 读取本地文件
    lib/impl.js:68
    if (!existsSync(legacy) || resolve(legacy) === resolve(target)) return target;
  • 读取本地文件
    lib/impl.js:69
    if (existsSync(target) && readdirSync(target).length > 0) return target;
  • 读取本地文件
    lib/impl.js:69
    if (existsSync(target) && readdirSync(target).length > 0) return target;
  • 写入本地文件
    lib/impl.js:72
    mkdirSync(dirname(target), { recursive: true });
  • 写入本地文件
    lib/impl.js:74
    renameSync(legacy, target);
  • 读取本地文件
    lib/impl.js:113
    if (!existsSync(exe)) continue;
  • 执行外部命令来自配置/变量
    lib/impl.js:116
    spawn(exe, [`--app=${url}`, '--window-size=560,860'], { detached: true, stdio: 'ignore' }).unref();
  • 执行外部命令固定命令
    lib/impl.js:126
    spawn('cmd', ['/c', 'start', '', url], { detached: true, stdio: 'ignore', windowsHide: true }).unref();
  • 执行外部命令固定命令
    lib/impl.js:128
    spawn('open', [url], { detached: true, stdio: 'ignore' }).unref();
  • 执行外部命令固定命令
    lib/impl.js:130
    spawn('xdg-open', [url], { detached: true, stdio: 'ignore' }).unref();
  • 写入本地文件
    lib/impl.js:217
    mkdirSync(dataDir, { recursive: true });
  • 读取本地文件
    lib/impl.js:249
    if (existsSync(skinFile)) savedSkin = JSON.parse(readFileSync(skinFile, 'utf8'));
  • 读取本地文件
    lib/impl.js:249
    if (existsSync(skinFile)) savedSkin = JSON.parse(readFileSync(skinFile, 'utf8'));
  • 写入本地文件
    lib/impl.js:372
    writeFileSync(skinFile, JSON.stringify(SKIN, null, 2));
  • 读取本地文件
    lib/pet-server.mjs:256
    const bytes = file ? await readFile(file).catch(() => null) : null;
  • 读取本地文件
    lib/pet-server.mjs:301
    const m = JSON.parse(readFileSync(join(this.opts.webDir, 'whale', 'figure.json'), 'utf8'));
  • 读取本地文件
    lib/pet-server.mjs:328
    const bytes = await readFile(full);
  • 读取本地文件
    lib/pet-window.mjs:50
    if (!existsSync(exe)) {
  • 执行外部命令来自配置/变量
    lib/pet-window.mjs:64
    this.child = spawn(exe, ['--pet-host', `--pet-url=${url}`, `--parent-pid=${process.pid}`], {
  • 执行外部命令固定命令
    lib/pet-window.mjs:99
    if (process.platform === 'win32') spawn('taskkill', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true });
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-tools
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 桌面养虚拟宠物
  • 宠物有记忆
  • 宠物可聊天

README

由 DeepSeek 最新模型翻译生成
dsh-coo-pet 把 Coopanion 的桌宠接进 DeepSeek Harness (DSH)。 她住在你的桌面上,大脑是 DSH 里的一个独立会话 —— 有自己的记忆,能跟你聊天,也能跟 Coopanion 里那只 Coo 聊天:两只桌宠各说各的,各自用自己的气泡说话。 ┌──────────────────────────┐ │ Coopanion 的桌宠窗口 │ 透明、置顶、点击穿透; │ whale 形象 / 走位 / 拖拽 │ 由 Coopanion 自带的 pet-host 提供 └───────────┬──────────────┘ │ WebSocket(pet 协议) ┌───────────▼──────────────┐ │ pet-server(本插件) │ 127.0.0.1,只认回环 Host └───────────┬──────────────┘ │ ┌───────────▼──────────────┐ ┌─────────────────────┐ │ brain(本插件) │ │ Coopanion 的 Coo │ │ 独立会话 · 独立记忆 │◄──────►│ 终端对话 World │ └──────────────────────────┘ └─────────────────────┘
展开完整文档(README 剩余 1 节)
dsh-coo-pet

把 Coopanion 的桌宠接进 DeepSeek Harness (DSH)。

她住在你的桌面上,大脑是 DSH 里的一个独立会话 —— 有自己的记忆,能跟你聊天,也能跟 Coopanion 里那只 Coo 聊天:两只桌宠各说各的,各自用自己的气泡说话。

┌──────────────────────────┐
│ Coopanion 的桌宠窗口 │ 透明、置顶、点击穿透; │ whale 形象 / 走位 / 拖拽 │ 由 Coopanion 自带的 pet-host 提供 └───────────┬──────────────┘ │ WebSocket(pet 协议) ┌───────────▼──────────────┐ │ pet-server(本插件) │ 127.0.0.1,只认回环 Host └───────────┬──────────────┘ │ ┌───────────▼──────────────┐ ┌─────────────────────┐ │ brain(本插件) │ │ Coopanion 的 Coo │ │ 独立会话 · 独立记忆 │◄──────►│ 终端对话 World │ └──────────────────────────┘ └─────────────────────┘

先决条件:必须先装 Coopanion

桌宠的窗口和外形全部来自 Coopanion,本插件在运行时从你已安装的那份里读取: 它去 cortico-world-desktop-pet/web/ 取页面与形象素材,并用 Coopanion.exe --pet-host 起桌宠窗口。不装 Coopanion,就没有形象、也没有窗口。

本插件不分发 Coopanion 的任何代码或贴图。 那些素材是 AGPL-3.0 的,而 web/whale/ 的贴图连 AGPL 都不覆盖 —— 原作者在 THIRD_PARTY_NOTICES 里明确写了 "不在本包的 AGPL 授权范围内",而且围裙上印着 DeepSeek、OpenAI、Anthropic、Google、阿里云、月之暗面、MiniMax 的商标。所以本仓库一张图、一行别人的代码都不放, 一律运行时从用户自己的安装里取。细节见 LICENSE 与 lib/assets.mjs。

插件会自己找 Coopanion 的安装目录:先看 cooRoot 配置,再问 Windows 注册表, 最后试几个常见位置;都找不到才会报错并提示你在配置里指定。

安装

desktop 换成你自己的 DSH profile 名。

从 GitHub
dsh plugin --profile desktop add github:vortioxetine213/dsh-coo-pet

或从 npm(收录之后)
dsh plugin --profile desktop add dsh-coo-pet

装完重启 DSH,她会自己上桌。

更新

这一段是写给你的 DSH 里的 AI 看的。 把这个仓库地址和这段字发给它,它就知道该怎么更新, 而且不会把她聊过的话和换过的衣服弄丢。

随手重跑一遍 add 是不管用的。dsh plugin add 只是把参数转给 pnpm add;同一条 github: 依赖已经在 lockfile 里时,pnpm 解析出同一个 commit,直接打一句 Already up to date —— 一行新代码都不会下。另外 pnpm 拉 GitHub 依赖走的是 codeload.github.com,而 git 的 insteadOf 重写不管这个域名,所以哪怕 github.com 能开,它也可能 404。

1. 先看装的是哪个版本

dsh plugin --profile desktop list

或者直接读 profile 目录下 node_modules/dsh-coo-pet/package.json 的 version,跟本仓库的比。

2. 先备份她的数据(仅 0.1.x 需要)

0.1.x 的数据是放在包里面的:data/brain.jsonl(她的记忆)、data/skin.json(她的外观)、
data/web/(取来的素材)、data/pet-window/(Chromium 档案)。删包会把它们一起删掉。
所以第 3 步之前,先把整个 data 目录拷到别处,装完再拷回新包里。

0.2.0 起数据改放在 %DSH_HOME%\dsh-coo-pet\(通常是 C:\Users\<你>\.dsh\dsh-coo-pet\), 在包外面,更新不再碰它。从 0.1.x 升上来时,插件第一次启动会自动把它搬过去 ——前提是那时旧的 data 目录还在;要是已经删了,就自己拷一份回去。

3. 先删,再装

dsh plugin --profile desktop remove dsh-coo-pet
dsh plugin --profile desktop add github:vortioxetine213/dsh-coo-pet

必须先 remove:光 add 就是那条会打 Already up to date 的命令。

如果 add 在从 codeload.github.com 拉取时报错,就先用镜像 clone 下来,再从本地目录装:

git clone https://gh-proxy.com/https://github.com/vortioxetine213/dsh-coo-pet
dsh plugin --profile desktop add file:<clone 下来的目录>

4. 重启 DSH

升级只有重启后才生效。plugin_manager set_bundle(关掉再打开)能重载代码,但升级之后请直接重启。

5. 验一下

- pet_status 应该报出窗口、气泡连着、记忆有多少条 —— 而不是报后端降级。
- 如果她该跟 Coo 聊天,跑一次 /pet-chat 1,看有没有 Coo 的话回来。一句都不回来通常是 Coopanion 没开,或者它的对话通道又被改名了(见下面的更新记录,0.2.0 起插件自己会认)。

更新记录

| 版本 | 改了什么 |
| 0.2.1 | 上游只换了衣服、没动页面代码时也能跟上 —— 素材指纹从「只看 pet-app.js」改成扫整个 web/ 目录。Coopanion 0.2.8 那套店员装就是这种情况:贴图和 figure.json 是新的,页面一行没改。 |
| 0.2.0 | 跟 Coo 说话不再写死 world:terminal —— Coopanion 把它改名成 world:console 之后,所有旧版本都连不上;现在自动探测并回退。她的数据搬出包目录,更新不再弄丢记忆和外观。 |
| 0.1.0 | 第一个公开版:桌宠窗口、气泡对话、独立会话大脑、双鲸聊天、换装页,以及音效、帧率、任务栏那几处修复。 |

用法

跟她说话:双击她,或者把鼠标停在她身上点旁边冒出来的「打字」按钮。
她的话会以气泡显示在头顶,一边想一边逐字蹦出来。

让她跟 Coo 聊天:两个入口,都不烧到你想停为止。

| 入口 | 怎么写 |
| DSH 输入框 | /pet-chat 开聊、/pet-chat-stop 叫停 |
| 桌宠身上 | 鼠标停在她身上,点那个「跟 Coo 聊天」按钮 —— 同一个键管开关,再点一下暂停 |

/pet-chat 还能带参数:

/pet-chat 5 今天谁摸鱼摸得多 # 聊 5 个来回,并给个开场话题 /pet-chat 0 # 一直聊到你喊停

默认关着,不会自动开聊 —— 互聊时两边都在调模型,是要花 token 的。

配置

都在 cordis.patch.yml 里,改完重载插件生效。一般只有前两个需要动。

| 键 | 说明 |
| cooRoot | Coopanion 的安装目录。默认自动探测 |
| brain | session(默认)= 她的大脑是 DSH 里的独立会话;local = 插件内自建会话,没有工具、最省 token |
| skin.scheme | 配色:deepseek / harness / chatgpt / claude / gemini / qwen / kimi / minimax |
| chatRounds | 上面那个按钮和不带数字的 /pet-chat 默认聊几个来回(最多 10) |
| user | 她怎么称呼你,默认「主人」 |
| autoStart | 装上就上桌,默认 true |
| port | 桌宠页面服务器端口,默认让系统分配 |
| petExe | Coopanion.exe 的路径,默认取 cooRoot 下的 |
| dataDir | 她的数据放哪(记忆、外观、窗口档案、取来的素材),默认 $DSH_HOME/dsh-coo-pet —— 在包外面,升级不会删 |

两种大脑的区别

| | local | session(默认) |
| 记忆 | data/brain.jsonl,最近 40 句 | DSH 原生持久化,会话列表里能翻到 |
| 人格 | 插件内置的鲸鲸人设 | DSH 的 preset 人格 |
| 每轮开销 | 小(一段人设 + 40 句历史) | 大(preset 的完整系统提示 + 工具定义) |
| 工具 | 没有,她只聊天 | 有,她那个会话会拿到 DSH 的工具 |
| 速度 | 快 | 慢一些(要走一整轮 agent loop) |

session 模式下有一条保险:会话后端一旦出错(流断了、等太久、preset 没配好), 插件会自动退回 local 重试一次 —— 她不会因为换了后端就说不出话。

给 DSH 里的 AI 用的工具

装好之后,你的 AI 会多出这些工具:

| 工具 | 干什么 |
| pet_say | 让桌宠说一句(直接上气泡,不过大脑、不进记忆) |
| pet_talk | 跟桌宠聊天,返回她的原话 |
| pet_status | 看她现在的状态:窗口、气泡、记忆条数、聊天开关 |
| pet_window | open / close / restart 让她上下桌 |
| coo_talk | 跨程序跟 Coopanion 的 Coo 说一句,把她的原话带回来 |
| pet_spar | 上面那个聊天开关(工具版) |
| pet_forget | 清空她的记忆 |

常见问题

装完没有桌宠。 99% 是没找到 Coopanion。先确认它确实装了,然后在 cordis.patch.yml 里写明确路径:

config:
cooRoot: 'D:\你的\Coopanion'

窗口出来了但是空的(没有鲸鱼)。
极可能是 Chromium profile 撞车:Coopanion 默认把 pet-host 的档案放在 <安装目录>\data\pet-window,如果它自己的桌宠正跑着,两个进程抢同一个 GPU 缓存目录, 后起的那个 WebGL 起不来。本插件已经用 CORTICO_COMPANION_DATA 把窗口档案指到自己的 dataDir 了 —— 如果你改过这个变量,检查一下别指回 Coopanion 的目录。

她说话很长、还爱分条列点。
插件在出气泡之前会强制压成一句(去换行、剥编号、超 80 字截断);如果还是长,
把 brain 换成 local,内置人设里对长度管得更严。

许可

代码是 MIT。Coopanion 的素材不在本项目的授权范围内,见上面「先决条件」, 以及 LICENSE 末尾那段说明。

开发

见 dev/NOTES.md —— 里面有架构决策、踩过的坑、验证记录和调试脚本的用法。
预览分享卡片长什么样 ↓vortioxetine213/dsh-coo-pet
分享 · DeepSeek Harness Hub
vortioxetine213/dsh-coo-pet

把 Coopanion 的桌宠接进 DeepSeek Harness DSH。

这是你的仓库?认领条目

回到顶部