# 变更记录 本项目的所有值得注意的变更都记在这里。格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/), 版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。 [English](CHANGELOG.md) ## [0.2.7] — 2026-10-21 ### 修复 - **粘贴、输入法合成、拖拽落字时 ghost 也会消失**,不再只对「可打印按键」生效。DSH 0.2.1-rc.2 起 slot 拿不到草稿,`Cmd+V`(keydown 带 metaKey)和中文输入法(`key === "Process"`)都会漏过去, 灰字会压在刚插入的文字上。 - **输入框已有草稿时不显示、也不再发起预测。** 原来的草稿判据用的是 `useInput(...).draft`,rc.2 起 恒为空,写了一半的消息可能被灰字盖住,而且那次模型调用白花。现在改读编辑器自身的 DOM 文本 (占位符是兄弟节点,不会混入),草稿清空后会自动重新触发预测。 ### 新增 - **连续失败时在输入框里给提示。** 连续两次预测失败会显示一行「联想没成功:…」,不再静默;成功后或 一开始输入就消失。 - **「暂停 10 分钟」开关。** 设置页可临时停止预测十分钟,带实时倒计时(「已暂停,剩余 7:31」)并到点 自动恢复;截止时间存在本机,刷新/重启后仍然有效。暂停期间不会发起任何预测调用(「试一下」按钮不受 影响,因为那是用户的显式操作)。 - **历史记录可清空、可复制。** 「清空」会同时清掉列表和 `localStorage`;每条展开后的原文旁边有「复制」。 - **设置页新增「试一下」按钮。** 它直接调用 composer 用的同一个 `/suggest` 接口,所以反映的是真实链路 (模型路由、语言、字数、放宽重试都包含),结果也会写进「最近预测」;装完或改完设置点一下就知道生效没有。 - **「建议语言」和「字数上限」从「高级」提到主区域**;高级里只留超时、上下文规模/预算、思考深度、记录条数。 ### 修复 - **文档写「最多 3 次调用」,代码实际允许 4 次。** 最坏路径是 主调用 + 档位降级 + 长度放宽 + 换一条;中英 README 已改成 4。 - **「试一下」的耗时单位原先写死 `ms`**,现在跟随界面语言;composer 失败提示里的 provider 长报错会截到 80 字符(完整原因仍保留在历史记录里)。 ### 新增 - **浅色 / 深色主题。** 文字、背景、边框与状态色优先使用 DSH 自己的设计令牌 (`--dsw-alias-label-*`、`--dsw-alias-bg-*`、`--dsw-alias-border-*`、`--dsw-alias-state-*`,随应用主题走), 取不到时回落到按 `prefers-color-scheme` 选择的本地调色板;切换时无需刷新。 - **清空历史后可撤销**,保留 5 秒。 - **失败计数改为跨 composer dock 共享**(一个会话失败不再清零另一个会话的计数),但提示仍只在最近失败的 那个会话里显示。 - 「试一下」按钮在暂停期间悬停会说明它仍然可用。 - **设置页标题旁显示插件版本**(`/status` 直接读 `package.json` 返回,不会两处不一致)。 - **设置卡片声明了 `color-scheme`**,让数字输入框的上下箭头、下拉弹层等原生控件也跟随深色。 ### 变更 - **设置项提示文案精简。** 「建议语言」「字数上限」「暂停预测」下面的长句各压成一行,完整说明挪到鼠标 悬停的 `title` 里;暂停按钮也改成单行不再折行。带详细说明的提示现在有虚线下划线 + `help` 光标, 悬停是可发现的。但原生 `title` 在这个渲染环境里实际不弹(只变光标),所以改成**在短文案下方弹出的浮层气泡**:绝对定位(行高完全不变)、并且 `pointer-events: none` (不会挡住下面控件的点击),行内只保留一个相对定位的锚点。气泡**以右边缘为锚点向左扩展**——提示文字在行尾,之前左对齐的 气泡会越过卡片右边界被裁掉;ghost 上「已截断」标记则改为悬停时直接展开设置路径。 ### 文档 - 中英 README 都补了**排查**一节:没出建议时该看什么、「联想没成功」各种原因分别怎么处理、建议语言 不对怎么固定、「已截断」意味着什么、`Tab` 为什么可能没反应,以及哪些改动要重启、哪些刷新窗口即可。 成本一节也顺手去掉了过期的 `maxTokens: 64` 默认值。 ### 变更 - **对比度与点击区域。** ghost 正文从 `#9aa3b2`(白底约 2.9:1)改成 `#6b7280`(约 4.8:1,达到 WCAG AA), 浅灰提示一并加深;`Tab` / `↻` 按钮从 19px 放大到 24px,字号同步变大。 - **设置项从「token 上限」改成「字数上限」。** 用户填 20–400 个**字符**,Host 按语言推导一个宽裕的 token 天花板(中日韩约 0.6 字/token + 256 推理预留,其它语言约 2.5 字符/token,夹在 64–1024), 字数预算同时写进提示词规则 6,让模型写完整的短句而不是撞墙被切。只有 maxTokens 的旧配置会在读取时 自动折算。仍被截断(或推理把预算吃光)时触发放宽重试,不再直接报失败。 - 输出上限的提示不再写「256 大约够 64 个汉字」。这个估算跟语言、tokenizer 都有关(推理型模型还会先消耗 一部分预算),换成说明「这个上限做什么、什么时候该调高」,由 ghost 上的「已截断」标记告诉你何时调; 截断提示里的建议值也从过期的 320 改成 512。 ## [0.2.6] — 2026-10-21 ### 新增 - **建议语言。** 新增一个设置项决定 ghost 建议用哪种语言书写:`自动`(默认,跟随对话), 或固定成某种语言——想用中文交流但让建议输出法语也可以。下拉先列 14 种主流语言,其余收进 「更多语言…」;带地区变体的语言会多出**地区**下拉:简体中文(中国大陆/新加坡/马来西亚)、繁體中文(台灣/香港)、 English(美/英/澳/加)、Português(巴西/葡萄牙)、Español(西班牙/拉丁美洲(中性)/墨西哥/阿根廷/哥伦比亚)、 Français(法國/加拿大)、Deutsch(德國/奧地利/瑞士)、Nederlands(荷蘭/比利時)。每个列表第一项就是该语言的 CLDR 默认地区,不再有含糊的「通用」;世界语(Esperanto)也在候选里。选中的变体会明确写进提示词(*Traditional Chinese (Taiwan)*、 *British English*、*Simplified Chinese*),模型才会选对字形;中文变体还要求**规范书面语** (不要粤语、不要俚语),「繁體中文(香港)」不会再回粤语;**任何合法的语言代码仍然都接受**。选择会和其他设置一起持久化, 并传给 Host,由 Host 把目标语言写进系统提示词。 - 界面词典仍只随 DSH 自身支持的语言提供(`zh` / `en`);locale 注册逻辑改成「注册所有词典」而不是 写死这两种,将来 DSH 支持新语言时客户端不用再改。 ### 修复 - **建议跟随对话语言。** 默认系统提示是中文写的,而且只让模型「使用用户近期主要语言」——模型会跟着 提示词走,于是任何非中文对话都会返回中文建议(issue #1:俄语对话里冒出中文 ghost)。现在提示词改为 英文,并把目标语言**明确点名**;语言按「最近几条用户消息逐条识别取多数票」判定,粘一段英文日志 也不会把俄语对话判成英文。模型自带的「Suggestion:」「Prédiction :」等前缀也会先剥掉再显示。 ## [0.2.5] — 2026-10-20 ### 新增 - **最近预测列表。** 设置页保留最近若干次预测(默认 10 条,可调 1–50),显示时间、会话、 提供商/模型、耗时和各类标记(截断、降级档位、换过一条、失败),**并保留当时的建议原文**。 列表默认折叠到最新一条(`▸ 展开全部` 看其余),最新一条原文默认展开,点其它行的 `▸` 会展开它 并自动收起上一条。它取代了原来那行「上次预测」——那条会把同一次运行显示两遍。 - **会话标签。** 每行写明来自哪个会话。DSH 的 Host 会话对象没有标题字段,所以标题从客户端会话 store 里取,取不到再退回会话 id 尾部。 - 记录存在应用自身的本地存储(桌面端是 Electron 渲染层,Web 端是页面 `localStorage`), 不上传,刷新/重启后仍在;标题显示「已用/上限」(如 `3/10`)。 ### 修复 - **建议不再半句就断。** 输出上限默认只有 64 token,装不下一句完整的中文,ghost 会突兀地停在 半句。现在默认 256、上限 1024(原来 512);真撞上限(`finish.reason.kind === 'max-tokens'`) 时会自动放宽预算重问一次(至少 384);仍然截断时,ghost 上会标 **已截断 · 建议调高输出上限(max tokens)**,设置页在历史列表上方也有同样的提示。 ## [0.2.4] — 2026-10-18 ### 修复 - **长建议不再被截断。** 之前 ghost 文本被限制在 60 个字符并加省略号(`white-space: nowrap` + `text-overflow: ellipsis`),超过一句话就变成 `…`。现在宽度改为取输入框内容区宽度、在原位折行, 整段建议都能看到;`Tab` / `↻` / `Esc` 三个控件跟在最后一行。 ## [0.2.3] — 2026-10-18 ### 修复 - **建议重新可见。** `0.2.2` 把它画成 `conversation.composer.dock` 里的一行;这一行在测试里能渲染、 `Tab` 也能采纳,但在**真实 app 里看不见**,所以渲染退回原来的覆盖层。 - **一开始打字,ghost 提示就消失。** DSH `0.2.1-rc.2` 不再通过 slot 的 `useInput` 暴露草稿 (现在返回的是 Lexical 输入态),覆盖层会一直留在屏幕上、压住你正在写的内容。现在改为在第一个 可打印按键时隐藏——完全不依赖草稿状态——下一次预测到达时再出现。 - 已在 DSH `0.2.1-rc.2` 上端到端验证:回复结束后出现建议,第一个按键后消失。 ## [0.2.2] — 2026-10-18(已弃用) ### 变更 - 建议改为画在 `conversation.composer.dock` 内的一行,不再是 fixed 覆盖层。 **已弃用:** 这一行在真实 app 里看不见。请使用 `0.2.3`。 ## [0.2.1] — 2026-10-17 ### 修复 - **npm 包页显示的是中文 README**。npm 按 glob 取第一个 `README.*` 匹配,而 `README.zh.md` 排序在 `README.md` 之前,于是中文版被选中。中文版改名 `README_zh.md` 后不再匹配 `{README,README.*}`,npm 必然选到英文的 `README.md`。取代 `0.2.0`,无代码改动。 ## [0.2.0] — 2026-10-17 ### 新增 - **`↻` 换一条**:输入框建议右侧新增按钮,点一下让模型给出不同的建议 - **`Alt+→` 逐段采纳**:一次填一小段(中文 2 字 / 英文 1 词),剩下的继续浮动,随时可停 - **设置页「高级」新增两项**:上下文预算(`maxChars`,1000–20000 字符)与输出上限(`maxTokens`,16–512 token) - **设置页新增「上次预测」状态行**:时间、所用模型、耗时,以及是否自动降级了思考档位 / 换过一条,失败时直接显示原因 - **界面中英双语**:跟随 DSH 的「设置 → 语言」**即时切换**,无需刷新。覆盖客户端全部文案(设置页、ghost 上的提示)与 **Host 端返回的校验错误 / 预测失败原因** - `GET /status` 支持 `?sessionId=`,回传该会话实际使用的模型 - 接口新增可选请求头 **`x-dsh-locale`**(`zh` / `en`),决定错误原因用哪种语言返回 - 客户端渲染冒烟测试(`test/client-render.mjs`,18 项):用极简 React 替身把组件树展开后断言 ### 变更 - 设置页「思考深度」下拉改为按**会话实际使用的模型**生成(此前按全局默认模型,两者不同时用户可能选到不被支持的档位) - 每轮辅助调用次数:默认仍为 **1 次**,仅在「档位需降级」或「建议撞车需换一条」时多试一次,**极端情况上限 3 次**且共享同一超时预算 - 打字隐藏建议后,**把草稿删空会重新显示**(此前一旦开始打字就隐藏到本轮结束) ### 修复 - **思考档位与真实模型不兼容时静默失败**——表现为「设置都对,但永远没有建议」。现在会自动去掉档位重试一次 - **建议复读**:连续两轮给出同一条时,要求模型换一条(一次为限,失败则保留原建议) - **逐段采纳后删掉已采纳的那段**,建议会显示从中间截断的残句(按 `Tab` 只插入半句)。改为完整重新展示 ### 文档 - 英文版升为主 `README.md`(中文移到 `README_zh.md`,两侧 11 节逐节对应并互链) - README 补充「在 DSH 里安装」、npm 安装方式与徽章、四种交互说明、新设置项 - 演示素材重录为含 `↻` / `Alt+→` 的新界面:`docs/demo.gif`、`docs/screenshot.png`、`docs/social-preview.png` - 本文件(`CHANGELOG.md` / `CHANGELOG_zh.md`) ## [0.1.0] — 2026-10-17 首个公开版本。 ### 新增 - **回复结束即出建议**:在输入框首字符处浮出灰色 ghost text,光标位置、字号、行高对齐当前编辑器 - **三种交互**:`Tab` 采纳 · `Esc` 忽略 · 开始输入自动消失;采纳前建议不属于会话内容 - **默认跟随当前会话模型**:不向辅助调用写死任何提供商 - **轻量上下文**:只取最近若干条 user/assistant 的纯文本,工具结果、附件、系统提示一律不进入辅助调用 - **设置页**:开关、提供商 / 模型、响应超时、上下文规模、思考深度;保存后立即生效,无需重启 DSH - 同源 HTTP 接口:`/status`、`/catalog`、`/efforts`、`/settings`、`/suggest` - MIT 许可;Host 端与客户端均无第三方运行时依赖