@grapecity-software/dsh-spreadjs-editor 0.2.6 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -2
- package/README.md +74 -298
- package/cordis.patch.yml +3 -3
- package/docs/desktop-licensing.md +15 -0
- package/docs/manual-regression.md +67 -0
- package/docs/releasing.md +47 -0
- package/lib/client.js +2 -2
- package/package.json +126 -122
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,59 @@
|
|
|
1
1
|
# Release Notes / 版本记录
|
|
2
2
|
|
|
3
|
+
## 0.2.8
|
|
4
|
+
|
|
5
|
+
### 中文
|
|
6
|
+
|
|
7
|
+
- 精简中英文 README,集中说明安装、保存、可选 Driver 和授权配置;明确恢复快照只在当前页面内存中,刷新或关闭页面后不保留。
|
|
8
|
+
- 统一桌面授权要求:必须取得适用于该场景、同时覆盖 SpreadJS 和 Designer Component 的无限制授权;没有该授权,桌面版无法使用本编辑器。移除桌面配置指引和本地授权试验记录。
|
|
9
|
+
- 删除已不可达的新建/下载导出内部接口及辅助代码、Node 20 构建补丁、冗余成功日志和过时注释;保留保存、另存为、恢复及 Driver 桥接协议。
|
|
10
|
+
- 清理过时发布 TODO,将可复用的发布流程和手工回归步骤整理到 `docs`;依赖安装统一使用已提交的 pnpm 锁文件。
|
|
11
|
+
|
|
12
|
+
**升级说明:** 建议与 Driver `0.1.5` 配套使用;Driver 本次同步发布文档与工程清理。DSH 兼容范围和内置 SpreadJS / Designer 版本保持不变。
|
|
13
|
+
|
|
14
|
+
**验证:** 类型检查、260 项测试、构建、客户端与宿主 smoke、独立离线包安装校验通过。
|
|
15
|
+
|
|
16
|
+
### English
|
|
17
|
+
|
|
18
|
+
- Simplify both README languages around installation, saving, the optional Driver, and licensing. Clarify that recovery snapshots live only in page memory and do not survive a page refresh or close.
|
|
19
|
+
- Require applicable unrestricted licenses covering both SpreadJS and Designer Component for desktop use; without them, the editor cannot be used in the desktop app. Remove desktop configuration instructions and local licensing experiments.
|
|
20
|
+
- Remove unreachable internal New/Download Export interfaces and helpers, the Node 20 build polyfill, redundant success logs, and outdated comments. Retain saving, Save As, recovery, and the Driver bridge contract.
|
|
21
|
+
- Replace obsolete release TODOs with reusable release and manual regression documents. Use the committed pnpm lockfile for dependency installation.
|
|
22
|
+
|
|
23
|
+
**Upgrade notes:** Use companion Driver `0.1.5`, released alongside this version with documentation and project cleanup. The DSH compatibility range and bundled SpreadJS / Designer versions are unchanged.
|
|
24
|
+
|
|
25
|
+
**Validation:** Typecheck, 260 tests, build, client and host smokes, and independent offline package installation passed.
|
|
26
|
+
|
|
27
|
+
## 0.2.7
|
|
28
|
+
|
|
29
|
+
### 中文
|
|
30
|
+
|
|
31
|
+
**隔离授权及初始化失败,保留 DSH 侧栏可用性**
|
|
32
|
+
|
|
33
|
+
- 隔离 SpreadJS / Designer 初始化与文档渲染错误,失败时显示当前页面来源和授权排查提示,避免异常冒泡并破坏 DSH sidebar。
|
|
34
|
+
- 初始化失败后清理局部 DOM 和已创建实例;销毁时先撤销工作簿与 Driver 租约,分别处理恢复、事件解绑及 SDK 销毁异常。
|
|
35
|
+
- 主题切换触发的工作簿刷新异常交由文档错误页处理,避免中断 DSH 的主题事件。
|
|
36
|
+
- 避免正常关闭时重复销毁 Workbook;Designer 已负责销毁它持有的工作簿。
|
|
37
|
+
- 补充授权要求,修正「留空即能试用」的描述;当前策略见[桌面授权策略](docs/desktop-licensing.md)。
|
|
38
|
+
|
|
39
|
+
**范围说明:** 本版保留 SDK 的授权校验,失败时显示当前文件的提示。无须配套升级 Driver,继续使用 `0.1.4`。
|
|
40
|
+
|
|
41
|
+
**验证:** 类型检查、260 项测试(含真实 React 调度下的初始化失败与侧栏隔离)、构建、客户端 / 宿主 smoke 和独立离线包安装校验通过。
|
|
42
|
+
|
|
43
|
+
### English
|
|
44
|
+
|
|
45
|
+
**Contain licensing and initialization failures within the editor**
|
|
46
|
+
|
|
47
|
+
- Contain SpreadJS / Designer initialization and document rendering failures within the editor, with page-origin and licensing guidance.
|
|
48
|
+
- Clean up partially initialized instances and DOM; revoke Workbook access and Driver leases before independently guarded recovery and disposal steps.
|
|
49
|
+
- Contain workbook refresh failures during theme changes without interrupting DSH's theme event.
|
|
50
|
+
- Avoid destroying a Workbook twice on normal close: Designer owns its workbook's disposal.
|
|
51
|
+
- Document licensing requirements and the limits of keyless evaluation; see the current [desktop licensing policy](docs/desktop-licensing.md).
|
|
52
|
+
|
|
53
|
+
**Scope:** SDK license validation remains in place; failures display a document-local message. Companion Driver `0.1.4` remains suitable.
|
|
54
|
+
|
|
55
|
+
**Validation:** Typecheck, 260 tests (including real React initialization-failure and sidebar-isolation tests), build, client / host smokes and independent offline package installation passed.
|
|
56
|
+
|
|
3
57
|
## 0.2.6
|
|
4
58
|
|
|
5
59
|
### 中文
|
|
@@ -16,7 +70,7 @@
|
|
|
16
70
|
|
|
17
71
|
**升级说明:** 建议与 Driver `0.1.4` 配套升级,完成打开任务的取消处理。恢复快照仍仅在当前页面生命周期内有效;取消不会撤销已发生的导航或已发送的写入。
|
|
18
72
|
|
|
19
|
-
**验证:** 类型检查、240 项单测、构建、两个 smoke 和独立离线包安装校验通过;用户在 DSH `0.2.1-rc.4` dev 环境做过基本回归,未发现问题。rc.3、rc.4、rc.5 相关 UI API
|
|
73
|
+
**验证:** 类型检查、240 项单测、构建、两个 smoke 和独立离线包安装校验通过;用户在 DSH `0.2.1-rc.4` dev 环境做过基本回归,未发现问题。rc.3、rc.4、rc.5 相关 UI API 包实现比对无差异,开发运行验证基线为 rc.4。
|
|
20
74
|
|
|
21
75
|
### English
|
|
22
76
|
|
|
@@ -32,7 +86,7 @@
|
|
|
32
86
|
|
|
33
87
|
**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.
|
|
34
88
|
|
|
35
|
-
**Validation:** Typecheck, 240 tests, build, both smokes and an independent offline package installation passed. The user completed basic development
|
|
89
|
+
**Validation:** Typecheck, 240 tests, build, both smokes and an independent offline package installation passed. The user completed basic development 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; development runtime validation is on rc.4.
|
|
36
90
|
|
|
37
91
|
## 0.2.5
|
|
38
92
|
|
package/README.md
CHANGED
|
@@ -1,169 +1,56 @@
|
|
|
1
1
|
# SpreadJS Editor for DeepSeek Harness
|
|
2
2
|
|
|
3
|
-
[GitHub](https://github.com/GrapeCityXA/dsh-plugin-spreadjs-editor) · npm
|
|
3
|
+
[中文](#中文说明) · [English](#english) · [GitHub](https://github.com/GrapeCityXA/dsh-plugin-spreadjs-editor) · [npm](https://www.npmjs.com/package/@grapecity-software/dsh-spreadjs-editor) · [版本记录 / Changelog](CHANGELOG.md)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
在 DeepSeek Harness Web UI 的文件树中打开 Excel / SpreadJS 文件,使用 Designer 编辑并保存回工作区。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Open Excel / SpreadJS files from the DeepSeek Harness Web UI file tree, edit them in Designer, and save back to the workspace.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-

|
|
12
|
-
|
|
13
|
-
---
|
|
9
|
+

|
|
14
10
|
|
|
15
11
|
## 中文说明
|
|
16
12
|
|
|
17
|
-
###
|
|
18
|
-
|
|
19
|
-
- 支持 `.xlsx`、`.xlsm`、`.csv`、`.sjs`、`.ssjson` 文件。
|
|
20
|
-
- 从文件树打开工作簿,使用 SpreadJS Designer 编辑表格。
|
|
21
|
-
- 编辑后可直接保存回原文件:原子写入、限制在会话工作区内、带冲突检测。保存按钮在 DSH 文档头部自己的工具栏上,未保存时带一个标记点;它与「另存为…」的尺寸、字号、颜色都按 DSH 头部自身控件的规格绘制,而且**只在表格文件上出现**。
|
|
22
|
-
- 「另存为」可以把当前工作簿(含新建的空白工作簿)写进工作区的另一个路径,成功后就地切换到那个文件;同名文件不会被覆盖。
|
|
23
|
-
- 编辑器跟随 DSH 的浅色/深色主题,工具栏与工作表区域一起变;DSH 偏好设为「跟随系统」时自然跟着系统走。
|
|
24
|
-
- 「设置」标签里有「关于」按钮:内置版本、授权状态与版权信息在弹窗里。
|
|
25
|
-
|
|
26
|
-
### 配合 SpreadJS Driver 使用
|
|
27
|
-
|
|
28
|
-
本插件**单独使用就是完整的**:打开、编辑、保存工作簿都不需要别的插件。但配上 driver,它会多出一件单独做不到的事——**让 AI 直接改你屏幕上这份表**。
|
|
29
|
-
|
|
30
|
-
本编辑器通过公开的[SpreadJS 桥接契约](docs/bridge-contract.md)支持其他 driver:driver 登记到 `spreadjsBridgeRegistry`,由用户选择后获取真实 Workbook 引用,无需依赖本 editor 的 npm 包。配套 [`@grapecity-software/dsh-spreadjs-driver`](https://www.npmjs.com/package/@grapecity-software/dsh-spreadjs-driver) 是其中一种实现,也能接入其他符合该契约的 SpreadJS editor。使用同一引擎之外,还需遵守实例身份、独占锁、取消和保存协议,并核对 SpreadJS 版本及模块支持。
|
|
31
|
-
|
|
32
|
-
本包不依赖任何 driver。SpreadJS、Designer 及扩展作为开发/构建依赖内联进浏览器产物,实例和授权始终由 editor 管理;DSH 与 React peers 由宿主提供。配套 Driver 不再包含 SpreadJS、Designer 或无头浏览器引擎。第三方 driver 使用自己的唯一 id;如需从服务端读取本 editor 的选择,设置文档命名空间为 `spreadjs-editor`,字段为 `bridge`。
|
|
33
|
-
|
|
34
|
-
#### 安装
|
|
13
|
+
### 安装
|
|
35
14
|
|
|
36
|
-
|
|
15
|
+
需要 DSH `>=0.2.1-rc.3 <0.3.0-0`、Node.js ≥22.19。插件内置 SpreadJS 和 Designer `19.2.1`,使用 DSH 自带侧栏,无需额外侧栏插件或本地编译。使用前请确认下方的[授权要求](#授权与配置)。
|
|
37
16
|
|
|
38
17
|
```sh
|
|
39
|
-
dsh plugin --profile web add @grapecity-software/dsh-spreadjs-editor@0.2.
|
|
40
|
-
dsh plugin --profile web add @grapecity-software/dsh-spreadjs-driver@0.1.4
|
|
18
|
+
dsh plugin --profile web add @grapecity-software/dsh-spreadjs-editor@0.2.8
|
|
41
19
|
dsh --profile web
|
|
42
20
|
```
|
|
43
21
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
> 「装了」不等于「激活」:两个包都必须出现在 profile 的 `dsh.profile.bundles` 里。光 `pnpm add` 或 `dsh plugin add` 不一定替你写进去,装完请开一个真实会话确认工具确实在场。
|
|
47
|
-
|
|
48
|
-
#### 两边是怎么配合的
|
|
49
|
-
|
|
50
|
-
编辑器**持有**你打开的那份工作簿,每个 driver **登记**为候选人;名册里可以有多个(比如我们的测试夹具),但**只有一个**会拿到工作簿——就是你在设置里选中的那一个。
|
|
51
|
-
|
|
52
|
-
- **递出去的是活引用,不是副本。** 工作簿从不离开页面、也从不被序列化,所以通过它写的样式、公式、格式,当场就出现在表格里。
|
|
53
|
-
- **默认不落盘。** AI 的改动先活在工作簿里,你看着满意了它才会要求保存。保存走的还是文档头部那颗「保存」,因此冲突检测、工作区围栏、原子写入一条都不少。
|
|
54
|
-
- **名册只认被选中的那个。** 设置里改选别人、或选「不使用」,driver 的**全部**工具与 skill 都会让位。这个设置命名的是「谁来管这里的电子表格」,而不只是「谁暂时拿着这份活文档」。
|
|
55
|
-
- **编辑器始终是守门人。** 名册是候选人列表,不是广播。没有被递到工作簿的插件,没有任何办法去够到它。
|
|
22
|
+
安装后重启 DSH,在 Web UI 右侧文件树中打开 `.xlsx`、`.xlsm`、`.csv`、`.sjs` 或 `.ssjson` 文件。
|
|
56
23
|
|
|
57
|
-
|
|
24
|
+
若插件未生效,检查当前 profile 的 `dsh.profile.bundles` 中是否已启用该插件。升级说明见 [CHANGELOG](CHANGELOG.md)。
|
|
58
25
|
|
|
59
|
-
|
|
26
|
+
### 使用与保存
|
|
60
27
|
|
|
61
|
-
|
|
28
|
+
- **保存**:使用文档头部的「保存」或 `Ctrl+S` 写回原文件;「另存为…」写到工作区的另一路径,不覆盖已有文件。
|
|
29
|
+
- **冲突保护**:文件加载完成后才能保存;若磁盘文件已被其他程序修改,保存会被拒绝。保存路径必须在当前会话工作区内。
|
|
30
|
+
- **未保存改动**:切换或关闭文档时保留恢复快照,重新打开可恢复;磁盘文件已变化时,由用户选择恢复或丢弃。**快照仅在当前页面内存中,刷新或关闭页面后不保留,请及时保存。**
|
|
31
|
+
- **界面**:跟随 DSH 明暗主题。Designer 的「设置 → 关于」显示内置版本及授权配置状态;「已配置」不代表授权已验证有效。
|
|
62
32
|
|
|
63
|
-
|
|
33
|
+
Designer 自带的「文件」标签已隐藏,其新建、导入、导出、打印等入口暂不可用。低版本 SpreadJS 可能无法打开本版本保存的 `.sjs` / `.ssjson` 文件,与旧系统交换文件时请保留原文件并确认兼容性。
|
|
64
34
|
|
|
65
|
-
|
|
35
|
+
### 让 AI 操作工作簿(可选)
|
|
66
36
|
|
|
67
|
-
|
|
68
|
-
- **两侧声明支持 DSH `>=0.2.1-rc.3 <0.3.0-0`**:桥选择页使用 `settings.section`,选择结果保存在 editor 的设置文档中。开发依赖固定在已验证的 rc.4;rc.3 到 rc.5 的相关 UI API 实现无差异,当前桌面环境验收基线为 rc.4。
|
|
69
|
-
- **driver 前提**:Node ≥22.19、同一 web profile 中的 editor 和可用的前端连接。服务端无需安装 Chrome/Edge。
|
|
70
|
-
|
|
71
|
-
### 内置版本与文件兼容性
|
|
72
|
-
|
|
73
|
-
| 组件 | 内置版本 |
|
|
74
|
-
| --- | --- |
|
|
75
|
-
| SpreadJS | 19.2.1 |
|
|
76
|
-
| SpreadJS Designer | 19.2.1 |
|
|
77
|
-
|
|
78
|
-
内置版本、授权状态与版权信息在 Designer「设置」标签的「关于」弹窗里。低版本 SpreadJS 可能无法打开本版本保存的 `.sjs` 或 `.ssjson` 文件;与旧版系统交换文件时,建议保留原文件并确认兼容性。
|
|
79
|
-
|
|
80
|
-
### 安装
|
|
81
|
-
|
|
82
|
-
Editor `0.2.6` 声明支持 DSH `>=0.2.1-rc.3 <0.3.0-0`,需要 Node.js ≥22.19;用户已确认 rc.4 的 dev 环境运行正常。插件使用 DSH 自带的右侧栏,**不需要安装任何第三方侧边栏插件**。新 DSH 次版本需验证 API 后再扩展支持范围。
|
|
83
|
-
|
|
84
|
-
| DSH 版本 | 状态 | 说明 |
|
|
85
|
-
| --- | --- | --- |
|
|
86
|
-
| `>=0.2.1-rc.3 <0.3.0-0` | 声明兼容范围 | 覆盖 DSH 0.2.x 从 rc.3 起的版本;rc.3/rc.4/rc.5 UI API 包实现对比无差异 |
|
|
87
|
-
| `0.2.1-rc.4` | 桌面环境验收基线 | 类型检查、240 项单测、构建、两个 smoke 与包安装校验通过;用户已确认 dev 环境运行正常 |
|
|
88
|
-
|
|
89
|
-
**版本策略:** `engines.dsh` 与 DSH API peers 使用同一有界范围;范围起点取插件所需 API 的最低版本,上界停在下一条 DSH 次版本线。范围内的 patch 和 RC 不要求每次发布插件;开发依赖固定在最近通过验证的 RC。扩展到新的 DSH 次版本前,先比较 API 并跑安装/运行 smoke,再发布更新后的兼容声明。
|
|
90
|
-
|
|
91
|
-
请同步使用 Editor `0.2.6` 与 Driver `0.1.4`;旧版插件的精确版本声明可能导致安装被拒绝。
|
|
92
|
-
|
|
93
|
-
当前验收的 rc.4 提供工作簿所需的二进制后缀声明、内置只读预览、文档头部动作槽 `sidebar.right.tab.document.actions` 和设置分区 `settings.section`。兼容声明限定在 DSH 0.2.x 主线。
|
|
94
|
-
|
|
95
|
-
插件内置 SpreadJS 和 Designer,无需编译。使用已安装的 DSH CLI 安装并启动:
|
|
37
|
+
Editor 可以独立使用。需要 AI 操作工作簿时,将 [SpreadJS Driver](https://github.com/GrapeCityXA/dsh-plugin-spreadjs-driver) 安装到同一个 `web` profile:
|
|
96
38
|
|
|
97
39
|
```sh
|
|
98
|
-
dsh plugin --profile web add @grapecity-software/dsh-spreadjs-
|
|
99
|
-
dsh --profile web
|
|
40
|
+
dsh plugin --profile web add @grapecity-software/dsh-spreadjs-driver@0.1.5
|
|
100
41
|
```
|
|
101
42
|
|
|
102
|
-
|
|
43
|
+
重启 DSH,在「设置 → 电子表格编辑器」中选择 **SpreadJS Driver**,即可让 AI 打开和修改当前聊天中的工作簿。选择「不使用」可停用 Driver。
|
|
103
44
|
|
|
104
|
-
|
|
45
|
+
AI 改动默认不落盘,可通过工具请求保存或手动保存。执行期间暂停手动编辑;取消不会撤销已产生的改动,已发送的写入仍可能完成。第三方 Driver 接入及执行规则见[桥接契约](docs/bridge-contract.md)。
|
|
105
46
|
|
|
106
|
-
|
|
107
|
-
npx --yes @deepseek-ai/dsh@0.2.1-rc.4 plugin --profile web add @grapecity-software/dsh-spreadjs-editor@0.2.6
|
|
108
|
-
npx --yes @deepseek-ai/dsh@0.2.1-rc.4 --profile web
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
旧版本用户请参阅[升级说明](CHANGELOG.md)。
|
|
112
|
-
|
|
113
|
-
### 保存
|
|
114
|
-
|
|
115
|
-
保存的正式入口是 **DSH 文档头部自己的工具栏**(打开工作簿后,文件名旁边那颗「保存」)。它注册在 DSH 的官方动作槽 `sidebar.right.tab.document.actions` 里,与其它查看器的控件排在一起;有未保存改动时,「保存」前会多一个标记点,像 Excel 标题栏的 `*`。改动写回你打开的那个文件,不会再问你"要不要保存",因为按下保存本身就是你的意图。
|
|
116
|
-
|
|
117
|
-
同一份写回也挂在 **`Ctrl+S` 和 Designer 工具栏上的保存按钮**上:插件把 Designer 的 Save 命令重定向到写回,所以这两处按下都不会再弹出下载框。(Designer 自带的「文件」标签页已从 Ribbon 上隐藏,见本节末尾。)
|
|
118
|
-
|
|
119
|
-
这两颗头部按钮并不引用 DSH 的按钮组件——第三方客户端插件不能假定内部的 `@deepseek-ai/*` 包在运行时一定可解析,解析失败会连编辑器一起挂掉——而是照抄了邻居的规格:28px 高、`padding: 0 6px`、12px 字号、常态 `--dsw-alias-label-secondary`,悬停转 `--dsw-alias-label-primary` 并给 `--dsw-alias-interactive-bg-hover` 底色,禁用转 `--dsw-alias-label-tertiary` 且不再响应。也就是头部「查看器名称」与图标按钮的那一套;有一条单测钉住这些数值,避免以后悄悄漂移。
|
|
120
|
-
|
|
121
|
-
它们**只在本插件负责的文件上画出来**。这个动作槽对每个预览文件都会渲染,所以按钮要在插件自己的编辑器占据屏幕时才出现——否则工作区里每个 Markdown、图片、日志旁边都会多两颗按不动的按钮。产品自己的「用本地应用打开」也是这个形状:没有可打开的应用时就什么都不画。
|
|
122
|
-
|
|
123
|
-
顺序上它们排在「用本地应用打开」**之前**。槽位是 list,条目按公开的 `order` 排序(先 `priority`,再 `order`,最后才轮到注册顺序),插件注册在 `-10` —— 而这正是 DSH 自己给「头部动作里排第一」用的值(`dsh-client-ui-agent-preset` 注册会话头部标签时就是 `order: -10`)。这样「先保存、再考虑外部打开」是确定的阅读顺序,也不再受插件加载顺序影响;未保存的标记点也因此落在这一组的第一项上,一眼就能看到。
|
|
124
|
-
|
|
125
|
-
Designer 自带的「文件」标签页已经**从 Ribbon 上隐藏**:插件不再改写它的私有菜单模板(那段改写已删掉),也不让它留在那里——因为「文件」页里的保存是**下载副本**,与上面那颗**写回**的保存只隔一次点击,两颗都在就是误存副本的来源。现在这个编辑器里只有一处保存:文档头部的「保存 / 另存为…」,加上 `Ctrl+S`。
|
|
126
|
-
|
|
127
|
-
代价是「文件」页里的其它分类(新建、打开、导入、导出、打印、信息)也一并看不到了——这是隐藏整页的必然结果,如果你需要其中某一项,告诉我,我们把它单独接回 Ribbon。隐藏方式是按产品公开的命令名(`CommandNames.FileMenuButton`)加它模板画出的元素类名做一条 CSS,作用域限定在本插件的面板内;这条规则有单测钉住,创建编辑器时控制台也会回报命中的元素数与它实际算出的 `display`,所以将来产品改名、规则失效会被看见,而不是悄悄多出一颗下载按钮。
|
|
128
|
-
|
|
129
|
-
- **工作簿还没载入完时不让保存。** 载入中的工作簿是空的,此时保存会用空表覆盖原文件;载入完成前保存命令会拒绝并说明。
|
|
130
|
-
- **不会冲掉别人的修改。** 打开文件时插件记下其内容哈希;保存前重新比对,若磁盘上的文件在此期间被改过(Agent 改过、你在别处存过),保存会被拒绝并说明原因,而不是覆盖掉那些改动。
|
|
131
|
-
- **不会写出半个文件。** 同目录临时文件写完后 rename 覆盖,其他程序任何时候读到的都是完整文件。
|
|
132
|
-
- **写不出工作区。** 目标必须在当前会话的工作区内,越界(含 `..` 逃逸)直接拒绝。
|
|
133
|
-
- **只有循环回环地址可用。** 保存接口与 DSH 其它接口一样只服务本机来源;通过局域网地址访问时,需要把该地址加进 `trustedHosts`。
|
|
134
|
-
|
|
135
|
-
### 另存为
|
|
47
|
+
### 授权与配置
|
|
136
48
|
|
|
137
|
-
|
|
49
|
+
插件代码采用 [MIT 许可证](LICENSE),**不包含 SpreadJS 或 Designer Component 的商业授权**。两个组件需要分别配置适用的授权;无 key 本地试用仅限供应商试用条款允许的 HTTP(S) 回环环境。正式部署或 SaaS 服务需获取适用于实际场景的授权。
|
|
138
50
|
|
|
139
|
-
|
|
140
|
-
- **成功后就地切换**:当前内容完整写入且文档仍在时,这个标签页直接打开新文件继续编辑;若期间产生新改动,则保留当前文件并提示继续保存。已关闭或切走的文档不会因旧任务完成而跳转。
|
|
141
|
-
- **同名不覆盖**:目标已存在时宿主会拒绝写入(写回要求带版本基线,另存为没有),对话框直接说「目标文件已存在,请换一个名字」,而不是默默覆盖。
|
|
142
|
-
- **只接受 5 种后缀**:`.xlsx`、`.xlsm`、`.csv`、`.sjs`、`.ssjson`。写出格式由后缀决定,其它后缀会写出打不开的文件,所以在提交前就拦下。
|
|
143
|
-
- **越界同样被拒**:路径解析与围栏由宿主按写回那一套规则判定,工作区之外一律拒绝。
|
|
144
|
-
- **写不进去的另一种可能**:正在载入或另一次保存尚未结束时,对话框会说「编辑器还没准备好」,不会假装成功。
|
|
51
|
+
**桌面环境需要同时覆盖 SpreadJS 和 Designer Component 的适用无限制授权;没有该授权,桌面版无法使用本编辑器。** 详见[桌面授权策略](docs/desktop-licensing.md)。
|
|
145
52
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
DSH 在标签页被切走时会卸载文档主体,平台也没有可供拦下的关闭钩子(关闭是同步的,文档定义里既无生命周期也没有否决点),所以这里**不做「确认离开」的拦截**,而是保证不丢:
|
|
149
|
-
|
|
150
|
-
- **切走再切回不丢。** 有未保存改动的工作簿会在主体卸载前留成一份快照,切回同一个标签页时原样恢复,不需要重新读盘。
|
|
151
|
-
- **关掉标签页也不丢。** 快照同时按文件路径保留;重新打开同一个文件时,只要磁盘上的文件仍是快照写下的那一版,就自动恢复,并在面板右下角的胶囊里说明来源。
|
|
152
|
-
- **文件被外部改过时不默默套用。** 若磁盘上的文件已经变了(Agent 改过、你在别处存过),面板右下角会浮出一个胶囊提示「存在未保存的改动缓存,但文件已在磁盘上被修改」,由你选择**恢复**(用缓存继续,之后保存即写入磁盘)或**丢弃**(重新读盘)。
|
|
153
|
-
- **看得见,而且有两处。** 头部工具栏的「保存」在有未保存改动时带一个标记点(像 Excel 标题栏的 `*`);面板右下角另有一个浮动胶囊,显示「未保存的改动」与「丢弃」操作。胶囊悬浮在表格上方,不占布局高度,当前内容全部保存后消失。
|
|
154
|
-
- **整页关闭会提示。** 刷新或关闭页面时,只要还有未保存的改动(含已留存的缓存),浏览器会弹出一次自己的离开确认。
|
|
155
|
-
- **保存当前内容后清空。** 当前内容完整写入后,该文件的快照清除;保存期间的新改动仍保留未保存标记,切走或关闭后留下的较新快照不会被旧保存清掉。
|
|
156
|
-
|
|
157
|
-
### 配置
|
|
158
|
-
|
|
159
|
-
如已获得许可证,在 web profile 的 `cordis.patch.yml` 中添加以下配置:
|
|
160
|
-
|
|
161
|
-
| Key | 默认值 | 说明 |
|
|
162
|
-
| --- | --- | --- |
|
|
163
|
-
| `licenseKey` | `''` | SpreadJS 部署许可证。留空以带水印的试用模式运行。 |
|
|
164
|
-
| `designerLicenseKey` | `''` | 独立的 SpreadJS Designer 部署许可证。留空保持 Designer 试用状态。 |
|
|
165
|
-
| `maxSaveBytes` | `67108864` | 单次保存允许的最大字节数;超出直接拒绝,不做截断。 |
|
|
166
|
-
| `trustedHosts` | `[]` | 除本机回环地址外,额外允许调用保存接口的地址(局域网部署时使用)。 |
|
|
53
|
+
在 `web` profile 的 `cordis.patch.yml` 中更新已有的 `spreadjs-editor` 配置项,保留其他字段:
|
|
167
54
|
|
|
168
55
|
```yaml
|
|
169
56
|
- id: spreadjs-editor
|
|
@@ -172,179 +59,58 @@ DSH 在标签页被切走时会卸载文档主体,平台也没有可供拦下
|
|
|
172
59
|
designerLicenseKey: 'YOUR_DESIGNER_KEY'
|
|
173
60
|
```
|
|
174
61
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
| 命令 | 验证内容 |
|
|
182
|
-
| --- | --- |
|
|
183
|
-
| `npm run typecheck`、`npm test` | 类型契约,以及 240 个单元测试(保存路由的每条守卫、文件地址解析与地址构造、另存为的目标校验、默认名与失败文案、保存命令重定向的每条分支、编辑器主题桥的每条分支、查看器名称与二进制后缀声明的边界、未保存改动的缓存规则与脏状态跟踪的边界、打开时「用文件还是用缓存」的每个分支、面板状态胶囊的状态与操作矩阵、文档头部动作的发布/订阅/命令路由、按钮的尺寸字号颜色规格、「只在表格文件上出现」的判定与注册顺序,隐藏 Designer「文件」Tab 那条规则的两处身份与作用域,以及桥选择的方向与「写入被拒也要报出来」、桥字段是否真的声明为 volatile、名册自身的契约(重复 id 拒绝、disposer 语义、只在真的变化时通知)、名册与设置页在有无 settings 服务时的接线,以及设置页每一行确实是照 DSH 自己设置页的行规格画的) |
|
|
184
|
-
| `node scripts/smoke-client.mjs` | 构建后的浏览器半结构:loader 包装、内联的 SpreadJS 与样式、外部依赖只有 react |
|
|
185
|
-
| `node scripts/smoke-node.mjs` | 构建后的宿主半:路由注册、许可证配置,以及保存路径的真实写盘、冲突与越界拒绝 |
|
|
186
|
-
| `npm run probe:live` | **对着正在运行的 DSH** 跑一遍真实保存:真实 `ctx.fs` 的解析、落盘、冲突守卫、工作区越界;并核对进程里装的是不是本构建(插件版本与内置 SpreadJS 版本) |
|
|
187
|
-
|
|
188
|
-
`npm run probe:live` 要求 DSH 已重启到本版本。宿主半会在 `/spreadjs/api/health` 回报插件版本与内置 SpreadJS 版本,探针据此判断「正在跑的进程是不是这一版」——回报的版本与本构建不一致会直接判失败;如果进程里是很早的宿主半(连版本字段都没有),探针会说明需要重启,如果连保存路由都报 404,则说明那更是旧版。可选参数:`--url`(默认 `http://127.0.0.1:3080`)、`--session <id>`、`--home <DSH_HOME>`。探针会在会话工作区内建一个临时文件,结束时删除。
|
|
189
|
-
|
|
190
|
-
### 许可
|
|
191
|
-
|
|
192
|
-
插件代码免费提供,采用 [MIT 许可证](LICENSE)。内置的 SpreadJS 和 Designer 是葡萄城商业产品,未配置许可证时可按其试用条款体验;插件免费不包含这两个产品的商业授权。
|
|
193
|
-
|
|
194
|
-
如用于正式部署或 SaaS 服务,请根据使用场景获取适用的 SpreadJS 和 Designer 授权。
|
|
62
|
+
| 配置项 | 默认值 | 说明 |
|
|
63
|
+
| --- | --- | --- |
|
|
64
|
+
| `licenseKey` | `''` | SpreadJS 授权 key |
|
|
65
|
+
| `designerLicenseKey` | `''` | Designer Component 授权 key |
|
|
66
|
+
| `maxSaveBytes` | `67108864` | 单次保存上限,默认 64 MiB;超出时拒绝保存 |
|
|
67
|
+
| `trustedHosts` | `[]` | 除回环地址外,额外允许调用保存接口的地址;通过局域网访问时配置 |
|
|
195
68
|
|
|
196
|
-
|
|
69
|
+
修改后重启 DSH 并重新打开文件。`bridge` 由「电子表格编辑器」设置页管理,无需手写。初始化失败时可查看编辑器内的错误提示,修正配置后重新打开文件。
|
|
197
70
|
|
|
198
71
|
## English
|
|
199
72
|
|
|
200
|
-
###
|
|
201
|
-
|
|
202
|
-
- Opens `.xlsx`, `.xlsm`, `.csv`, `.sjs`, and `.ssjson` files.
|
|
203
|
-
- Open workbooks from the file tree and edit them with SpreadJS Designer.
|
|
204
|
-
- Save edits straight back to the file: atomic, confined to the session workspace, with conflict detection. Save lives in the harness's own document header, with a mark while anything is unsaved.
|
|
205
|
-
- **Save As** writes the workbook — including a new blank one — to another path in the workspace and moves the tab onto it; an existing name is never overwritten. Both header buttons follow the spec of the header's own controls (see Saving below) and appear on this plugin's own files only.
|
|
206
|
-
- Follows the harness's light or dark theme, toolbars and worksheet alike; a harness preference of `system` still tracks the OS.
|
|
207
|
-
- An **About** button in the settings tab reports the bundled versions, the licence state and the copyright.
|
|
208
|
-
|
|
209
|
-
### Using it with the SpreadJS Driver
|
|
210
|
-
|
|
211
|
-
This plugin is **complete on its own**: opening, editing and saving workbooks needs nothing else. Paired with the driver, though, it gains the one thing it cannot do alone — **letting the AI edit the very sheet you have on screen**.
|
|
212
|
-
|
|
213
|
-
This editor supports other drivers through the public [SpreadJS bridge contract](docs/bridge-contract.md). A driver registers into `spreadjsBridgeRegistry` and receives the real Workbook only after explicit user selection, without an npm dependency on this editor. The companion [`@grapecity-software/dsh-spreadjs-driver`](https://www.npmjs.com/package/@grapecity-software/dsh-spreadjs-driver) is one implementation and can consume other compatible SpreadJS editors. Compatibility also requires document identity, leases, cancellation and save semantics, plus supported SpreadJS versions/modules.
|
|
214
|
-
|
|
215
|
-
This package depends on no driver. SpreadJS, Designer and extensions are build/dev dependencies inlined into the browser bundle; the editor owns the instance and licensing. DSH and React peers are supplied by the host. The companion Driver bundles no SpreadJS, Designer or headless engine. Third-party drivers use their own unique ids; the host-side selection document for this editor is namespace `spreadjs-editor`, field `bridge`.
|
|
216
|
-
|
|
217
|
-
#### Install
|
|
73
|
+
### Installation
|
|
218
74
|
|
|
219
|
-
|
|
75
|
+
Requires DSH `>=0.2.1-rc.3 <0.3.0-0` and Node.js ≥22.19. The plugin bundles SpreadJS and Designer `19.2.1` and uses DSH's built-in sidebar. No additional sidebar plugin or local build is needed. Check the [licensing requirements](#licensing-and-configuration) before use.
|
|
220
76
|
|
|
221
77
|
```sh
|
|
222
|
-
dsh plugin --profile web add @grapecity-software/dsh-spreadjs-editor@0.2.
|
|
223
|
-
dsh plugin --profile web add @grapecity-software/dsh-spreadjs-driver@0.1.4
|
|
78
|
+
dsh plugin --profile web add @grapecity-software/dsh-spreadjs-editor@0.2.8
|
|
224
79
|
dsh --profile web
|
|
225
80
|
```
|
|
226
81
|
|
|
227
|
-
Restart DSH
|
|
228
|
-
|
|
229
|
-
> Installed is not the same as active: both packages have to appear in the profile's `dsh.profile.bundles`. `pnpm add` or `dsh plugin add` does not always write that for you, so after installing, open a real session and confirm the tools are actually there.
|
|
230
|
-
|
|
231
|
-
#### How the two fit together
|
|
232
|
-
|
|
233
|
-
The editor **owns** the workbook you open; each driver **registers** as a candidate. The roster may hold several — our test fixture, for one — but exactly **one** is handed the workbook: the one you selected in Settings.
|
|
234
|
-
|
|
235
|
-
- **What is handed over is a live reference, not a copy.** The workbook never leaves the page and is never serialized, so a style, formula or format written through it appears in the sheet at once.
|
|
236
|
-
- **Nothing reaches disk by default.** An AI edit lives in the workbook until you are happy with it and the agent asks for a save. That save is the document header's own Save, so conflict detection, the workspace fence and the atomic write are all still in force.
|
|
237
|
-
- **The roster answers to the selection alone.** Choose another bridge — or "None" — and **every** tool and skill the driver registers steps aside. The setting names the plugin that *owns spreadsheets* here, not merely the one holding the live document for the moment.
|
|
238
|
-
- **The editor stays the gatekeeper.** The roster is a list of candidates, not a broadcast. A plugin that was not handed the workbook has no way to reach it.
|
|
239
|
-
|
|
240
|
-
Selecting the driver enables `sjs_live_open`, `sjs_live_execute` and `sjs_live_status`. The driver can copy a template and ask this editor to open and initialize it. Import/export and Workbook ownership remain editor features.
|
|
241
|
-
|
|
242
|
-
The saved bridge choice survives delayed loading, reloads and removal. If that bridge is absent, Settings shows it as unavailable with its id; it reconnects when loaded, or you can choose another bridge or None. Another bridge loading first never clears the saved choice.
|
|
243
|
-
|
|
244
|
-
Driver status and execution are confined to the calling chat and bound to the current loaded-document identity, renewed on every reload. Recovery snapshots use the full session resource address, so same-named files in different chats cannot restore or clear each other's buffers. Cancellation/timeout prevent subsequent automatic saves; the editor rechecks permission after export and before write-back. Scripts ignoring cancellation retain their edit lock until they settle or the instance is destroyed. A write already sent may complete; cancellation cannot guarantee rollback. Update both plugins for the identity protocol.
|
|
245
|
-
|
|
246
|
-
#### Requirements
|
|
247
|
-
|
|
248
|
-
- **Update the editor and driver together** for the complete instance identity, lease and recovery protocol.
|
|
249
|
-
- **Both plugins declare support for DSH `>=0.2.1-rc.3 <0.3.0-0`**: the bridge picker uses `settings.section` and stores the choice in the editor settings document. Development dependencies remain pinned to validated rc.4; the relevant UI API package implementations compare without differences from rc.3 through rc.5.
|
|
250
|
-
- **Driver requirements**: Node ≥22.19, the editor in the same web profile, and a working browser connection. No Chrome/Edge installation on the server is required.
|
|
251
|
-
|
|
252
|
-
### Bundled Versions and File Compatibility
|
|
253
|
-
|
|
254
|
-
| Component | Bundled version |
|
|
255
|
-
| --- | --- |
|
|
256
|
-
| SpreadJS | 19.2.1 |
|
|
257
|
-
| SpreadJS Designer | 19.2.1 |
|
|
258
|
-
|
|
259
|
-
The **About** button in the Designer's settings tab shows the bundled versions, the licence state and the copyright. Older SpreadJS versions may not open `.sjs` or `.ssjson` files saved by this version. When exchanging files with older systems, keep the original files and check compatibility.
|
|
260
|
-
|
|
261
|
-
### Installation
|
|
262
|
-
|
|
263
|
-
Editor `0.2.6` declares support for DSH `>=0.2.1-rc.3 <0.3.0-0` and requires Node.js ≥22.19; the user confirmed rc.4 works in the development environment. The plugin uses the harness's own right Sidebar and needs **no third-party sidebar plugin**. Verify a new DSH minor's APIs before extending the supported range.
|
|
264
|
-
|
|
265
|
-
| DSH version | Status | Notes |
|
|
266
|
-
| --- | --- | --- |
|
|
267
|
-
| `>=0.2.1-rc.3 <0.3.0-0` | Declared compatibility range | DSH 0.2.x from rc.3; the rc.3/rc.4/rc.5 UI API package implementations compare without differences |
|
|
268
|
-
| `0.2.1-rc.4` | Desktop validation baseline | Typecheck, 240 unit tests, build, both smokes and package installation checks pass; the user confirmed the development environment works |
|
|
82
|
+
Restart DSH after installation, then open an `.xlsx`, `.xlsm`, `.csv`, `.sjs`, or `.ssjson` file from the Web UI's right-side file tree.
|
|
269
83
|
|
|
270
|
-
|
|
84
|
+
If the plugin does not appear, check that it is enabled in the active profile's `dsh.profile.bundles`. See the [changelog](CHANGELOG.md) for upgrade notes.
|
|
271
85
|
|
|
272
|
-
|
|
86
|
+
### Editing and saving
|
|
273
87
|
|
|
274
|
-
|
|
88
|
+
- **Save**: use **Save** in the document header or `Ctrl+S` to write back to the original file. **Save As…** writes to another workspace path without overwriting an existing file.
|
|
89
|
+
- **Conflict protection**: saving requires a fully loaded workbook and a path inside the current session's workspace. If another program has changed the file on disk, the save is refused.
|
|
90
|
+
- **Unsaved changes**: switching or closing a document keeps a recovery snapshot. Reopening restores it, or offers Restore / Discard if the disk file has changed. **Snapshots live only in page memory and do not survive a page refresh or close. Save your work promptly.**
|
|
91
|
+
- **Interface**: follows DSH's light/dark theme. **Settings → About** in Designer shows bundled versions and license configuration status; a configured key does not establish license validity.
|
|
275
92
|
|
|
276
|
-
|
|
93
|
+
Designer's **File** tab is hidden, so its New, Import, Export, and Print entries are unavailable. Older SpreadJS versions may not open `.sjs` / `.ssjson` files saved by this version; keep originals and check compatibility when exchanging files with older systems.
|
|
277
94
|
|
|
278
|
-
|
|
279
|
-
dsh plugin --profile web add @grapecity-software/dsh-spreadjs-editor@0.2.6
|
|
280
|
-
dsh --profile web
|
|
281
|
-
```
|
|
95
|
+
### Let AI edit workbooks (optional)
|
|
282
96
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
Alternatively, install and start through npx:
|
|
97
|
+
The Editor works independently. To let AI operate on workbooks, install the [SpreadJS Driver](https://github.com/GrapeCityXA/dsh-plugin-spreadjs-driver) in the same `web` profile:
|
|
286
98
|
|
|
287
99
|
```sh
|
|
288
|
-
|
|
289
|
-
npx --yes @deepseek-ai/dsh@0.2.1-rc.4 --profile web
|
|
100
|
+
dsh plugin --profile web add @grapecity-software/dsh-spreadjs-driver@0.1.5
|
|
290
101
|
```
|
|
291
102
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
### Saving
|
|
295
|
-
|
|
296
|
-
Save's official entry point is **the harness's own document header** — the Save button beside the file name once a workbook is open. It is registered in the actions slot `sidebar.right.tab.document.actions` published by DSH, next to the other viewers' own controls, and it carries a mark while anything is unsaved, like the `*` in Excel's title bar. It writes your changes back to the file you opened, and there is no second prompt, because pressing Save *is* the intent.
|
|
297
|
-
|
|
298
|
-
The same write-back is also on **`Ctrl+S` and the Save button on the Designer's own toolbar**: the plugin redirects the Designer's Save command, so neither of those reaches a download dialog any more. (The Designer's own File tab is hidden from the ribbon — see the end of this section.)
|
|
299
|
-
|
|
300
|
-
These two header buttons do not import the harness's button component — a third-party client plugin cannot assume an internal `@deepseek-ai/*` package resolves at runtime, and a failure there would take the whole editor down — so they copy the values from the controls beside them instead: 28px tall, `padding: 0 6px`, 12px text, `--dsw-alias-label-secondary` at rest, `--dsw-alias-label-primary` with the `--dsw-alias-interactive-bg-hover` background on hover, and `--dsw-alias-label-tertiary` with no response when disabled. That is exactly what the header's own viewer-name button and icon buttons do, and a unit test pins those values so they cannot drift unnoticed.
|
|
301
|
-
|
|
302
|
-
They are drawn **only on the files this plugin handles**. The slot renders for every previewed file, so the buttons appear only while this plugin's own editor is the body on screen — otherwise every markdown file, image and log in the workspace would carry two buttons that cannot do anything. The product's own open-in-app control works the same way: it draws nothing when there is no application to offer.
|
|
303
|
-
|
|
304
|
-
They are ordered **before** open-in-app. The slot is a list, and its entries sort by the documented `order` (priority first, then order, then registration sequence), where this plugin registers at `-10` — the very value the harness itself uses for "first in a header actions list" (`dsh-client-ui-agent-preset` registers its session-header label at `order: -10`). That makes "save first, think about opening elsewhere second" a decided reading order rather than a side effect of plugin load order, and it puts the unsaved mark on the first item of the group, where the eye lands.
|
|
305
|
-
|
|
306
|
-
The Designer's own File tab is **hidden from the ribbon**. The plugin no longer rewrites its private menu template (that rewrite is gone), and it does not leave the tab in place either: the File tab's Save *downloads a copy*, one click away from the Save that writes the file back, and having both is how the wrong one gets pressed. This editor now has exactly one place to save — the document header's **Save / Save As…**, plus `Ctrl+S`.
|
|
307
|
-
|
|
308
|
-
The price is that the File tab's other categories (new, open, import, export, print, info) are not reachable from the UI any more; that is what hiding the page means. Say the word if you want one of them back on the ribbon and we will wire that one in. The hiding is one CSS rule keyed on the product's public command name (`CommandNames.FileMenuButton`) and the class its template draws, scoped to this plugin's panel; a unit test pins the rule, and creating the editor logs how many elements it matched and what `display` they compute to, so a rename in a future build shows up as a dead rule rather than as a quietly reappearing download button.
|
|
103
|
+
Restart DSH and select **SpreadJS Driver** under **Settings → Spreadsheet Editor**. AI can then open and edit workbooks in the current chat. Select **None** to disable the Driver.
|
|
309
104
|
|
|
310
|
-
|
|
311
|
-
- **It will not clobber someone else's edit.** The plugin records the file's content hash when it opens it and re-checks before writing; if the file changed in the meantime (an agent edited it, you saved it elsewhere), the save is refused with an explanation instead of overwriting those changes.
|
|
312
|
-
- **It never leaves half a file.** A same-directory temporary file is renamed over the target, so any other reader always sees a complete workbook.
|
|
313
|
-
- **It cannot write outside the workspace.** The target must sit inside the current session's workspace; anything else — including `..` escapes — is refused.
|
|
314
|
-
- **Loopback only.** The save endpoint serves the local machine like the rest of DSH. If you reach DSH through a LAN address, add that address to `trustedHosts`.
|
|
105
|
+
AI edits are not saved by default; a tool can request a save, or you can save manually. Manual editing is paused during execution. Cancellation does not undo edits already made, and a write already sent may still complete. See the [bridge contract](docs/bridge-contract.md) for third-party integration and execution rules.
|
|
315
106
|
|
|
316
|
-
###
|
|
107
|
+
### Licensing and configuration
|
|
317
108
|
|
|
318
|
-
|
|
109
|
+
The plugin code uses the [MIT license](LICENSE). **SpreadJS and Designer Component commercial licenses are not included.** Configure applicable license keys for each component. Keyless local evaluation is limited to HTTP(S) loopback environments permitted by the vendor's trial terms. Production and SaaS deployments require licenses appropriate to their use.
|
|
319
110
|
|
|
320
|
-
|
|
321
|
-
- **It switches this tab.** When the current contents are fully written and the document is still present, the tab opens the new file. If later edits remain, it keeps the current file and asks for another save. A completed task does not navigate after its document has closed or switched away.
|
|
322
|
-
- **An existing name is never overwritten.** The host refuses the write (a write-back needs a version baseline, and a Save As has none) and the dialog says so — "that file already exists; choose another name" — instead of replacing what is there.
|
|
323
|
-
- **Only five suffixes are accepted**: `.xlsx`, `.xlsm`, `.csv`, `.sjs`, `.ssjson`. The written format follows the suffix, so anything else would produce a file this editor cannot reopen; it is refused before the write.
|
|
324
|
-
- **Containment is judged by the host**, on the same rule as a write-back: a path outside the session workspace is refused.
|
|
325
|
-
- **A busy editor says so.** While a load or another save is running the dialog reports that the editor is not ready rather than pretending to have written.
|
|
111
|
+
**Desktop use requires unrestricted licenses applicable to that environment and covering both SpreadJS and Designer Component. Without them, the editor cannot be used in the desktop app.** See the [desktop licensing policy](docs/desktop-licensing.md).
|
|
326
112
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
The harness unmounts a document body when its tab is hidden, and the platform offers no close hook to intercept (a close is synchronous, and a document definition has neither a lifecycle nor a veto point). So leaving is never blocked — and nothing is dropped either:
|
|
330
|
-
|
|
331
|
-
- **Switching away and back keeps the edits.** A dirty workbook is kept as a snapshot just before its body unmounts, and restored as-is when the same tab returns, without re-reading the file.
|
|
332
|
-
- **Closing the tab keeps them too.** The snapshot is also kept under the file's path, so reopening that file restores it — and says so in the pill at the panel's bottom-right — as long as the file on disk is still the version the snapshot was written from.
|
|
333
|
-
- **A file changed elsewhere is never silently replaced.** If the file on disk changed since the snapshot (an agent, another editor), the panel offers it instead in that same pill: **Restore** carries on from the buffer (a later save writes it to disk), **Discard** re-reads the file.
|
|
334
|
-
- **It is visible, in two places.** Save in the document header carries a mark while edits are pending, like Excel's title-bar `*`. A floating pill at the bottom-right shows `Unsaved changes` and a Discard action. It costs no layout height and disappears once the current contents are fully saved.
|
|
335
|
-
- **Closing the page warns.** A reload or close raises the browser's own prompt once, as long as anything is unsaved or still cached.
|
|
336
|
-
- **Saving the current contents clears recovery.** Later edits remain marked as unsaved. An earlier save cannot clear a newer snapshot left when closing or switching the document.
|
|
337
|
-
|
|
338
|
-
### Configuration
|
|
339
|
-
|
|
340
|
-
If you have licenses, add the following to the web profile's `cordis.patch.yml`:
|
|
341
|
-
|
|
342
|
-
| Key | Default | Description |
|
|
343
|
-
| --- | --- | --- |
|
|
344
|
-
| `licenseKey` | `''` | SpreadJS deployment key. Empty runs in evaluation mode with a watermark. |
|
|
345
|
-
| `designerLicenseKey` | `''` | Separate SpreadJS Designer deployment key. Empty keeps Designer in evaluation mode. |
|
|
346
|
-
| `maxSaveBytes` | `67108864` | Largest payload one save may carry; a bigger one is refused, never truncated. |
|
|
347
|
-
| `trustedHosts` | `[]` | Extra authorities allowed to call the save endpoint, beyond loopback (for LAN deployments). |
|
|
113
|
+
Update the existing `spreadjs-editor` entry in the `web` profile's `cordis.patch.yml`, preserving its other fields:
|
|
348
114
|
|
|
349
115
|
```yaml
|
|
350
116
|
- id: spreadjs-editor
|
|
@@ -353,23 +119,33 @@ If you have licenses, add the following to the web profile's `cordis.patch.yml`:
|
|
|
353
119
|
designerLicenseKey: 'YOUR_DESIGNER_KEY'
|
|
354
120
|
```
|
|
355
121
|
|
|
356
|
-
|
|
122
|
+
| Key | Default | Description |
|
|
123
|
+
| --- | --- | --- |
|
|
124
|
+
| `licenseKey` | `''` | SpreadJS license key |
|
|
125
|
+
| `designerLicenseKey` | `''` | Designer Component license key |
|
|
126
|
+
| `maxSaveBytes` | `67108864` | Save size limit, 64 MiB by default; larger saves are refused |
|
|
127
|
+
| `trustedHosts` | `[]` | Extra addresses allowed to call the save endpoint beyond loopback; configure for LAN access |
|
|
128
|
+
|
|
129
|
+
Restart DSH and reopen the file after changing configuration. The **Spreadsheet Editor** settings page manages `bridge`; no manual entry is needed. If initialization fails, review the editor's error message, correct the configuration, and reopen the file.
|
|
357
130
|
|
|
358
|
-
|
|
131
|
+
## 开发 / Development
|
|
359
132
|
|
|
360
|
-
|
|
133
|
+
使用 pnpm 和仓库中的 `pnpm-lock.yaml` 安装依赖。开发依赖固定在 DSH `0.2.1-rc.4`;兼容范围内的 patch / RC 不逐个发版适配,扩展到新的 DSH 次版本前先验证 API 和运行行为。
|
|
361
134
|
|
|
362
|
-
|
|
363
|
-
| --- | --- |
|
|
364
|
-
| `npm run typecheck`, `npm test` | The type contract, and 240 unit tests: every save guard, file-address parsing and address building, the Save As target rules, suggested name and failure wording, every branch of the Save-command redirect, every branch of the editor theme bridge, the viewer-name and binary-suffix edge cases, the unsaved-buffer and dirty-tracking rules, every branch of the file-versus-buffer decision at open, the panel state pill's state/action matrix, the document header actions' publication, subscription, command routing, button spec, "spreadsheets only" rule and registration order, both identities plus the scope of the rule that hides the Designer's File tab, the direction of the bridge choice and that a refused write is reported, that the bridge field really is declared volatile, and the registry's own contract (a duplicate id refused, disposer semantics, notifying only on a real change), the wiring of the roster and the settings page with and without a settings service, and that every row of that page is drawn to the harness's own settings-row spec |
|
|
365
|
-
| `node scripts/smoke-client.mjs` | The built browser half's structure: loader wrapper, inlined SpreadJS and styles, react as the only runtime external |
|
|
366
|
-
| `node scripts/smoke-node.mjs` | The built host half: route registration, license config, and the save path writing real bytes plus refusing conflicts and escapes |
|
|
367
|
-
| `npm run probe:live` | A real save against a **running DSH**: the actual `ctx.fs` resolving, writing, refusing a stale base hash, and refusing a workspace escape — plus a check that the process carries *this* build (plugin and bundled SpreadJS versions) |
|
|
135
|
+
Install dependencies with pnpm and the committed `pnpm-lock.yaml`. Development dependencies are pinned to DSH `0.2.1-rc.4`. Patch / RC updates within the declared range do not require individual plugin releases. Verify APIs and runtime behavior before extending support to a new DSH minor.
|
|
368
136
|
|
|
369
|
-
|
|
137
|
+
```sh
|
|
138
|
+
pnpm install --frozen-lockfile
|
|
139
|
+
npm run typecheck
|
|
140
|
+
npm test
|
|
141
|
+
npm run build
|
|
142
|
+
node scripts/smoke-client.mjs
|
|
143
|
+
node scripts/smoke-node.mjs
|
|
144
|
+
npm run verify:package
|
|
145
|
+
```
|
|
370
146
|
|
|
371
|
-
|
|
147
|
+
`npm run probe:live` 可验证运行中 DSH 的真实保存、冲突和工作区边界;运行前需重启 DSH 加载当前构建。支持 `--url`(默认 `http://127.0.0.1:3080`)、`--session`、`--home` 参数,使用 `npm run probe:live -- <参数>` 传入。探针会创建并删除一个临时文件。
|
|
372
148
|
|
|
373
|
-
|
|
149
|
+
`npm run probe:live` checks real saves, conflicts, and workspace boundaries against a running DSH. Restart DSH on the current build first. Pass `--url` (default `http://127.0.0.1:3080`), `--session`, or `--home` via `npm run probe:live -- <options>`. The probe creates and deletes a temporary file.
|
|
374
150
|
|
|
375
|
-
|
|
151
|
+
开发文档 / Development docs: [发布流程 / Release workflow](docs/releasing.md) · [手工回归 / Manual regression](docs/manual-regression.md).
|
package/cordis.patch.yml
CHANGED
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
name: '@grapecity-software/dsh-spreadjs-editor'
|
|
18
18
|
inject: [webServer]
|
|
19
19
|
config:
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
20
|
+
# Separate SpreadJS and Designer Component keys. Keyless evaluation is
|
|
21
|
+
# limited to supported HTTP(S) loopback environments. Desktop use needs
|
|
22
|
+
# applicable unrestricted licenses; see docs/desktop-licensing.md.
|
|
23
23
|
licenseKey: ''
|
|
24
24
|
designerLicenseKey: ''
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# 桌面授权策略
|
|
2
|
+
|
|
3
|
+
桌面环境使用本编辑器,必须取得适用于该场景的**无限制授权**,并同时覆盖 **SpreadJS** 和 **Designer Component**。
|
|
4
|
+
|
|
5
|
+
没有上述授权,桌面版无法使用本编辑器。SpreadJS 和 Designer Component 的授权需分别配置,缺少任一组件的适用授权均无法使用完整编辑器。
|
|
6
|
+
|
|
7
|
+
免费插件不包含 SpreadJS 或 Designer Component 授权。无 key 的本地开发仅限供应商试用条款允许的 HTTP(S) 回环环境;桌面环境不能依赖这类本地试用。
|
|
8
|
+
|
|
9
|
+
## English
|
|
10
|
+
|
|
11
|
+
Use of this editor in a desktop environment requires **unrestricted licenses** applicable to that use, covering both **SpreadJS** and **Designer Component**.
|
|
12
|
+
|
|
13
|
+
Without these licenses, the editor cannot be used in the desktop app. SpreadJS and Designer Component license keys must be configured separately; the complete editor requires applicable licenses for both components.
|
|
14
|
+
|
|
15
|
+
The free plugin does not include SpreadJS or Designer Component licenses. Keyless local development is limited to HTTP(S) loopback environments permitted by the vendor's trial terms; desktop environments cannot rely on that local trial mode.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# 手工回归 / Manual regression
|
|
2
|
+
|
|
3
|
+
在浏览器 Web UI 中测试,使用独立测试文件。先安装本次 Editor 构建及配套 Driver(如需 AI 测试),重启 DSH 并刷新页面。核对 `/spreadjs/api/health` 的 `plugin.version` 与待测版本一致;授权须适用于实际页面来源。
|
|
4
|
+
|
|
5
|
+
准备 `regression.xlsx` 和 `scratch.xlsx` 两个文件。记录 DSH、Editor、Driver 版本及浏览器,避免在业务文件上制造冲突或坏文件。
|
|
6
|
+
|
|
7
|
+
## 编辑、保存与恢复
|
|
8
|
+
|
|
9
|
+
1. 打开 `regression.xlsx`,在 A1 输入 `BASE`、B1 输入 `100`、C1 输入 `=B1*2`,提交单元格编辑后保存。
|
|
10
|
+
2. 刷新页面并重新打开,确认 C1 为 `200`,内容已写入磁盘,没有未保存标记。
|
|
11
|
+
3. A2 输入 `RECOVERY`,不保存,切到 `scratch.xlsx` 后再切回;关闭文档标签后再打开。两种情况下均应恢复 A2,并保留未保存标记。
|
|
12
|
+
4. 最后保存。恢复快照只在当前页面内存中,第 3 步不能用整页刷新代替切换文档。
|
|
13
|
+
|
|
14
|
+
## 保存期间继续编辑或切换
|
|
15
|
+
|
|
16
|
+
在浏览器 Console 中延迟交付保存响应,留出稳定的编辑时间;此代码不延迟服务端写入,刷新页面后失效:
|
|
17
|
+
|
|
18
|
+
```js
|
|
19
|
+
(() => {
|
|
20
|
+
if (window.__restoreSpreadjsTestFetch) return;
|
|
21
|
+
const original = window.fetch;
|
|
22
|
+
window.fetch = async function (input, init) {
|
|
23
|
+
const response = await original.call(this, input, init);
|
|
24
|
+
const url = typeof input === 'string' ? input : input?.url ?? String(input);
|
|
25
|
+
if (url.includes('/spreadjs/api/save')) {
|
|
26
|
+
console.info('[SJS-TEST] SAVE_RESPONSE_DELAY');
|
|
27
|
+
await new Promise(resolve => setTimeout(resolve, 10000));
|
|
28
|
+
}
|
|
29
|
+
return response;
|
|
30
|
+
};
|
|
31
|
+
window.__restoreSpreadjsTestFetch = () => {
|
|
32
|
+
window.fetch = original;
|
|
33
|
+
delete window.__restoreSpreadjsTestFetch;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
1. 修改 A3 并保存。看到 `SAVE_RESPONSE_DELAY` 后立即修改 B3,等待保存结束。B3 仍应标为未保存,第二次保存后才清除标记。
|
|
39
|
+
2. 再做一轮:修改 A4、保存,看到延迟提示后修改 B4,并立即切到另一文件。等待保存结束再打开原文件,B4 应仍可恢复。旧保存不能清掉较新的快照。
|
|
40
|
+
3. 最后保存所有测试改动。若未在保存期间产生新改动,记录为「未触发」,重新测试。
|
|
41
|
+
|
|
42
|
+
## 另存为
|
|
43
|
+
|
|
44
|
+
1. 修改工作簿,另存为新的 `copy.xlsx`;内容完整写入后应打开副本,原文件的磁盘内容不变。
|
|
45
|
+
2. 保持上述延迟,另存为另一个新文件;看到提示后切到 `scratch.xlsx`。等待完成后应仍停在 scratch,不能被旧任务导航到副本。
|
|
46
|
+
3. 再次另存为已存在的 `copy.xlsx`,应拒绝覆盖;工作区外路径、其他后缀也应拒绝。
|
|
47
|
+
4. 在 Console 执行 `window.__restoreSpreadjsTestFetch?.()` 恢复正常保存响应。
|
|
48
|
+
|
|
49
|
+
## 冲突、加载失败与界面
|
|
50
|
+
|
|
51
|
+
1. 两个浏览器标签页打开同一聊天的同一文件。第一边修改并保存,再在第二边修改并保存,第二边应提示磁盘变化或保存冲突。独立读盘确认第一边的内容未被覆盖;恢复缓存中的内容不能作为磁盘结果。
|
|
52
|
+
2. 多次在大工作簿与小工作簿间切换,确认文件名和内容一致,不被旧加载覆盖。
|
|
53
|
+
3. 准备内容为普通文本、后缀为 `.xlsx` 的测试坏文件。加载失败后应拒绝保存和另存为,不生成空白副本;关闭后文本、图片和聊天切换仍正常。
|
|
54
|
+
4. 切换 DSH 明暗主题,检查表格及工具栏。若出现授权或初始化失败,记录错误详情,并确认关闭该文件后侧栏仍可使用。
|
|
55
|
+
|
|
56
|
+
## 可选的 Driver 回归
|
|
57
|
+
|
|
58
|
+
1. 在「设置 → 电子表格编辑器」选择 Driver,刷新后选择应保留;选择「不使用」后应停止提供其工具。
|
|
59
|
+
2. 让 AI 修改单元格,使用 `save:false` 时只改变当前工作簿;使用 `save:true` 时经 Editor 保存,刷新后内容仍在。
|
|
60
|
+
3. 运行包含可取消等待的任务,在写入之前停止,确认不继续保存。取消不回滚已经完成的改动;已发送的写入仍可能完成。
|
|
61
|
+
4. 执行期间关闭或切换文件,任务应中断。重新打开后检查可恢复的部分,再继续测试;快照不能恢复 JavaScript 执行位置。
|
|
62
|
+
|
|
63
|
+
Driver 的详细接入与执行约束见[桥接契约](bridge-contract.md)。
|
|
64
|
+
|
|
65
|
+
## 记录结果
|
|
66
|
+
|
|
67
|
+
记录测试项、版本、实际步骤、预期结果、实际结果和 Console / 工具错误。未触发的竞态测试单独标注;数据丢失、错误文件操作或保存结果不符需要先修复再发布。
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# 发布流程 / Release workflow
|
|
2
|
+
|
|
3
|
+
## 准备 / Prepare
|
|
4
|
+
|
|
5
|
+
版本号以 `package.json` 为准;在 `CHANGELOG.md` 中写对应版本小节,并同步 README 安装示例。依赖使用 `pnpm-lock.yaml`,无需维护 npm 锁文件。
|
|
6
|
+
|
|
7
|
+
Use the version in `package.json`, add a matching section to `CHANGELOG.md`, and update README installation examples. Use `pnpm-lock.yaml` for dependencies; no npm lockfile is maintained.
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
pnpm install --frozen-lockfile
|
|
11
|
+
npm run prepublishOnly
|
|
12
|
+
npm pack --ignore-scripts
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
`prepublishOnly` 包含类型检查、测试、构建、客户端与宿主 smoke,以及独立离线包安装验证。安装包使用预构建产物,不在用户安装时编译。运行中的 DSH 另用 `npm run probe:live` 验证保存;该命令需要已加载当前构建的 DSH 实例。
|
|
16
|
+
|
|
17
|
+
`prepublishOnly` runs typechecking, tests, builds, client/host smokes, and an independent offline package installation check. Packages contain prebuilt artifacts; users do not build during installation. Use `npm run probe:live` separately against a running DSH loaded with the current build to verify real saves.
|
|
18
|
+
|
|
19
|
+
## GitHub 版本记录 / GitHub release
|
|
20
|
+
|
|
21
|
+
确认改动已提交到 `main`,工作区干净后运行:
|
|
22
|
+
|
|
23
|
+
After committing changes on `main` with a clean working tree:
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
npm run release -- --dry-run
|
|
27
|
+
npm run release
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
发布脚本先完成检查,再创建版本提交(如需要)、annotated tag、推送和 GitHub Release;说明文字取自 changelog。`--dry-run` 执行检查并显示计划,不推送。**此脚本不发布 npm 包。**
|
|
31
|
+
|
|
32
|
+
The release script validates first, then creates a version commit if needed, an annotated tag, a push, and a GitHub Release using the changelog section. `--dry-run` validates and prints the plan without pushing. **It does not publish to npm.**
|
|
33
|
+
|
|
34
|
+
## npm 发布 / npm publication
|
|
35
|
+
|
|
36
|
+
发布已验证的 tarball,再核对 registry 中的版本:
|
|
37
|
+
|
|
38
|
+
Publish the verified tarball, then check its registry version:
|
|
39
|
+
|
|
40
|
+
```sh
|
|
41
|
+
npm publish ./grapecity-software-dsh-spreadjs-editor-<version>.tgz --access public
|
|
42
|
+
npm view @grapecity-software/dsh-spreadjs-editor@latest version
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
最后在 `web` profile 安装完整版本号,重启 DSH,验证打开、编辑、保存及可选的 Driver 操作。授权要求以 [README](../README.md) 和[桌面授权策略](desktop-licensing.md) 为准。
|
|
46
|
+
|
|
47
|
+
Finally, install the exact version in a `web` profile, restart DSH, and verify opening, editing, saving, and optional Driver operations. Licensing requirements are documented in the [README](../README.md) and [desktop licensing policy](desktop-licensing.md).
|
package/lib/client.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
[diffend] Oversized file quarantined before diffing.
|
|
2
2
|
name: package/lib/client.js
|
|
3
|
-
size:
|
|
4
|
-
sha256:
|
|
3
|
+
size: 52053126 bytes
|
|
4
|
+
sha256: 965bcc53ce235e6ee2700035f9ddd2a8f30bc128bb137671f113b4763878c68b
|
package/package.json
CHANGED
|
@@ -1,122 +1,126 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@grapecity-software/dsh-spreadjs-editor",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "DSH sidebar SpreadJS editor with binary save, recovery and a selectable bridge for compatible drivers.",
|
|
5
|
-
"keywords": [
|
|
6
|
-
"deepseek-harness",
|
|
7
|
-
"dsh",
|
|
8
|
-
"webui",
|
|
9
|
-
"plugin",
|
|
10
|
-
"spreadjs",
|
|
11
|
-
"excel"
|
|
12
|
-
],
|
|
13
|
-
"type": "module",
|
|
14
|
-
"main": "lib/index.js",
|
|
15
|
-
"exports": {
|
|
16
|
-
".": {
|
|
17
|
-
"default": "./lib/index.js"
|
|
18
|
-
},
|
|
19
|
-
"./client": {
|
|
20
|
-
"default": "./lib/client.js"
|
|
21
|
-
},
|
|
22
|
-
"./package.json": "./package.json"
|
|
23
|
-
},
|
|
24
|
-
"files": [
|
|
25
|
-
"lib/*.js",
|
|
26
|
-
"lib/licenses",
|
|
27
|
-
"cordis.patch.yml",
|
|
28
|
-
"README.md",
|
|
29
|
-
"docs/bridge-contract.md",
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
"@deepseek-ai/dsh-client-ui-
|
|
70
|
-
"@deepseek-ai/dsh-client-ui-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
"@deepseek-ai/
|
|
78
|
-
"@deepseek-ai/dsh-client-ui-
|
|
79
|
-
"@deepseek-ai/dsh-client-ui-
|
|
80
|
-
"@deepseek-ai/
|
|
81
|
-
"
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
"@deepseek-ai/
|
|
87
|
-
"@deepseek-ai/dsh-client-ui-
|
|
88
|
-
"@deepseek-ai/dsh-client-ui-
|
|
89
|
-
"@deepseek-ai/dsh-client-ui-
|
|
90
|
-
"@deepseek-ai/dsh-client-ui-
|
|
91
|
-
"@deepseek-ai/dsh-
|
|
92
|
-
"@deepseek-ai/
|
|
93
|
-
"@
|
|
94
|
-
"@
|
|
95
|
-
"@grapecity-software/spread-
|
|
96
|
-
"@grapecity-software/spread-sheets
|
|
97
|
-
"@grapecity-software/spread-sheets-
|
|
98
|
-
"@grapecity-software/spread-sheets-
|
|
99
|
-
"@grapecity-software/spread-sheets-
|
|
100
|
-
"@grapecity-software/spread-sheets-
|
|
101
|
-
"@grapecity-software/spread-sheets-
|
|
102
|
-
"@grapecity-software/spread-sheets-
|
|
103
|
-
"@grapecity-software/spread-sheets-
|
|
104
|
-
"@grapecity-software/spread-sheets-
|
|
105
|
-
"@grapecity-software/spread-sheets-
|
|
106
|
-
"@grapecity-software/spread-sheets-
|
|
107
|
-
"@grapecity-software/spread-sheets-
|
|
108
|
-
"@grapecity-software/spread-sheets-
|
|
109
|
-
"@grapecity-software/spread-sheets-
|
|
110
|
-
"@grapecity-software/spread-sheets-
|
|
111
|
-
"@grapecity-software/spread-sheets-
|
|
112
|
-
"@grapecity-software/spread-sheets-
|
|
113
|
-
"@
|
|
114
|
-
"@
|
|
115
|
-
"
|
|
116
|
-
"
|
|
117
|
-
"
|
|
118
|
-
"
|
|
119
|
-
"
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@grapecity-software/dsh-spreadjs-editor",
|
|
3
|
+
"version": "0.2.8",
|
|
4
|
+
"description": "DSH sidebar SpreadJS editor with binary save, recovery and a selectable bridge for compatible drivers.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"deepseek-harness",
|
|
7
|
+
"dsh",
|
|
8
|
+
"webui",
|
|
9
|
+
"plugin",
|
|
10
|
+
"spreadjs",
|
|
11
|
+
"excel"
|
|
12
|
+
],
|
|
13
|
+
"type": "module",
|
|
14
|
+
"main": "lib/index.js",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"default": "./lib/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./client": {
|
|
20
|
+
"default": "./lib/client.js"
|
|
21
|
+
},
|
|
22
|
+
"./package.json": "./package.json"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"lib/*.js",
|
|
26
|
+
"lib/licenses",
|
|
27
|
+
"cordis.patch.yml",
|
|
28
|
+
"README.md",
|
|
29
|
+
"docs/bridge-contract.md",
|
|
30
|
+
"docs/desktop-licensing.md",
|
|
31
|
+
"docs/releasing.md",
|
|
32
|
+
"docs/manual-regression.md",
|
|
33
|
+
"CHANGELOG.md",
|
|
34
|
+
"LICENSE",
|
|
35
|
+
"THIRD_PARTY_NOTICES.md"
|
|
36
|
+
],
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "node scripts/build.mjs && node scripts/copy-notices.mjs",
|
|
39
|
+
"grapecity:update": "node scripts/update-grapecity.mjs",
|
|
40
|
+
"prepack": "npm run build",
|
|
41
|
+
"prepublishOnly": "npm run typecheck && npm test && npm run build && node scripts/smoke-client.mjs && node scripts/smoke-node.mjs && npm run verify:package",
|
|
42
|
+
"probe:live": "node scripts/probe-live-save.mjs",
|
|
43
|
+
"release": "node scripts/release.mjs",
|
|
44
|
+
"test": "vitest run",
|
|
45
|
+
"typecheck": "tsc --noEmit",
|
|
46
|
+
"verify:package": "node scripts/verify-package.mjs"
|
|
47
|
+
},
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": ">=22.19.0",
|
|
50
|
+
"dsh": ">=0.2.1-rc.3 <0.3.0-0"
|
|
51
|
+
},
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public"
|
|
54
|
+
},
|
|
55
|
+
"repository": {
|
|
56
|
+
"type": "git",
|
|
57
|
+
"url": "https://github.com/GrapeCityXA/dsh-plugin-spreadjs-editor.git"
|
|
58
|
+
},
|
|
59
|
+
"dsh": {
|
|
60
|
+
"engines": {
|
|
61
|
+
"dsh": ">=0.2.1-rc.3 <0.3.0-0"
|
|
62
|
+
},
|
|
63
|
+
"bundle": {
|
|
64
|
+
"patch": "./cordis.patch.yml"
|
|
65
|
+
},
|
|
66
|
+
"client": {
|
|
67
|
+
"platform": "web",
|
|
68
|
+
"inject": [
|
|
69
|
+
"@deepseek-ai/dsh-client-ui-theme",
|
|
70
|
+
"@deepseek-ai/dsh-client-ui-slots",
|
|
71
|
+
"@deepseek-ai/dsh-client-ui-sidebar-right",
|
|
72
|
+
"@deepseek-ai/dsh-client-ui-sidebar-documentpreview"
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"peerDependencies": {
|
|
77
|
+
"@deepseek-ai/cordis": "~4.0.5",
|
|
78
|
+
"@deepseek-ai/dsh-client-ui-renderer": ">=0.2.1-rc.3 <0.3.0-0",
|
|
79
|
+
"@deepseek-ai/dsh-client-ui-sidebar-documentpreview": ">=0.2.1-rc.3 <0.3.0-0",
|
|
80
|
+
"@deepseek-ai/dsh-client-ui-slots": ">=0.2.1-rc.3 <0.3.0-0",
|
|
81
|
+
"@deepseek-ai/dsh-client-ui-theme": ">=0.2.1-rc.3 <0.3.0-0",
|
|
82
|
+
"@deepseek-ai/schemastery": "~3.18.5",
|
|
83
|
+
"react": "^18.0.0"
|
|
84
|
+
},
|
|
85
|
+
"devDependencies": {
|
|
86
|
+
"@deepseek-ai/cordis": "~4.0.5",
|
|
87
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.2.1-rc.4",
|
|
88
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.2.1-rc.4",
|
|
89
|
+
"@deepseek-ai/dsh-client-ui-sidebar-documentpreview": "0.2.1-rc.4",
|
|
90
|
+
"@deepseek-ai/dsh-client-ui-sidebar-right": "0.2.1-rc.4",
|
|
91
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.1-rc.4",
|
|
92
|
+
"@deepseek-ai/dsh-client-ui-theme": "0.2.1-rc.4",
|
|
93
|
+
"@deepseek-ai/dsh-host-webserver": "0.2.1-rc.4",
|
|
94
|
+
"@deepseek-ai/schemastery": "~3.18.5",
|
|
95
|
+
"@grapecity-software/spread-excelio": "19.2.1",
|
|
96
|
+
"@grapecity-software/spread-sheets": "19.2.1",
|
|
97
|
+
"@grapecity-software/spread-sheets-barcode": "19.2.1",
|
|
98
|
+
"@grapecity-software/spread-sheets-charts": "19.2.1",
|
|
99
|
+
"@grapecity-software/spread-sheets-datacharts-addon": "19.2.1",
|
|
100
|
+
"@grapecity-software/spread-sheets-designer": "19.2.1",
|
|
101
|
+
"@grapecity-software/spread-sheets-designer-resources-cn": "19.2.1",
|
|
102
|
+
"@grapecity-software/spread-sheets-formula-panel": "19.2.1",
|
|
103
|
+
"@grapecity-software/spread-sheets-ganttsheet": "19.2.1",
|
|
104
|
+
"@grapecity-software/spread-sheets-io": "19.2.1",
|
|
105
|
+
"@grapecity-software/spread-sheets-languagepackages": "19.2.1",
|
|
106
|
+
"@grapecity-software/spread-sheets-pdf": "19.2.1",
|
|
107
|
+
"@grapecity-software/spread-sheets-pivot-addon": "19.2.1",
|
|
108
|
+
"@grapecity-software/spread-sheets-print": "19.2.1",
|
|
109
|
+
"@grapecity-software/spread-sheets-reportsheet-addon": "19.2.1",
|
|
110
|
+
"@grapecity-software/spread-sheets-resources-zh": "19.2.1",
|
|
111
|
+
"@grapecity-software/spread-sheets-shapes": "19.2.1",
|
|
112
|
+
"@grapecity-software/spread-sheets-slicers": "19.2.1",
|
|
113
|
+
"@grapecity-software/spread-sheets-sparklines": "19.2.1",
|
|
114
|
+
"@grapecity-software/spread-sheets-tablesheet": "19.2.1",
|
|
115
|
+
"@types/node": "^22.0.0",
|
|
116
|
+
"@types/react": "^18.3.0",
|
|
117
|
+
"@types/react-test-renderer": "18.3.1",
|
|
118
|
+
"react": "^18.2.0",
|
|
119
|
+
"react-test-renderer": "18.3.1",
|
|
120
|
+
"tsdown": "^0.22.0",
|
|
121
|
+
"typescript": "^5.9.0",
|
|
122
|
+
"unrun": "^0.3.1",
|
|
123
|
+
"vitest": "^3.0.0"
|
|
124
|
+
},
|
|
125
|
+
"license": "MIT"
|
|
126
|
+
}
|