How to use dsh-web-ui
Registry-driven desktop pet companion for dsh web GUI. Model session activity drives animation switching. Pet and feed to increase intimacy. Supports custom pets and messages.
This article is auto-derived from indexed fields (wiki / faq / compatibility_json), not freshly AI-generated.
This article is derived from the plugin's already-indexed fields (wiki / faq / compatibility_json / readme), not freshly generated by AI. Source field is noted at the end of each section.
Quick start
dsh-web-ui
— source: plugin_wiki.wiki_content
Install & verify
dsh plugin --profile web add @linxin666/dsh-pet
Run the command above in your DSH Web Profile. Then enable the plugin in the plugin list.
— source: plugins.install
Key points
- Web 终端:xterm.js 远程终端,实时输出,窗口大小自适应;
- 文件传输:SFTP 上传 / 下载,有进度条,能浏览远程目录;
- 端口转发:本地隧道直连远程内网服务(数据库、API、管理后台),只监听 127.0.0.1;
- 集群执行:一条命令并发跑多台主机,按别名 / 环境 / 标签过滤;
- Agent 直连:Agent 和面板共用同一份主机配置,对话里说一句「连一下 xxx 看看状态」,智能体就去执行远程命令。
— source: plugin_wiki.readme_en (fallback readme_raw)
FAQ
What can this plugin do?
Hang a floating pet in the bottom right corner of the DSH Web GUI; it switches between different animations during model waiting, thinking, tool calling, response organizing, completion, and failure. You can pet its head (10 second cooldown, +1 affection), feed it dried fish (30 second cooldown, +5 affection, -1 inventory), and watch the affection level grow from "Baby Whale" all the way to "Lifetime Companion". Two built-in whale girls are included (original and refined versions), and you can also put your own pet folder locally and it will appear directly. packages/dsh-pet/README.zh.md:5-29 / packages/dsh-pet/src/index.ts:115-139.
How do I replace it with my own pet?
No code changes needed. Write a new pet description following the pet.json template in the README (including atlas path), put it together with the atlas files into $DSH_HOME/pets/<your pet name>/, then restart dsh web. The new pet will appear in the "Pet" option in the settings; built-in pets with the same id will be overridden by yours. v2 manifest Live2D renderer is also supported (you need to provide Cubism Core yourself). packages/dsh-pet/src/registry.ts:794-832 / packages/dsh-pet/README.zh.md:63-89.
Where is data stored? Will deleting the plugin lose it?
Selection, name, affection, dried fish, and drag position are all stored in $DSH_HOME/pet.json (default ~/.dsh/pet.json). Deleting the plugin does not delete this file, so reinstalling allows you to continue right where you left off. The custom pet directory $DSH_HOME/pets/ is completely independent and self-managed. packages/dsh-pet/src/persist.ts:77-79, 108-167 / packages/dsh-pet/src/dsh-home.ts:24-31.
Why is the Live2D pet blank when opened?
Because Live2D's Cubism Core is proprietary licensed, the plugin cannot embed it or download it for you. You need to obtain live2dcubismcore.min.js from Live2D official and place it in $DSH_HOME/pets/.runtime/. When this file is missing, an installation guide card will be displayed; sprite2d pets are not affected. packages/dsh-pet/README.zh.md:125-134 / packages/dsh-pet/src/routes.ts:328-345.
Can I migrate from the old Codex desktop app?
Yes. Pets produced by the hatch-pet pipeline are already in ${CODEX_HOME:-~/.codex}/pets/, and this plugin will automatically scan this directory and pick them up without additional wiring. The old "tiled name" field will be automatically migrated under the whale girl's name. packages/dsh-pet/src/registry.ts:814-820 / packages/dsh-pet/src/persist.ts:142-148.
Can pets have their own dialogue and button text?
Yes, this is the voice pack mechanism. Place a voice.json in the pet directory (or write a global override in $DSH_HOME/pets/.voice.json) to replace status bubbles, tooltips, murmuring text, and the button text and statistics format for "Feed / Rename / Hide" on the floating panel. Merge priority is: pet built-in > global > built-in, malformed packages only warn but don't reject. packages/dsh-pet/README.zh.md:91-123 / packages/dsh-pet/src/voice-pack.ts:1-79.
Will the pet get messy with multiple concurrent sessions?
No. Sprite animations follow the most recent meaningful activity event. Each top-level session reports status with its own bubble (up to 12 bubbles at once, excess shown in +N badge). Sub-agent sessions are reflected through their parent initiating session and don't get their own separate bubble row. Any session completing a round independently counts toward affection and dried fish. packages/dsh-pet/README.zh.md:251 / packages/dsh-pet/src/service.ts:439-458.
Is it safe? Can LAN neighbors see my pet images?
No, only local loopback is visible by default. Both /api/pet/* and /pet/<id>/* use loopback fencing (127.0.0.1, socket address, Host header, sec-fetch-site), and other machines on the LAN get 403. When dsh-remote-web-ui is also installed, paired devices' cookies can serve as an additional bypass path. Live2D models use a "closure reference" whitelist; files not in the closure are not served. Symlinks crossing boundaries are directly rejected (403), and images exceeding 20MB get 413. packages/dsh-pet/README.zh.md:289-295 / packages/dsh-pet/src/routes.ts:42-49, 72-82, 141-147.
— source: plugin_wiki.faq_json
Compatibility
- DSH: 未声明(package.json 无 dsh.engines;通过 devDependencies 依赖 @deepseek-ai/dsh-client-* / dsh-host-webserver / dsh-session / dsh-settings 等 ^0.1.0-rc.8,详见 packages/dsh-pet/package.json:67-76;宿主 CLI 当前已知为 dsh 0.1.0-rc.7/rc.8)
- Node: ^22.19.0 || >=24.0.0(packages/dsh-pet/package.json:7-9)
— source: plugin_wiki.compatibility_json
Pitfalls
Review the upstream repo before installing. This guide is auto-derived from indexed fields and may lag the latest release. If anything contradicts the official docs, treat the upstream source as authoritative.
— source: general rule