# Changelog

创建于 2026-10-17

本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。版本号从 `0.1` 起；DSH 宿主接口（`workspaceRegistry` / `sessionPersistence` / `webServer` 服务面与 `~/.dsh/sessions` 布局）在 0.x 期间按 `0.2.0-rc.2` 基线验证，每次官方升级会重验并在此记录。

## 0.1.47 — 2026-10-23

本次发布包含 0.1.46 的本地迭代。

- 任务联想支持独立指定 DSH 服务商与模型，自动生成和手动星光共用选择；未配置时继续跟随会话。支持读取宿主目录或手填模型 ID，本地端点与凭据仍由 DSH 管理。指定失败不回落、不自动重试，用量按所选服务商/模型分列（#1）。
- 明确区分模型不可用、凭据无效、限流与超时；切换联想模型会取消旧请求、清理旧候选，不补发收费请求。损坏或不完整的持久化模型配置不会静默使用主会话模型。
- 工具箱改为紧凑双列布局，窄容器自动回到单列；收紧页头、表单与卡片间距，用量摘要常驻，详细统计与说明按需展开。
- 新增「跟随 DSH / 中文 / English」界面语言设置，默认跟随宿主并实时响应语言变更，显式选择持久化且不改变 DSH 的全局语言。主页面、弹窗与会话操作共用中英文词典。

## 0.1.46 — 本地验收（2026-10-23，未发布）

- 插件顶部 QQ 群号旁增加 GitHub 仓库入口和 Star 鼓励文案，沿用原有主题、自动换行及键盘焦点样式，支持中英文。

## 0.1.45 — 2026-10-21

- 修复升级后手动任务联想提示「未知的操作类型：nextTasks.generate」：操作前核对界面与运行中后台版本；安装版本与当前界面一致时，通过 DSH 官方插件管理接口重新应用已启用的插件，再使用新后台密钥执行操作，无需重启支持 HMR 的 DSH。
- 并发操作共用一次后台重载；读取状态和模型生成失败不触发重载。安装版本不匹配、后台未更新或宿主未应用重载时，显示明确的处理提示并停止发送操作，避免请求落到旧后台。
- 补充升级版本不一致、密钥轮换及插件生命周期回归测试，更新安装与排错说明。

## 0.1.44 — 2026-10-21

本次发布汇总 0.1.38 之后的本地迭代。

- 侧栏与“管理项目与分组”弹窗支持分组拖动排序，默认“未分组”同样参与排序；管理弹窗提供上移、下移按钮，支持 Alt/Option + ↑/↓。两处顺序即时同步并持久化，组内项目和会话跟随，兼容旧分组数据。
- 回答末尾引用图标前增加原生风格星光图标，可手动生成、失败后重试或重新生成任务联想；生成中显示忙碌状态并防止重复点击，支持键盘与减少动画设置。
- 关闭自动联想后仍可手动使用。历史回答只使用截至该轮的可见问答文字，候选显示在对应回答下方，点击填入输入框，由用户发送；沿用独立 token 统计、缓存、取消及并发保护。保存其他设置不会意外取消手动任务。
- 修复新安装或升级后，问答正常结束但宿主收尾超过 150 ms 时漏触发联想：最多等待 15 秒空闲，期间新消息、关闭或卸载会取消，不增加重复模型请求。
- 兼容模型在有效 JSON 候选前后附带说明、JSON 代码块或常见对象包装；保留对损坏、冲突及非候选内容的校验，空数组表示没有合适建议。补充提示词示例与流式分块回归测试。
- 生成中、失败及空结果会在所属回答下显示可收起的简短状态，插件页显示最近一次失败的脱敏类别；失败不自动重试，服务商已返回的用量照常结算，不保存原始错误或请求内容。
- 更新 README、使用指南、架构说明和脱敏分组截图。

## 0.1.38 — 2026-10-20

本次发布汇总 0.1.26 之后的本地迭代。

