@tita-agent/dsh-data-table 0.0.0-stage → 0.2.0

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.
Files changed (267) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +172 -2
  3. package/cordis.patch.yml +7 -0
  4. package/lib/client.js +16766 -0
  5. package/lib/contract-envelope.d.ts +91 -0
  6. package/lib/contract-envelope.js +106 -0
  7. package/lib/contract-layout.d.ts +130 -0
  8. package/lib/contract-layout.js +138 -0
  9. package/lib/contract-refs.d.ts +39 -0
  10. package/lib/contract-refs.js +9 -0
  11. package/lib/contract-version.d.ts +311 -0
  12. package/lib/contract-version.js +270 -0
  13. package/lib/contract-wire.d.ts +147 -0
  14. package/lib/contract-wire.js +99 -0
  15. package/lib/contracts.d.ts +12 -0
  16. package/lib/contracts.js +12 -0
  17. package/lib/types/audit.d.ts +42 -0
  18. package/lib/types/audit.js +39 -0
  19. package/lib/types/client/ProjectImportMenu.d.ts +30 -0
  20. package/lib/types/client/ProjectImportMenu.js +70 -0
  21. package/lib/types/client/SheetPanel.d.ts +33 -0
  22. package/lib/types/client/SheetPanel.js +1766 -0
  23. package/lib/types/client/SheetToggle.d.ts +18 -0
  24. package/lib/types/client/SheetToggle.js +26 -0
  25. package/lib/types/client/index.d.ts +15 -0
  26. package/lib/types/client/index.js +110 -0
  27. package/lib/types/client/persistence/changes.d.ts +15 -0
  28. package/lib/types/client/persistence/changes.js +51 -0
  29. package/lib/types/client/persistence/ids.d.ts +34 -0
  30. package/lib/types/client/persistence/ids.js +48 -0
  31. package/lib/types/client/persistence/merge.d.ts +35 -0
  32. package/lib/types/client/persistence/merge.js +362 -0
  33. package/lib/types/client/store.d.ts +61 -0
  34. package/lib/types/client/store.js +152 -0
  35. package/lib/types/client/surface-context.d.ts +27 -0
  36. package/lib/types/client/surface-context.js +104 -0
  37. package/lib/types/client/surface-control.d.ts +2 -0
  38. package/lib/types/client/surface-control.js +12 -0
  39. package/lib/types/client/transport/workbookApi.d.ts +159 -0
  40. package/lib/types/client/transport/workbookApi.js +246 -0
  41. package/lib/types/client/univer/StandaloneWorkbookPage.d.ts +5 -0
  42. package/lib/types/client/univer/StandaloneWorkbookPage.js +7 -0
  43. package/lib/types/client/univer/WorkbookCanvas.d.ts +40 -0
  44. package/lib/types/client/univer/WorkbookCanvas.js +87 -0
  45. package/lib/types/client/univer/WorkbookView.d.ts +3 -0
  46. package/lib/types/client/univer/WorkbookView.js +2 -0
  47. package/lib/types/client/univer/loader.d.ts +18 -0
  48. package/lib/types/client/univer/loader.js +81 -0
  49. package/lib/types/client/univer/standalone-entry.d.ts +1 -0
  50. package/lib/types/client/univer/standalone-entry.js +19 -0
  51. package/lib/types/client/versions/VersionChrome.d.ts +33 -0
  52. package/lib/types/client/versions/VersionChrome.js +21 -0
  53. package/lib/types/client/versions/inspect.d.ts +70 -0
  54. package/lib/types/client/versions/inspect.js +88 -0
  55. package/lib/types/client/versions/preview-decoration.d.ts +11 -0
  56. package/lib/types/client/versions/preview-decoration.js +54 -0
  57. package/lib/types/client/versions/records.d.ts +19 -0
  58. package/lib/types/client/versions/records.js +70 -0
  59. package/lib/types/client/workspace-host.d.ts +61 -0
  60. package/lib/types/client/workspace-host.js +124 -0
  61. package/lib/types/collaboration-hub.d.ts +31 -0
  62. package/lib/types/collaboration-hub.js +69 -0
  63. package/lib/types/contract/ids.d.ts +24 -0
  64. package/lib/types/contract/ids.js +46 -0
  65. package/lib/types/contract/mutations.d.ts +25 -0
  66. package/lib/types/contract/mutations.js +782 -0
  67. package/lib/types/contract/operations.d.ts +54 -0
  68. package/lib/types/contract/operations.js +203 -0
  69. package/lib/types/contract/snapshots.d.ts +176 -0
  70. package/lib/types/contract/snapshots.js +351 -0
  71. package/lib/types/contract/univer-api-catalog.d.ts +29 -0
  72. package/lib/types/contract/univer-api-catalog.js +264 -0
  73. package/lib/types/errors.d.ts +8 -0
  74. package/lib/types/errors.js +12 -0
  75. package/lib/types/http/assets-routes.d.ts +3 -0
  76. package/lib/types/http/assets-routes.js +169 -0
  77. package/lib/types/http/collaboration.d.ts +10 -0
  78. package/lib/types/http/collaboration.js +154 -0
  79. package/lib/types/http/history.d.ts +15 -0
  80. package/lib/types/http/history.js +134 -0
  81. package/lib/types/http/project-files.d.ts +79 -0
  82. package/lib/types/http/project-files.js +206 -0
  83. package/lib/types/http/project-scope.d.ts +50 -0
  84. package/lib/types/http/project-scope.js +52 -0
  85. package/lib/types/http/routes.d.ts +98 -0
  86. package/lib/types/http/routes.js +323 -0
  87. package/lib/types/http/standalone.d.ts +9 -0
  88. package/lib/types/http/standalone.js +31 -0
  89. package/lib/types/http/trunk.d.ts +10 -0
  90. package/lib/types/http/trunk.js +322 -0
  91. package/lib/types/http/worktree.d.ts +9 -0
  92. package/lib/types/http/worktree.js +145 -0
  93. package/lib/types/index.d.ts +18 -0
  94. package/lib/types/index.js +156 -0
  95. package/lib/types/invariant.d.ts +15 -0
  96. package/lib/types/invariant.js +15 -0
  97. package/lib/types/request-params.d.ts +21 -0
  98. package/lib/types/request-params.js +76 -0
  99. package/lib/types/store/paths.d.ts +68 -0
  100. package/lib/types/store/paths.js +148 -0
  101. package/lib/types/store/project.d.ts +88 -0
  102. package/lib/types/store/project.js +120 -0
  103. package/lib/types/store/read.d.ts +110 -0
  104. package/lib/types/store/read.js +404 -0
  105. package/lib/types/store/retention.d.ts +27 -0
  106. package/lib/types/store/retention.js +111 -0
  107. package/lib/types/store/write.d.ts +22 -0
  108. package/lib/types/store/write.js +210 -0
  109. package/lib/types/tools/arguments.d.ts +40 -0
  110. package/lib/types/tools/arguments.js +130 -0
  111. package/lib/types/tools/cells.d.ts +50 -0
  112. package/lib/types/tools/cells.js +298 -0
  113. package/lib/types/tools/index.d.ts +2 -0
  114. package/lib/types/tools/index.js +250 -0
  115. package/lib/types/tools/render.d.ts +47 -0
  116. package/lib/types/tools/render.js +290 -0
  117. package/lib/types/tools/univer-api.d.ts +18 -0
  118. package/lib/types/tools/univer-api.js +198 -0
  119. package/lib/types/tools/workbook-catalog.d.ts +3 -0
  120. package/lib/types/tools/workbook-catalog.js +83 -0
  121. package/lib/types/tools/workbook-edit.d.ts +192 -0
  122. package/lib/types/tools/workbook-edit.js +912 -0
  123. package/lib/types/tools/workbook-find.d.ts +11 -0
  124. package/lib/types/tools/workbook-find.js +89 -0
  125. package/lib/types/tools/workbook-history.d.ts +2 -0
  126. package/lib/types/tools/workbook-history.js +59 -0
  127. package/lib/types/tools/workbook-read.d.ts +21 -0
  128. package/lib/types/tools/workbook-read.js +204 -0
  129. package/lib/types/types.d.ts +377 -0
  130. package/lib/types/types.js +34 -0
  131. package/lib/types/univer/apply-operation.d.ts +14 -0
  132. package/lib/types/univer/apply-operation.js +398 -0
  133. package/lib/types/univer/chunk.d.ts +68 -0
  134. package/lib/types/univer/chunk.js +16 -0
  135. package/lib/types/univer/decoration.d.ts +34 -0
  136. package/lib/types/univer/decoration.js +88 -0
  137. package/lib/types/univer/diagnostics.d.ts +31 -0
  138. package/lib/types/univer/diagnostics.js +141 -0
  139. package/lib/types/univer/engine.d.ts +33 -0
  140. package/lib/types/univer/engine.js +338 -0
  141. package/lib/types/univer/entry.d.ts +8 -0
  142. package/lib/types/univer/entry.js +11 -0
  143. package/lib/types/univer/facade.d.ts +107 -0
  144. package/lib/types/univer/facade.js +1 -0
  145. package/lib/types/univer/fonts.d.ts +202 -0
  146. package/lib/types/univer/fonts.js +140 -0
  147. package/lib/types/univer/plugins/collaboration.d.ts +23 -0
  148. package/lib/types/univer/plugins/collaboration.js +47 -0
  149. package/lib/types/univer/plugins/export.d.ts +39 -0
  150. package/lib/types/univer/plugins/export.js +246 -0
  151. package/lib/types/univer/plugins/history.d.ts +24 -0
  152. package/lib/types/univer/plugins/history.js +50 -0
  153. package/lib/types/univer/plugins/version.d.ts +13 -0
  154. package/lib/types/univer/plugins/version.js +13 -0
  155. package/lib/types/version/diff.d.ts +36 -0
  156. package/lib/types/version/diff.js +156 -0
  157. package/lib/types/version/grouping.d.ts +7 -0
  158. package/lib/types/version/grouping.js +94 -0
  159. package/lib/types/version/records.d.ts +17 -0
  160. package/lib/types/version/records.js +102 -0
  161. package/lib/types/version/session.d.ts +36 -0
  162. package/lib/types/version/session.js +89 -0
  163. package/lib/types/version/summary.d.ts +24 -0
  164. package/lib/types/version/summary.js +111 -0
  165. package/lib/types/workbook-manager.d.ts +191 -0
  166. package/lib/types/workbook-manager.js +935 -0
  167. package/lib/types/xlsx-export-worker.d.ts +5 -0
  168. package/lib/types/xlsx-export-worker.js +24 -0
  169. package/lib/types/xlsx-export.d.ts +21 -0
  170. package/lib/types/xlsx-export.js +371 -0
  171. package/lib/types/xlsx-import-worker.d.ts +1 -0
  172. package/lib/types/xlsx-import-worker.js +19 -0
  173. package/lib/univer-client.js +690 -0
  174. package/lib/workbook-page.js +23826 -0
  175. package/lib/xlsx-export-worker.js +104 -0
  176. package/lib/xlsx-import-worker.js +46 -0
  177. package/package.json +106 -3
  178. package/src/audit.ts +58 -0
  179. package/src/client/ProjectImportMenu.tsx +100 -0
  180. package/src/client/SheetPanel.module.css +1578 -0
  181. package/src/client/SheetPanel.tsx +1934 -0
  182. package/src/client/SheetToggle.module.css +73 -0
  183. package/src/client/SheetToggle.tsx +65 -0
  184. package/src/client/contract.d.ts +19 -0
  185. package/src/client/index.ts +131 -0
  186. package/src/client/persistence/changes.ts +58 -0
  187. package/src/client/persistence/ids.ts +60 -0
  188. package/src/client/persistence/merge.ts +392 -0
  189. package/src/client/store.ts +188 -0
  190. package/src/client/surface-context.ts +123 -0
  191. package/src/client/surface-control.ts +13 -0
  192. package/src/client/transport/workbookApi.ts +355 -0
  193. package/src/client/univer/SheetView.module.css +110 -0
  194. package/src/client/univer/StandaloneWorkbookPage.module.css +8 -0
  195. package/src/client/univer/StandaloneWorkbookPage.tsx +15 -0
  196. package/src/client/univer/WorkbookCanvas.tsx +128 -0
  197. package/src/client/univer/WorkbookView.module.css +30 -0
  198. package/src/client/univer/WorkbookView.tsx +3 -0
  199. package/src/client/univer/loader.ts +90 -0
  200. package/src/client/univer/react-dom-client.d.ts +10 -0
  201. package/src/client/univer/standalone-entry.tsx +19 -0
  202. package/src/client/univer/standalone.css +12 -0
  203. package/src/client/univer/univer-locales.d.ts +89 -0
  204. package/src/client/univer/univer-modules.d.ts +26 -0
  205. package/src/client/versions/VersionChrome.tsx +114 -0
  206. package/src/client/versions/inspect.ts +138 -0
  207. package/src/client/versions/preview-decoration.ts +54 -0
  208. package/src/client/versions/records.ts +78 -0
  209. package/src/client/workspace-host.ts +147 -0
  210. package/src/collaboration-hub.ts +83 -0
  211. package/src/contract/ids.ts +50 -0
  212. package/src/contract/mutations.ts +791 -0
  213. package/src/contract/operations.ts +221 -0
  214. package/src/contract/snapshots.ts +383 -0
  215. package/src/contract/univer-api-catalog.ts +289 -0
  216. package/src/css-modules.d.ts +6 -0
  217. package/src/errors.ts +25 -0
  218. package/src/http/assets-routes.ts +177 -0
  219. package/src/http/collaboration.ts +144 -0
  220. package/src/http/history.ts +151 -0
  221. package/src/http/project-files.ts +227 -0
  222. package/src/http/project-scope.ts +77 -0
  223. package/src/http/routes.ts +364 -0
  224. package/src/http/standalone.ts +32 -0
  225. package/src/http/trunk.ts +322 -0
  226. package/src/http/worktree.ts +119 -0
  227. package/src/index.ts +165 -0
  228. package/src/invariant.ts +17 -0
  229. package/src/request-params.ts +92 -0
  230. package/src/store/paths.ts +165 -0
  231. package/src/store/project.ts +137 -0
  232. package/src/store/read.ts +454 -0
  233. package/src/store/retention.ts +106 -0
  234. package/src/store/write.ts +230 -0
  235. package/src/tools/arguments.ts +128 -0
  236. package/src/tools/cells.ts +298 -0
  237. package/src/tools/index.ts +274 -0
  238. package/src/tools/render.ts +301 -0
  239. package/src/tools/univer-api.ts +243 -0
  240. package/src/tools/workbook-catalog.ts +94 -0
  241. package/src/tools/workbook-edit.ts +987 -0
  242. package/src/tools/workbook-find.ts +80 -0
  243. package/src/tools/workbook-history.ts +63 -0
  244. package/src/tools/workbook-read.ts +210 -0
  245. package/src/types.ts +432 -0
  246. package/src/univer/apply-operation.ts +369 -0
  247. package/src/univer/chunk.ts +77 -0
  248. package/src/univer/decoration.ts +111 -0
  249. package/src/univer/diagnostics.ts +136 -0
  250. package/src/univer/engine.ts +370 -0
  251. package/src/univer/entry.ts +14 -0
  252. package/src/univer/facade.ts +91 -0
  253. package/src/univer/fonts.ts +148 -0
  254. package/src/univer/overrides.css +33 -0
  255. package/src/univer/plugins/collaboration.ts +47 -0
  256. package/src/univer/plugins/export.ts +236 -0
  257. package/src/univer/plugins/history.ts +49 -0
  258. package/src/univer/plugins/version.ts +13 -0
  259. package/src/version/diff.ts +169 -0
  260. package/src/version/grouping.ts +96 -0
  261. package/src/version/records.ts +113 -0
  262. package/src/version/session.ts +90 -0
  263. package/src/version/summary.ts +117 -0
  264. package/src/workbook-manager.ts +1111 -0
  265. package/src/xlsx-export-worker.ts +34 -0
  266. package/src/xlsx-export.ts +373 -0
  267. package/src/xlsx-import-worker.ts +30 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 NoneFire
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,173 @@
1
- # Temporary Holding Version
1
+ # @tita-agent/dsh-data-table
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Univer 表格终端(DeepSeek Harness 插件):agent 产出的结构化数据直接渲染为**可交互表格**,通过 DSH 官方右侧 Sidebar 的「Table」标签打开,可编辑、切换 workbook,并从 Univer 顶部菜单导出 CSV / Excel。
4
+
5
+ ## 用法
6
+
7
+ 先调用 `workbook_catalog` 明确选择或创建工作簿,再用 `workbook_edit` 写入数据:
8
+
9
+ ```json
10
+ {
11
+ "workbookId": "sales-2026",
12
+ "baseRevision": 12,
13
+ "versions": [{
14
+ "summary": "补充 6 月营收",
15
+ "intent": "写入 6 月营收",
16
+ "commands": [{
17
+ "type": "append_rows",
18
+ "sheet": "营收",
19
+ "name": "月度营收",
20
+ "columns": [
21
+ { "key": "month", "label": "月份", "type": "date" },
22
+ { "key": "revenue", "label": "营收", "type": "currency" }
23
+ ],
24
+ "rows": [{ "month": "2026-06-01", "revenue": 1280000 }],
25
+ "meta": { "source": "sales_db.orders", "notes": "按自然月汇总" }
26
+ }]
27
+ }]
28
+ }
29
+ ```
30
+
31
+ `workbookId` 必须是已明确选择的工作簿 id;不会隐式创建或切换到 `main`。从 DSH 官方右侧 Sidebar 的 guide 中选择「Table」即可打开工作台。单个 sheet 支持最多 100000 条数据行 × 50 列;超过 1000 行的 `append_rows` 会在同一个 Version 内自动拆分为多个可回放 Step。批量结果落表优先用 `import_file` 或 `update_cells` + `sourcePath`(一次命令 + 一个本地文件路径),不要逐格内联 `values`。
32
+
33
+ 选中表格中的单元格或区域后,输入框会显示「Table」上下文。发送消息时,工作簿 id、sheet、选区地址和有限范围的单元格预览会一起注入;Agent 可以继续用 `workbook_read` 读取完整范围,再用 `workbook_edit` 修改。点击消息中的选区引用会打开 Table 标签并定位回原工作簿和单元格区域。
34
+
35
+ ## 架构
36
+
37
+ | 面 | 落点 | 说明 |
38
+ |---|---|---|
39
+ | Host | workbook tools(`ctx.tools.register`) | workbook 生命周期、范围读取、细粒度修改、revision 与操作历史 |
40
+ | Host | `WorkbookManager` | Univer snapshot 持久化、轻量 index、append-only Version/Step 操作日志、原子写入、进程内 mutation queue;存储根目录为 `<dshHome>/storages/data-table` |
41
+ | Host | `/data-sheet/workbook/:id/operations` | Agent/用户共享的 operation 接口;支持 `baseRevision` 和幂等 `opId` |
42
+ | Host | `/data-sheet/workbook/:id/changes` | 浏览器投影同步的漏操作补偿接口 |
43
+ | Host | `/data-sheet/workbook/:id/collaboration` | 自研 SSE 协同会话:广播已提交操作、ACK 后续补偿和断线重连 |
44
+ | Host | `/data-sheet/workbook/:id/presence` | 临时选区/焦点 presence 写入入口;只广播,不产生 revision |
45
+ | Host | `/data-sheet/workbook/:id/history/diff` | 两个可重放 revision 之间的 cell/sheet/structure 差异 |
46
+ | Host | `/data-sheet/workbooks.json` | 浏览器顶部 workbook 选择器使用的只读目录 |
47
+ | Host | `webServer` 路由 `/data-sheet/univer-client.js` | 按需提供引擎 chunk(`lib/univer-client.js`) |
48
+ | Host | `webServer` 路由 `/data-sheet/xlsx-export-worker.js` | 按需提供 XLSX/CSV 编码 Worker(`lib/xlsx-export-worker.js`) |
49
+ | Host | `webServer` 路由 `/data-sheet/xlsx-import-worker.js` | 按需提供 XLSX 解析 Worker(`lib/xlsx-import-worker.js`) |
50
+ | Host | `/data-sheet/workbook/:id/view` | 同源新 Tab 全屏工作簿页面;复用嵌入面板的同步和保存控制器 |
51
+ | Client | `sidebarRightTabs.register` | 注册官方右侧 Sidebar 的 `data-sheet` tab type 和 guide 入口 |
52
+ | Client | `sidebar.right.pane.tab` keyed slot | 按官方 tab type id 注入一个 pane frame;真正的 `WorkbookWorkspace` 由常驻容器提供(见下) |
53
+ | Client | `workspace-host.ts` | 常驻工作区容器:pane 只负责把它「领养」进自己的 frame,切走时移到屏幕外停放,所以切 tab / 切 session 不会重建 Univer 引擎或重新拉取快照 |
54
+ | Client | 顶部菜单栏 | 工作簿选择弹层、新 Tab 打开、版本管理、导入 / 导出分组菜单、右对齐保存状态;不超过 48px |
55
+ | Client | `DataSheetExportPlugin` | Univer 命令 + `data-sheet:request-*` 事件桥:Excel / CSV 导入,Excel / CSV / JSON 导出(不再注册 DSH「文件」页) |
56
+ | Client | `DataSheetHistoryPlugin` | 注册历史命令;版本管理从顶部菜单栏打开共享 Drawer |
57
+ | Client | `UniverSheetsCrosshairHighlightPlugin` | 复用 Univer 开源 Crosshair Highlight,按当前单元格高亮行列 |
58
+ | Host | `/data-sheet/univer-api.json` | 安全的 Univer Facade API 元数据目录 |
59
+ | Client | `univer-overrides.css` | Ribbon 顶部菜单项左对齐 |
60
+
61
+ 数据流:Agent 调用 workbook tool,或用户在 Univer 中编辑 → DSH Host 校验 operation、检查 `baseRevision`、持久化并递增内部 `revision` → 浏览器投影通过 Univer Facade/原生命令应用 operation。`revision` 只是并发、排序和回放游标;用户操作的是 Version,Version 内包含有序 Step。用户连续编辑加入同一个 `open` Version,在**空闲超过 2 秒**(`VERSION_IDLE_CLOSE_MS`)、显式 close、Agent 开始写入或达到 50 个 Step 的安全上限(`VERSION_MAX_STEPS`)时封存,不再以“固定 10 个 Step”作为唯一边界;`Ctrl/Cmd+S` 会立即提交当前剩余 Step。选区、焦点和滚动不计 step。Agent 使用 `versions` 按语义分组:每个分组原子持久化为一个 final Version,组内 commands 是可逐步回放的 Step;`commands` 简写会把整组命令视为一个 Version。所有写入默认直接进入主线。Host 保留完整 operation payload 和可重放 checkpoint,用于任意版本/步骤预览、回放和恢复;恢复会创建 `restored` Version,并把不再位于当前谱系的后续记录标记为 `superseded`,从不删除日志。
62
+
63
+ ## Agent 工具
64
+
65
+ Agent 面严格收敛为 7 个聚合根入口:
66
+
67
+ | 工具 | 职责 |
68
+ |---|---|
69
+ | `workbook_catalog` | `list` / `create` / `rename` / `delete` 工作簿 |
70
+ | `workbook_read` | 读取 workbook、sheet、range 或指定 cells,并返回 revision 与 `sheetName ↔ sheetId` 映射 |
71
+ | `workbook_find` | 搜索 sheet 名、单元格值或公式 |
72
+ | `workbook_edit` | 唯一业务写入口;语义 `versions` 落为 Version,分组内 commands 为可回放 Step |
73
+ | `workbook_history` | `list` / `diff` / `replay` 历史查询和按 Step 回放 |
74
+ | `workbook_restore` | 恢复可回放 revision,产生新的主线 Version |
75
+ | `univer_api` | `catalog` / `search` / `invoke` 安全 Univer Adapter Registry |
76
+
77
+ 版本管理抽屉:相同的版本列表、状态徽章(`未归档 / 已保存 / 已恢复 / 已被替代`)、Step 展开、diff 渲染、保存版本弹层与恢复确认弹层;`V12` 是主标题,技术 revision(`r48`)作为副信息。「保存版本」即使没有内容变化也会把当前快照写成一个命名的 final Version;比较基准可切换(`/history/diff` 只接受 `from <= to`,客户端会把这对 revision 归一化,因此 diff 始终按旧 → 新渲染)。
78
+
79
+ 并发写入无法自动 rebase 时,HTTP 与工具层返回统一的 409 体(`ConflictPayload`,统一):`baseRevision` / `currentRevision` / `conflictSet`(调用方漏掉的 operation 摘要)/ `nextAction` / `retryable`;同时保留原有的 `expectedRevision`、`revision` 字段以兼容旧客户端。
80
+
81
+ `workbook_edit` 使用 Command 模式:Sheet 和 Cell 是 Workbook aggregate 内的目标,而不是独立
82
+ Tool 命名空间。它支持写值、清空、插删行列、Sheet 生命周期、追加结构化行、格式、合并、
83
+ 冻结、尺寸、排序和超链接。推荐传入 `versions: [{ summary, intent?, commands }]`,一个分组就是
84
+ 一个用户可读的 Version,commands 只构成其内部 Step;兼容 `commands` 简写时,整组 commands
85
+ 仍只形成一个 Version。Host 分配 `revision`/`versionId`,Agent 不可指定 `versionId`;可选的
86
+ `agentRunId` 仅用于关联同一 Agent 运行产生的多个 Version;`dryRun: true` 只执行内存预检,不写入历史。
87
+
88
+ ### Agent 工具契约
89
+
90
+ - **读回显**:`workbook_catalog` / `workbook_read` / `workbook_find` / `workbook_history` 的 `render` 返回「摘要 + 真实 JSON」;`workbook_read(kind=workbook)` 至少给出 `revision` 与每个 sheet 的 `name ↔ id`、`rowCount`/`columnCount`/`maxRow`/`maxColumn`/`nonEmptyCells`。序列化超过 24 000 字符时,`execute` 会把完整结果落到 `<storage root>/tool-output/*.json` 并在返回值中给出 `detailPath`,render 只回摘要 + 截断预览 + 路径。
91
+ - **range 语义**:`range` 的 `startRow/endRow/startColumn/endColumn` 全部 0-based 且 **inclusive**。`update_cells` 可以省略 `range`(按 `startRow/startColumn`,默认第 1 行第 0 列),也可以只给起点由 `values` 尺寸推导终点;当显式终点与 `values` 冲突时以 `values` 为准,并在 `warnings` 中说明修正后的范围。
92
+ - **结构命令**:`insert_rows`/`delete_rows` 接受 `range:{startRow,endRow}`,`insert_columns`/`delete_columns` 接受 `range:{startColumn,endColumn}`;也兼容 `index`/`startRow`/`startColumn` + `count`,`count` 缺省时按 range 跨度推导。
93
+ - **同批次自引用**:`create_sheet` 未显式给 id 时由 Host 生成稳定 id,因此同一个 `version` 内可以先 `create_sheet` 再写入该 sheet;调用方仍可用 `sheet`/`sheetId` 指定显式 id。
94
+ - **dryRun 与提交同路径**:`dryRun: true` 走与正式提交完全相同的 opId 校验、payload 解析、`applyWorkbookOperation` 校验与 revision 计算,只在落盘前返回;返回值给出 `revisionBefore` / `revisionAfter` / `affectedSheets` / `affectedCellCount` / `warnings` 预检清单。
95
+ - **写回执与告警**:正式提交返回同样的 `revisionBefore` / `revisionAfter` / `affectedSheets` / `affectedCellCount` / `sheetRefs`;同一编辑计划内重复写同一 cell 会返回 `warnings`(后写入的命令生效)。`sheetRefs` 把受影响 sheet 的 `{ name, sheetId }` 作为**数据**发布——sheet id 是哈希值,只嵌在 `affectedSheets` 的 `名称(id)` 标签里时,刚创建 sheet 的调用方还得反解自己的回执。`sheet 不存在` 与 `range/values 尺寸不一致` 的报错会列出当前 sheet 名与 id、以及期望/实际的 rows×cols 与建议 range。
96
+ - **失败回执可直接重试**:校验失败会在原消息后追加已收参数与重试范围(例如 `已收参数:workbookId=retry,1 条命令(update_cells)`,分组提交时则为 `N 个 version 分组`),并说明**只需修正出错的那条命令**,不必重发整份 payload;同样的信息挂在 `DataSheetError.details` 上供能读取它的调用方使用。
97
+ - **结构命令守卫与列定义报错**:在含公式或高级结构的 sheet 上,`insert_rows` / `delete_rows` / `append_rows` 等结构命令会被守卫拒绝,报错会直接给出可行路径——写更多行用 `update_cells` 或 `import_file`(越界自动扩容,无需 `insert_rows`),整体替换改用 `snapshot`。列定义报错不再只说「不对」:会回显期望结构 `{ key, label, type }` 与实际收到的值,未知类型还会列出可选类型。
98
+ - **文件导入通道(`sourcePath`)**:`update_cells`(省略 `values` 时)与一等命令 `import_file` 都能直接读本地 `CSV/JSON/JSONL/XLSX/XLS`(≤128 MiB、最多 100000 行数据 × 50 列),一次命令 + 一个路径即可落表;`sourceFormat` 可显式覆盖扩展名。文件第一行作为列名、只写入数据行,CSV 走真解析器,带引号、逗号、换行的字段与源文件逐格一致。`update_cells` 的起点沿用 `range`,或顶层 `startRow` / `startColumn`(两者都省略时保持既有默认:第 1 行第 0 列)。导入不要求 sheet 第 0 行是表头,报告型 sheet(列头不在第 0 行)也能一次写入。
99
+ - **`append_rows` 的表头行**:`{ type: 'append_rows', sheet, columns, rows, headerRowIndex?, verifyHeader? }`。`headerRowIndex` 默认 `0`,指向真实列头行,数据写在它下面且列头行本身不被覆盖,因此带标题块的报告型 sheet 也能追加;`verifyHeader` 默认 `true`,比对现有列头文本与传入 `columns` 的 `label`,只有显式传 `false` 才跳过(仅放宽文本匹配,列数仍须一致)。两者缺省时与历史版本行为完全一致,既有工作簿和既有调用不变;列头不匹配的报错会直接点名 `headerRowIndex`。
100
+ - **读回显默认收窄**:`workbook_read` 的 range 读取**默认只返回 `values`**。`formulas` / `cells` / `styles` 是同一份数据的另两种视图(外加样式),会成倍占用 24 000 字符的回显预算,需在 `include` 中显式索取;`workbook_read(kind=sheet)` 与 `(kind=workbook)` 的 `snapshot` 同样按 `include` 返回。
101
+ - **长文本外置(`valueFromFile`)**:`update_cells` 的单个 cell 可给 `valueFromFile`(本地文本文件路径,≤1 MiB),Host 读入后按 `utf8` 作为该 cell 的字面值,用于把长文本(典型是 SQL)从文件写进单元格而不必内联进工具调用——此前同一条 SQL 要在每个用到的册子里重复写一遍。同给 `value` 时 `value` 优先;文件缺失或超限在写入前报错,不产生部分写入。`run_detail_id` 属 facade(`sql_result_to_data_sheet`)范围,不在本插件。
102
+ - **`duplicate_sheet`(布局复用)**:`{ type: 'duplicate_sheet', sheet, name, sheetId?, fromWorkbookId? }` 新建一个 sheet,并复制源 sheet 的**单元格内容**(标题块、表头行、长 SQL 文本都算)与**列宽**。`fromWorkbookId` 省略时取当前工作簿,源 sheet 必须已存在——同一批次内刚创建的 sheet 不在此列。样式、合并、冻结、数据校验不复制。该命令在持久化前展开为既有 `create_sheet` / `update_cells` / `set_column_width`,不新增 operation 类型。
103
+ - **回填状态视图**:`workbook_read(kind=workbook)` 传 `include: ['backfill']` 会为每个 sheet 返回 `lastOccupiedRow` / `columnCount` / `conclusionRows` / `runAt` / `provenance` / `schemaUpdatedAt` / `complete`。注意 `lastOccupiedRow` 是**内容上界**而非数据行数:任何写入都会重算行计数,它同样覆盖结论块;`conclusionRows` 是启发式(未跨满数据 schema 的填充行),仅在存在 schema 时计数。
104
+ - **`import_file` 命令与自证回执**:`{ type: 'import_file', sheet, startRow, startColumn, sourcePath, sourceFormat?, verifyCapacity?, allowTruncate? }`(`startRow` 必填,0-based 起点)在持久化前归一化为既有 `update_cells` 写入路径,Version/Step 模型与协同投影协议不变。返回值新增 `imports[]`,每项含 `workbookId` / `revisionBefore` / `revisionAfter` / `sheetId` / `range` / `rowsWritten` / `cellsWritten` / `sourceRowCount` / `truncated` / `sourcePath` / `rowCountBefore` / `rowCountAfter` / `capacityExpanded` / `warnings`,以及内容自证字段 `firstRow` / `lastRow` / `valuesHash`,Agent 无需写完整段回读。命中 `opId` 重放时**不会**返回 `imports[]`:该轮没有写入,任何内容证明都可能与表内实际内容不符,此时以 `replayed: true` 为准并回读工作簿。
105
+ - **越界自动扩容与行上限**:写入超过当前 sheet `rowCount`(默认 1000)时自动扩容,并在回执与 `warnings` 中说明扩容结果,无需先 `insert_rows`;`verifyCapacity`(默认 true)只控制这条容量说明,不改变写入行为。`SHEET_MAX_ROWS = 100000`(物理行 0–100000,row 0 可为表头);**源文件超出可写区间时 `import_file` 默认报错**(避免静默的部分写入),只有显式传 `allowTruncate: true` 才写入能容纳的前若干行,并在回执置 `truncated: true` 与一条 `warnings`;单条超过 `SHEET_MAX_APPEND_ROWS = 1000` 行的 `append_rows` 会在同一个 Version 内自动拆成多个可回放 Step。
106
+ - **框架级参数校验**:`invalid arguments: missing required property "workbookId"` 由 DSH 参数校验产生,插件无法改写;工具描述中已把 `workbookId` 标为必填并给出获取方式。
107
+
108
+ `univer_api` 是“可持久化 Adapter Registry”,不是任意原始 Univer API 执行器:它不能直接
109
+ 调用未登记的 `univerAPI`、Injector 服务或任意 `executeCommand`。新增 Univer 能力必须补充
110
+ 参数校验、持久化 operation、回放器与权限声明,才能注册为可调用 adapter;由此保证每次
111
+ Agent 写入都能生成 Version/Step、可回放,并且不会绕过 revision 或协同广播。
112
+
113
+ 编辑历史面板读取 `/data-sheet/workbook/:id/history`:默认按 Version 展示,展开后查看
114
+ 其有序 Step;Step 默认隐藏。每个 Version 和 Step 都可按顺序预览,Version 可恢复。
115
+ `GET /history?revision=N&step=M` 返回 Version 内第 M 个 step 的状态;`workbook_history`
116
+ 通过 `list` / `diff` / `replay` 返回同一历史模型。
117
+ 历史数据由 DSH 自己维护,不依赖 `@univerjs-pro/*` 或 Univer Server。
118
+
119
+ 修改型工具支持可选的 `baseRevision`。所有写入都是主线 Version;出现问题时用户可恢复任意可重放版本,恢复动作本身占用新的全局 revision,之后继续累加,不复用旧编号。回滚目标之后、且不再属于当前谱系的旧 Version 保留在历史中并标记为 `superseded`,不会从日志删除。工作簿目录下的 `<id>.json` 保存轻量元数据,`<id>.snapshot.json` 保存当前 snapshot,`<id>.checkpoints.json` 保存可回放 checkpoint,`<id>.operations.json` 保存完整 operation;`<id>.index.json` 只保存 sheet/schema、revision 和摘要。推荐 Agent 先读取目标范围,再携带读取结果中的 revision 修改;revision 冲突时重新读取并重试。`opId` 用于网络重试幂等,复用同一 `opId` 但提交不同 payload 会被拒绝。
120
+
121
+ 右侧 Sidebar 的开合、tab 导航和 session-scoped 状态完全由 DSH 官方 `ui-sidebar-right` / `ui-dockkit` 管理;插件只提供 tab type、guide entry 和 keyed body,不复制布局状态。
122
+
123
+ ## 入口控制
124
+
125
+ 入口不是 npm 市场页里的固定按钮,而是插件加载后注册到 DSH 官方右侧 Sidebar guide 的一个标签。发布后,用户安装包时,包内
126
+ `dsh.bundle.patch` 会自动插入 `data-sheet` 这条 Cordis 配置,插件激活后入口才会出现。
127
+
128
+ - 入口位置和样式由插件提供:guide 入口顺序当前为 45,tab body 通过 `sidebar.right.pane.tab` keyed slot 注入。
129
+ - 用户控制是否显示:`dsh plugin --profile web remove dsh-data-table` 会卸载;也可以在
130
+ profile 的 `cordis.patch.yml` 用同一个 `id: data-sheet` 覆盖并保留包名,保留安装但停用:
131
+
132
+ ```yaml
133
+ - id: data-sheet
134
+ name: '@tita-agent/dsh-data-table'
135
+ disabled: true
136
+ ```
137
+ - 默认打开状态、列宽和行为:当前默认打开宽度是视口的 50%,用户仍可拖拽调整。
138
+
139
+ npm 发布分发包内的 `lib/`、`src/` 与 `cordis.patch.yml`;入口的挂载由 Cordis patch 控制,入口的视觉和位置由 client bundle 控制。用户更新插件后需重启 DSH。
140
+
141
+ ## 包内产物
142
+
143
+ - `lib/client.js` 是**轻量** client bundle(`__ModuleLoader__.load` handoff,模块表外部依赖走 loader require);
144
+ - `lib/workbook-page.js` 是**独立浏览器 Tab**使用的自包含页面 bundle,通过 `/data-sheet/workbook/:id/view` 打开;
145
+ - `lib/univer-client.js` 是**按需引擎 chunk**(自包含 IIFE,Univer 全量内联 + 压缩,约 11MB):页面启动不加载它,首个表格渲染时经 Host 路由取回;`/assets/data-sheet-univer.js` 是旧服务器(无该路由)的兜底副本。
146
+
147
+ ## 重新进入不重新加载
148
+
149
+ 官方 dock 只渲染当前激活 tab 的 body,所以切 DSH tab 或切 session 都会卸载右侧面板的 React 树。工作区是一个**常驻 React 树**:
150
+
151
+ - pane frame 只负责把常驻容器「领养」进自己的 frame,离开时把它移到屏幕外停放,保留测量尺寸(避免引擎收到 0×0 resize);
152
+ - 再次进入只是把同一个容器挪回新 frame,引擎、滚动位置、未保存草稿和协同流都保持原样,只挂载一次;
153
+ - 停放超过 10 分钟(`PARKED_RELEASE_MS`)会真正卸载并释放引擎,避免常驻内存;
154
+ - 因为工作区不再随 pane 消失,窗口级 `Ctrl/Cmd+S` 和「离开 tab 时提交待保存改动」照常生效。
155
+
156
+ ## 约定与限制
157
+
158
+ - **命名**:用户可见的 Sidebar 标题是「Table」;npm 包名为 `@tita-agent/dsh-data-table`,HTTP 路由 `/data-sheet/*` 和 tab kind `data-sheet` 保持不变。存储根目录改名为 `storages/data-table`:首次解析存储路径时会把旧的 `storages/data-sheet` 整体迁移一次(`migrateLegacyWorkbookStorage`)。迁移是幂等的,只在目标目录不存在时移动;两个目录都有数据时不合并、不删除,旧数据保持原样。
159
+ - 在新 profile 中,表格作为 DSH 官方 `ui-sidebar-right` 的 extension tab 渲染。插件不持有 Sidebar store,也不依赖第三方 `dsh-better-sidebar`;官方 dockkit 负责 tab、浮动、分栏和 session 生命周期。
160
+ - 表格为**全尺寸网格**(1000 行 × 26 列,数据落在左上角),修复了首表单行数被数据行数限制的问题。
161
+ - 引擎含**免费功能预设**:筛选、排序、查找替换、条件格式、数据验证、绘图、超链接、批注、评论、超级表;协同由 Datasheet 自研 Univer 插件接入,不依赖商业 collaboration/PRO preset。
162
+ - 工具参数行数上限 100000(`SHEET_MAX_ROWS`,物理行索引为 0–100000,row 0 可为表头);`append_rows` 会自动按 1000 行(`SHEET_MAX_APPEND_ROWS`)分块,避免 Agent 一次提交过大的 Univer mutation,`import_file` / `update_cells + sourcePath` 是批量导入的推荐路径。快照最多 100 个 sheet、50 列、25 MB;超过快照大小时应拆分 workbook 或先聚合数据。
163
+ - 列类型:`string | number | boolean | date | currency`(date 渲染为 `YYYY-MM-DD`,currency 按数字处理)。
164
+ - `workbook_read` 的 range 读取**默认只返回 `values`**;`formulas` / `cells` / `styles` 要在 `include` 里显式索取(它们会成倍占用回显预算)。公式单元格携带 `calculation: cached | unavailable`,Host 不伪造公式重算结果。
165
+ - 导入/导出:顶部菜单栏分为「导入」(Excel / CSV)和「导出」(Excel / CSV / JSON)两个分组菜单,不再注册 DSH 自定义「文件」页,Univer 自带的编辑工具页不受影响。XLSX 适配器保留多 sheet、公式、合并区域、行列尺寸、数字格式和可序列化的基础样式;导入/导出均在独立 Worker 中执行(单文件最大 25 MB),CSV 会中和 `= + - @` 公式前缀以避免公式注入。JSON 导出的是工作簿 snapshot(与 Host 持久化同一格式)。
166
+ - 当前用户的普通单元格编辑通过带 `opId` 的增量 operation 保存;复杂操作仍使用 snapshot fallback。Host 使用全局 revision 和本地 mutation queue 排序;单元格并发写入以 Host revision 为最终顺序,后提交的写入覆盖前一个写入,客户端会实时重放远端和本地待提交轨迹。结构性操作仍进入三方冲突处理。浏览器通过自研 SSE 会话实时接收操作,断线时用 `/changes` 补齐漏操作,无法安全投影时使用「基线 + 本地 + 远端」三方快照合并,冲突单元格保留本地值并以黄色高亮,用户确认后再提交。
167
+ - CSV/Excel 编解码在 `xlsx-export-worker.js` / `xlsx-import-worker.js` 中按需加载,避免 SheetJS 在 Univer 主线程阻塞滚动和编辑;Univer 本体仍是首次进入表格时按需加载的独立 chunk。
168
+ - 当前协同使用 DSH 进程内 SSE 广播 + `/changes` 漏操作补偿,不依赖 `@univerjs-pro/*`;同一 DSH 进程内的多浏览器 Tab 可以实时协作。每个 workbook 最多 64 个 SSE 连接,慢客户端的待发送队列上限 100 帧,超限会断开并由客户端自动重连。跨进程部署仍需要换成共享消息总线或 WebSocket 网关。
169
+
170
+ ## 相关
171
+
172
+ - 数据和操作契约:`src/types.ts`(`SheetData` / `WorkbookOperation`)
173
+ - workbook 持久化与 operation 应用:`src/workbook-manager.ts`
@@ -0,0 +1,7 @@
1
+ # data-sheet bundle patch: mount the Univer spreadsheet terminal.
2
+ #
3
+ # One plugin instance registers an official `ui-sidebar-right` tab type and
4
+ # its keyed `sidebar.right.pane.tab` body.
5
+ - insert:
6
+ - id: data-sheet
7
+ name: '@tita-agent/dsh-data-table'