aiworkskills/deepseek-harness-server--packages-dsh-deliverables ↗★ 1
@dshserver/dsh-deliverables
Open a managed Runtime's produced files in the browser instead of on the server's desktop
安装
此插件尚未提供可验证的 bundle,或兼容性检查未通过。请先阅读仓库说明。 阅读完整 README ↗
说明文档
阅读完整 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)。照着内部事件形状再实现一份,上游一改就会无声漂移。
接管一个方法把那份词汇留在原处,并且一次修好三个界面。代价是这属于组合期的装饰: 原实现被保留并在处理不了时回退,插件卸载时恢复。