- 重排项目与分组管理弹窗：左侧分组筛选与项目数量，右侧紧凑项目列表、即时归组和编辑入口；选中分组后可重命名或删除。长路径省略并可悬停查看，窄窗口自适应单栏，沿用原生弹窗、按钮和主题色。
- 支持整条消息与选中文字的多引用累加，在原输入光标处插入，保留草稿、其他引用和附件；每条引用独立取消，刷新或切换会话后可恢复。输入卡片内显示带编号的预览，较多时内部滚动；发送后各引用独立显示，可展开查看，保留原生复制。兼容宿主发送时裁掉末尾空行的情况。
- 引用图标调整为圆圈引号，回转箭头用于恢复检查点。正文选中后右键可「引用所选内容」，同时保留「复制」；不复制推理过程、工具输出或图片字节。
- 新增「恢复检查点」：记录本地项目工具调用前后的文件变化，预览后恢复这条消息及之后的修改，保留聊天记录，不修改 Git 提交与暂存区。拦截快照之后的手动或跨会话修改、运行中任务、不完整快照及超限；支持恢复中断后重试。同一消息的并行工具共享快照，工具运行期间的其他来源写入无法独立归属，详见使用指南。
- 没有记录到可恢复修改时显示铅笔「编辑并重新发送」，将历史文字载入原生输入框，可编辑并加截图后发送；保留聊天记录、当前附件，已有草稿文字可取回。历史附件不自动复制。
- 历史用户消息和已完成助手回复可单条删除，确认按钮使用红色。从界面及后续 AI 上下文中移除该条，不撤销代码修改，原始日志保留；拒绝删除运行中、含工具调用或已合并进摘要的消息。刷新、切换会话和热更新后继续生效。
- 新增默认开启、可关闭的后续任务联想：正常问答结束后独立调用当前会话模型，最多 3 条候选显示在所属回答下方，点击填入输入框，由用户发送。限制输入及输出，不读取图片、工具或思考正文；失败不自动重试，不为历史轮次补生成。选择、开始输入或手动关闭后，本轮建议收起。
- 独立统计联想调用、成功、失败、取消及 token 消耗，支持模型累计与近 90 天 UTC 日期统计，单列缺少完整用量和未结算请求。已完成候选单独本机缓存，热更新恢复最近 7 天结果，不额外调用模型；修复切换时旧草稿误将目标会话候选收起的问题。
- 移除插件队列引导快捷按钮、原生队列装饰及专用样式，直接使用 DSH 原生引导功能。
- 更新 README、使用指南、架构说明、脱敏分组截图和多引用示意图。

## 0.1.26

- 拖动切换项目的成功提示在 4 秒后自动消失，失败提示保留 8 秒；处理中保持显示，连续操作重新计时，卸载时清理计时器。

## 0.1.25

- 支持把侧栏会话拖到另一个项目标题上切换项目，目标项目高亮；迁移后刷新列表与数量，失败原因直接显示在侧栏。
- 复用现有迁移预检、空闲/队列保护、写锁与中断恢复；同项目内仍沿用原生排序，跨项目放下后不提交原生遗留的排序位置，不影响项目拖入分组。

## 0.1.24

- 项目菜单统一为「编辑项目」，调整菜单宽度；修复独立 React portal 导致鼠标移入新增菜单项后自动关闭，以及连续分组时项目菜单定位失效的问题。菜单边界按真实 DOM 统一处理，并保留离开、键盘及原生操作行为。
- 修复编辑弹窗先于项目快照到达时名称、路径为空的问题，后续分组刷新不覆盖正在编辑的内容。
- 增加项目菜单「移入分组…」，支持项目拖到目标分组标题及「未分组」，保留原生项目与会话。
- 增加用户消息及助手最终答复的「引用回复」：可取消预览，保留草稿、附件与其他引用；原生引用标记负责持久化及序列化，刷新、切换会话后可恢复，发送沿用原生排队/引导流程。

## 0.1.23

- 侧栏增加可折叠的“分组 → 项目 → 会话”层级；原生项目菜单增加“编辑项目与分组…”，可直接调整分组、名称和项目路径。
- 原生队列每条消息旁显示“引导”，保留原生下一步插话行为及禁用条件，选中消息进入当前轮次而不取消正在执行的工具；兼容队列插槽延迟注册。
- 修复已加载会话迁移依赖重启的问题：空闲且无排队消息时，完成该会话的完整生命周期清理，再取得持久化与目标目录写锁后迁移；支持立即迁回和新路径继续写入，保留恢复日志与项目数量刷新。
- 分组数据投影保持引用稳定，避免触发原生列表循环更新；文档同步在线迁移条件。

## 0.1.20

- 在插件页面顶部常驻显示 QQ 交流群入口和群号 1124103038，可点击链接打开入群页，支持中英文文案并沿用 DSH 主题颜色。
- 重整 README 与使用指南，补充脱敏界面图片、队列流程图和带中文说明的 1080p 图文导览视频；区分 npm 已发布版本与当前源码构建安装，并更新维护者架构说明。

## 0.1.19

