Artifact Space(产物空间):在 DSH 侧栏按会话翻看有效产物

前言

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

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