Skip to content

Releases: Red0tsnow/dsh-companion

dsh-companion 0.7.3 · 首次真实安装验证

Choose a tag to compare

@Red0tsnow Red0tsnow released this 26 Oct 13:34

docs(0.7.3): record the first real-user install, and keep the claim scoped

A user with no Node experience installed the plugin on Windows by asking DSH to do
it, then connected Minecraft and QQ. Nothing blocked them.

That is the first evidence that the install path works off the development machine,
so the limitations section no longer says a fresh Windows user was never tried.

It stays narrow on purpose:

  • Bilibili is still unverified — that user had no alt account, so the round trip after
    scanning was never exercised
  • QQ is verified to "connects and round-trips", not to long-term stability: reconnect
    behaviour and how often a re-scan is needed are unknown
  • everything added after 0.6.0 (self-play, the three reflection rituals, the empty-world
    watchdog) has no real-wake evidence at all
  • one install is not a regression suite

Also carries the two commits from the parallel session: task-outcome and skill-acceptance
tests, and the rule telling the character to leave a world the user has finished with.

dsh-companion 0.7.2 · 空世界自动关

Choose a tag to compare

@Red0tsnow Red0tsnow released this 26 Oct 12:28

feat(0.7.2): close the world when nobody has been in it for a while

Stopping the self-play wakes fixed the model bill, but the world itself kept running:
a player opens it, plays, quits the game, and the server holds memory until someone
remembers to close it by hand. On a first install nobody knows to.

A watchdog now watches two things at once 鈥?is the world up, and is anyone in it:

  • mc.autoStopEmptyMinutes, default 15, 0 disables, capped at 1440 and validated
  • world-idle.js tracks when the world first went empty and calls worldAction('down')
    after the configured time. A player arriving clears the clock, a running task keeps
    the world alive, and an already issued stop never repeats
  • for a LAN world 'down' only disconnects the body, leaving the user's own client
    untouched; for a plugin-managed world it stops the server
  • the amount is editable in the panel next to the self-play timing, and the reason
    is recorded in world-idle.json rather than the error list, because this is normal
    behaviour, not a failure

The panel field and both language strings ship in the built client.

144 tests, 7 of them new: the guards (disabled channel, 0 minutes, world not up), the
full path (stops once the window elapses and only once), a player arriving resets the
clock, and a running task is never interrupted.

dsh-companion 0.7.1 · 没人时不唤醒

Choose a tag to compare

@Red0tsnow Red0tsnow released this 26 Oct 12:15

fix(0.7.1): stop waking the character while nobody is in the world

The self-play loop only asked "has there been no input for a while". Leaving the
world produces exactly that condition, so a character kept waking up and taking a
full model turn every cooldown — up to the consecutive cap — for an audience of
nobody. A novice who opens a world, plays, and closes the game has no way to know
they are still being billed, and the character has no way to know "I'm done" means
stop.

The body now reports who is actually in the world:

  • mc-body.js counts non-self players whose entity is present (players who quit keep
    a roster entry but lose the entity), exposes humansOnline and lastHumanSeenAt in
    both status() and snapshot(), and never throws when the bot is gone
  • life.js: the self-play decision moves into an exported selfplayDecision() so the
    behaviour that spends money is directly testable. It refuses to arm a wake when
    humansOnline is 0, withdraws an entry that was already armed, and resets the
    consecutive streak so coming back starts clean
  • selfplay.requireHuman (default true) is the explicit opt-out for people who do
    want solo play; requireHuman:false restores the previous behaviour

The panel hint and the README row both say the loop does not wake while the world
is empty.

137 tests, 8 of them new here: an empty world never arms a wake, an armed entry is
withdrawn when the last player leaves, cooldown and the cap still hold, a human
message resets the streak, and the body counter ignores itself and dropped players.

dsh-companion 0.7.0 · 鲸屋

Choose a tag to compare

@Red0tsnow Red0tsnow released this 26 Oct 10:12

改名了:「同居者」→「鲸屋」/ Whale House。

原因很简单:中文里「同居」先被读成法律意义上的同居关系,其次是这个名词太抽象——第一次听到根本想象不出画面。鲸屋保留了同一个意思(她住在你这里,不在某个服务里),又带上了项目本来就在用的那头鲸鱼。

改了什么

只改用户看得见的:

位置 现在
面板标题 鲸屋 / Whale House
设置侧栏入口 鲸屋 / Whale House
README 标题 dsh-companion · 鲸屋
新手说明里的回指 设置 → 鲸屋

刻意没动的

这几样改了会让已安装的人出问题:

  • 包名 dsh-companion(改了等于发新包,老用户断更新)
  • 数据目录 companion(改了老用户的日记找不到)
  • 环境变量 DSH_COMPANION_HOME / _CREDENTIALS
  • 客户端 slot id 和所有 CLI 入口