- 修复归档池把已有标题的原生归档显示为「无标题」：按当前公开 `sessionQuery.readTitle()` 快照的 `title` 字段读取，同时覆盖原项目已删除的归档。

## 0.1.18

- 修复切换会话产生新输入绑定后，旧绑定的迟到通知或待处理快照重新备份已发送截图的问题；输入订阅按绑定身份隔离，补充先发送再触发旧通知的回归测试。

## 0.1.17

- 修复项目较多时分组弹窗超出视口、顶部按钮无法点击的问题：内容区按视口限高并独立滚动，保留原生弹窗标题和关闭按钮。
- 在 DSH 0.2.1-rc.2 运行实例安装并验证热更新、分组和项目编辑、原生归档同步及会话迁移。

## 0.1.16

- 新增工作区项目分组：持久化分组、独占归组、重命名和删除；侧栏按组筛选，保留原生列表、菜单与排序。通过公开插槽镜像子项，卸载恢复原侧栏。
- 新增项目编辑，可替换项目路径并将已有会话一起迁移；先检查所有成员，保留会话顺序、归档、置顶及分组，同步归档池的项目引用。代码文件与历史消息内容保持原样。
- 多会话迁移使用独立进度日志；写入中断、账本失败、删除旧注册后中断均可继续，恢复前暂停冲突操作；支持原代码目录已不存在的项目。
- 输入区新增「引导下一条」，使用原生队列 steer 接口将原消息交给当前运行轮次，不停止当前工具，保留附件与其他排队消息。
- 补充项目迁移崩溃恢复、分组筛选防串组、插槽镜像清理、队列引导及重复点击回归。

## 0.1.15

- 修复迁移后立即迁回被误判为日志仍在写入：迁移保留原日志时间戳，外部新写入和已加载会话仍受保护。
- 项目选择器订阅共享状态，迁移和原生工作区变更后自动更新数量；旧请求迟到时不再覆盖新快照。
- 归档池同时展示 DSH 原生归档，支持还原和确认后彻底删除，且不重复展示工具箱或归档项目中的成员。原生归档时间未知，不纳入插件到期自动删除。
- 修复打包检查失败时误清理临时目录上级目录的问题，清理范围固定为本次检查创建的目录。

## 0.1.14

- 修复切换会话后重复恢复截图：优先以官方 SessionInput 附件列表判断，避免缩略图尚未渲染就再次粘贴；订阅跨会话切换保留，发送/删除后清理对应备份，失败发送恢复的附件重新备份。
- 修复刷新后未发送草稿无法再次恢复、相同图片发送后无法再次备份；清理捕获监听器，恢复过程中校验会话身份，支持实时开关与容量设置，立即整理实际清理 IndexedDB。
- 迁移活动检测正确等待异步宿主事件；修复管理页体检按钮异常、变更后自动刷新侧栏、重载后写入密钥失效。对宿主持有写入句柄的已加载会话明确拒绝，并给出重启后直接从侧栏迁移的步骤。
- 修复发布阶段中断、会话附属文件保留、原文件变化校验、账本部分失败后的回滚重试及无 cwd 会话回滚。
- 菜单项使用 DSH 原生 MenuItemButton 与图标；迁移/归档/删除使用原生 Modal，弹窗挂载在 shell overlay，关闭菜单后不再随菜单销毁。
- 归档前先落恢复快照；修复空闲已加载会话无法归档、项目还原顺序和静默失败；彻底删除先记录暂存路径，记账失败可重试；自动清理按小时巡检。修复 CLI 注册表清理与 IPv6 本机接口访问。
- 宿主接口核对基线：本机 DSH 0.2.1-rc.2；归档测试直接使用生产 adapter，补充快速切换、发送、迁移中断与失败重试回归。

## 0.1.13

- **新增「刷新会话列表」按钮**：迁移或还原会话后，若侧栏没有立刻变化，点一下即可让宿主重新拉取会话列表，**不需要重启 DSH**，也不影响任何会话内容。实现走官方 `sessions.refresh()`（内部调用 `remote.session.list` 全量刷新基线），因此刷新的是真实索引而不是本地缓存。
- 客户端 `inject` 增加 `sessions`（官方客户端插件同样声明该服务，必然存在）。

## 0.1.12

