# 变更记录 本文件记录 `dsh-chat-local` 的版本演进。格式参照 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/);版本号沿用 `主版本.次版本.修订号-local.修订` 的本地发布约定。 > 房间状态格式(state version)与插件版本绑定。跨状态版本的升级前请备份,旧版程序无法读取新格式。 ## [0.16.3-local.1] — 2026-09-17 ### 新增 - **不可变事件日志。** 每个房间在状态目录的 `events/` 子目录下新增一份只追加的 JSONL 日志,逐条记录消息、投递、系统消息与调度事件,并带上来源(provenance)与逻辑 tick。每条事件以 SHA-256 链接前一条,`verifyChain` 因此能检出**中段改写**(它也会拒绝自己无法解释的信封版本);房间日志另有头部锚点,**尾部截断**由 `read()` 比对锚点检出(此前尾部截断不可检测)。日志是附加层:写入失败不会使房间操作失败,但会计数并通过 `/health` 的 `audit` 字段暴露,不静默丢失;失败的那条记录另在 `audit.dropped` 里按 `{roomId, type, messageId}` 具名(有上限),以便确认哪条消息没有事件。`scripts/verify-event-log.mjs` 可对备份出来的日志做只读离线校验。 - **逻辑 tick。** 房间新增单调递增的逻辑时钟;同一回合内的调度顺序与执行顺序分别记录,便于事后核对「计划跑谁」与「实际跑了谁」。 - **回合提示词留档。** 每次回合实际发送的提示词按原样存入日志,作为实验的自变量;它记录的是真实发送的内容,不是重新生成的近似值。 - **运行快照与恢复。** `GET /rooms/:id/snapshot` 导出房间在某一 tick 的完整事件前缀与配置哈希,`POST /rooms/:id/restore-from-snapshot` 在校验通过后恢复。恢复会同时回退日志链与房间状态,使两者保持一致;校验失败即拒绝,不写入。 - `/health` 新增 `stateVersion` 与 `audit`(`appended` / `failed` / `lastError` / `droppedCount` / `dropped`),后者即上述日志健康计数;`lastError` 只保留错误码与文件名、不含绝对路径,并在下一次成功写入时清空。 ### 变更 - **房间状态版本 14 → 15。** 迁移前自动把迁移前的状态文件复制为 `rooms.json.v14.bak`,迁移失败可从该备份恢复。 ## [0.16.2-local.1] — 2026-09-16 ### 修复 - **受限回合不再能读到其他房间。** `discuss_only` / `read_only_audit` 回合按工具名放行只读工具,而 `read` 可以打开群聊自身的状态文件(其中含全部房间),`web_fetch` 可以访问本机回环地址上的本插件 HTTP 接口(该接口按设计不带凭证)。两者都越过了房间边界:现在会拒绝参数指向状态目录或状态文件的只读工具,以及指向回环、链路本地或私有网段的 `web_fetch` / `fetch`。普通文件读取与公网抓取不受影响。 - **幂等重放不再谎报成功。** `operateWork`、`proposeCharter`、`reviewCharter`、`requestLedgerHandoff`、`triageLedgerEntry` 命中 `operationId` 重放时直接返回而不写盘;首次写盘失败时,重试会报告成功,而改动只存在于内存,重启即丢。这五处改为与同类操作一致,先落盘再返回。 - **`setRoomProfile` 不再吞掉未传字段。** 原先用调用方传入的 `purpose`/`charter`/`source` 直接重建档案,只传 `charter` 会静默清空 `purpose` 并照样推进修订;改为与 `proposeCharter` 相同的合并语义。 - **重复修正同一条消息不再报错。** `correctHumanMessage` 的幂等指纹包含它自身提交时会改写的投递状态,导致重试必然被判为「operation id 被复用」。现在按调用方的 operationId 直接返回已生效的修正。 - HTTP 接口拒绝跨站请求(`Sec-Fetch-Site: cross-site`,或 `Origin` 与服务端 host 不一致),避免仅仅打开某个网页就能驱动本机接口。 ### 变更 - 迁移前先把迁移前的状态文件复制为 `rooms.json.v<旧版本>.bak`;迁移不再是覆盖唯一副本的不可逆操作。 - 群聊工作台的 `shell.overlay` 层级由 20 改为 30,避免与 Deep Research 同位叠加;该层缺失时不再在点击回调里抛错。 - `cordis.patch.yml` 的注释不再复制 DSH 版本号(此前写着 `0.1.2-rc.1`,与清单声明的 `>=0.1.5-rc.2` 矛盾),改为指向 `package.json`。 - 「个人路径」回归测试改为递归遍历仓库内全部文件。此前只扫 `lib|scripts|test` 下的 `*.js`/`*.mjs` 与根目录的 `*.md`/`*.json`/`*.yml`,`LICENSE`、`.gitignore`、`*.d.ts` 与所有子目录都不在检查范围内。 ## [0.16.1-local.1] — 2026-09-16 ### 变更 - **适配 DSH 0.1.5 的槽位重构。** DSH 0.1.5 移除了旧的 `conversation` 单槽,中心区域改为渲染 `main` 键控面板槽的条目,全局界面走 `shell.overlay` 覆盖层。工作区改注册到 `shell.overlay`(与官方 Deep Research 插件同一模式)。 - 移除对旧 `AppFrame` 栅格的手工改造与 `body` 类切换。覆盖层本身覆盖整个框架,因此进入群聊不再隐藏原生侧栏,返回 DSH 也不会残留样式。 - 不再假设台账负责人/监控协调人的别名。默认取成员列表第一位,由用户在台账中调整。 - 文档与测试中的示例名称改为中性用语。 - `scripts/ui-fixture.mjs` 曾硬编码开发机的 DSH 安装路径(含用户名)。改为读取 `DSH_MODULES_DIR`,或从 DSH 包自动解析;找不到时给出可执行的错误提示。该脚本在 DSH 0.1.5 下仍需外部提供 React(见 README「已知边界」)。 - `package-lock.json` 的版本号未跟随 0.16.0 → 0.16.1 的升级。已同步。 ### 修复 - 旧版 `dsh-bridge` 写入的拼接消息 `source.form` 使用传输名(如 `dsh-chat-local-room`),不符合 DSH 会话格式 v0→v1 迁移的 `form` 白名单,表现为唤醒成员时 `resume failed`。新版 `dsh-bridge` 已改用 `relay`;受影响的旧会话需把该字段同步改为 `relay`(仅改此字段,保留其余字节与 Zstandard 帧结构)。详见 README「已知边界」。 - `/health` 曾硬编码插件版本号,升级时不会跟随 `package.json`。现在直接从清单读取。 ### 维护 - DSH 兼容范围改由 `package.json` 的 `dsh.engines.dsh` 声明(`>=0.1.5-rc.2`),支持该字段的安装器会据此提示版本不匹配。README 的说明与之一致。 - 新增 `test/version-consistency.test.js` 锁定版本一致性:健康检查必须报告清单版本、清单必须声明 DSH 范围、README 必须写明同一版本、CHANGELOG 首条必须等于当前发布版本、锁文件必须记录同一版本、源码不得硬编码任何发布版本号,并检查已提交文件不含带用户名的绝对路径。 - `LICENSE` 原先只有一行标题,缺少 MIT 正文与版权行,导致托管平台无法识别许可证(显示为 other)。已补全为标准 MIT 全文,版权行使用 `ALPSIYH`,与 `package.json` 的 `"license": "MIT"` 一致。 ## [0.16.0-local.1] ### 新增 - 分开 **Agent 名册**、**群组成员池**、**新对话预选名单**与**本次参与者**四个概念。新群组从空白开始,可混合已有与新建 Agent。 - 纯保存群组或名册不建立原生 Session、不执行模型。临时对话不需要先建群组。 - 话题先写内容;称呼、职务与模型都可在指定作用域调整。 - 原生模型目录与文件夹选择器共用;接续已有原生历史前需预览忙碌状态、共享范围与权限影响。 - 名册收存不删除历史引用;群组收存前检查活动工作并明确暂停监测,恢复时不自动开工。 ### 变更 - 状态格式升至 **v14**,以追加识别的方式保留旧数据、两份未完成草稿与 Session 绑定。 ## [0.15.0-local.1] ### 新增 - **持久化草稿与本次阵容**:直接写主题、选择或增减成员并从 DSH 模型目录配置,不预先建立原生 Session;可保存多套常用阵容,环境与权限不随阵容迁移。 - `chat_manage`:Agent 可提出固定清单,用户一次确认归档、终止或取消指定的过时依赖,保留验收语义与完整历史。 - 群组可以为空;保存群组不创建同名对话。 ### 变更 - 首发使用持久化凭据,恢复时不会盲目重播结果未知的执行。执行失败须核对结果后按当前权限接续。 - 状态格式升至 **v13**,不能直接用旧程序读取。 ## [0.14.0-local.1] ### 新增 - **群组 → 多个独立对话**:主入口为新对话,新建群组可复用当前团队;首条用户消息生成可编辑主题。 - 分支讨论先显示选定消息供确认,可补充背景;新对话保留来源快照与返回入口,不把来源当作新指令或授权。 - 独立原生会话的成员、模型与章程修改只影响当前对话;「设为群组默认」显式保存当前已提交配置。若连接的是已被其他对话引用的原生 Session,模型更改会显示共享影响并要求确认。 - 新对话预留独立 Session ID,首次发言或配置时按需准备;冻结的成员配置包含名称、职务、职责、工作目录与准确的模型/推理等级,不调用模型生成。 ### 变更 - 新对话默认继承只读审计;可明确将当前策略保存为群组默认。 - 新对话不继承旧消息、台账、活动队列、材料授权或验收结论,也不取消后台其他对话。未操作的原房间完整迁移为一个对话,保持原 ID 与 Session 绑定。 - 组内模型选择走 DSH 原生提交原语,不触碰 DSH 全局默认模型;原语缺失时拒绝准备或选择,不静默替换。 ## [0.13.0-local.1] ### 修复 - 权限锁只跟随实际执行回合,跨房间排队不再覆盖。 - 并发新消息以不可变回合代次调度。 - 保存失败的同 ID 重试补做持久化,且至多启动一次。 - 重启时核对所有残留的「处理中」投递。 - 迟到响应不再覆盖其他房间;纠正消息在响应丢失后复用操作 ID。 - 失效的排队消息晚到时停止执行;同一原生回合混入多个群聊投递时不发布无法归属的结果。 ### 变更 - 台账处理入口前移,长交付与系统台账通知折叠,分别统计待推进任务和证据;继续操作先准备收件人与任务草稿。 - 未加载成员的权限通过 DSH 原生只读投影读取,未知或不匹配时明确提示,不自动提权。 - 文件列表支持全部文件搜索;Markdown 默认安全阅读并可切换源码。 - 覆盖式检查器加入对话框语义、背景隔离与焦点恢复。 - GET 使用 ETag 条件同步和有界客户端缓存。 ## [0.12.2-local.1] ### 修复 - 短文件名未关联已共享完整路径的问题:预览与 `chat_read_document` 共用解析器,只在精确文件名唯一匹配时只读打开。 - 工作区或已共享路径存在同名文件时要求选择完整路径,不猜版本、不递归搜索目录。已知但缺失的同名文件也保留在选择中,避免静默改读另一份。 - 错误区分未找到、名称未匹配、未共享、非普通文件与本机读取失败。 ## [0.12.1-local.1] ### 新增 - 事项卡片与阻断页提供**忽略旧阻断**和**移除事项**,说明可留空。 - 忽略由用户判断,不要求条件检查通过:清除当前阻断与旧进展,任务回到待处理,不标记完成也不自动启动;未有新工作变化前可撤销。 - 移除采用可恢复归档,可从「已归档 / 已移除」恢复为待处理,不复活旧验收。 ### 变更 - 已提交或验收后,早于本次交付的进展报告折叠为历史,不再把旧权限报错呈现为「最近报告」;当前仍受阻的真实报告保留可见。 ## [0.12.0-local.1] ### 新增 - 把协作台账的「受阻」补齐为**条件检查与接手链路**:读出当前负责人可访问的材料及哈希、检查已登记的前置事项,并提供单文件只读共享、真实通知重试与文件查看后的返回入口。 - Agent 报告 blocked 时可附结构化 `blocker`(类型、原因、下一步、所需绝对路径、实际前置事项)。拒绝跨房间、自引用和循环前置依赖。 - 接手通知持久保存,区分排队、发送、等回报、已回报、未回报、失败和中断。 ### 变更 - 检查本身不登记文件、不改状态、不唤醒 Agent;文件可读不代表任务已恢复或内容版本正确。 - 用户采纳决定时可将通知排到当前讨论之后,不再丢弃。只通知指定接手人,不解析任务标题中的额外 `@`。 - 重启或用户停止协作时,未完成的接手通知转为明确中断,不自动重放;任务状态不因通知变为已解决。 - 台账支持按事项、负责人和阻断文本查找;关联事项改为最多 8 项多选。 ## [0.11.1-local.1] ### 新增 - DOCX 默认预览改为**结构化阅读**:标题、段落、直接设置的粗体/斜体、表格及合并单元格分别呈现;支持正文/脚注/尾注/批注切换、标题跳转、文内查找、字号调整与展开阅读。 - 脚注标记可跳转到对应注释并返回原引用段落;可复制段落、定位与文件 SHA-256。 ### 变更 - 技术限制默认折叠,不再把 XML 定位码混入每一段正文。 - 阅读结构仅用于文件预览响应;`chat_read_document` 仍返回原有带定位码的分段文本,不向 Agent 附带整份阅读结构,也不改变原文件。 ## [0.11.0-local.1] ### 新增 - 安全的常用 Markdown 呈现、长消息展开、原文复制与房间导出。 - Markdown 导出包含完整对话与当前台账;JSON 包含完整房间快照及审计历史,并附 SHA-256 校验。 ### 变更 - 发送以服务端保存确认作为成功依据,不再因为后续刷新失败而恢复草稿。响应丢失时保留发送编号与收件人,重试复用编号。 - 取消旧版 2000 条消息的静默截断。界面仍只加载最近 200 条,旧消息通过全文搜索定位。 - 重启后把未完成的回合标为中断、未完成投递标为可重试失败,不假装任务正在运行。 - 文件路径与 `@` 识别使用前后端共享协议,支持含空格的 macOS 路径,排除邮箱、代码和长英文名的误触发。 ## [0.10.0-local.1] ### 新增 - **实际权限选择**:只读讨论/审计、跟随 DSH、工作区内修改、完全权限。后两项调用 DSH 原生权限预设设置成员的真实 Session,不是只改台账或提示词。 - `chat_read_document`:分段只读抽取 DOCX/文本,包含版本哈希与定位信息。除参与者工作目录外,用户在群里明确共享的单个文件也可读取。 - 受阻事项处理入口:打开共享文件、跳转关联待决问题、调整实际权限、准备负责人重试消息、进入负责人原生 DSH 会话。 - 待决问题支持明确问题、2–4 个选项和各项影响。 ### 变更 - 完全权限须明确勾选影响提示;应用后不自动启动任务。 - 不会仅靠换权限就伪造「已解除阻断」。采纳决定不会暗中提权,切换权限也不会把任务自动标记为已解除阻断。 - 旧提议不伪造备选方案,支持请成员补齐或直接编辑。 ## [0.9.0-local.1] ### 新增 - **协作状态维护闭环**:Agent 可自行登记任务、待决定事项、证据与分歧;任务负责人本人收悉后报告进展或阻断、提交带材料版本的结果,再由指定的独立成员或用户验收。 - 成员每次唤醒都看到本人未闭环事项;分派、提交、退回在原协作轮的预算内精确唤醒接手人。 ### 变更 - 台账支持待我处理、未闭环、受阻、待验收、分类和含归档筛选。任务与决定显示真实阶段;历史展示前后快照、操作者、说明与讨论来源,支持恢复为新版本。 - 旧 done 记录没有验收元数据时不伪造验收。 - 不会另起无限后台工作,也不会自动开启监控。 ## [0.8.0-local.1] ### 新增 - **章程自更新**:Agent 可读取共享记忆、基于讨论消息提交章程提案、明确确认或提出异议。提交者与其余成员全部确认后自动生效。 - 章程检查器显示提案前后差异、讨论依据快照、逐人成员意见、待处理/已结束修订和生效版本。 ### 变更 - 异议保留旧章程,并在轮次预算内返回提案人处理。普通回复中的「同意」不是工具确认。 - 用户可搁置提案或将历史内容恢复为新版本,历史不删除。 - 「梳理章程」「继续审阅」按钮只准备消息草稿,不会覆盖已有草稿或直接唤醒模型。 ## [0.7.1-local.1] ### 变更 - 沿用 DSH 的主题颜色与正文字号,统一线性图标、表单、头像和消息层级。 - 桌面房间栏默认展开;680px 以下改为按需展开的房间抽屉;1120px 以下详情使用遮罩抽屉,更宽时与对话并排。 - 消息按日期分组;「回应」可跳转并短暂高亮原消息。 - 输入框随内容增高;消息辅助操作在悬停/聚焦时显示(触屏常显)。 - 背景同步错误在重连成功后自动清除,操作错误可以关闭。 --- 更早的版本早于本变更记录的起始点。房间状态格式的完整演进(v6 → v14)见 README「本地数据」。