DSH Office Tools 是什么
DSH Office Tools 是一个 DeepSeek Harness 宿主插件:包名 dsh-office-tools,包元数据里的版本号是 1.0.2,MIT 许可,向模型注册八个面向 Word、Excel 和 PowerPoint 文件的工具。它的 dsh 字段声明了一个 bundle patch(./cordis.patch.yml),并把兼容下限写成 dsh >=0.1.0-rc.6,另外列出四个 release 为 compatible。这里的包名与仓库名一致;README 还钉住了一个经过核对的 commit:ae1ddd40f98debf4b1430748d287951f35faaf36(tag v1.0.0),并说明 main 上更晚的提交只包含测试与文档改动,除非版本号提升。这句话值得细读:包文件里的版本是 1.0.2,所以被钉住的 commit 与已发布的版本并不是同一个产物。
八个工具,逐个说清
工具集很小,能力也一样具体:
word_create—— 新建.docx,内容为标题、段落、项目符号和一个表格。word_read—— 从任意.docx抽取文本;加format: "markdown"时会结构化渲染标题、列表和表格。word_update—— 向已有.docx追加段落、项目符号和/或一个表格。excel_create—— 用标量单元格网格创建多工作表.xlsx。excel_read—— 读一个或全部工作表,返回标量行;公式返回缓存值或'=…'字符串。excel_update—— 替换/创建整张工作表,或按 A1 地址写单元格。ppt_create—— 创建 16:9 的.pptx(标题页、标题、段落、项目符号、演讲者备注、以链接方式引用的 PNG/JPG/GIF 图片),并回显每个元素的落位坐标。ppt_read—— 逐页的段落、表格、演讲者备注、图片数量与替代文本,外加每个形状以英寸计的包围盒和一份文本线框草图。
请注意读法:三条创建路径、三条读取路径,更新只覆盖 Word 与 Excel —— 八个工具里没有 ppt_update。以 = 开头的字符串单元格会写成真正的 Excel 公式,由 Excel 在打开文件时计算。
工作区边界:原文怎么说的
这一页的安全主张就是路径规则,所以直接引 README 的原话:execute(args, exec)「resolves every path against exec.agent.session.header.cwd; relative paths stay in the session workspace and absolute paths are accepted only when still inside it. Containment and symlink resolution are enforced by the ctx.fs backend (plus a lexical pre-check here).」
由此有三点。相对路径被限制在会话工作区内;绝对路径只有在仍然落在该工作区内时才被接受;符号链接解析属于这项检查的一部分,它发生在官方 ctx.fs 后端,插件这边另有一道词法预检。README 在安全章节又把这条边界说了两遍:「All file access is confined to the calling agent’s session workspace」,以及插件自身代码「never touches the file system directly — there is no node:fs import anywhere in src/」。所以这项限制的性质是:插件把每一个字节都路由经过的一项服务级策略,而它可被验证,是因为插件根本没有第二条文件通道。README 从未把它描述成操作系统级沙箱,也从未称它是硬安全边界。包元数据另外单独声明了 files:workspace-read 与 files:workspace-write 两项权限。
覆盖、删除与确认
写入以 UTF-8 文本经由 ctx.fs.writeText 离开,README 说这「published atomically by the backend; overwrite defaults to false」。安全章节重复了同一件事:创建与更新「refuse overwrites by default」。因此已存在的文件不会被悄悄替换,除非显式打开覆盖选项。README 全文没有任何备份机制,也没有提到确认弹窗 —— 这道闸门是默认标志位加原子发布,而不是旧文件的副本。
八个已注册工具里没有删除操作,所以这里不会删除你的文档。README 没有说明的是:当覆盖被请求并获准、而目标文件已存在时究竟发生什么;这一点应当读作「未说明」,而不是假定有回滚或留存副本。
文档到底是怎么生成的
不是靠文档工具库。README 写道:「No LibreOffice/PowerPoint/Word subprocess is spawned and no third-party library is shipped: formats are generated and parsed by this plugin’s own ASCII-safe OOXML engine over node:zlib.」自 1.0.0 起插件「dependency-free」,装出来的产物是一个只含自身代码的 ESM bundle,约 116 kB,运行时依赖为零。生成的包「pure ASCII by construction」—— 一个 STORE zip 规划器为每个 XML part 补齐并对齐偏移,使每个 CRC、size、offset 字段都保持字节安全 —— 非 ASCII 文本编码为 XML 字符引用。README 把「真实 .docx/.xlsx/.pptx 能经由文本通道字节级无损往返」这件事归功于该机制。
保真度方面的保留意见就在同一段里,而且很容易被跳过:word_update 与 excel_update「re-publish through the text channel, so they work on packages whose every part is text (always true for files these tools write, and for OOXML packages without binary media); packages carrying binary media are refused with a clear error instead of being corrupted.」也就是说,含内嵌二进制媒体的文件根本无法被这两个工具更新。读取要宽容得多:「Reads accept any real-world package (STORE and DEFLATE entries, bounded by the zip-bomb guard).」
图片是一处刻意留下的缺口:「Images are LINKED, not embedded」—— 演示文稿引用工作区里的图片文件,PNG/JPG/GIF 头会被嗅探,因此省略尺寸时默认取原始大小。移动文件时要把图片一起带走。README 自己把这一点称为「无依赖、无二进制包」的代价。
运行要求
Node >=20,来自包的 engines 字段;Harness 需 >=0.1.0-rc.6,包元数据中 0.1.1-rc.2、0.1.2-alpha.4、0.1.2-alpha.5、0.1.2-rc.1 分别标为 compatible。宿主必须提供 fs 服务:README 说「every DSH profile that ships the built-in read/write tools does」。运行时服务依赖被声明为可选的 peerDependencies —— cordis 与五个 @deepseek-ai 包 —— 它们保持 external,由 profile 的 node_modules 提供。没有需要编译的原生依赖:jszip、xlsx、vitest、esbuild、typescript 都在 devDependencies 下。安装即复制已提交的源码 —— 「no npm fetch, no CDN, no postinstall scripts」—— README 要求安装后重启 DSH 服务器,八个工具会在下一次提示词组装时出现。engines 下限是针对这个包声明的;装好后的 bundle 在运行时是否也需要 Node 20,取决于 Harness,而两份来源都没有写。
已知限制(照抄来源的说法)
- 不存在「支持全部 Office 功能」的声明。
word_create覆盖的正好是「title, paragraphs, bullets, one table」;excel_read返回「scalar rows」;ppt_create是 16:9,含标题、段落、项目符号、备注与链接图片。 - 不提供删除工具,也没有可以加一个的配置项。
- 更新路径只有 Word 与 Excel,且都是追加/写入语义 ——
word_update只追加,excel_update替换或新建工作表、或按 A1 地址写单元格。没有声明支持修改既有正文、修订痕迹或重排。 - 含二进制媒体的包会被
word_update和excel_update拒绝。 - 读取预算:「Reads are capped at 50 MiB compressed; before anything is inflated, the archive’s own declared sizes are checked against budgets (256 MiB per entry, 512 MiB per archive, 100 000 entries), so zip bombs are refused rather than decompressed. XML parts carrying DOCTYPE/ENTITY declarations are refused outright.」
- 结果有界:「Text/cell results are bounded and mark
truncated」;「Creates/updates are bounded by row and cell limits」—— 具体的行数与单元格上限没有给出。 - 图片是链接而非内嵌,所以搬走演示文稿时要带上图片文件。
ppt_create/ppt_read可以用唯一的配置项enablePptTools(布尔,默认true)关掉,原因是「DSH refuses duplicate tool names at startup」,而专门的演示插件同样会注册ppt_create。- 包里的
dshWorkshop.evidence把install、failureIsolation、hotReload、remove四项都记为null:这四种行为没有公开的测试证据,尽管 lifecycle 元数据声称安装是事务性的、带 generation rollback,激活方式是重启,且支持 dispose。
来源没有说的事
有几件读者容易默认成立的事,来源其实都没写:文档里的宏能否被读取、更新或创建 —— 全文没有宏、VBA 或 vbaProject.bin 的讨论,启用宏的 .docm/.xlsm 也不是被点名的格式;文档里的外部链接或超链接关系是否会去抓取东西或执行什么;既有文档的格式、样式、图表、数据透视表、条件格式或图片在读取并重写后是否保留;公式是否会由这些工具重算 —— README 只说 Excel 在「on open」时计算 =…,且刚写入的公式在 Excel 缓存值之前读回来是 '=…' 字符串;能否删除文件。至于「既存 .docx 里的宏会不会执行」:插件不拉起任何 Office 进程、也不执行任何内容,但 README 对「读者在别处打开该文件是否会触发宏」没有任何表态,这一页也不会替它编一句。最后,本页不给出任何星数、下载量或用户数,因为来源没有提供。
什么时候用它、什么时候不要用
当交付物是一个全新的 Office 文件时用它:生成一份报告、一个带 =SUM 合计的预算工作簿、一份带演讲者备注的演示文稿 —— README 自己的演示提示词要的正好是这三件套,而且整条流程被 tests/demo-trio.spec.ts 钉住,「so the demo cannot drift from the tools」。当你要在不离开 Harness 的前提下,从既有文件里抽出文本、标题、表格、单元格与幻灯片几何信息时也适合用它;向这些工具自己产出的纯文本文件追加行和段落同样可以。
不要把它当成通用的 Office 编辑器。它无法让一份精心手工排版的文档无损往返,无法更新任何带二进制媒体的文件,没有图表、数据透视表、修订痕迹或模板方面的能力;而它的路径限制是一项它遵守的策略,而不是操作系统级容器 —— 如果 Harness 自身的文件系统策略比工作区更宽,那项策略由 Harness 决定,不由这个插件决定。需要保真时,请在真正的 Office 套件里编辑。
FAQ
工作区根目录真的能挡住向工作区外的写入吗?
对这套工具而言是的:相对路径留在 exec.agent.session.header.cwd 内,绝对路径「only when still inside it」才会被接受,且 containment 与符号链接解析由 ctx.fs 后端执行,插件内另有一道词法预检。README 声明 src/ 里不存在任何 node:fs import,因此每个字节都经过该服务。但它被描述为服务级限制,不是操作系统沙箱,README 也从未声称它是硬安全边界。
它会覆盖或删除我已有的文件吗?
默认拒绝覆盖 —— overwrite 默认 false,写入以原子方式发布。八个工具里没有删除操作,README 也没提到任何备份或确认弹窗。至于显式请求并获准覆盖之后究竟发生什么,来源没有说明。
创建之后哪些格式还能更新?
Word .docx 与 Excel .xlsx,走 word_update 和 excel_update。没有 ppt_update,PowerPoint 是「创建 + 读取」。两个更新工具都会拒绝含二进制媒体的包,报明确错误而不是把文件改坏。
带宏或外部链接的文档会执行什么吗?
来源完全没有涉及宏、VBA、启用宏的格式或外部链接,所以这一页对两个方向都不做安全断言。README 实际说的是更窄、也可验证的内容:不拉起 LibreOffice、PowerPoint 或 Word 子进程,不附带任何第三方库,携带 DOCTYPE 或 ENTITY 声明的 XML part 一律直接拒绝。
它需要装 LibreOffice 或原生模块吗?
不需要。格式由插件自带的 ASCII-safe OOXML 引擎在 node:zlib 之上生成与解析,包运行时依赖为零,也没有原生模块 —— jszip、xlsx 等都是测试用的 devDependencies。声明的下限是 Node >=20 与 dsh >=0.1.0-rc.6,外加一个提供 fs 服务的宿主。