Skip to content

Releases: zhu1090093659/dsh-pet

v0.4.9

Choose a tag to compare

@github-actions github-actions released this 26 Oct 07:20

本版本把亲和度等级名交还给每只宠物自己:作者可以在 voice.json 里声明一条 panel.ranks 阶梯,内置的鲸鱼等级名退为回退显示(#22,需求见 issue #21)。同时修掉配对服务缺席时信任围栏把异常漏给宿主、被 web server 变成空 body 400 的问题(dsh-web#1942),并把插件 cohort 前进到宿主 0.2.1-rc.3。

兼容性:没有破坏性变更。包名 @linxin666/dsh-pet、安装方式、$DSH_HOME/pet.json 的持久化文件名与全部键名、以及线协议字段都没有改动;不声明 panel.ranks 的宠物渲染结果与之前完全一致,亲和度积分、奖励、冷却与已持久化的账本都不受影响。dsh.engines.dsh 这个声明字段及其语义同样冻结,唯一需要留意的是它的下限在本轮从 0.2.1-rc.2 抬到 >=0.2.1-rc.3(跟随受支持的宿主 cohort,双语 README 徽章同步改动),仍停在 rc.2 宿主上的安装需要先把宿主升到 0.2.1-rc.3 或更高。

新功能

  • voice.json 新增可选的 panel.ranks 亲和度等级阶梯(#22,需求见 issue #21):每条是 { min, name, nameEn? },name 是默认名、nameEn 在界面语言为英文时生效;声明了阶梯就整体替换该宠物的等级名,内置的 幼鲸 / 伙伴 / 挚友 / 深海羁绊 / 心有灵犀 / 传说羁绊 / 神话羁绊 / 永恒之契 / 鲸生共渡 退为回退
  • 阶梯校验是全有或全无,沿用语音包「警告并丢弃」的纪律:1-16 条、首条 min 必须为 0、min 严格递增且不重复、名字 1-24 字符;任何一条违规就整条阶梯丢弃并回到内置名,坏阶梯不会让这只宠物被拒绝加载
  • 阶梯只影响显示:积分、奖励、冷却、内置阈值与已持久化的账本都不动,panel.ranks 只改变 rankOf / affinityViewOf 解析出的名字;panel.stats 里的 {rank} 拿到的是生效名,所以自定义统计格式也会显示宠物自己的等级名
  • 分层合并时声明阶梯整体替换上一层,不跨层合并阈值(合并两份部分阶梯会造出作者没声明过的阈值);优先级仍是宠物 voice.json > 全局 $DSH_HOME/pets/.voice.json > 内置,解析与 remark 分层同处一地(voiceLayers / applyVoiceLayers),启动、setPetId 与设置面应用不会各算一套
  • contracts/voice-pack-v1.schema.json 记录新块,src/voice-pack.test.ts 的漂移锁同步它的上下限;双语 README 的「Voice packs and panel DIY」行与示例补上 ranks

修复

  • 配对服务缺席时信任围栏不再抛异常(dsh-web#1942):src/pair-access.ts 此前把 ctx.remoteWebUiPairing 当属性读,cordis 对未注入的服务会抛 cannot get property "remoteWebUiPairing" without inject,异常逃出路由处理器、被宿主 web server 变成空 body 的 400,于是「这处组合没有装配对服务」看起来像请求本身有问题
  • 现在 lookupPairing() 先走非严格形式的 ctx.get('remoteWebUiPairing', false)(未加载的服务答 undefined 而不是抛),再退回属性读取并用 try/catch 兜住:读不出来一律当作「没有配对服务」,围栏如实回答未配对而不是把错误漏到路由层;两条查找路径都由 tests/access.spec.ts 钉住(新增 30 行)

其他改动

  • 插件 cohort 前进到 0.2.1-rc.3:消费的 @deepseek-ai 开发依赖改为 ^0.2.1-rc.3,dsh.engines.dsh 与 @deepseek-ai/dsh peer 抬到 >=0.2.1-rc.3,pnpm-workspace.yaml 里 dsh-client-store / dsh-client-ui-primitives 的 packageExtensions 修复按 rc.3 改键(含两条 DeepSeek 工具钉版),锁文件覆盖全部 29 个已解析的 rc.3 包;shared/web-platform.ts 的十一行浏览器平台表没有变化,只有 provenance 注释跟着移动
  • 上游这些改动落在宠物消费的表面上是加法:DraftInitializationOptions.whenDraftExists 是可选的,宠物没有实现 MessageSubmissionState、也没有接管新的会话表头,活动投影用到的 agent 与 durable session 事件声明在 rc.3 里没有变化,因此不需要运行时适配
  • .agents/notes/implemented/ 新增三份记录:feature/2026-10-23-pet-affinity-rank-ladders.md(阶梯的决策与被否决的选项)、process/2026-10-24-sdk-cohort-0.2.1-rc.3.md(推进 cohort 的依据)、process/2026-10-20-plugin-review-round.md(本轮插件评审)
  • 测试:src/voice-pack.test.ts 钉校验与整条阶梯合并,src/affinity.test.ts 钉查找与 nameEn 投影,src/ledger.test.ts 钉账本重挂,src/service.test.ts 钉全局与宠物的优先级跨切换与设置面应用,src/client/PetSprite.test.tsx 钉英文/默认渲染与自定义 {rank} 格式,src/client/index.test.tsx 补挂载注入;本机 51 个文件 681 个测试、node --test scripts/dsh-pet*.test.mjs 22 个测试全部通过

English

This release hands the affinity rank names back to each pet: an author can declare a panel.ranks ladder in voice.json, and the built-in whale tier names drop to a fallback (PR #22, requested in issue #21). It also fixes the trust fence leaking an exception into the host whenever the pairing service was absent, where the web server turned it into an empty-body 400 (dsh-web#1942), and moves the plugin cohort to host 0.2.1-rc.3.

Compatibility: nothing breaks. The package name @linxin666/dsh-pet, the install path, the $DSH_HOME/pet.json filename with all of its keys, and every wire-protocol field keep their names and meaning. A pet that declares no panel.ranks renders exactly as before, and affinity points, rewards, cooldowns and the persisted ledger are untouched. The dsh.engines.dsh declaration and its semantics are frozen as well, but one thing does change: its floor moves from 0.2.1-rc.2 to >=0.2.1-rc.3 in this cycle (following the supported host cohort, with both README badges updated), so an installation still on an rc.2 host needs the host upgraded to 0.2.1-rc.3 or newer first.

New Features

  • voice.json gains an optional panel.ranks affinity ladder (PR #22, requested in issue #21): each entry is { min, name, nameEn? }, where name is the default and nameEn applies when the UI locale is English. A declared ladder replaces that pet's tier names whole, and the built-in 幼鲸 / 伙伴 / 挚友 / 深海羁绊 / 心有灵犀 / 传说羁绊 / 神话羁绊 / 永恒之契 / 鲸生共渡 set drops to a fallback
  • Ladder validation is all-or-nothing, matching the voice pack's warn-and-drop discipline: 1-16 entries, the first min must be 0, strictly ascending unique minima, names of 1-24 characters. Any violation drops the whole ladder and restores the built-in names, so a bad ladder never gets the pet rejected
  • The ladder is display-only: points, rewards, cooldowns, the built-in thresholds and the persisted ledger are untouched, and panel.ranks only changes which name rankOf / affinityViewOf resolve. {rank} inside panel.stats receives the effective name, so a custom stat format shows the pet's own tier name too
  • When layers merge, a declared ladder replaces the previous layer whole and tiers are never merged across layers, because merging two partial ladders would invent thresholds no author declared. Precedence stays pet voice.json > global $DSH_HOME/pets/.voice.json > built-in, and the ladder resolves in the same place as the remark layers (voiceLayers / applyVoiceLayers), so startup, setPetId and the settings-surface apply cannot drift apart
  • contracts/voice-pack-v1.schema.json documents the new block and the drift lock in src/voice-pack.test.ts keeps its caps in sync; the bilingual README's "Voice packs and panel DIY" row and example gain ranks

Bug Fixes

  • The trust fence no longer throws when the pairing service is absent (dsh-web#1942). src/pair-access.ts used to read ctx.remoteWebUiPairing as a property, which cordis answers by throwing (cannot get property "remoteWebUiPairing" without inject) when the service was never injected. The exception escaped the route handler and the host web server turned it into an empty-body 400, so "this composition carries no pairing service" looked like a malformed request
  • lookupPairing() now tries the non-strict ctx.get('remoteWebUiPairing', false) first (an unloaded service answers undefined instead of throwing), then falls back to the property read wrapped in try/catch: an unreadable value counts as no pairing service, so the fence answers "not paired" instead of leaking the error into the route layer. tests/access.spec.ts pins both lookup paths (30 new lines)

Other Changes

  • The plugin cohort advances to 0.2.1-rc.3: the consumed @deepseek-ai development dependencies move to ^0.2.1-rc.3, dsh.engines.dsh and the @deepseek-ai/dsh peer move to >=0.2.1-rc.3, the packageExtensions repairs for dsh-client-store / dsh-client-ui-primitives in pnpm-workspace.yaml are re-keyed to rc.3 (including the two DeepSeek utility pins), and the lockfile covers all 29 resolved rc.3 packages; the eleven-row browser platform table in shared/web-platform.ts is unchanged and only its provenance comment moves
  • At the surface the pet consumes, those upstream changes are additive: DraftInitializationOptions.whenDraftExists is optional, the pet implements neither MessageSubmissionState nor the new conversation-header owner, and the agent and durable session event declarations used by the activity projection have no rc.3 change, so no runtime adaptation is needed
  • Three new records under .agents/notes/implemented/: feature/2026-10-23-pet-affinity-rank-ladders.md (the ladder decision and the rejected options), process/2026-10-24-sdk-cohort-0.2.1-rc.3.md (why the cohort moved) and process/2026-10-20-plugin-review-round.md (this round's plugin review)
  • Tests: src/voice-pack.test.ts pins validation and whole-ladder merge, src/affinity.test.ts pins lookup and the nameEn projection, src/ledger.test.ts pins the ledger re-seat, src/service.test.ts pins global-vs-pet precedence across a switch and a settings apply, src/client/PetSprite.test.tsx pins English/default rendering and a custom {rank} format, and src/client/index.test.tsx covers the mount injection; locally 681 tests in 51 files and the 22 node --test scripts/dsh-pet*.test.mjs tests all pass

v0.4.8

Choose a tag to compare

@github-actions github-actions released this 19 Oct 23:52

本版本新增内置宠物「deep酱」(deep-chan):由 Daizhdd 贡献的 sprite2d 像素角色,8 列 x 9 行、格 256x288 的图集(2048x2592,57 帧),其中 49 帧是逐帧绘制的独立姿势;内置宠物至此为 12 只。同时修掉了 issue #17——宠物只要出现在屏幕上,整个 GUI 就掉帧:精灵渲染路径不再挂在 requestAnimationFrame 的 60 fps 循环上,图集落位改为整像素对齐,三处气泡上不可见却迫使区域重合成的 backdrop-filter 一并移除。其余改动是为新宠物补齐的注册表期望值、双语 README 行、第三方素材声明与 PR 证据目录。

兼容性:没有破坏性变更。包名 @linxin666/dsh-pet、安装方式、dsh.engines.dsh 声明的宿主下限、$DSH_HOME/pet.json 的持久化位置与键名、线协议字段都没有变化,无需手工迁移。

新功能

  • 新增内置宠物「deep酱」(deep-chan),sprite2d 像素风:8 列 x 9 行、格 256x288 的图集(2048x2592,共 57 帧),其中 49 帧是逐帧绘制的独立姿势,行走 8 帧是完整步态循环、跳跃 5 帧是独立姿势,其余状态由表情与小幅动作连续变化,另有 8 帧左走由右走水平镜像而来;license: Personal-Use-Only,node scripts/dsh-pet.cjs validate assets/deep-chan 通过(#15)
  • 他是「鲸鱼娘」的非官方同人二创形象:角色及相关权利归 DeepSeek 所有,与官方无隶属或背书关系,素材仅限个人非商业使用;THIRD_PARTY_NOTICES.md 与两份 README 都已注明来源与限制
  • 与 jyn / jyn-foxtail / doro / jyn-loli 一样只放仓库、不进 package.json 的 files 白名单,@linxin666/dsh-pet 的安装体积不变

修复

  • issue #17:内置 whale-girl-refined(1536x1872 图集,解码后约 11 MB)在 display.size: 160 下让整个 GUI 掉帧,隐藏宠物即恢复。src/client/spritesheet.ts 现在一次性量化缩放后的格子尺寸(scaledCellSize),framePosition 与 background-size 都由它推导,图集网格、精灵框与每帧偏移共用同一套像素栅格:此前格子渲染为 147.69 x 160 px、background-size 为 1181.5 x 1440 px,每次换帧都落在小数像素边界上,合成器只能重新滤波整张图集;现在换帧是对缩放后图集的整像素平移,不再逐帧重采样
  • src/client/PetSprite.tsx 的换帧调度改为按当前帧剩余时间(src/client/sequences.ts 新增 remainingAt)排程,而不是 requestAnimationFrame,非循环轨道停在末帧后不再唤醒;缩放变化仍会重绘已停下的那一帧
  • 漫游行走直接写浮动元素的 right / bottom 并用 ref 持有实时位置,不再每帧 setState:React 状态只在落地帧更新一次,行走途中被拖起时从宠物实际到达的位置起算
  • src/client/pet.module.css 去掉状态气泡、公告气泡与悬停面板上的 backdrop-filter:三者本来就有 90–97% 不透明,模糊看不见,却让背后区域在每次换帧时被迫重新合成

其他改动

  • src/registry.test.ts 的期望 id 列表按字母序补上 deep-chan,双语 README 的内置宠物表补上对应行,README.i18n.yaml 重新记录成对哈希
  • 新增 PR 证据目录 docs/pr-evidence/deep-chan-pr-15/:设置页宠物选择器截图与本轮评审记录
  • Agent Note:记录 issue #17 精灵渲染路径的几项成本与一项「不适用」的怀疑,以及 2026-10-17 的宠物评审轮次
  • 测试:新增 src/client/spritesheet.test.ts(图集几何),src/client/sequences.test.ts 补 remainingAt 用例,src/client/PetSprite.test.tsx 补整像素图集尺寸、换帧循环不用 rAF、静止轨道停止唤醒、缩放重绘与「行走不触发重渲染」用例,src/client/pet-css.test.ts 增加一条禁止 backdrop-filter 的守卫

English

This release adds the built-in pet deep-chan: a sprite2d pixel-art character contributed by Daizhdd, cut from an 8x9 atlas of 256x288 cells (2048x2592, 57 frames), 49 of them standalone per-frame artwork, which brings the built-in set to 12 pets. It also fixes issue #17, where the pet dropped the whole GUI's frames for as long as it was on screen: the sprite render path no longer runs on a 60 fps requestAnimationFrame loop, atlas placement lands on whole pixels, and the invisible yet re-composite-forcing backdrop-filter on three bubbles is gone. The rest is what the new pet needed: the registry's expected ids, the bilingual README rows, third-party provenance and a PR evidence directory.

Compatibility: nothing breaks. The package name @linxin666/dsh-pet, the install path, the host floor declared in dsh.engines.dsh, the layout persisted in $DSH_HOME/pet.json with its keys, and every wire-protocol field keep their names and meaning, so no manual migration is needed.

New Features

  • New built-in pet deep-chan, sprite2d pixel art: an 8x9 atlas of 256x288 cells (2048x2592, 57 frames), 49 of them drawn as standalone per-frame artwork, the 8-frame walk cycle and the 5-frame jump each an independent pose, the remaining states varying by expression and small motion, plus the 8 running-left frames mirrored horizontally from running-right; license: Personal-Use-Only, and node scripts/dsh-pet.cjs validate assets/deep-chan passes (#15)
  • deep-chan is an unofficial, fan-made derivative of the DeepSeek whale girl (鲸鱼娘): the character and all related rights belong to DeepSeek, this is fan artwork with no affiliation to or endorsement by DeepSeek, and the assets are personal non-commercial use only; THIRD_PARTY_NOTICES.md and both READMEs record the source and the limits
  • Like jyn / jyn-foxtail / doro / jyn-loli it stays repository-only and out of the package.json files whitelist, so the installed size of @linxin666/dsh-pet is unchanged

Bug Fixes

  • Issue #17: the built-in whale-girl-refined pet (a 1536x1872 atlas, about 11 MB once decoded) at display.size: 160 dropped frames across the whole GUI, and hiding the pet restored them. src/client/spritesheet.ts now quantizes the scaled cell size once (scaledCellSize) and derives both framePosition and background-size from it, so the atlas grid, the sprite box and every frame offset share one pixel grid. The cell used to render at 147.69 x 160 px with a 1181.5 x 1440 px background-size, so every frame change landed on a fractional pixel boundary and the compositor could only re-filter the scaled atlas; a frame change is now a whole-pixel translate of the scaled atlas
  • The frame loop in src/client/PetSprite.tsx is scheduled by the current frame's remaining time (src/client/sequences.ts gains remainingAt) instead of requestAnimationFrame, and a non-looping track stops waking once it holds its final frame; a scale change still repaints the settled frame
  • The roam walk writes the float's right / bottom directly and keeps the live spot in a ref instead of a setState on every animation frame: React state updates once, on the landing frame, and a drag grabbed mid-walk starts from the position the pet actually reached
  • src/client/pet.module.css drops backdrop-filter from the status bubble, the announcement bubble and the hover panel. All three are 90-97% opaque, so the blur was not visible while forcing the region behind them to re-composite on every sprite frame change

Other Changes

  • src/registry.test.ts gains deep-chan in its alphabetical slot, the bilingual built-in pet table gains the matching row, and README.i18n.yaml re-records the pair hashes
  • New PR evidence directory docs/pr-evidence/deep-chan-pr-15/: the Settings pet selector screenshot and this round's review record
  • Agent Notes: issue #17's sprite render-path costs and the one suspicion that did not apply, plus the 2026-10-17 pet review round
  • Tests: a new src/client/spritesheet.test.ts (atlas geometry), remainingAt coverage in src/client/sequences.test.ts, whole-pixel atlas size, a frame loop without rAF, a settled track that stops waking, scale repaint and a walk that does not re-render in src/client/PetSprite.test.tsx, and a CSS guard against backdrop-filter in src/client/pet-css.test.ts

v0.4.7

Choose a tag to compare

@github-actions github-actions released this 17 Oct 11:52

本版本迎来第十只宠物「鲸鱼娘·萝莉」(jyn-loli)——本仓库第一只由图生视频逐条生成、以 frames2d 渲染的角色,十轨 720 帧共用一条 72 帧节奏和一个 764×1172 裁切框;交付前又把她 720 帧预览 GIF 里的棋盘格预合成、rest 入场轨的灰影和 work-fail 彩虹的平涂色块一并修掉,并补上了她唯一的玩法缺陷:点击此前不触发任何加成。同时把 frames2d 的解码帧缓存从「永不释放」改为按字节预算回收,修掉了播放过多条轨道或切换皮肤后常驻内存单调增长的问题。宿主侧对齐官方 0.2.1-rc.2 SDK cohort。

重要变更:声明支持的宿主下限抬到 >=0.2.1-rc.2(dsh.engines.dsh、@deepseek-ai/dsh 宿主 peer 与两份 README 徽章同步),更旧的宿主不再落在声明范围内;./invariant 子路径导出被删除(连同 src/invariant.ts 与两份 tsdown 配置里的条目),因为官方 0.2.1-alpha 线取消了 runtime invariant 机制、@deepseek-ai/dsh-invariants 不再发布,而该模块只重复校验本包自己的常量,单测已经钉住这些常量。除此之外是加法与依赖升级:包名 @linxin666/dsh-pet、安装方式、布局持久化位置 $DSH_HOME/pet.json 与键名、线协议字段都没有改名或改语义,没有需要手工迁移的步骤。

新功能

  • 新增第十只宠物「鲸鱼娘·萝莉」(jyn-loli):frames2d 渲染,10 条轨道 / 720 帧 / 每帧 40 ms,全部轨道统一 72 帧 × 40 ms = 2880 ms 节奏,并共用同一个 764×1172 裁切框,切换状态时角色既不跳大小也不跳位置;带 stats、4 个待机小动作(挠头 / 抱鲸鱼枕头 / 舔棒棒糖 / 踏拍摇摆)、三个触摸区、打工与五成成功率的两条结果轨、躺下休息与躺平时的能量回复、被动收入与商店,以及每条轨道一张预览 GIF。由 stushansusu(涂山苏苏)以 MIT 授权投稿,与 assets/jyn、assets/jyn-foxtail 同属「鲸鱼娘」角色线(#16)
  • 她的 84 MB 内容与 jyn / jyn-foxtail / doro 一样不进 package.json 的 files 白名单:只在仓库内随市场分发,@linxin666/dsh-pet 的安装体积不变

修复

  • frames2d 的解码帧不再永久常驻:改为在 MAX_RETAINED_BYTES(128 MiB)内按 Map 插入序做 LRU 回收。此前解码缓存只清理失败路径,任何播放过的帧都要到 dispose 才释放,一只三皮肤宠物跨轨循环下来可钉住约 1.7 GB 内存且只增不减;现在正在播放轨的前瞻窗口与下一次绘制正在等待的那帧永远不会被驱逐,回收优先取出别的轨道,dispose 同步释放全部保留位图,迟到的解码结果也会自己关闭
  • jyn-loli 的 720 帧预览 GIF 改为真透明:此前由预合成的棋盘格产出,整帧不透明、角落读到 (239,237,240);重录后角落 alpha 为 0,叠白背景与已提交帧的平均差从 17 降到 2.0–2.5/255
  • rest 入场轨不再带灰色重影:源片 f0..f20 改为 1:1 逐帧照搬(不再线性插值),多出来的 27 帧落在躺定之后几乎不动的呼吸段,被标记区间的重影幅度从 24.8 降到 2.5 灰阶,rest → resting 接缝仍为 0
  • work-fail 的彩虹改为羽化半透明叠加:被它盖住的像素从时间上最近、并未覆盖它们的帧取回(扇形并集 100% 可找回),毛衣细节恢复 55%,不再有整块平涂纯色埋掉毛衣与鲸鱼图案
  • 修掉她唯一一处玩法缺陷:clickBoost 原本挂在并不存在的三条 shy 动画轨上,触摸块因此整块被丢弃,宿主的回应是 {"ok":false,"error":"no-touch"}——她是当时唯一一只点击不给数值的 frames2d 宠物;现在触摸区、其效果与台词保留,clickBoost 改挂 stats 块

其他改动

  • 对齐官方 0.2.1-rc.2 SDK cohort:全部 @deepseek-ai devDependency 从 ^0.2.1-alpha.5 移到 ^0.2.1-rc.2,cordis ~4.0.5、schemastery ~3.18.5 与 cohort 声明的稳定版对齐,pnpm-lock.yaml 重新解析,minimumReleaseAgeExclude 同步到实际解析集
  • shared/web-platform.ts 复核 0.2.1-rc.2 的冻结模块表,与 alpha.5 逐字节相同,只更新了校验说明;dsh-agent 的 AssistantStreamFrame 与 dsh-session 的事件词表同样两版一致
  • README 双语内置宠物表补上 jyn-loli 行,README.i18n.yaml 重新记录成对哈希
  • 新增 PR 证据目录 docs/pr-evidence/jyn-loli-pr-16/(设置页宠物选择器、宠物卡片、选择器原始选项表与运行中宿主的注册表读数)
  • Agent Note:记录 jyn-loli 的 frames2d 决策与帧级发现、frames2d 保留预算决策、2026-10-12 / 10-13 / 10-16 三个宠物评审轮次,以及 0.2.1 cohort 迁移
  • 测试:新增 tests/jyn-loli-pet.spec.ts(含一个依赖无关的 GIF89a 解码守卫,因为棋盘格 GIF 与透明 GIF 的头部、帧数与节奏完全相同)与 frames2d 保留预算的回收用例

English

This release adds the tenth pet, the whale girl's loli form (jyn-loli) - the first pet in this repository whose frames are generated track by track from image-to-video and rendered through frames2d: ten tracks, 720 frames, one shared 72-frame cadence and one 764x1172 crop box. Before it shipped, its 720 preview GIF frames lost the checkerboard pre-composite, the rest entry track lost its grey ghost, and the work-fail rainbow stopped burying the sweater; its one gameplay defect is fixed too, a tap that used to feed nothing. The frames2d decode cache also stops growing forever: it is now reclaimed under a byte budget. On the host side the package aligns with the official 0.2.1-rc.2 SDK cohort.

Important change: the declared host floor rises to >=0.2.1-rc.2 (dsh.engines.dsh, the @deepseek-ai/dsh host peer and both README badges together), so older hosts fall outside the declared range; the ./invariant subpath export is gone (with src/invariant.ts and the entries in both tsdown configs), because the official 0.2.1-alpha line removed the runtime invariant mechanism and @deepseek-ai/dsh-invariants is no longer published, while that module only re-checked this package's own constants, which the unit tests already pin. Everything else is additive or a dependency upgrade: the package name @linxin666/dsh-pet, the install path, the layout persisted in $DSH_HOME/pet.json with its keys, and every wire-protocol field keep their names and meaning, so no manual migration is needed.

New Features

  • New tenth pet, the whale girl's loli form (jyn-loli): frames2d rendering, 10 tracks of 720 frames at 40 ms each, every track on one 72-frame x 40 ms = 2880 ms cadence and cut from the same 764x1172 box, so the character neither jumps size nor position when the state changes. It carries stats, four idle-director acts (scratch head, hug a whale pillow, lick a lollipop, sway on the beat), three touch zones, work with two result tracks behind a 50% roll, lying down to rest with energy regen while lying, passive income, a shop, and one preview GIF per track. Contributed by stushansusu under MIT, on the same whale-girl character line as assets/jyn and assets/jyn-foxtail (#16)
  • Its 84 MB of content stays out of the package.json files whitelist, like jyn / jyn-foxtail / doro: it ships from the repository through the market only, so the installed size of @linxin666/dsh-pet is unchanged

Bug Fixes

  • frames2d no longer retains decoded frames forever: the cache now reclaims under MAX_RETAINED_BYTES (128 MiB) in Map insertion (LRU) order. The decode cache used to prune only its failure path, so any frame that ever played stayed resident until dispose, and a three-skin pet cycling across its tracks pinned roughly 1.7 GB with monotonic growth. The playing track's look-ahead window and the frame a draw is awaiting are never evicted, other tracks are reclaimed first, dispose releases every retained bitmap synchronously, and a decode that lands after dispose closes its own frame
  • The 720 preview GIF frames of jyn-loli are truly transparent again: they came out of a pre-composited checkerboard, fully opaque with a corner reading (239,237,240). Re-recorded, the corner alpha is 0 and a frame composited on white differs from its committed frame by a mean of 2.0-2.5/255 instead of 17
  • The rest entry track no longer carries a grey ghost: source frames f0..f20 are copied 1:1 frame for frame instead of linearly interpolated, and the extra 27 frames land on the quiet breathing that follows the lie-down, so the ghost amplitude in the flagged range falls from 24.8 to 2.5 grey levels while the rest to resting seam stays exactly 0
  • The work-fail rainbow is a feathered translucent overlay: pixels it covered are restored from the nearest frame that does not cover them (100% of the fan's union is recoverable), sweater detail comes back at 55%, and no flat pure-colour bucket buries the sweater and its whale pattern any more
  • Its one gameplay defect is fixed: clickBoost was gated on three shy animation tracks the package does not ship, so the whole touch block was dropped and the host answered a tap with {"ok":false,"error":"no-touch"} - she was the only frames2d pet in the set whose clicks fed nothing. The touch zones, their effects and their phrases stay, and clickBoost is gated on the stats block instead

Other Changes

  • Aligned with the official 0.2.1-rc.2 SDK cohort: every @deepseek-ai devDependency moves from ^0.2.1-alpha.5 to ^0.2.1-rc.2, cordis ~4.0.5 and schemastery ~3.18.5 match the stable releases the cohort declares, pnpm-lock.yaml is rebuilt from a fresh resolution, and minimumReleaseAgeExclude is reduced to the resolved set
  • shared/web-platform.ts re-verifies the frozen module table of the 0.2.1-rc.2 dist: byte-identical to alpha.5, so only the verification note changed. The dsh-agent AssistantStreamFrame and the dsh-session event vocabulary are likewise identical across the two lines
  • README: the bilingual built-in pet table gains the jyn-loli row, and README.i18n.yaml re-records the pair hashes
  • New PR evidence directory docs/pr-evidence/jyn-loli-pr-16/ (the Settings pet selectors, the pet card, the selector's unmodified option list, and the running host's own registry read)
  • Agent Notes: the jyn-loli frames2d decision and its frame-level findings, the frames2d retention-budget decision, the 2026-10-12 / 10-13 / 10-16 pet review rounds, and the 0.2.1 cohort migration
  • Tests: a new tests/jyn-loli-pet.spec.ts (including a dependency-free GIF89a decode guard, because a checkerboard GIF and a transparent one share headers, frame counts and cadence) and frames2d retention-budget release cases

v0.4.6

Choose a tag to compare

@github-actions github-actions released this 10 Oct 15:01

本版本把宠物插件的交互面开放给同级插件:悬停面板接受插件注册的按钮,公告气泡从单槽改为按发布者分槽,宠物自己的状态气泡可以在设置里关掉。同时修好浮动界面读不到语言包、语音包台词被设置面板覆盖,以及设置表单在共享表单尚未就绪时过早落定这三处缺陷。

重要变更:本版本没有需要手工迁移的改动,没有重命名任何已持久化的标识符、线协议字段或 profile 格式。包名 @linxin666/dsh-pet 与安装方式不变:布局仍持久化在 $DSH_HOME/pet.json,键名不变,新增设置项 statusBubbles 的默认值 auto 与旧行为完全一致。线协议只做加法:状态快照新增可选的 panelActions、statusBubbles 与公告数组 announcements,原有的单数 announcement 字段保留原语义,端点新增 POST /api/pet/panel-action;读不懂新字段的浏览器半端与旧宿主各自忽略它们,不构成破坏性变更。

新功能

  • 悬停面板开放插件动作行:同级插件通过 ctx.pet.registerPanelAction({ id, label, title?, order?, onSelect }) 在 Feed / Rename / Hide 之后追加自己的按钮,点击经 POST /api/pet/panel-action 回到注册插件自己的回调;重复注册同一 id 会替换旧动作,动作随注册插件的 fiber 一起释放(#6)
  • 公告气泡按发布者分槽:pet.announce 由单槽改为以 source 为键的有界槽位表(上限 4),每个发布者保留自己的 TTL,不再互相顶掉;重复发布者原地刷新自己的气泡,两个不同节奏的发布者不会交换上下位置(#1812)
  • 新增设置项 Settings > Pet > Status bubbles(statusBubbles,默认 auto,可关闭):只关掉宠物自己的会话/状态气泡,互动反馈气泡与同级插件的公告气泡照常渲染(#6)

修复

  • 浮动宠物改为通过框架的 locale seat(ctx.locale.bind('pet'))取文案,不再使用只识别 en 的模块内 t 函数;此前除英文外的一切语言都会回落到中文,而旁边的设置卡片已经是翻译过的
  • 语音包台词层在设置路径上不再丢失:所有 seating 路径统一经 remarkLayers() / applyRemarks() 同时解析 manifest 层与语音包层,applySettingsSection() 不再只传 selected.remarks(#10)
  • 设置表单在共享表单报 loading 时不再过早落定:fallbackSettled() 现在只把 ready 判为已落定,因此有界重试窗口会保留到家族表单发布为止(#1813)

其他改动

  • 新增宠物开发者 skill(.agents/skills/dsh-pet-developer/SKILL.md)
  • Agent Note:记录 2026-10-05 的公告分槽与面板动作决策,以及 2026-10-06 的插件评审轮次与 locale seat 缺陷分析
  • README:补充多发布者公告、插件面板动作与状态气泡开关的双语文档
  • 测试:为宠物目录级 voice.json 台词层补上经设置路径的回归用例

English

This release opens the pet plugin's interactive surfaces to sibling plugins: the hover panel now takes plugin-registered buttons, announcement bubbles move from a single slot to one slot per publisher, and the pet's own status bubbles can be switched off. It also fixes three defects: the floating surface could not reach a language pack, the settings surface overwrote the voice-pack remark layer, and the settings form settled before the shared form was ready.

Important change: no manual migration is needed, and no persisted identifier, wire-protocol field or profile format was renamed. The package name @linxin666/dsh-pet and its install path are unchanged: the layout is still persisted in $DSH_HOME/pet.json with unchanged keys, and the new statusBubbles setting defaults to auto, which is exactly the previous behaviour. The wire change is additive: the state snapshot gains optional panelActions, statusBubbles and an announcements array, the singular announcement field keeps its previous meaning, and POST /api/pet/panel-action is new. A browser half or host that predates these fields ignores them, so nothing is broken.

New Features

  • Plugin actions in the hover panel: a sibling plugin adds its own button after Feed / Rename / Hide through ctx.pet.registerPanelAction({ id, label, title?, order?, onSelect }), and the click travels back to the registering plugin's own callback through POST /api/pet/panel-action. Registering the same id again replaces the earlier action, and the action is released together with the registering plugin's fiber (#6)
  • Announcement slots per publisher: pet.announce moves from one slot to a bounded table keyed by source (at most 4), each publisher keeps its own TTL instead of displacing another, and a repeating publisher refreshes its own bubble in place so two publishers on different cadences never swap vertical positions (#1812)
  • New Settings > Pet > Status bubbles switch (statusBubbles, auto by default, switchable off): it silences only the pet's own session/status bubbles, while the interaction feedback bubble and a sibling plugin's announcement bubble keep rendering (#6)

Bug Fixes

  • The floating pet resolves its copy through the framework locale seat (ctx.locale.bind('pet')) instead of a module-local t that distinguished only en; before this change every language but English fell back to Chinese while the settings card beside it was already translated
  • The voice-pack remark layer is no longer dropped on the settings path: every seating path resolves both the manifest layer and the voice-pack layer through one remarkLayers() / applyRemarks() pair, and applySettingsSection() no longer passes selected.remarks alone (#10)
  • The settings form no longer settles early while the shared form reports loading: fallbackSettled() now treats only ready as settled, so the bounded retry window stays open until the family form publishes (#1813)

Other Changes

  • New pet developer skill (.agents/skills/dsh-pet-developer/SKILL.md)
  • Agent Notes: the 2026-10-05 announcement-slot and panel-action decisions, and the 2026-10-06 plugin review round and locale-seat defect analysis
  • README: bilingual documentation for multiple announcement publishers, plugin panel actions and the status-bubble switch
  • Tests: a regression case for a pet-directory voice.json remark layer applied through the settings path

v0.4.5

Choose a tag to compare

@github-actions github-actions released this 05 Oct 08:03

宠物插件随 dsh-web 家族对齐到统一版本。本版本新增两只宠物,修好主开关与宠物自身隐藏意图的冲突,并让设置表单延迟绑定,不再在 apply() 阶段只探测一次。

重要变更:本版本没有需要手工迁移的改动,没有重命名任何已持久化的标识符、线协议字段或 profile 格式。包名 @linxin666/dsh-pet 与安装方式不变:布局仍持久化在 $DSH_HOME/pet.json,键名不变。

新功能

  • 新增宠物 long-niang(#4)
  • 新增 frames2d 宠物 jyn-foxtail(#5)

修复

  • 主开关与宠物自身的隐藏意图可以共存,不再互相覆盖
  • 设置表单改为延迟绑定,不再在 apply() 阶段只探测一次

其他改动

  • Agent Note:记录 2026-10-01、2026-10-02 的收件轮次,以及作者撤回 mei-chi-bao 的重复登记
  • README:优化 SEO 关键词与双语呈现

English

The pet plugin publishes on the family's aligned version. This release adds two pets, fixes the conflict between the master switch and the pet's own hide intent, and late-binds the settings form instead of probing once in apply().

Important change: no manual migration is needed, and no persisted identifier, wire-protocol field or profile format was renamed. The package name @linxin666/dsh-pet and its install path are unchanged: the layout is still persisted in $DSH_HOME/pet.json with unchanged keys.

New Features

  • New pet long-niang (#4)
  • New frames2d pet jyn-foxtail (#5)

Bug Fixes

  • The master switch and the pet's own hide intent coexist instead of overriding each other
  • The settings form is late-bound instead of probing once in apply()

Other Changes

  • Agent Notes: record the 2026-10-01 and 2026-10-02 intake rounds and the author's withdrawal of the duplicate mei-chi-bao entry
  • README: optimize SEO keywords and the bilingual presentation

v0.4.4

Choose a tag to compare

@github-actions github-actions released this 29 Sep 05:28

宠物插件随 dsh-web 家族对齐到统一版本。本版本让拖拽后的位置在重启后保持,并补记宠物收件轮次。

重要变更:本版本没有需要手工迁移的改动,没有重命名任何已持久化的标识符、线协议字段或 profile 格式。包名 @linxin666/dsh-pet 与安装方式不变:布局仍持久化在 $DSH_HOME/pet.json,键名不变;设置镜像改为写入宿主实际伺服的插件行 id,聚合安装下不再是无效的 pet。

修复

  • 宠物:拖拽后的位置在重启后保持(#2)
    • 设置镜像不再写死 pet 命名空间,聚合安装下写入被拒导致位置丢失的问题消失
    • 挂载不再用 schema 默认值覆盖 pet.json 里已持久化的位置

其他改动

  • Agent Note:记录 2026-09-29 的宠物收件轮次

English

The pet plugin publishes on the family's aligned version. This release keeps a dragged position through a restart and records the pet intake round.

Important change: no manual migration is needed, and no persisted identifier, wire-protocol field or profile format was renamed. The package name @linxin666/dsh-pet and its install path are unchanged: the layout still persists in $DSH_HOME/pet.json under the same keys, and the settings mirror now writes the plugin row id the host actually serves instead of the invalid pet under an aggregate install.

Bug Fixes

  • Pet: a dragged position now survives a restart (#2)
    • The settings mirror no longer hardcodes the pet namespace, so a rejected write under an aggregate install no longer drops the position
    • Mounting no longer overwrites the persisted position in pet.json with the schema defaults

Other Changes

  • Agent Note: record the 2026-09-29 pet intake round

v0.4.3

Choose a tag to compare

@github-actions github-actions released this 26 Sep 14:06

宠物插件随 dsh-web 家族对齐到统一版本。本版本重写了设置页的宠物卡片、移除目录诊断面板,并带上聚合外壳关闭宠物与挂载重放的修复。

重要变更:本版本没有需要手工迁移的改动,没有重命名任何已持久化的标识符、线协议字段或 profile 格式。包名 @linxin666/dsh-pet 与安装方式不变;宠物资产的分发方式也不变(包内只内置默认宠物,其余按需从 dsh-market.com 下载到 $DSH_HOME/pets/<id>/)。设置页上的「目录诊断」面板已移除:它只展示信息,不承载任何设置项。

修复

  • 聚合外壳里的宠物可以被关闭:开关不再被聚合行吞掉
  • 上一次挂载尚未释放时被拒绝的挂载不再丢失:持有者退出后自动重放
  • 设置卡片在宿主重新渲染后保持挂载,不再因 dispose 规格不匹配而卸载

其他改动

  • 设置页的宠物卡片按官方布局席位重写,移除目录诊断面板
  • README:展示工坊上最受欢迎的三个宠物

English

The pet plugin publishes on the family's aligned version. This release rewrites the settings-page pet card, drops the directory diagnostics panel, and carries the aggregate-shell off switch and mount replay fixes.

Important change: no manual migration is needed, and no persisted identifier, wire-protocol field or profile format was renamed. The package name @linxin666/dsh-pet and its install path are unchanged, as is how pet assets are distributed: the package ships only the default pet, and the Workshop downloads the rest into $DSH_HOME/pets/<id>/ on demand. The directory diagnostics panel is gone from the settings page; it only displayed information and carried no setting.

Bug Fixes

  • The pet can be turned off from inside the aggregate shell: the switch is no longer swallowed by the aggregate row
  • A mount refused while the previous holder was still alive is no longer lost: it replays once the holder exits
  • The settings card stays mounted across host re-renders instead of unmounting on a dispose-spec mismatch

Other Changes

  • The settings-page pet card is rewritten against the official layout seats, and the directory diagnostics panel is removed
  • README: showcase the three most-liked Workshop pets

v0.4.2

Choose a tag to compare

@github-actions github-actions released this 24 Sep 14:39

宠物插件随 dsh-web 家族对齐到统一版本。从本版本起,四个卫星仓与本仓发布同一个 X.Y.Z,卫星先发、本仓后发;版本号从 0.3.25 跳到 0.4.2 是这次对齐的结果。

重要变更:本版本没有需要手工迁移的改动,没有重命名任何已持久化的标识符、线协议字段或 profile 格式。包名 @linxin666/dsh-pet 与安装方式不变。宠物资产的分发方式也不变:包内只内置默认宠物,其余宠物由工坊按需从 dsh-market.com 下载到 $DSH_HOME/pets/<id>/。

其他改动

  • CI:pull request 自动路由到对应评审人;发布管线支持在同一 tag 上补跑(发布已成功但 registry 传播检查未过时,可直接重跑 dispatch 车道,无需重推 tag)
  • 文本文件统一以 LF 检出

English

The pet plugin aligns to the dsh-web family's unified version. From this release on, the four satellite repositories publish the same X.Y.Z as this repository, satellites first; the jump from 0.3.25 to 0.4.2 is that alignment.

Important change: no manual migration is needed, and no persisted identifier, wire-protocol field, or profile format is renamed. The package name @linxin666/dsh-pet and the install path are unchanged. Pet asset distribution is unchanged too: the package bundles only the default pet, and every other pet installs on demand from dsh-market.com into $DSH_HOME/pets/<id>/.

Other Changes

  • CI: pull requests are routed to their reviewers automatically, and the release pipeline can complete a tag that already published (re-run the dispatch lane instead of re-pushing the tag when only the registry propagation check failed)
  • Text files check out with LF line endings

v0.3.25

Choose a tag to compare

@github-actions github-actions released this 23 Sep 15:44

宠物插件迁出 dsh-web 主仓后的首次独立发布。包名 @linxin666/dsh-pet 与安装方式不变,版本线从本版本起独立推进。

重要变更:本版本没有需要手工迁移的改动,但相对 npm 上现存的 0.3.24 修复了一个会让插件完全无法激活的缺陷。此前发布的 0.3.24 仍然注入 0.1.7 已下线的 settingsScope 服务(构建产物里出现 19 处),在 0.1.7-rc.1 宿主上挂载会停在等待 settingsScope,永不激活。本版本随 0.1.7-rc.1 适配移除了该注入,挂载恢复正常。宠物资产的分发方式不变:包内只内置默认宠物,其余宠物由工坊按需从 dsh-market.com 下载到 $DSH_HOME/pets/<id>/,可随时安装与卸载。

新功能

  • 独立仓库:宠物插件单独评审、单独发版,不再跟随主仓的统一版本
  • 无需宿主表单即可持久化宠物选择(新增 src/client/main-session.ts)
  • 插件列表图标(icon.svg)

修复

  • 移除已下线的 settingsScope 注入,恢复在 0.1.7-rc.1 宿主上的激活

其他改动

  • 仓库内置宠物校验/安装 CLI(scripts/dsh-pet.cjs)
  • 新增 CI 与 tag 触发的发布管线
  • 补齐 CONTRIBUTING 与仓库元数据
English

First standalone release after the pet plugin moved out of the dsh-web monorepo. The package name @linxin666/dsh-pet and the install path are unchanged; the version line advances on its own from here.

Important change: no manual migration is needed, but this release fixes a defect that stopped the plugin from activating at all. The 0.3.24 currently on npm still injected the settingsScope service retired in 0.1.7 (19 occurrences in the built bundle), so mounting it on a 0.1.7-rc.1 host stalled waiting for that service and never activated. This release carries the 0.1.7-rc.1 adaptation that removes the inject, and mounting works again. Pet asset distribution is unchanged: the package bundles only the default pet, and every other pet installs on demand from dsh-market.com into $DSH_HOME/pets/<id>/, where it can be uninstalled again at any time.

New Features

  • Standalone repository: the pet plugin is reviewed and released on its own, no longer tied to the monorepo's unified version
  • Persist the pet selection without a served host form (new src/client/main-session.ts)
  • A listing icon for the plugin (icon.svg)

Bug Fixes

  • Drop the retired settingsScope inject and restore activation on a 0.1.7-rc.1 host

Other Changes

  • Carry the pet validate/install CLI in the repository (scripts/dsh-pet.cjs)
  • Add CI and a tag-triggered release pipeline
  • Add CONTRIBUTING and repository metadata