@linxin666/dsh-pet 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/LICENSE +29 -0
  2. package/README.md +106 -0
  3. package/assets/whale/pet.json +7 -0
  4. package/assets/whale/previews/failed.gif +0 -0
  5. package/assets/whale/previews/idle.gif +0 -0
  6. package/assets/whale/previews/jumping.gif +0 -0
  7. package/assets/whale/previews/review.gif +0 -0
  8. package/assets/whale/previews/running-left.gif +0 -0
  9. package/assets/whale/previews/running-right.gif +0 -0
  10. package/assets/whale/previews/running.gif +0 -0
  11. package/assets/whale/previews/waiting.gif +0 -0
  12. package/assets/whale/previews/waving.gif +0 -0
  13. package/assets/whale/spritesheet.webp +0 -0
  14. package/cordis.patch.yml +10 -0
  15. package/lib/client.js +1515 -0
  16. package/lib/index.js +642 -0
  17. package/lib/invariant.js +34 -0
  18. package/lib/types/affinity.d.ts +83 -0
  19. package/lib/types/affinity.d.ts.map +1 -0
  20. package/lib/types/client/PetDockEntry.d.ts +44 -0
  21. package/lib/types/client/PetDockEntry.d.ts.map +1 -0
  22. package/lib/types/client/PetSettingsCard.d.ts +67 -0
  23. package/lib/types/client/PetSettingsCard.d.ts.map +1 -0
  24. package/lib/types/client/PluginSettingsCard.d.ts +78 -0
  25. package/lib/types/client/PluginSettingsCard.d.ts.map +1 -0
  26. package/lib/types/client/WhalePet.d.ts +49 -0
  27. package/lib/types/client/WhalePet.d.ts.map +1 -0
  28. package/lib/types/client/index.d.ts +46 -0
  29. package/lib/types/client/index.d.ts.map +1 -0
  30. package/lib/types/client/locales.d.ts +101 -0
  31. package/lib/types/client/locales.d.ts.map +1 -0
  32. package/lib/types/client/pet-store.d.ts +49 -0
  33. package/lib/types/client/pet-store.d.ts.map +1 -0
  34. package/lib/types/client/settings-form.d.ts +119 -0
  35. package/lib/types/client/settings-form.d.ts.map +1 -0
  36. package/lib/types/client/slots-augment.d.ts +19 -0
  37. package/lib/types/client/slots-augment.d.ts.map +1 -0
  38. package/lib/types/client/spritesheet.d.ts +69 -0
  39. package/lib/types/client/spritesheet.d.ts.map +1 -0
  40. package/lib/types/index.d.ts +44 -0
  41. package/lib/types/index.d.ts.map +1 -0
  42. package/lib/types/invariant.d.ts +10 -0
  43. package/lib/types/invariant.d.ts.map +1 -0
  44. package/lib/types/persist.d.ts +45 -0
  45. package/lib/types/persist.d.ts.map +1 -0
  46. package/lib/types/routes.d.ts +22 -0
  47. package/lib/types/routes.d.ts.map +1 -0
  48. package/lib/types/service.d.ts +161 -0
  49. package/lib/types/service.d.ts.map +1 -0
  50. package/lib/types/state.d.ts +80 -0
  51. package/lib/types/state.d.ts.map +1 -0
  52. package/lib/types/treats.d.ts +59 -0
  53. package/lib/types/treats.d.ts.map +1 -0
  54. package/package.json +100 -0
  55. package/src/affinity.test.ts +74 -0
  56. package/src/affinity.ts +144 -0
  57. package/src/client/PetDockEntry.tsx +95 -0
  58. package/src/client/PetSettingsCard.tsx +186 -0
  59. package/src/client/PluginSettingsCard.tsx +207 -0
  60. package/src/client/WhalePet.tsx +342 -0
  61. package/src/client/css-modules.d.ts +6 -0
  62. package/src/client/index.ts +261 -0
  63. package/src/client/locales.ts +108 -0
  64. package/src/client/pet-store.ts +80 -0
  65. package/src/client/pet.module.css +185 -0
  66. package/src/client/settings-card.module.css +277 -0
  67. package/src/client/settings-form.ts +294 -0
  68. package/src/client/slots-augment.ts +27 -0
  69. package/src/client/spritesheet.ts +138 -0
  70. package/src/index.ts +148 -0
  71. package/src/invariant.ts +40 -0
  72. package/src/persist.test.ts +96 -0
  73. package/src/persist.ts +128 -0
  74. package/src/routes.ts +171 -0
  75. package/src/service.ts +389 -0
  76. package/src/state.test.ts +65 -0
  77. package/src/state.ts +156 -0
  78. package/src/treats.test.ts +86 -0
  79. package/src/treats.ts +101 -0
