# Release Notes / 版本记录 ## 0.2.7 ### 中文 **隔离授权及初始化失败,保留 DSH 侧栏可用性** - 隔离 SpreadJS / Designer 初始化与文档渲染错误,失败时显示当前页面来源和授权排查提示,避免异常冒泡并破坏 DSH sidebar。 - 初始化失败后清理局部 DOM 和已创建实例;销毁时先撤销工作簿与 Driver 租约,分别处理恢复、事件解绑及 SDK 销毁异常。 - 主题切换触发的工作簿刷新异常交由文档错误页处理,避免中断 DSH 的主题事件。 - 避免正常关闭时重复销毁 Workbook;Designer 已负责销毁它持有的工作簿。 - 补充桌面版 `dsh-app://app/` 授权说明、配置位置和测试步骤,修正「留空即能试用」的描述。 **范围说明:** 本版保留 SDK 的授权校验,失败时显示当前文件的提示。用户用主机名 `app` 申请的试用授权已让运行时启动,但 Designer 显示仍异常;本版不宣称解决桌面版完整授权和 Designer 兼容问题。无须配套升级 Driver,继续使用 `0.1.4`。 **验证:** 类型检查、260 项测试(含真实 React 调度下的初始化失败与侧栏隔离)、构建、客户端 / 宿主 smoke 和独立离线包安装校验通过。真实桌面许可证及 Designer 显示仍需后续验证。 ### English **Contain licensing and initialization failures within the editor** - Contain SpreadJS / Designer initialization and document rendering failures within the editor, with page-origin and licensing guidance. - Clean up partially initialized instances and DOM; revoke Workbook access and Driver leases before independently guarded recovery and disposal steps. - Contain workbook refresh failures during theme changes without interrupting DSH's theme event. - Avoid destroying a Workbook twice on normal close: Designer owns its workbook's disposal. - Document desktop licensing for `dsh-app://app/`, profile configuration, regression steps and the limits of keyless evaluation. **Scope:** SDK license validation remains in place; failures display a document-local message. A trial key issued for hostname `app` let the runtime start in a user test, but Designer still displayed incorrectly. This release does not establish complete desktop licensing or Designer compatibility. Companion Driver `0.1.4` remains suitable. **Validation:** Typecheck, 260 tests (including real React initialization-failure and sidebar-isolation tests), build, client / host smokes and independent offline package installation passed. Real desktop licensing and Designer rendering still need further validation. ## 0.2.6 ### 中文 **放宽 DSH 兼容范围,修复保存与恢复中的数据丢失风险** - DSH 兼容声明和 UI peer 范围调整为 `>=0.2.1-rc.3 <0.3.0-0`,开发依赖继续固定在 `0.2.1-rc.4`。同一范围内的 patch 和 RC 不再要求逐个发布插件;扩展到新的 DSH 次版本前先验证 API 和运行行为。 - 保存期间继续编辑时,新改动仍标为未保存;关闭或切换标签页后,稍后完成的旧保存不会清除新留下的恢复快照。 - 另存为只写入了较早内容时,保留当前文件和后续改动,并提示继续保存;文档已关闭或切走时,不再因旧任务完成而自动跳转。 - 串行载入同一工作簿,避免旧加载最后完成并覆盖新内容。载入失败或导出期间工作簿发生切换、重新加载时,拒绝写入过时内容。 - 在同一宿主进程内,串行执行同一文件的冲突检查与写回,拒绝基于旧文件版本的后续保存;读取文件状态失败时停止写入。 - 保留延迟加载或临时重载的桥选择,避免其他桥先注册时清空用户设置;设置页会提示所选桥暂不可用,并允许改选或选择「不使用」。 - 打开工作簿支持取消信号:导航前拒绝已取消的请求,取消后停止加载等待并释放打开锁。 **升级说明:** 建议与 Driver `0.1.4` 配套升级,完成打开任务的取消处理。恢复快照仍仅在当前页面生命周期内有效;取消不会撤销已发生的导航或已发送的写入。 **验证:** 类型检查、240 项单测、构建、两个 smoke 和独立离线包安装校验通过;用户在 DSH `0.2.1-rc.4` dev 环境做过基本回归,未发现问题。rc.3、rc.4、rc.5 相关 UI API 包实现比对无差异,桌面运行验证基线为 rc.4。 ### English **Broaden DSH compatibility and fix save and recovery data-loss risks** - Declare DSH and UI peer compatibility as `>=0.2.1-rc.3 <0.3.0-0`, keeping development dependencies pinned to `0.2.1-rc.4`. Patch and RC updates within this range no longer require individual plugin releases; verify APIs and runtime behavior before supporting a new DSH minor. - Keep edits made during a save marked as unsaved. An earlier upload finishing after a tab closes or switches no longer clears its newer recovery snapshot. - Keep the current file and later edits when Save As wrote an older revision, and explain that another save is needed. A completed Save As no longer navigates after its document has closed or switched away. - Serialize imports into one Workbook so an older load cannot overwrite newer contents. Refuse stale exports after a load failure, workbook switch or reload. - Serialize conflict checks and writes to each file within the same host process, rejecting subsequent saves based on an outdated version. Stop writes when file metadata cannot be read. - Preserve bridge selections during delayed registration and temporary reloads. Settings explains unavailable selections and lets users choose another bridge or None. - Accept cancellation signals when opening workbooks: refuse cancelled requests before navigation, stop readiness waits and release the opening lock. **Upgrade notes:** Update together with Driver `0.1.4` for complete opening cancellation support. Recovery snapshots remain limited to the current page lifetime. Cancellation does not undo navigation or writes already sent. **Validation:** Typecheck, 240 tests, build, both smokes and an independent offline package installation passed. The user completed basic development desktop checks on DSH `0.2.1-rc.4` without finding issues. Relevant UI API implementations compare without differences across rc.3, rc.4 and rc.5; desktop runtime validation is on rc.4. ## 0.2.5 - 将 DSH 开发依赖、宿主 peer 与兼容声明更新至 `0.2.1-rc.4`,补齐安装器读取的顶层 `engines.dsh`,解决在该 RC 中安装时的版本不兼容拦截。 - 用户已确认 DSH `0.2.1-rc.4` 的 dev 环境运行正常。请配套使用 Driver `0.1.3`。 - Target DSH `0.2.1-rc.4` in development dependencies, host peers and compatibility declarations, including the top-level `engines.dsh` read by the installer, so this RC accepts the plugin. - The user confirmed the DSH `0.2.1-rc.4` development environment works. Use companion Driver `0.1.3`. ## 0.2.4 - 更新 editor 与配套 driver 的 DSH 支持基线至 `0.2.1-rc.2`,并升级对应的 Cordis、Schemastery 与 UI/host 开发依赖。 - Move the editor and companion driver support baseline to DSH `0.2.1-rc.2`, and update the matching Cordis, Schemastery and UI/host development dependencies. ## 0.2.3 ### 中文 **增强 AI 协作与工作簿恢复** - 完善桥接协议,支持兼容 Driver 接入;由用户在「设置 → 电子表格编辑器」中明确选择。 - 支持 Driver 请求打开工作区文件,等待工作簿加载完成后执行操作。 - 增加 AI 执行期间的独占编辑保护,以及关闭、切换后的未保存内容恢复;恢复缓存仅在当前页面生命周期内有效。 - 按聊天、文件和加载实例隔离任务与恢复缓存;完善取消检查,阻止取消后的后续自动保存。 - 中文版 SpreadJS、Designer、IO、语言资源及全部扩展升级至 `19.2.1`。 - 适配 DSH `0.2.0-rc.2`,需要 Node.js ≥22.19。 **升级提示:** 本版支持范围统一为 DSH `0.2.0-rc.2`。请同步升级配套 Driver,使用完整的实例身份、独占锁与恢复协议。低版本 SpreadJS 打开本版保存的文件前,请确认格式兼容性。 ### English **Improve AI collaboration and workbook recovery** - Extend the bridge contract for compatible drivers, selected explicitly under Settings → Spreadsheet Editor. - Allow drivers to request a workspace file and wait until its Workbook is ready. - Protect the editor with an exclusive lease during AI work; preserve unsaved snapshots when the editor closes or switches. Recovery lasts only for the current page lifetime. - Isolate tasks and recovery by chat, file and load instance; check cancellation before subsequent automatic saves. - Upgrade the complete Chinese SpreadJS / Designer / IO / resources / extension suite to `19.2.1`. - Target DSH `0.2.0-rc.2` and require Node.js ≥22.19. **Upgrade notes:** This version supports DSH `0.2.0-rc.2`. Update the companion Driver together for the complete identity, lease and recovery protocol. Check file-format compatibility before opening files saved by this build in an older SpreadJS version. ## 0.2.2 ### 中文 - **切走标签页不再丢掉未保存的改动**:DSH 在标签页被切走时会卸载文档主体,此前这等于销毁工作簿——未保存的编辑就此消失,而且没有任何提示。平台也没有能拦下的关闭钩子(关闭是同步的,文档定义里没有任何生命周期或否决点),所以这里不做「确认离开」的拦截,改为一律不丢:脏工作簿在主体卸载前留成快照,切回来即恢复;标签页真正关闭后,快照按文件路径继续保留,重新打开同一文件时可以恢复;若文件在磁盘上已被改动,则不会默默套用快照,而是给出「恢复 / 丢弃」两个选择。整页刷新或关闭时浏览器会提示一次。保存成功即清空该文件的全部快照。 - **未保存状态是右下角一个浮动胶囊,不占布局**:悬浮在表格右下角,只在有话说时出现——有未保存改动时显示「未保存的改动」并带一颗「丢弃」,保存成功后自己消失。(这一版中途曾做成面板顶部常驻的一行,实装后发现它虽然不高,却始终占着表格的纵向空间,于是改了回来;`0.1.5/0.1.6` 上文档头部还没有动作槽,这个胶囊就是唯一的状态提示,所以它必须保留。)「丢弃」同时覆盖两种未保存内容:本会话的缓存,以及只存在于编辑器里的改动(尚无缓存可清),所以它每次都重新从磁盘载入当前版本。 - **工作簿不再被当作文本提供查看**:为 `.xlsm`、`.sjs`、`.ssjson` 声明「二进制后缀」(`.xlsx` 一并声明),DSH 因此不会再把它们列进纯文本查看方式——此前打开这类文件,可能选到把工作簿当文本渲染的方式,看到的是一屏乱码。该声明需要 DSH `0.1.7` 及以上才生效;`0.1.5-rc.3` 会忽略这个字段,行为与之前一致,不影响编辑与保存。 - **查看器名称跟随 DSH 的语言,并与内置的只读预览区分开**:DSH `0.1.7` 起自带了只读的「表格」预览,会与本插件并列出现在同一份查看方式列表里,所以这里的名称由固定的 `SpreadJS` 改为随语言变化的「SpreadJS 编辑器 / SpreadJS Editor」,一眼能看出哪个能编辑。DSH 未提供语言服务时,则用内置的「SpreadJS 编辑器」。 - **健康接口回报版本**:`/spreadjs/api/health` 现在返回插件版本与内置 SpreadJS 版本,`npm run probe:live` 因此能判断「正在运行的 DSH 里装的是不是这一版」——此前只能靠 404 猜测,进程里跑着旧版宿主半时其余检查都是一样的结果。 - **「保存」搬进 DSH 自己的文档工具栏,不再依赖 Designer 私有模板**:DSH `0.1.7` 起,文档预览头部有一个官方动作槽(`sidebar.right.tab.document.actions`),「保存」现在注册在那里——就排在文件名和其它查看器控件之后,有未保存改动时它前面会多一个标记点,像 Excel 标题栏的 `*`。此前只有改写 Designer「文件」菜单的私有模板才点得到保存,模板一变就失效;那处改写随后**整个删掉**了——既然保存已经另有正式入口,就没有理由再依赖 Designer 的内部模板结构,插件也因此少一处私有结构依赖。必须贴着文件解释的「恢复 / 丢弃」由面板右下角的浮动胶囊承载。 - **Designer 自带的「文件」标签页已从 Ribbon 上隐藏**:它里面的保存是**下载副本**,与头部那颗**写回**的保存只隔一次点击,两颗都在就是误存副本的来源——现在这个编辑器里只剩一处保存(文档头部「保存 / 另存为…」与 `Ctrl+S`)。隐藏用的是一条按产品**公开命令名**(`CommandNames.FileMenuButton`)加模板元素类名的 CSS,作用域限定在本插件面板内,有单测钉住,创建编辑器时控制台会回报命中元素数与它算出的 `display`,所以将来产品改名、规则失效会被看见。代价是「文件」页里的新建 / 打开 / 导入 / 导出 / 打印 / 信息也看不到了,需要哪一项可以单独接回 Ribbon。 - **新增「另存为」,把工作簿(包括重置成空白的新工作簿)写进工作区**:工具栏「另存为…」询问一个相对会话工作区的路径,默认是「同目录 + 同后缀 + 文件名加『副本』」;写成功后就地切换到那个文件继续编辑,不会另开标签页。同名文件不会被覆盖——宿主对没有版本基线的写入一律拒绝,对话框直接说「目标文件已存在,请换一个名字」。只接受本插件能打开的 5 种后缀(`.xlsx / .xlsm / .csv / .sjs / .ssjson`):写出格式由后缀决定,别的后缀会写出打不开的文件,因此在提交前就拦下。 - **面板内残留的固定英文提示改走语言表**:新工作簿提示、载入中、缺少完整字节的提示原先固定为英文,现在随 DSH 语言切换。 - **头部两颗按钮改用 DSH 自己控件的规格**:28px 高、12px 字号、常态用次要色、悬停转主要色并给悬停底色、禁用转三级色——与文档头部自己的「查看器名称」和图标按钮同一套值(照抄数值而不是引用内部 UI 包:第三方客户端插件不能假定内部的 `@deepseek-ai/*` 在运行时一定可解析,解析失败会连编辑器一起挂掉)。有一条单测钉住这些数值。 - **头部两颗按钮只在表格文件上出现,并排在「用本地应用打开」之前**:动作槽对所有预览文件都渲染,因此按钮现在只在插件自己的编辑器占据屏幕时才画出来(此前打开任意 Markdown、图片也会看到两颗按不动的按钮);顺序改用槽位公开的 `order`(`-10`,DSH 自己给「头部动作排第一」用的值),不再由插件加载顺序决定,未保存标记点也因此落在这一组的第一项。 - **新增「SpreadJS 桥」设置页:决定由谁来使用屏幕上打开的那份工作簿**:编辑器把它手里的**活工作簿**交给用户在设置里选中的那一个「桥」(bridge)——装上 `@grapecity-software/dsh-spreadjs-driver` 之后,AI 就能直接改你正在看的这张表,而不是另开一个文件去写。名册是**登记制**:任何插件都可以报名,但**只有一个**会拿到工作簿,就是用户选中的那个;工作簿是**递出去的引用,不是副本**,所以通过它改的样式会立刻出现在表格里。没装任何桥时名册为空,编辑器行为与没有这项功能时完全一样。 - **这个选择一定留得住**:存在 DSH 自己的设置文档里(本插件那条 Loader 记录,命名空间 `spreadjs-editor`,字段 `bridge`)。让写入被接受要靠 schema 里声明 `.volatile()`——DSH 只接受对 volatile 字段的设置写入,否则每次点选都被宿主拒绝;而**拒绝是以 resolve `false` 的形式回来的,不是抛错**,所以只挂 `.catch` 会让它看起来一切正常、重启后却变回「不使用」。设置页现在两种失败都会说明(`refused` / `failed`),因为后果要到下次启动才看得见。字段**故意不给默认值**:「从没选过」与「明确选了不使用」是两个不同状态,将来若要加「默认选中唯一的桥」只能靠这个区分。指向已被卸载的桥的旧选择,会在名册确实拿到条目且其中没有它时清掉;**名册为空时一律保留**——插件还没加载完和桥被卸载两种情况长得一样,那时清掉就等于把重装本该恢复的选择扔掉。 - **保存失败不再被报告成保存成功**:从页面外驱动编辑器的那条路(桥,以及任何等在 promise 上的调用方)现在拿到的是真话。此前四种情况都会被吞掉——工作簿还没载入、已有另一次保存在进行、写盘失败、以及「没有文件可写、只能下载一份」——前两种静默返回,后两种只写进面板右下角的状态栏,而 promise 照样 resolve,于是调用方会以为文件已经写好。现在这四种都抛错;状态栏照旧先说给人看,两处并不重复:一处说给看着面板的人,一处说给等在 promise 上的人。面板头部与 Designer 自己的保存命令没有 promise 可传,仍然只报状态栏,但那一处吞掉失败是有名有姓、写了原因的。 - **设置页按 DSH 自己设置页的行规格重画,不再是裸按钮**:这一页最初**只有类名、一条样式都没有**,所以浏览器按默认 `