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

纸片宠物动画 Traveritas/petween-dsh

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

本仓库已停止维护并归档。 本项目原名 petween,现已更名为 petween-dsh。Petween 已在新仓库…

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

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

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

状态速览

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

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

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

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

展开查看检查明细 ↓

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

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

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/23 08:34:13

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

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 40 处,展示前 40 条)
  • 发起网络请求
    src/client/api.ts:132
    fetch(url, { ...init, signal: init?.signal ?? controller.signal }),
  • 读取本地文件
    src/host/animations.ts:171
    entries = await readdir(this.options.animationsDir)
  • 读取本地文件
    src/host/animations.ts:183
    raw = JSON.parse(await readFile(join(this.options.animationsDir, entry), 'utf8'))
  • 删除本地文件
    src/host/animations.ts:286
    await unlink(join(this.options.animationsDir, fileNameFor(id))).catch(() => undefined)
  • 删除本地文件
    src/host/animations.ts:305
    await unlink(join(this.options.animationsDir, fileNameFor(valid)))
  • 读取本地文件
    src/host/animations.ts:311
    return validateCustomAnimationId(id) !== null && existsSync(join(this.options.animationsDir, fileNameFor(id)))
  • 读取本地文件
    src/host/animations.ts:324
    raw = JSON.parse(readFileSync(join(this.options.animationsDir, fileNameFor(id)), 'utf8'))
  • 读取本地文件
    src/host/animations.ts:341
    entries = readdirSync(this.options.animationsDir)
  • 写入本地文件
    src/host/assets.ts:246
    await mkdir(this.options.assetsDir, { recursive: true })
  • 写入本地文件
    src/host/assets.ts:247
    await writeFile(join(this.options.assetsDir, meta.fileName), buffer)
  • 删除本地文件
    src/host/assets.ts:269
    await unlink(join(this.options.assetsDir, meta.fileName)).catch(() => {
  • 读取本地文件
    src/host/migrate-v2.ts:60
    return JSON.parse(readFileSync(filePath, 'utf8')) as unknown
  • 读取本地文件
    src/host/migrate-v2.ts:79
    entries = readdirSync(petsDir)
  • 读取本地文件
    src/host/migrate-v2.ts:105
    if (!existsSync(join(petsDir, `${id}.json`))) return id
  • 写入本地文件
    src/host/migrate-v2.ts:182
    if (existsSync(configPath)) copyFileSync(configPath, backupPath)
  • 读取本地文件
    src/host/migrate-v2.ts:182
    if (existsSync(configPath)) copyFileSync(configPath, backupPath)
  • 写入本地文件
    src/host/migrate-v2.ts:227
    copyFileSync(configPath, backupPath)
  • 写入本地文件
    src/host/migrate.ts:50
    renameDirSync: (from, to) => renameSync(from, to),
  • 读取本地文件
    src/host/migrate.ts:66
    if (existsSync(targetDir)) return 'skipped'
  • 读取本地文件
    src/host/migrate.ts:67
    if (!existsSync(legacyDir)) return 'skipped'
  • 读取本地文件
    src/host/migrate.ts:83
    if (!existsSync(legacyDir)) return 'skipped'
  • 读取本地文件
    src/host/migrate.ts:90
    if (!existsSync(legacyDir)) return 'skipped'
  • 删除本地文件递归
    src/host/migrate.ts:94
    rmSync(targetDir, { recursive: true, force: true })
  • 读取本地文件
    src/host/pets.ts:396
    entries = await readdir(this.options.petsDir)
  • 读取本地文件
    src/host/pets.ts:407
    raw = JSON.parse(await readFile(join(this.options.petsDir, entry), 'utf8'))
  • 读取本地文件
    src/host/pets.ts:457
    raw = JSON.parse(await readFile(this.filePathFor(valid), 'utf8'))
  • 读取本地文件
    src/host/pets.ts:564
    if (valid === null || !existsSync(this.filePathFor(valid))) {
  • 删除本地文件
    src/host/pets.ts:567
    await unlink(this.filePathFor(valid))
  • 读取本地文件
    src/host/pets.ts:579
    if (!existsSync(this.filePathFor(id))) return id
  • 读取本地文件
    src/host/routes.ts:891
    if (resolved !== null) data = await readFile(resolved.path).catch(() => null)
  • 读取本地文件
    src/host/routes.ts:1010
    data = await readFile(resolved.path)
  • 读取本地文件
    src/host/static-page.ts:114
    .then(deps.loadBundle ?? (() => readFile(new URL(options.bundleRelPath, import.meta.url))))
  • 读取本地文件
    src/host/storage.ts:18
    return JSON.parse(await readFile(filePath, 'utf8')) as T
  • 写入本地文件
    src/host/storage.ts:32
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    src/host/storage.ts:44
    await rename(tmp, filePath)
  • 删除本地文件
    src/host/storage.ts:46
    await rm(tmp, { force: true })
  • 写入本地文件
    src/host/storage.ts:73
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    src/host/storage.ts:78
    writeFileSync(handle, content, 'utf8')
  • 写入本地文件
    src/host/storage.ts:84
    renameSync(tmp, filePath)
  • 删除本地文件
    src/host/storage.ts:86
    rmSync(tmp, { force: true })
扫描于 2026/11/2(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-atomic-write@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-layout@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-home-paths@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-session
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 生成漫画风宠物动画
  • WAAPI时间轴引擎
  • 自定义动画编辑器

README

由 DeepSeek 最新模型翻译生成
本仓库已停止维护并归档。 本项目原名 petween,现已更名为 petween-dsh。Petween 已在新仓库 petween 重做:独立桌面宠物,跨智能体(Claude Code、Codex 等),插件化,支持多只宠物。 Petween DeepSeek Harness(DSH)Web UI 的宠物插件 —— 纸片动画风格的智能体宠物动画中间件。 note:插件是纯vibe出来的,如有不足,欢迎改进❤ 你只需要准备少量静态角色图(如 idle.webp / thinking.webp / happy.webp),插件的程序化 Motion Engine 会自动生成漫画感的状态切换动画(squash & stretch)与循环动画(Bounce / Sway / Breathing),并跟随 Agent 的真实运行状态自动切换姿势。 [README需要更新,排期中!
展开完整文档(README 剩余 1 节)
本仓库已停止维护并归档。 本项目原名 petween,现已更名为 petween-dsh。Petween 已在新仓库 petween 重做:独立桌面宠物,跨智能体(Claude Code、Codex 等),插件化,支持多只宠物。

Petween

DeepSeek Harness(DSH)Web UI 的宠物插件 —— 纸片动画风格的智能体宠物动画中间件。

note:插件是纯vibe出来的,如有不足,欢迎改进❤

你只需要准备少量静态角色图(如 idle.webp / thinking.webp / happy.webp),插件的程序化 Motion Engine 会自动生成漫画感的状态切换动画(squash & stretch)与循环动画(Bounce / Sway / Breathing),并跟随 Agent 的真实运行状态自动切换姿势。

[README需要更新,排期中!]

特性

- 少量图片即可工作:至少一张图;六个状态槽位(待机/思考/工作/等待/成功/错误)各自可配,缺失状态自动 fallback
- 漫画式过渡动画:Comic Pop / Soft / Jelly / Jump / Snap / Celebrate / Deflate,强度与时长可调
- 状态循环动画:六个状态可分别组合 Bounce(随机间隔)、Sway、Breathing,并挂载一个自定义循环动画
- Anchor 真实对齐:换图时脚底不瞬移,squash/stretch 围绕地面锚点
- 跟随 Agent 状态:思考摇摆弹跳、等待用户时安静等待、完成时庆祝、出错时泄气——基于宿主事件归一化 + 状态稳定器,流式输出不会导致宠物乱跳
- 可拖动、可缩放、位置持久化;尊重 prefers-reduced-motion
- 多宠物预设:每只宠物独立保存姿势图片、状态动画与整体缩放,可快速切换、复制、重命名和删除
- Timeline Engine:所有动画(内置与自定义)都是 AnimationDefinition 数据,经同一个 Timeline Compiler / Scheduler 执行(WAAPI),无专用分支——自定义动画格式见 docs/motion-format.md
- 可视化时间轴编辑器:管理自定义过渡/环境/互动动画,编辑轨道、关键帧、easing 与事件并循环试播
- 点击互动与粒子特效:点击宠物可配置为弹一下、播放动画或粒子特效,内置 flip 翻面
- 动画包(Motion Pack):自定义动画可导出为单文件 JSON 包;导入时校验定义并自动规划 id 碰撞,包内的挂载建议(mounts)可在动画库一键应用到当前宠物,见 docs/motion-format.md §11
- 宠物包(Pet Package):一只宠物连同图片、设定与她挂的动画打成 zip 分享;导入时图片按内容哈希去重、动画碰撞改号、一步建宠并切换,附署名(角色/创作者/来源/许可)随包传播,见 docs/motion-format.md §12
- 附属插件扩展服务:host 侧 petween 与 client 侧 petween/client 两个 cordis 服务——动画库注册、舞台快照订阅、位置驱动租约、pose 通道、指针/拖拽/动画三类观察事件流,「提供能力、不做策略」;首个消费示例:petween-physics(拖拽甩出 + 碰壁反弹 + 地面滑动)

截图

独立全页编辑器(宠物预设、六状态过渡与循环动画、锚点调整、实时预览与动画库):

编辑器

| 设置卡片 | 宠物特写 |
| 设置卡片 | 宠物特写 |

示例角色为社区流行的「DeepSeek 女仆鲸鱼娘」:角色原型「溟月」由 上善无形 创作,女仆装版本由 ZipZipPipe 二次设计,依 CC BY-NC-SA 4.0 授权使用。

安装

要求:已安装 DSH(@deepseek-ai/dsh,在 0.1.0-rc.7 上实测)、Node ≥ 22.18(tsdown 0.22 起的构建工具链要求;插件运行时不受此限)与 pnpm。

尚未发布到 npm(dsh plugin add petween 暂不可用),从 GitHub 克隆安装:

git clone https://github.com/Traveritas/petween-dsh.git
cd petween
pnpm install
pnpm run build # 产出 lib/(仓库不含构建产物,安装前必须构建)

dsh plugin --profile web add link:/path/to/petween # link: 后指向你克隆的目录

重启 dsh web 生效。

升级与卸载

dsh plugin --profile web update petween # 升级
dsh plugin --profile web remove petween # 卸载

卸载只移除插件本身;你的配置与图片保留在 $DSH_HOME/petween/(默认为 ~/.dsh/petween/),需要彻底删除时手动移除该目录即可。

从 dsh-motion-pet ≤ 1.1.0 升级:首次启动会自动把 $DSH_HOME/motion-pet/ 迁移为 $DSH_HOME/petween/(目录重命名;跨盘/被占用导致重命名失败时改为复制,并保留旧目录作备份)。
附属插件配套升级:1.2.0 起 cordis 服务名由 motion-pet / motion-pet/client 更名为 petween / petween/client,且不提供旧名 alias。附属插件必须改用新服务名(petween-physics 需 ≥ 0.2.0);仍在注入旧服务名的旧版附属插件不会加载、也不会报错,请一并升级。

使用

打开 DSH Web UI → 设置 → Petween 卡片:可快速启用/停用宠物、调整整体缩放,并查看图片导入进度。点击卡片上的「打开完整编辑器 →」(或浏览器直接访问 /petween-editor/)会在新标签页打开独立编辑器页面:

1. 管理宠物:顶部「宠物」区可把当前配置保存为副本,或新建空白宠物;切换后,下面所有面板都编辑当前宠物。姿势、状态动画与整体缩放会自动镜像进当前预设。
2. 导入图片:在左侧选择状态(如「待机」),点击「更换图片」。支持 PNG / WebP / JPEG(JPEG 无透明背景,会提示)。推荐透明背景、近似正方形画布、角色完整的图片;不同姿势尽量保持角色视觉尺寸一致。
3. 调 Anchor:Anchor X/Y 标记角色的「脚底中心」(默认 0.5 / 0.96)。多张图的 Anchor 对齐后,切换姿势时角色不会瞬移。可用「图片缩放」微调大小。
4. 调动画:每个状态可选进入过渡(Preset / 强度 / 时长)与循环动画(自定义循环动画 + Bounce / Sway / Breathing);「全局」区设置默认过渡、整体缩放(0.3~4.0)、减少动态(跟随系统 / 总是 / 从不)、成功/失败停留时长。底部动画库可创建和编辑自定义时间轴动画。
5. 实时预览:右侧预览区点击状态按钮即可模拟状态切换(走与正式 Overlay 相同的渲染与状态机),改动会即时进入预览;点击“保存修改”后写入当前宠物预设,主界面的宠物会在数秒内跟进。

也可以直接访问 http://127.0.0.1:3080/petween-editor/(端口以你的 DSH web 配置为准)。

想快速试手感而不碰真实配置:构建后直接双击 preview/index.html 打开独立预览页(无需 DSH,随上面的克隆构建流程一并生成),还支持贴入自定义 AnimationDefinition JSON 即注册即播。

状态说明

| 视觉状态 | 触发 | 默认表现 |
| 待机 idle | Agent 空闲 | 缓慢摇摆 + 呼吸 |
| 活跃 active | 生成中 / 跑工具(thinking/coding/command/working 统一为活跃,不频繁换图) | 思考:摇摆 + 随机弹跳;工作:紧凑 bounce + 呼吸 |
| 等待 waiting | 等你批准权限 / 回答问题 | 更慢的摇摆 + 弱呼吸 |
| 成功 success | 一轮任务完成 | Celebrate 进入动画,短暂停留(默认 1600ms)后回待机 |
| 错误 error | 出错 / 中断 | Deflate 进入动画,停留(默认 1800ms)后回待机 |

点击宠物会轻轻弹一下(不改变状态)。拖动宠物会记住位置;窗口缩小时宠物会被拉回视口内。

兼容版本

- DSH:0.1.0-rc.7(本仓库开发/验收版本;插件 API 若变化以 docs/implementation-notes.md 记录为准)
- 运行环境:DSH Web UI(Chromium 系浏览器)
- 构建:Node ≥ 22.18、pnpm

开发

pnpm install
pnpm run build # tsc -b && tsdown → lib/index.js(host)、lib/client.js、lib/editor.js(独立编辑器页)、preview/preview.js
pnpm vitest run # 测试(tests/,800+ 用例)
pnpm run typecheck # 双工程类型检查

改代码后重新 pnpm run build,重启 dsh web 生效(纯 client 改动刷新页面即可)。

Known limitations

- 更多内置 ambient channel 与 Transition Matrix override 尚未实现;Motion Pack 后续计划 zip 容器与编辑器多选导出
- Agent 状态联动的「无焦点会话」聚合回退模式按优先级取最紧急会话(WAITING > ERROR > ACTIVE > SUCCESS > IDLE,终态带 TTL);正常跟随当前会话
- 不执行/不信任用户资产:SVG 明确拒绝,图片只做解码展示
- 多浏览器标签同时编辑同一配置默认 last-write-wins;写入请求携带 x-petween-expected-revision 头即可获得乐观并发控制(版本过期返回 409 REVISION_MISMATCH)

License

MIT。例外:docs/images/ 下的示例截图包含「DeepSeek 女仆鲸鱼娘」角色形象(原型「溟月」by 上善无形,女仆装设计 by ZipZipPipe,CC BY-NC-SA 4.0),仅作演示用途,不随本项目的 MIT 许可发布。
预览分享卡片长什么样 ↓Traveritas/petween-dsh
分享 · DeepSeek Harness Hub
Traveritas/petween-dsh

本仓库已停止维护并归档。 本项目原名 petween,现已更名为 petween-dsh。Petween 已在新仓库…

这是你的仓库?认领条目

回到顶部