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

桌宠贴图修复 wmq199711180/dsh-pet-live2d-fix

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

修复桌面客户端桌宠贴图加载失败,让模型完整显示

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

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

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

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 67 处,展示前 48 条)
  • 读取本地文件
    lib/index.js:85
    return JSON.parse(readFileSync(file, 'utf8'))
  • 读取本地文件
    lib/index.js:337
    if (existsSync(file)) return file
  • 读取本地文件
    lib/index.js:341
    for (const entry of readdirSync(dir, { withFileTypes: true })) {
  • 读取本地文件
    lib/index.js:349
    const hit = readdirSync(root).find((name) => name.toLowerCase().endsWith('.cdi3.json'))
  • 读取本地文件
    lib/index.js:393
    if (!existsSync(manifestFile)) return undefined
  • 读取本地文件
    lib/index.js:402
    if (!existsSync(modelFile)) return undefined
  • 写入本地文件
    lib/index.js:632
    mkdirSync(petsRoot(), { recursive: true })
  • 写入本地文件
    lib/index.js:633
    writeFileSync(join(petsRoot(), SYNC_RECORD), JSON.stringify(record, null, 2) + '\n')
  • 写入本地文件
    lib/index.js:714
    mkdirSync(dirname(target), { recursive: true })
  • 发起网络请求
    lib/index.js:1024
    const upstream = await fetch(CORE_CDN, { redirect: 'follow' })
  • 写入本地文件
    lib/index.js:1032
    mkdirSync(dirname(cachePath), { recursive: true })
  • 写入本地文件
    lib/index.js:1033
    writeFileSync(cachePath, bytes)
  • 读取本地文件
    lib/desktop.js:48
    return JSON.parse(readFileSync(join(HERE, '..', 'package.json'), 'utf8')).version ?? '0.0.0'
  • 读取本地文件
    lib/desktop.js:68
    if (existsSync(candidate)) return candidate
  • 读取本地文件
    lib/desktop.js:99
    if ((statSync(path).mode & 0o111) !== 0) return true
  • 写入本地文件
    lib/desktop.js:100
    chmodSync(path, 0o755)
  • 读取本地文件
    lib/desktop.js:141
    const stat = statSync(path)
  • 读取本地文件
    lib/desktop.js:188
    const version = JSON.parse(readFileSync(join(pack, 'package.json'), 'utf8')).version
  • 发起网络请求
    lib/desktop.js:254
    const response = await fetch(registry + '/' + encodeURIComponent(name), { headers: { accept: 'application/json' } })
  • 发起网络请求
    lib/desktop.js:267
    const response = await fetch(tarballUrl)
  • 写入本地文件
    lib/desktop.js:294
    mkdirSync(dirname(target), { recursive: true })
  • 写入本地文件
    lib/desktop.js:295
    writeFileSync(target, inner)
  • 写入本地文件
    lib/desktop.js:296
    if (process.platform !== 'win32') chmodSync(target, 0o755)
  • 读取本地文件
    lib/display.js:37
    const parsed = JSON.parse(readFileSync(preferencePath(home), 'utf8'))
  • 写入本地文件
    lib/display.js:48
    mkdirSync(home, { recursive: true })
  • 写入本地文件
    lib/display.js:49
    writeFileSync(preferencePath(home), JSON.stringify(current, null, 2) + '\n')
  • 执行外部命令固定命令
    lib/display.js:226
    spawnSync('taskkill', ['/pid', String(childPid), '/T', '/F'], {
  • 执行外部命令来自配置/变量
    lib/display.js:274
    child = spawn(binary.path, ['--attach', dshUrl, '--from-plugin'], {
  • 读取本地文件
    lib/display.js:423
    file: existsSync(preferencePath(home)),
  • 读取本地文件
    lib/settings.js:44
    parsed = JSON.parse(readFileSync(settingsPath(home), 'utf8'))
  • 写入本地文件
    lib/settings.js:92
    mkdirSync(dirname(settingsPath(home)), { recursive: true })
  • 写入本地文件
    lib/settings.js:93
    writeFileSync(settingsPath(home), JSON.stringify(next, null, 2) + '\n')
  • 写入本地文件
    lib/sound-files.js:169
    if (create) mkdirSync(home, { recursive: true })
  • 读取本地文件
    lib/sound-files.js:171
    if (create && !existsSync(dir)) mkdirSync(dir, { mode: 0o700 })
  • 写入本地文件
    lib/sound-files.js:171
    if (create && !existsSync(dir)) mkdirSync(dir, { mode: 0o700 })
  • 读取本地文件
    lib/sound-files.js:172
    const stat = lstatSync(dir)
  • 读取本地文件
    lib/sound-files.js:185
    const stat = lstatSync(path)
  • 读取本地文件
    lib/sound-files.js:187
    const bytes = readFileSync(path)
  • 读取本地文件
    lib/sound-files.js:196
    if (existsSync(path) && (lstatSync(path).isSymbolicLink() || !lstatSync(path).isFile())) throw new Error('unsafe-path')
  • 读取本地文件
    lib/sound-files.js:196
    if (existsSync(path) && (lstatSync(path).isSymbolicLink() || !lstatSync(path).isFile())) throw new Error('unsafe-path')
  • 写入本地文件
    lib/sound-files.js:200
    writeFileSync(fd, bytes)
  • 写入本地文件
    lib/sound-files.js:202
    renameSync(temp, path)
  • 删除本地文件
    lib/sound-files.js:205
    try { unlinkSync(temp) } catch { }
  • 删除本地文件
    lib/sound-files.js:220
    unlinkSync(path)
  • 发起网络请求
    lib/live2d-vendor.js:17
    `,t.accessibleText&&(r.innerText=t.accessibleText)),r.style.width=`${sx}px`,r.style.height=`${sx}px`,r.style.backgroundColor=this.debug?"rgba(255,255,
  • 发起网络请求
    lib/live2d-vendor.js:905
    `)x();else if(!C&&T){let B=T.xAdvance+(T.kerning?.[o]||0)+u;n.width+=B,n.spaceWidth=B,n.spacesIndex.push(n.charPositions.length),n.chars.push(b)}}else
  • 发起网络请求
    lib/live2d-vendor.js:906
    ${c}`);throw c instanceof Error&&c.stack&&(d.stack=c.stack),d}}};qP.defaultOptions={onProgress:void 0,onError:void 0,strategy:"throw",retryCount:3,ret
  • 发起网络请求
    lib/live2d-vendor.js:955
    `,pn=null,Fa=class{constructor(){pn||(pn=URL.createObjectURL(new Blob([BR],{type:"application/javascript"}))),this.worker=new Worker(pn)}};Fa.revokeOb
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH Live2D 插件:为什么 fork 后请求会返回 403?

README

由 DeepSeek 最新模型翻译生成
dsh-pet-live2d(桌面客户端修复版) 给 DeepSeek Harness 用的 Live2D 桌宠,自带 DS鲸鱼娘。 这是 A8Chann/dsh-pet-live2d 的 fork,只干一件事:修好官方桌面客户端(DSH NEXT / Electron,页面 origin 是 dsh-app://app)下贴图全部 403、模型只剩骨架的问题。 在浏览器里跑 dsh web 的用户用原版就够了;这个 fork 是给桌面客户端的。 装它 插件 → 添加插件 → dsh-pet-live2d-fix → 安装 → 立即启用 装完重启一次 DSH(客户端 bundle 不做热重载)。首次显示时宿主会去 Live2D 官方 CDN 取一次 Cubism Core 并缓存到 $DSH_HOME/pets/.runtime/,那一下需要联网,之后离线可用。 不要和原版 dsh-pet-live2d 同时装:两者用同一组 HTTP 路由(/api/live2d-pet/)和同一个宠物 id,会打架。
展开完整文档(README 剩余 1 节)
dsh-pet-live2d(桌面客户端修复版)

给 DeepSeek Harness 用的 Live2D 桌宠,自带 DS鲸鱼娘。

这是 A8Chann/dsh-pet-live2d 的 fork,只干一件事:修好官方桌面客户端(DSH NEXT / Electron,页面 origin 是 dsh-app://app)下贴图全部 403、模型只剩骨架的问题。

在浏览器里跑 dsh web 的用户用原版就够了;这个 fork 是给桌面客户端的。

装它

插件 → 添加插件 → dsh-pet-live2d-fix → 安装 → 立即启用

装完重启一次 DSH(客户端 bundle 不做热重载)。首次显示时宿主会去 Live2D 官方 CDN 取一次 Cubism Core 并缓存到 $DSH_HOME/pets/.runtime/,那一下需要联网,之后离线可用。

不要和原版 dsh-pet-live2d 同时装:两者用同一组 HTTP 路由(/api/live2d-pet/)和同一个宠物 id,会打架。

修了什么

官方桌面客户端的 Host 有一道原生令牌闸:页面主线程发出的请求会带上令牌,而 Pixi 取贴图是在 blob Worker 里发出的,Worker 不在那个 frame 上、没有令牌 —— 于是 GET /api/live2d-pet/asset/<pet>/textures/.png 全部 403 Forbidden,moc3 能加载、贴图全丢,看上去就是"装了但只有一坨骨架"。

修法(两处,改动很小):

1. 宿主半区 lib/index.js:asset 路由接受 ?inline-textures=1。带这个参数请求模型 JSON 时,把 FileReferences.Textures 就地换写成 data:image/png;base64,... 再返回。
2. 浏览器半区 lib/client.js:在 dsh-app: 协议下给模型地址自动挂上这个参数。

贴图因此变成绝对 data: 地址,Worker 在本地解码,不联网、不过闸。基准地址仍是正常的模型地址,相对路径(moc3 / physics / motions)照常解析。

另外把 package.json 的包名、cordis.patch.yml 的插件行、lib/client.js 的模块 id 与 PACKAGE_NAME 改成了 scoped 名,避免和原版冲突。

完整 diff 见 ../patches/。

与原版的关系

- 版本:基于 3.3.3,功能与原版一致
- 原版文档(配置、装扮、相位、自制宠物):README.upstream.md
- 上游仓库:https://github.com/A8Chann/dsh-pet-live2d
- 这个修复也提过给上游:合并后请优先用原版

许可(重要)

| 部分 | 许可 |
| 插件代码(含本 fork 的修改) | MIT,见 LICENSE |
| DS鲸鱼娘模型(pets/ds-whale-girl/) | CC BY-NC-SA 4.0:署名、非商业、相同方式共享 |
| Cubism Core | Live2D 专有,不随包分发,运行时从官方 CDN 取 |

非商业:个人使用、公司内部使用都没问题;拿去做商业产品需要分别取得三位作者授权。
署名与版权链见 NOTICE.md。
预览分享卡片长什么样 ↓wmq199711180/dsh-pet-live2d-fix
分享 · DeepSeek Harness Hub
wmq199711180/dsh-pet-live2d-fix

修复桌面客户端桌宠贴图加载失败,让模型完整显示

这是你的仓库?认领条目

回到顶部