顺便

删掉了副标题「一个角色,慢慢过自己的日子。」/「One character, a life that carries on.」。

因为副标题是 <p> 标签,清空文案会留一个空行,所以顺手改成有内容才渲染。

验证

125 项测试通过
check.mjs 通过(129 文件)
构建产物:鲸屋 ✓  Whale House ✓  同居者残留 ✗
装到隔离目录后,安装副本的 client.js 同样确认

Release:https://github.com/Red0tsnow/dsh-companion/releases/tag/v0.7.0


顺带说一句:提交时踩了个坑——git commit -m "..." 里的 -> 被 PowerShell 当成重定向,报 unknown switch '>'。改成写进文件用 -F 才过。以后提交信息里别写箭头。

dsh-companion 0.6.6

Choose a tag to compare

@Red0tsnow Red0tsnow released this 26 Oct 08:19

加了三件「回头看自己」的定时任务。解决的问题:人设、长期记忆、规则文件都不会自己更新,规则里早就写了她可以改,但没有任何时机让她想起来。

三个开关(共用一个总开关,默认关闭)

开关 节奏 做什么
整理长期记忆 每月 1 号 11:00 日记里 30 天前的段落压成三行写进长期记忆,原文进 archive/
人设回顾 每周日 21:00 这周有没有哪句话让她觉得「我不是这样想的」;想不清楚可以跳过
规则检查 每月 15 号 21:00 规则有没有跟实际冲突、过时;一个月最多改一条

三个刻意的约束

  1. 配额按窗口算,不是按天——月度整月只记一次,周度按周一起界。这一点差点做错:原来 lifeGate 会走按天账本,那样月度任务会被允许每天一次。
  2. 日期限制 1–28,避免二月没有 30 号导致整月跳过。
  3. 人设回顾允许空着。为了完成配额去改人设,比不改更糟——这条写进了提示词。

用法

node companion.mjs reflect status            # 三件各自做了没有
node companion.mjs reflect gate memory       # 定时唤醒先查,allowed:false 就安静结束
node companion.mjs reflect mark memory "…"
node companion.mjs reflect mark persona --skip

账本 workspace/reflect.jsonl,同一窗口第二次 mark 退出码 3。

需要 dsh-proactive(和已有的三项一样),缺了会在面板显示不可用。

125 项测试通过,包含窗口配额行为和构建产物文案检查。

dsh-companion 0.6.5

Choose a tag to compare

@Red0tsnow Red0tsnow released this 26 Oct 08:01

按实际第一次用的反馈改了两处。

1. 第 5 步原来写错了

原文写"点「打开角色对话」→ 随便说一句"。实测是:

点完之后 DSH 会让你选一个工作空间,选完发现里面还不是她,是 DSH 自己的会话。

真正能跟她说话的是面板里那个折叠行「在这里聊一句」→ 输入 → 「发送」。

改成了正确的两步,并且说明了:如果那行显示「当前为独立面板预览;角色对话需在 DSH 中打开」,说明在预览里,没回复是正常的。

2. 大部分步骤可以直接让 DSH 做

新增开头一节:装好 DSH 之后,直接说

帮我装这个插件:https://github.com/Red0tsnow/dsh-companion

它会自己下载、打包、装进 profile、告诉你该重启了。

第 2、4、6、7、8 步都加了「可以交给 DSH 做」的标注,同时写明哪两步只能自己做:

  • 装 DSH 本身——没有它就没有能替你干活的东西
  • 所有扫码——QQ、B站都得你手机扫

测试

新增两条断言,防止这两处再被改回去:文档必须提到"选一个工作空间"和"那里面还不是她",必须提到"可以交给 DSH 做"。117 项通过。

dsh-companion 0.6.4

Choose a tag to compare

@Red0tsnow Red0tsnow released this 26 Oct 07:51

加了一份写给完全没接触过的人的说明:从零开始。

之前的文档都默认读者已经在用 DSH、能看懂功能清单。这份从"你电脑上还没有 DSH"开始,九步:

  1. 先确认这不是 App —— 只想"下载就能聊"的人看到这里就该停
  2. 装 DSH,先确认它自己能聊天(跳了这步后面全白费)
  3. Node 22+,装插件,完全重启 DSH
  4. 打开面板,看「宿主模型」那行是"可用 / 未配置 / 未知"
  5. 写人设,点「载入示例」或「载入空白模板」,存
  6. 点「打开角色对话」,随便说一句——最小可用到此完成
  7. 可选:进 Minecraft(三个选项怎么选、勾哪两个框、要等几分钟)
  8. 可选:上 QQ(两个号、扫码、先看风险提示)
  9. 可选:连 B站(扫码)
  10. 可选:三个日常开关(默认全关,要另装 dsh-proactive)

