aiworkskills/deepseek-harness-server--packages-dsh-deliverables1

@dshserver/dsh-deliverables

Open a managed Runtime's produced files in the browser instead of on the server's desktop

包名
@dshserver/dsh-deliverables
版本
0.1.0
许可证
MIT
最近更新
2026年8月26日

安装

此插件尚未提供可验证的 bundle,或兼容性检查未通过。请先阅读仓库说明。 阅读完整 README ↗

@dshserver/dsh-deliverables

托管部署里,让对话中的产物点开就能在右侧面板里看

解决什么

DSH 的产物徽章、正文里的文件提及、工具行,打开文件走的都是同一个出口: workspaces.openPath —— 把路径交给宿主机的系统默认程序。浏览器和宿主机是 同一台机器时这是对的;托管部署里不是:那台服务器没有桌面,也没有人坐在它前面。 于是用户被告知"产出了 article.html",点下去只能得到一个自己无能为力的拒绝。

这个插件改变"打开"在这里的含义:在组合期接管 workspaces.openPath。落在当前 会话工作区内的文件,在右侧详情面板里显示;其余原样交回原实现。

因为接管的是三个界面共用的那一个出口,徽章、文件提及和工具行一起修好。

组进 profile

- id: dshserver-deliverables
  name: '@dshserver/dsh-deliverables'

按类型怎么展示

类型展示
HTML沙箱 iframe
图片内联
Markdown / 文本 / 代码 / JSON文本
其它不预览,给下载

HTML 的沙箱档位

sandbox="allow-scripts",不给 allow-same-origin,而且两者永不同时给 —— 同时给的话文档可以自己摘掉 sandbox 属性,约束就成了装饰。只给 allow-scripts, 文件拿到一个不透明来源:脚本照常运行(产出的页面、小游戏能用),而会话 Cookie、 /api 接口和承载它的这个文档都够不到。产物是模型写的,这个理由就够了。

和别的详情面板同处一室

预览是临时覆盖层:只在用户点开某个产物期间注册,关闭即注销。它的遮蔽档位 DETAILS_PRIORITY = -20 从包里导出 —— DSH 在同槽位同档位的第二次注册会直接抛错并 指名占用者,所以把这个数字摆在公开面上,装配的人一眼能看出会不会撞、以及谁在前面。

两条约束

文件路由是路径式的,不是查询式的。 产出的 article.html 用相对路径引用配图, 而相对引用是相对文档自身 URL 解析的。…/file?path=article.html 之下,cover.png 会解析到一个本路由不提供的地址,预览出来满屏裂图。

收敛在 realpath 之后比较。 请求给的是会话与工作区相对路径,返回的必须在那个 工作区之内:不是隔壁 Subject 的,不是 /etc,也不是一条指向外面的符号链接。 (路径里的 .. 其实到不了这里 —— URL 解析在规范化 pathname 时就去掉了,%2e%2e 同样,因为 URL 标准把 %2e 视同 .。收敛守的是符号链接与绝对路径。)

为什么是接管一个方法,而不是替换那个插件

另一条路是把 DSH 的 deliverables 插件换成一份自己的、徽章点击去向不同的副本。 那需要"哪些文件算这一轮产出"的累加器,而它在那个插件内部 —— 仓库里有,发布包里 没有(它的 files 只发 lib)。照着内部事件形状再实现一份,上游一改就会无声漂移。

接管一个方法把那份词汇留在原处,并且一次修好三个界面。代价是这属于组合期的装饰: 原实现被保留并在处理不了时回退,插件卸载时恢复。