## 0.2.9 — 2026-11-01 **冷却不再把「投递成功」当成「她开口了」;那句念头现在会带上「现在几点」** - 🐞 **冷却被白吃**:以前「搭话冷却」的时间戳是在**投递那一刻**记的。可投递只是把一句念头塞进她的会话, 她完全可以看完选择不说(真机上发生过:送出后这一轮 1 秒结束、一个字没发), 冷却却已经记上了 —— 接下来整整一个冷却周期都不再投,机会白白抵消。 - ✅ 现在只有**真的出现一条有正文的 assistant 消息**才算她开过口:只有思考、只调了工具、 正文全是空白,都不算;而且只认勾着的目标会话(别的会话、子智能体说话也不算)。 - ✨ **那句念头里加了一行「现在是几点」**。宿主本来每步都会塞一条时间,但那个插件默认 10 分钟内不重复塞 —— 一跳过,她就只剩「好久没人跟我说话了」,于是把大白天当成凌晨、 怕吵醒人把自己劝退。现在消息自带「现在这会儿是 11 月 1 日 周日 下午 3:08」, 触发文案一个字没改。 - 测试:`node tests/宿主半边.mjs`(新增 5 项冷却断言 + 1 项时间断言)、`node tests/网页半边.mjs` 全过。 ## 0.2.8 — 2026-11-01 **「检查更新」以前会报错版本,而且只给一条命令让你自己手动复制、然后手动装** - 🐞 **"最新版本"会骗人**:以前是「哪个地址先返回就用哪个」。GitHub 一超时就落到 jsDelivr —— 那个地址**带 CDN 缓存、会滞后好几天**,于是同一分钟内能报出好几个不同的"最新", 甚至比你本机装的还旧,看着像"该降级"。 - ✅ 现在**三个源全查**(GitHub / jsDelivr / npm registry),**取版本号最大的那个**: 版本只会往前走,哪个源报小了就是它滞后。三个都失败才说"查不到",绝不把旧值当成"最新"。 - ✨ **检测到新版可以直接装**:那一块多了一个「一键更新到 vX」按钮,点它走 DSH 自己的插件管理装最新版, 装完会提示你重启(或重载)一次。以前只有一个「复制命令」,得你自己去终端敲两行。 - 🧹 **界面上那些命令行全删了**:以前那两行 `dsh plugin --profile web remove/add` 和「复制命令」按钮不再显示 —— 很多人看不懂,还得跑来问。现在有新版就只有「一键更新到 vX」一个按钮。 - ⚠ **本地开发副本(link: 进来的那种)不给一键装** —— 那会把正在改的目录换成仓库里的版本; 这种会明确写出来,让你手动更新。 ## 0.2.7 — 2026-10-29 **会话清单列不全** - 🔧 跟 QQ 桥同一个毛病:只认 `typeof 会话服务.list === 'function'`,新版 DSH 那里是快照对象, 于是只剩 agent 兜底 —— 没打开过的会话列不出来。 - ✅ 三路都试:内存里的会话(`list()` / `getSnapshot()`)、盘上的 `storages/session_projcache/sessions/*.json`、agent 兜底;子智能体会话滤掉。 - 测试:宿主 / 网页两边全过。 ## 0.2.6 — 2026-10-26 **配置文件开头带 BOM 时,设置不会再「变回默认」** - 🐛 用记事本 / PowerShell 存出来的 UTF-8 文件开头会带一个 `\uFEFF`(BOM),`JSON.parse` 直接抛错 —— 设置被当成「坏文件」,退回旧配置或默认值(默认是「总开关开着、目标会话空」),看着就是**设置全没了、也不说话**; 这时候再点一下保存,还会把默认值写回去,原来的勾选和文案就真丢了。 - ✅ 读配置时先去掉**文件开头**那一个 BOM(正文里的 U+FEFF 原样保留),新旧两个配置文件都走这条; 写出去的文件照旧不带 BOM。 - 测试:`node tests/宿主半边.mjs`(新增 5 项 BOM 断言)、`node tests/网页半边.mjs` 全过。 ## 0.2.5 — 2026-10-26 **目标会话那一轮报错时,现在真的会记下来了** - 🐛 「目标会话」存的是一个**数组**(可以勾好几个),但 `agent/error` 那里还在拿 `String(agent.id)` 跟整个数组比 —— 永远不相等,于是「目标会话这一轮报错了」这条从来没记过。 - ✅ 改成按会话键逐个比,数组里任何一个对上就算(`session-` 前缀有无都认)。 - 测试:`node tests/宿主半边.mjs`、`node tests/网页半边.mjs` 全过(新增 3 项)。 # 改动记录 > **版本号规矩**:每改一次 **+0.0.1**;末位满 10 **进位**(`0.1.9` → `0.2.0`)。 > 现在是 **0.1.7**(从 `0.1.0` 起,共 7 次改动)。 > 版本号只写在一处真源:`package.json`;提交信息也以版本号开头。 ## 0.2.4 — 2026-10-26 **峰谷可以按时区算了(海外机器也能对上北京时间,issue #4)** - 🆕 新增设置项「按哪个时区算峰谷」:填 IANA 名字(如 `Asia/Shanghai`)就按那个时区判峰谷; **留空 = 跟本机时区**(默认,和以前一样)。写得不对当没填。 - 🐛 以前峰谷判定用的是**这台机器本地时间**,可 DSH 的峰谷是按北京时间算的 —— 机器不在东八区时, 峰时会判成谷时、谷时判成峰时,命中线整个错位。 - 自测:宿主半边 **86 项**全过(新增 6 项:北京时区判峰 / 同一瞬间按洛杉矶算 / 名字写错退回本机 / 时区名规整 / 算基础命中线认时区两种)。 ## 0.2.3 — 2026-10-24 **修:触发语被当成「对方说的话」,语境错位(用户报的)** - 🐛 掷中之后那句触发文案是**原样**当成一条 user 消息送进去的。可 user 消息在模型眼里就是「对方说的」——于是「好久没人跟我说话了,我该主动去打个招呼」被读成**主人在跟它说这句话**,它顺着回答「那我陪你说话呀」,而不是自己起个话头。 - ✅ DSH 只认 user 角色(developer 送不了),所以改成**在文字里把语境说清**:正文最前面加一句「这是你自己心里冒出来的念头,不是对方说的话;顺着它去做,不用回应它」,**触发文案一个字不改**。 - ✅ 「演练」日志里也显示**带框之后**的原文,所见即所发。 - 设置页那句说明也改了:告诉她写一句心里话就行,别在那里再写解释。 ## 0.2.2 — 2026-10-23 **修:「目标会话」勾不掉、已勾数虚高(用户报的)** - 🐛 同一个会话被存成两种写法(`9120c7fa-…` 和 `session-9120c7fa-…`)时:面板说「已勾 1 个」、列表里那个框却是空的;点一下变「已勾 2 个」;取消只删掉一种写法,另一种留着 ⇒ 点不掉、还在往那儿发话,只能手改 JSON。 - ✅ 比较和去重改成按「去掉 `session-` 前缀的键」——两种写法算同一个会话。**存进去的写法不变**,不硬改别人的 id。 - ✅ 磁盘上已经存坏的老配置,**打开设置页读一次就自动洗净**写回,不用手改。 - 加了 6 条回归测试盖住这个坑。 ## 0.2.1 — 2026-10-22 **README 文案改成中性的** - 全文把伙伴默认写成「她」的地方改成中性的「它」;换个人用也读得通。 ## 0.1.8 — 2026-10-20 **修:设置页文案里的 `**` 会被原样显示成星号** - 界面文字不是 markdown,`**不花模型**` 这种都会露星号;把 UI 文案里的星号全去掉了(24 行)。 - 注释里的星号保留(那不影响显示)。 ## 0.1.7 — 2026-10-20 **修:目标会话清单里混着「已归档」的会话** - 🐛 归档只是把会话藏起来,`sessions.list()` 里**还在**;原来只调 list(), 于是设置页里把那 40 个已归档的也列出来了,勾了也没用。 - ✅ `inject` 加 `workspaceRegistry`,从 `archivedSessionIds` 取归档名单(照朗读桥的写法)。 - ✅ 清单:没勾着的归档会话**不列**;已勾着的仍然显示并标「⚠ 已归档」,方便取消。 - ✅ 发送时也跳过归档会话(日志写「已归档」),不再往废纸篓里说话。 ## 0.1.6 **补:安装指令 + 这份改动记录** - README 的「装 / 开」重写了:先给**一行就能装**的办法(DSH 里:设置 → 插件 → 安装, 填 `github:Yuuyuko-uu/dsh-speak-up`;或者命令行 `dsh plugin --profile add github:Yuuyuko-uu/dsh-speak-up`), 再写给开发者用的「本地改代码那种装法」。 - 加了这份 `CHANGELOG.md`。以后**每改一次加 0.0.1**,提交信息以版本号开头。 ## 0.1.5 **有改动时,底下自己浮出「保存设置」条** - 改了任意要保存的项(数字 / 触发文案 / 开关 / 角色)→ 设置页底部浮出 `⚠ 有改动还没保存 [保存设置]`,不用再滚到页面最下面找那个按钮;保存完它自己收起来。 - 没改动时**压根不渲染**(不占地方、不挡视线)。用的是 `position: sticky`,只在这一页里浮着。 ## 0.1.4 **中文名叫「主动搭话」**(原来是「自己开口」) - 设置页那一节、README 标题、插件说明都换成「主动搭话」。 - 顺带把冷却那一格的配置键改成 `搭话冷却分钟`(老键 `自己开口冷却分钟` 仍然读得出来,设置不会丢)。 ## 0.1.3 **英文名改成 `dsh-speak-up`**(原来是 `dsh-her-words`) - 包名、插件 id、路由前缀、来源标记、配置文件名字全跟着改。 - ⚠ **旧配置会自动搬过来**:新配置文件不存在时,会退回读 `her-words-config.json`,设置不丢。 - 宿主半边文件名 `lib/index.js` → `lib/host.js`(跟 `lib/client.js` 配一对)。 - 顺手修:**改了「掷骰子间隔」保存后立刻重挂定时器** —— 原来是等旧的那一轮走完才生效 (把 15 分钟改成 1 分钟,得先干等满 15 分钟才有第一次滴答,看着像坏了)。 ## 0.1.2 **「概率」改叫「命中线」+ 没中加成 + 冷却单独一格** - 「峰时概率 / 谷时概率」→ **「峰时命中线 / 谷时命中线」**:每轮掷一个 0~100 的数, **掷到命中线以下才开口**(掷在上面就不开)。 - 新增 **没中加成**(默认 10:每没掷中一次,下一次命中线 +10;**0 = 关掉**) 和 **加成上限**(默认 40)。**掷中(含试运行掷中)就清零**,从头开始。 - **搭话冷却**单独一格(默认 20 分钟,**0 = 不冷却**),不再偷偷借用「近阈值分钟」那一格。 - 记录改成**先说最终答案**,例如: `掷中 ✓ 掷出 15.0(命中线 20.0 —— 掷到 20.0 以下就开口)|20.0 = 峰时命中线 20% × 时机因子 1(距上次说话 74.6 分钟)` ## 0.1.1 **峰谷分时**:贵的时候少开口,便宜的时候多开口 - 时段**写死、不用填**:周一~周五 `9:00~12:00`、`14:00~18:00` 是**峰时**; 其余全部(含午休 `12:00~14:00`、晚上到早上、**周末全天**)是**谷时**。 - 两格命中线:峰时默认 **20**、谷时默认 **60**;两格填一样 = 不分峰谷。 ## 0.1.0 **首发**:本地掷骰子 → 掷中就走 DSH 自己的一轮(`agent.followup`) - 纯本地 `Math.random`,**掷骰子一个 token 都不花**;只有掷中之后那一步才花模型。 - 设置页:总开关 / 试运行 / 掷骰子间隔 / 安静时段 / 时机因子 / 目标会话(勾选清单)/ 触发文案 / 角色,外加「演练一次(绝不真发)」「真发一次(跳过等待)」两个按钮。 - 触发消息是 `user` 角色 + 自家 `source.kind` 来源标记(不冒充使用者发的消息)。