最后一张表是"卡住了查哪里",按现象列到具体日志。

每一步都写了"看到什么、点哪里",引用的按钮文字全部核对过真实存在。新加的测试会在这份文档和界面文字脱节时报错。

另外 check.mjs 拦下了我写的一个 C:\Users\你的用户名\... 示例路径——规则是对的,文档是公开的,不该带机器路径。改成描述位置。

115 项测试通过。

dsh-companion 0.6.3

Choose a tag to compare

@Red0tsnow Red0tsnow released this 26 Oct 07:45

补了两份之前完全缺失的东西:隐私说明和平台协议风险。

隐私(新增 docs/privacy.md)

  • 插件不上传任何数据:没有账号服务器、没有遥测、没有崩溃上报
  • 逐项列清数据在哪:人设/日记/记忆是 workspace/ 里的纯文本;凭据单独在 secrets.json,任何接口都不返回凭据值;世界和身体在 runtime/
  • 什么会出去:对话会发给你 DSH 里配置的模型服务方——这是 DSH 的行为,插件不记录;日记、记忆、媒体只在本机
  • 对外请求白名单(硬编码,不在名单直接拒绝):Mojang 三个域名、Adoptium、GitHub 发行、Paper、Modrinth
  • 怎么删:删数据目录即可;卸载插件不删数据(避免误删日记)

平台协议风险

原来只写了"风控",没写"协议"。现在 QQ 和 B站都补上:

用第三方客户端或自动化方式使用这些平台,可能违反它们的用户协议,账号可能被限制或封停。插件只在你本机调用公开协议,不绕过任何安全机制;是否使用由你决定。

写在三个地方:面板提示(仍限 QQ / B站)、连接向导两处、README。

顺手修的

  • NOTICE 版本号从 0.6.0 更新;删掉"Paper 仍待验收"这句过期陈述(0.5.2 已开放);新增隐私段
  • 面板提示框加了隐私一句

验证

112 项测试(新增 4 项)。tests/notices.test.mjs 会检查:privacy.md 里的域名白名单必须和 downloads.js 一致、面板文案不能消失、构建产物不能是旧的。装到隔离目录后逐句核对五条新文案确实在 lib/client.js 里。

dsh-companion 0.6.2

Choose a tag to compare

@Red0tsnow Red0tsnow released this 26 Oct 07:30

加了账号风险提示。功能代码与 0.6.1 一致,只有文案。

提示内容

新建小号或多年未使用的小号可能触发平台风控、验证或账号限制;QQ 小号还可能因风险提醒需要每隔一段时间重新扫码登录,登录态无法保证长期有效。本插件尚未在长期使用的账号上进行测试,不推荐使用主号,风险自负。

写在四个地方

位置 形式
面板 QQ / B站向导里的一段提示(QQ 额外多一句重登说明)
连接向导 两个扫码步骤之前各一段
已知问题 一条独立条目
README 「四个通道各需要什么」下面

中英双语,四处都有。

验证

  • 108 项单元测试通过,check.mjs 通过
  • 装进隔离目录后,解出 lib/client.js 逐句确认七条文案都在包里(打包器把中文转成了 \uXXXX 转义,直接搜原文是搜不到的)
  • 真实初始化产出 body + bridge 正常

dsh-companion 0.6.1

Choose a tag to compare

@Red0tsnow Red0tsnow released this 26 Oct 07:16

0.6.1 只改文档和打包,功能代码与 0.6.0 完全一致。

改的原因:README 一开头是功能列表,没回答陌生人最先问的三个问题——这是啥、我要先装什么、每个通道还要我自己准备什么。

现在的 README 结构

  1. 开头就说明:这是 DSH 的插件,不是独立 App,不是模型,用你自己 DSH 里已配好的模型
  2. 为什么用它:一张对照表(没有它 vs 有了它)
  3. 前置条件:DSH、模型、Node 22+、Windows——四个都列出来,缺一不可
  4. 四个通道各需要什么:左边「你要准备」,右边「插件替你做」,第三列写当前验收到什么程度
  5. 明确的限制:平台、验收、功能边界、行为约束,四类写全
  6. 安装:先用 Release 里的包,源码打包放第二条

明确写出来的限制

  • 只在 Windows 验过,全新用户首装没实测
  • QQ / B站没有跑通真实账号完整往返
  • 三个日常功能默认关闭,还要另装 dsh-proactive@0.3.1
  • Paper 皮肤只支持 1.21.8 build 60
  • 人设上限 4000 个 UTF-16 单位,超了拒绝保存不截断
  • 不生成语音,小黑盒不含签名实现
  • 模型费用自己承担

验证

108 项单元测试通过,check.mjs 通过(125 文件,无个人路径泄漏),包重新构建。