- **迁移/还原后自动刷新会话位置**（不重启、不影响其它会话）：宿主在 `index` 阶段重新读取会话头（`replaceHeaderIndex`）使新位置立即生效；客户端在迁移/还原完成后通过窗口事件通知面板并重新拉取状态。侧栏列表是服务端驱动的快照，因此界面会给出一句明确提示——刷新侧栏即见，而不是静默消失。
- **账本写入前校验文件真实位置**：`ledger` 阶段会读取新位置的日志并确认 `header.cwd === toCwd`，不匹配就以 `publish-missing` 失败，避免「注册表说在 B、字节还在 A」的孤立会话（此前正是这种半完成状态让一个会话从侧栏消失）。
- **迁移失败自动回滚**：`commit` 之后的阶段一旦抛错，立即按逆序回滚到底，不再留下半完成状态；仅当回滚本身也失败时才保留 journal 作为救援指针。

## 0.1.11

- **修复「切换会话到其它项目」总是报 `session … is live`**：此前的判定是「`sessions.list()` 里是否包含该会话」，但那返回的是**宿主已加载的全部会话**，只要文件打开过就算「运行中」，几乎任何会话都无法迁移。现改用官方的 `workspace/session-activity` 事件：只有出现 `{kind:'turn'}`（真正有一轮在跑，含等待审批/回答）才阻止迁移。
- **修复已发送截图仍被重复插回输入框**（0.1.10 未覆盖真实场景）：附件栏探测用的选择器 `[data-composer-bar]` 在官方 UI 中**并不存在**，真实容器是 `[data-composer-seat]`（带 `data-conversation-region="composer"`）。选择器始终落空 → 探测永远得到 0 张卡片 → 发送检测永不触发、恢复时也总认为「输入框是空的」。现已改用真实容器，并同时接受 `blob:` 与 `data:image/` 两种预览源。
- 测试桩改为模拟真实 composer 结构（此前只应答 `conversation-content`，所有探测都走兜底路径，所以测试全绿但真实场景失败）。

## 0.1.10

- **修复已发送的截图在切回会话后被重复插回输入框**。此前判断「已发送」靠附件栏从有到无的跳变：切回会话时附件栏本来就是空的，这个跳变永远不会发生，于是每次切回都把旧图重新粘贴一遍。
  现在记录**明确的「已发送」标记**（`sentAt`），恢复时跳过该标记的记录；触发点有三处——输入框挂载期间附件卡片消失、按回车发送（含快速切走）、以及恢复成功后标记 `seeded` 避免重复派发。新增回归测试：已发送的草稿在切回后不再被恢复。

## 0.1.9

- **修复右键菜单里的迁移对话框没有项目选择**：0.1.8 只给设置页的迁移表单加了项目下拉，而会话行 `⋯` → 「切换到其它项目…」打开的是 `MoveDialog`，那里仍只能手填绝对路径。现在对话框与面板一致：显示当前项目、提供项目下拉（标注会话数与「当前项目」），并可继续手填路径。

## 0.1.8

- **回收站改名并明确语义**：会话的「删除」在 DSH 里本质就是官方归档，插件只是额外记录了入池时的项目归属、列表位置与置顶状态，因此可以还原到原位。界面统一改为「归档池」：菜单项「归档到归档池」、面板标题「归档池」、列名「入池时间」，并在面板里说明它同时出现在官方归档视图中。
- **切换项目支持按名字选择**：迁移表单新增项目下拉（显示项目名与会话数），并**标出当前项目**且禁用它作为目标；选中后自动填入路径。输入会话 ID 后会显示它当前所属的项目（名称 + 路径）。宿主新增 `project.of` 动作与 `state.projects` 列表。

## 0.1.7

- **修复插件页报错 `cannot get property "locale" without inject`**：客户端 `inject` 只声明了 `slots`，却直接读取 `ctx.locale`。cordis 的 reflect 代理对未注入的服务属性访问会抛错（而非返回 undefined），因此插件页无法完成同步。现已在 `inject` 中声明 `locale`，并按官方客户端插件的方式用 `ctx.effect` 包裹字典注册。
- 客户端测试改用与 cordis reflect 一致的**严格 ctx**（未注入即抛错），该用例已验证能拦住本次回归。

## 0.1.6

- **插件启动失败不再拖垮整个应用**：`apply` 全程包裹错误隔离，任何内部异常都降级为警告并继续（此前宿主入口抛错会让 DSH 报 `entry did not activate` 而无法启动）。
- 失败详情写入 `~/.dsh/session-toolbox/startup-error.log`（含完整堆栈），便于定位；依赖缺失时额外提示"从插件页卸载后重新安装"，因为 peer 依赖必须由包管理器安装到插件自己的 `node_modules`，手工覆盖 `lib/` 会丢失它们。
- 无功能变更，纯健壮性修复。

## 0.1.5

