前言¶
DSH 的一个会话跑完,工作区里常常散落着十几处写入:交付给你的报告、顺手改的脚本、生成的中间数据。宿主日志里这些都在,但要从日志里把它们捞出来不容易——你得记得文件名,还得在一次次 write、edit 事件里筛出真正还存在于磁盘上的那几个。Artifact Space 想做的就是这件事:把一个会话最终留下的有效产物按工作区、按会话列出来,直接在面板里预览。
下面介绍的插件是 Artifact Space(产物空间),仓库 majestyjun/artifact-space,npm 包名 @xxjxx/artifact-space,当前版本 1.4.0,MIT 许可(见仓库 LICENSE)。它定位为客户端插件,为 DSH 增加一个「产物空间」侧栏入口。
这是什么¶
一句话:它在 DSH 侧栏增加一个入口,按「工作区 → 会话」两级列出每个会话最终产出的有效文件,并支持直接预览。
技术上它是 package-bundle 形态,分宿主半边和浏览器半边:
| 半边 | 文件 | 职责 |
|---|---|---|
| 宿主 | index.js |
注册两条需鉴权的路由:GET /api/artifact-space.rows 与 GET /api/artifact-space.read |
| 浏览器 | client.js |
注册侧栏入口(sidebar.panellist)与主面板(main slot,键为 artifact-space) |
两半边通过 ctx.connection.fetch.register 注册的鉴权宿主路由通信,凭证不会离开本机回环。插件声明不使用任何宿主私有 API。
什么会被算作产物¶
宿主半边折叠每个会话自己的日志事件,保留两类:
- 通过
deliverables/presented声明的文件,类型presented; - 由成功的
write、edit或str_replace_editor调用写入或修改的文件,类型produced。
只有仍然存在的文件才会被列出;没有任何存活产物的会话会被丢弃;会话与工作区都按最后活跃时间排序。
每个产物在面板上还会附带三项来源信息:标记为「交付」还是「产出」、来自第几轮对话、会话当时对这个文件说了什么。列表行只带徽章,预览区头部完整展示轮次与说明。
核心功能¶
预览按扩展名选渲染方式,而不是把原始文本直接甩出来:Markdown、HTML、YML/YAML、JSON 各有专属渲染器,图片直接显示,其它格式回落到纯文本。
代码文件(js、ts、py、json、yml 等)以编辑器形态打开:行号栏随滚动吸附、语法高亮,底部状态栏显示语言、行数、体积与编码。
图片走独立路由:宿主在「文件位于所属工作区内、扩展名确属图片、体积在 16 MB 以内」时返回原始字节,并带上对应 Content-Type。SVG 同样以图片方式呈现,浏览器不执行其中的脚本。图片预览区提供全屏查看和下载两项操作。
HTML 产物由宿主投递,但文档里的相对引用(src、href、poster、srcset 等)会先被改写成带会话鉴权的资源地址;绝对地址、data: URI 与纯锚点保持原样,用 .. 爬出工作区根的引用会被拒绝。文档投递时带 content-security-policy,预览框另有 sandbox 收敛权限,文档里的脚本不会执行。
搜索跨三个层级匹配:工作区、会话、产物。空格分隔的多个词是「备选」而非「收窄」,所以搜 client json 能同时找到 client.js 和 package.json。命中词高亮,搜索框旁显示结果数,Ctrl/Cmd+F 聚焦。
收藏以「所属会话 + 路径」为键,通过 localStorage 跨重启保留,键名前缀为 artifactSpace.favorite.v1.*。每条收藏各占一个键,取消收藏会直接删掉那个键;存储不可用时(隐私窗口、配额已满)功能降级为仅本次会话有效,而不是报错。收藏的生命周期可以比会话长:所属会话被删除后条目标记为失效且无法打开,收藏夹头部的「清理 N 项失效」按钮会删除这些条目。失效条目不自动清理——宿主在会话日志不可读或等待迁移时会把该行整个丢掉,所以「列表里没有」不能证明「文件已删除」。
安装与启用¶
从插件市场安装:打开 Settings → Plugins → Discover,搜索 Artifact Space 并安装,市场会安装索引中指定的确切版本并通过 profile 补丁启用它。README 中列出的公开目录收录情况如下:
| 目录 | 位置 | 状态 |
|---|---|---|
官方插件市场(awesome-dsh-plugin registry) |
awesome-dsh-plugin.com | 收录 PR 已提交 |
| 1024 社区插件目录 | deepseek1024.com | 已收录并同步上线 |
| 社区插件精选 | kejixiaoliang/awesome-dsh-plugins | 收录 PR 已提交 |
从 registry 安装:
npm install @xxjxx/artifact-space
或者直接用 DSH 的命令:
dsh plugin add @xxjxx/artifact-space
然后在自己的 profile 补丁(~/.dsh/profiles/desktop/cordis.patch.yml)中启用:
- insert:
- id: artifact-space
name: 'artifact-space'
环境要求 DSH >= 0.1.5-alpha.2,插件在 engines.dsh 中声明了该范围,运行版本不满足时宿主会拒绝加载。浏览器半边通过 dsh-client-hmr 热重载;改动宿主半边需要重新启用插件(或重启应用),以便模块被重新导入。
典型用法¶
装好后侧栏出现「产物空间」入口。打开它,先看到按最后活跃时间排序的工作区分组,展开某一项是该工作区下的会话列表,再展开某个会话就是它的产物行。
要找东西时直接在搜索框输入产物名片段。因为空格分词的备选语义,client json 一次就能命中 client.js 和 package.json 两个产物。会话行列过多时可以折叠,默认只展开首屏放得下的那些。
点开一个产物行进入预览区头部,可以复制内容或复制绝对路径。复制优先走异步 Clipboard API,宿主不支持时(缺少该 API、权限被拒)回退到隐藏 textarea 加 execCommand('copy');剪贴板拒绝写入时按钮会如实显示失败。二进制文件与工作区之外的文件没有内容可复制,但路径仍可复制。
值得留下的产物点行上星标收藏,之后在收藏夹视图集中查看。
适用场景与注意¶
适合持续用 DSH 做多轮协作、产物分散在大量会话里的开发者,尤其是需要回溯「某个报告是第几轮产出的、当时说了什么」的场景。
安装前需要确认一点:插件以当前 dsh 进程的权限运行,能读取宿主开放给它的会话日志与工作区文件。它声明不发起任何自己的网络请求,也不向任何地方发送数据;但这一点仍需自行审阅源码确认,MIT 许可也一并读过。
收藏保存在浏览器本地 profile 下,取消收藏即删除对应存储记录,收藏夹头部的「清空」会连同全部收藏的存储记录一起删除。隐私窗口或配额满时收藏只保留在当次会话内。
结语¶
Artifact Space 的价值在于它不改变 DSH 的产出方式,只是把会话日志里已经存在的信息按工作区、按会话重新组织成可预览、可搜索、可收藏的清单。对于需要频繁回溯会话产物的开发者,它比翻日志省事。
目录页:https://www.skillhub.cn/plugins/majestyjun/artifact-space
GitHub:https://github.com/majestyjun/artifact-space