package/LICENSE ADDED
@@ -0,0 +1,29 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, zhu1090093659
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ 1. Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ 3. Neither the name of the copyright holder nor the names of its
17
+ contributors may be used to endorse or promote products derived from
18
+ this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package/README.md ADDED
@@ -0,0 +1,106 @@
1
+ # dsh-pet — 鲸鱼娘宠物插件
2
+
3
+ ![version](https://img.shields.io/badge/version-0.1.0-4f8ef7) ![license](https://img.shields.io/badge/license-BSD--3--Clause-9b59b6) ![platform](https://img.shields.io/badge/platform-DSH%20Web-00c2a8) ![language](https://img.shields.io/badge/language-TypeScript-3178c6)
4
+
5
+ > 一只软萌治愈的鲸鱼娘,陪你在 DeepSeek Harness 里工作。
6
+
7
+ 模型思考的时候你在等,她在游。她会跟着模型的工作状态切换动画——干活、等待、思考、庆祝完成;你还可以摸头、喂小鱼干,看着她从幼鲸慢慢长成你的深海羁绊。
8
+
9
+ 复刻自 Codex 桌面版的宠物功能,以 DSH 官方插件形态实现(cordis bundle:host 半区 + client 半区单包)。
10
+
11
+ ## 功能
12
+
13
+ | 功能 | 说明 |
14
+ |---|---|
15
+ | 状态动画 | 模型状态 → 鲸鱼娘动画:`thinking/tool → 工作`、`waiting → 等待`、`done → 跳跃庆祝`、空闲 `idle` 呼吸待机 |
16
+ | 摸头互动 | 点击鲸鱼娘 → 气泡反馈 + 亲密度 +1(10s 冷却) |
17
+ | 喂食 | 悬浮面板「喂食」→ 消耗 1 条小鱼干 + 亲密度 +5(30s 冷却) |
18
+ | 饲料经济 | 小鱼干库存(上限 20):工作每 3 回合 +1 条、每 30 分钟 +1 条;库存不足会提示「多陪鲸鱼娘工作一会儿」 |
19
+ | 亲密度 | 每完成一个回合 +1;4 个等级:幼鲸 → 伙伴 → 挚友 → 深海羁绊(100 点封顶) |
20
+ | 自定义命名 | 悬浮面板「改名」→ 1–20 字符,持久化,召唤按钮/面板同步显示 |
21
+ | 拖动 | 按住鲸鱼娘拖动重新摆放,位置持久化 |
22
+ | 隐藏/召唤 | 悬浮面板「隐藏」;隐藏后输入选择行出现「召唤{名字}」按钮 |
23
+ | 状态气泡 | 工作时显示模型当前状态短语 |
24
+
25
+ ## 动画演示
26
+
27
+ 素材为 8 列 × 9 行图集(192×208 单元),由 [hatch-pet](https://github.com/dsh2026) 流水线生成,以下为各状态动画预览:
28
+
29
+ | idle 待机 | waiting 等待 | running 干活 | jumping 庆祝 |
30
+ |---|---|---|---|
31
+ | ![idle](assets/whale/previews/idle.gif) | ![waiting](assets/whale/previews/waiting.gif) | ![running](assets/whale/previews/running.gif) | ![jumping](assets/whale/previews/jumping.gif) |
32
+
33
+ | waving 挥手 | review 复盘 | failed 失败 | 左右移动 |
34
+ |---|---|---|---|
35
+ | ![waving](assets/whale/previews/waving.gif) | ![review](assets/whale/previews/review.gif) | ![failed](assets/whale/previews/failed.gif) | ![running-left](assets/whale/previews/running-left.gif) ![running-right](assets/whale/previews/running-right.gif) |
36
+
37
+ ## 架构
38
+
39
+ ```
40
+ dsh-pet/
41
+ |-- src/
42
+ | |-- index.ts # host 半区:插件入口(cordis apply,注册路由)
43
+ | |-- service.ts # PetService:宠物状态机 + 亲密度 + 配置(HTTP API 服务面)
44
+ | |-- state.ts # 宠物状态机:activity/status phase → 9 状态动画
45
+ | |-- affinity.ts # 亲密度账本(纯函数 + 冷却)
46
+ | |-- treats.ts # 小鱼干库存账本
47
+ | |-- persist.ts # 持久化($DSH_HOME/pet.json,原子写入)
48
+ | |-- routes.ts # /api/pet/* JSON API + /pet/whale/* 素材静态路由
49
+ | `-- client/ # 浏览器半区
50
+ | |-- index.ts # slots 注册 + 轮询(800ms)+ 交互接线(fetch)
51
+ | |-- PetDockEntry.tsx # conversation.input.selector.context 挂载点
52
+ | |-- WhalePet.tsx # 浮层组件(portal + rAF 帧动画 + 拖动)
53
+ | |-- spritesheet.ts # 图集几何 + 每状态动画轨道(帧/时长)
54
+ | `-- pet.module.css
55
+ |-- assets/whale/ # 鲸鱼娘素材(pet.json + spritesheet.webp + 动画预览)
56
+ `-- cordis.patch.yml # bundle patch:插入 pet 插件行
57
+ ```
58
+
59
+ ### 数据流
60
+
61
+ ```
62
+ activity/status session 事件(原 working-activity 插件发布) --> PetService(host)
63
+ | /api/pet/* JSON
64
+ conversation.input.selector.context 槽位 <-- 轮询 800ms -- pet-client(浏览器)
65
+ |
66
+ WhalePet 浮层(portal + rAF)
67
+ ```
68
+
69
+ - **状态源**:监听 `activity/status` 会话事件(phase: idle/waiting/thinking/tool/done + 状态短语),由 host 半区消费;该事件曾由 working-activity 插件发布,插件已从本仓库移除,未安装时宠物只随会话生命周期变化。
70
+ - **挂载点**:`conversation.input.selector.context`(list 槽位,输入选择行,无会话/新会话/会话中全程挂载——旧挂载点 `conversation.composer.dock` 只在活跃会话渲染,导致新会话界面看不到宠物),组件内部 `createPortal` 渲染全局浮层。
71
+ - **渲染**:CSS sprite(background-position)逐帧动画,帧时长来自 `spritesheet.ts` 的轨道定义。
72
+ - **通信**:浏览器 ↔ host 走同源 `/api/pet/*` JSON 端点(state/interact/set-visible/set-config),图集从 `/pet/whale/spritesheet.webp` 加载——RPC 域与 `/plugins/` 静态服务都是平台注册的,插件自足地提供自己的 API 与素材(与 dsh-remote-web-ui 的 `/api/pair` 同一模式)。
73
+
74
+ ## 安装
75
+
76
+ 推荐直接安装全家桶聚合包 `@linxin666/dsh-web-ui-all`(一个包装齐全部功能插件与皮肤),或单独安装本插件:
77
+
78
+ ```sh
79
+ # 当前(插件尚未发布到 npm):克隆全家桶仓库后安装
80
+ git clone https://github.com/zhu1090093659/dsh-web-ui.git
81
+ cd dsh-web-ui
82
+ pnpm install && pnpm -r build
83
+ dsh plugin --profile web add link:$(pwd)/packages/dsh-pet
84
+
85
+ ```
86
+
87
+ 安装后**重启 `dsh web`**,鲸鱼娘出现在界面右下角即生效。link 模式下改代码后重新 `pnpm build` 并刷新页面即可,无需重装。
88
+
89
+ ## 开发
90
+
91
+ ```sh
92
+ pnpm build # tsc -b(类型+声明)&& tsdown(node 半区 + 浏览器 bundle)
93
+ pnpm test # vitest 单元测试(affinity / treats / persist / state)
94
+ pnpm prepare # 仅转译构建(无类型检查,供消费者安装)
95
+ pnpm typecheck # 仅类型检查
96
+ ```
97
+
98
+ 浏览器 bundle 走 `window.__ModuleLoader__.load` 契约,React/cordis 等由 loader 模块表解析(external);CSS Modules 由 lightningcss 内联为 `<style data-plugin>`。
99
+
100
+ ## 素材与动画轨道校准
101
+
102
+ 鲸鱼娘图集由 hatch-pet 流水线按 9 状态 × 8 列生成:`assets/whale/spritesheet.webp`(1536×1872,8 列 × 9 行 192×208 单元)+ `assets/whale/pet.json`。每行实际帧数与节奏在 `src/client/spritesheet.ts` 的 `TRACKS` 中定义。若素材重做导致帧数变化,只需更新该表(行序契约:0 idle / 1 running-right / 2 running-left / 3 waving / 4 jumping / 5 failed / 6 waiting / 7 running / 8 review)。
103
+
104
+ ## License
105
+
106
+ [BSD-3-Clause](LICENSE)
@@ -0,0 +1,7 @@
1
+ {
2
+ "id": "whale-girl",
3
+ "displayName": "鲸鱼娘",
4
+ "description": "一只软萌治愈的鲸鱼娘,来自深海的陪伴小伙伴。",
5
+ "spritesheetPath": "spritesheet.webp",
6
+ "frames": [6, 8, 8, 4, 5, 8, 6, 6, 6]
7
+ }
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,10 @@
1
+ # dsh-pet bundle patch: inserts its plugin row into the web plugin roster.
2
+ # The bundle is the official dsh plugin shape — install it into a dsh profile
3
+ # (`dsh plugin --profile <name> add link:/Users/zcl/code/dsh-web-ui/packages/dsh-pet`). The single
4
+ # row mounts BOTH halves: the host side (pet state machine, affinity score,
5
+ # pet.* RPC service) and the browser side (the modules node half scans
6
+ # dsh.client packages into the web plugin roster, served from this package's
7
+ # lib/client.js plus the whale assets under assets/whale).
8
+ - insert:
9
+ - id: pet
10
+ name: '@linxin666/dsh-pet'