- 文档修正：首次安装后若界面无变化，**需要完全重启 DSH**。原因是宿主侧 `dsh-client-modules` 把包元数据的"非客户端包"否定判定按 Loader specifier 缓存到重启，且扫描为逐包增量、无全量重扫路径；此时宿主半边可能已工作（`~/.dsh/session-toolbox/` 已创建），但菜单项与面板不会出现。0.1.4 中"停用再启用即可"的说法不适用于此场景。
- `0.1.4` 曾建议手工改动后停用再启用；该结论对本插件不成立，现已更正。

## 0.1.4

- 文档：新增「生效时机（需要重启吗）」一节，说明从插件页安装/启停不需要重启、四类 `restartReason` 的含义，以及手工改动安装目录后停用再启用即可生效的做法。

## 0.1.3

- 修复草稿图片反复新增：恢复草稿时派发的合成粘贴会被插件自己的捕获器再次存一份，切会话越多份数越多。现在恢复事件带内部标记、捕获器直接忽略；同时按内容哈希做同会话去重，同一张图即使重复粘贴也只保留一份（新增 2 项回归测试）。

## 0.1.2

- 修复与 DSH `0.2.1-rc.2` 的不兼容：此前把官方内部包固定为精确版本 `0.2.0-rc.2`，导致 DSH 升级 rc 后被判为不兼容。改为声明 `engines.dsh`（官方优先判定字段，见 `dsh-app-boot` 的 `unmetRequirements`）+ 区间 peer，覆盖 `0.2.0-rc.2` 至 `0.2.x`；`0.3.0` 起仍会正确判为不兼容。
- 已针对 `@deepseek-ai/dsh-home-paths` / `dsh-atomic-write` `0.2.1-rc.2`、`cordis` `4.0.5` 重跑全部测试（56 项通过）。两版 API 实测一致：`resolveDshHome` / `withFileLock` / `writeFileAtomic` 签名与导出均未变。

## 0.1.1

- 发布渠道改为 GitHub Release 触发的 npm Trusted Publishing：`publish.yml` 与参考项目 `dsh-multi-router` 对齐，显式安装 `npm@11.19.0`、由版本后缀推导 `NPM_TAG`（稳定版 `latest` / 预发布 `next`），全程 OIDC 签名，仓库不存任何 npm token。
- 版本一致性校验扩展为四重：tag ↔ `package.json` ↔ `package-lock.json` ↔ `cordis.patch.yml` 中的 `host-vX.Y.Z.js`，任一处漂移即拒绝发布。
- 本版本无功能变更，用于激活并验证 Trusted Publisher 绑定后的自动发布链路。

## 0.1.0

- 首个版本：合并交付三个能力位（需求文档 §1–§11）。
- 草稿保险箱：capture 旁观粘贴/拖拽/文件选择，图片镜像进 IndexedDB（默认 7 天 / 200MB，TTL+LRU 清理，事件可见）；切会话、刷新、重启后向官方粘贴管线重放合成 ClipboardEvent 恢复，附件栏非空即跳过（幂等），发送或清空即回收备份；宿主侧仅存清单镜像。
- 会话切换项目：分步 journal（备份→重写→发布→账本→缓存→索引），只重写 zstd 会话日志的 header 帧、事件帧逐字节搬运；崩溃后启动检出，可前滚可逐字节回滚；体检 fail-closed（忙会话/未知会话/同目标/目录不存在/布局漂移/重复布局全部拒绝并说明原因）；同进程 header 缓存未刷新时账本记为 deferred，由下次启动或 move.complete 收敛。
- 回收站：会话删除=官方归档+入站快照（含 previouslyArchived/pinned 与列表位置），还原逐状态收敛且幂等；项目删除=官方 delete（保留会话日志）+标题/顺序快照，还原走 create/attach/insertBefore/unarchive；彻底删除分两段（pending-purge 暂存→清缓存/账本→落刀）；TTL 巡检默认只提醒，autoPurge 可开。
- 宿主插件经真实 cordis v4 内核生命周期测试；UI 走官方插槽（plugins.bundle.config、sidebar.workspaces.session.menu.item、conversation.input.dock）；缺失服务在面板显示不可用，不影响官方原生行为。
- loopback 管理端点沿用 dsh-multi-router 信任模型：仅 127.0.0.1/::1、Host/Origin/Sec-Fetch-Site 校验、GET 下发每进程随机写密钥、timing-safe 比对、请求体上限。
- CLI：status / move / recover / rollback / trash-purge，面向 DSH 停止时的离线维护与中断迁移救援。
