description: "在 DSH 侧栏增加「产物空间」入口,按工作区与会话隔离列出每个会话的最终有效产物,并支持预览、搜索与收藏。" kind: "package-bundle"
Artifact Space(产物空间)
中文 | English
一个为 DSH 增加产物空间侧栏入口的插件。它按「工作区 → 会话」两级列出每个会话最终产出的有效文件,点击即可预览内容。

功能
| 玻璃界面 | 分层玻璃面板,随明暗主题自适应;面板下方铺有彩色光斑,玻璃才真的有折射感,而不是一张淡色卡片 |
| 编辑器预览 | 代码文件以编辑器形态打开:行号栏随滚动吸附、语法高亮,底部状态栏显示语言、行数、体积与编码 |
| 多格式渲染 | Markdown、HTML、YAML、JSON 各有专属渲染器,无法识别的格式一律回落到纯文本 |
| 三级搜索 | 工作区 / 会话 / 产物同时匹配;空格分隔的多个词是「备选」而非「收窄」,所以搜 client json 能同时找到 client.js 和 package.json |
| 收藏夹 | 把值得留意的产物标星,在收藏夹里集中查看。收藏可跨重启保留,取消收藏即从磁盘删除对应记录 |
| 会话折叠 | 会话可折叠成标题行;默认只展开首屏能看到的那些 |
| 一键带走 | 在预览区头部直接复制文件内容或绝对路径 |
| 来源可溯 | 每个产物都标明是「交付」还是顺手「产出」、来自第几轮对话、会话当时对它说了什么 |
什么算是一个产物
宿主半边(Host half)折叠每个会话自己的日志事件,保留:
- 通过
deliverables/presented声明的文件(类型presented), - 由成功的
write、edit或str_replace_editor调用写入或修改的文件(类型produced)。
只有仍然存在的文件才会被列出;没有任何存活产物的会话会被丢弃;会话与工作区都按最后活跃时间排序。
架构
| 半边 | 文件 | 职责 |
|---|---|---|
| 宿主 | index.js |
注册两条需鉴权的路由:GET /api/artifact-space.rows 与 GET /api/artifact-space.read |
| 浏览器 | client.js |
注册侧栏入口(sidebar.panellist)与主面板(main slot,键为 artifact-space) |
两半边通过 ctx.connection.fetch.register 注册的鉴权宿主路由通信,凭证不会离开本机回环。
路由
GET /api/artifact-space.rows— 所有工作区分组及其会话、产物。GET /api/artifact-space.read?sessionId=…&path=…— 单个产物的文本内容,上限 512 KB / 4000 行。拒绝原因映射为403 outside-workspace、404 not-a-file、413 too-large、415 binary-file。
预览状态
binary 与 outsideWorkspace 在发起请求之前就根据行上的标记判定(不发请求、不闪加载态)。其余状态为 missing(404)、error(413 / 其它)以及渲染出的正文。
格式渲染
预览会按扩展名选择合适的呈现方式,而不是把原始文本直接甩出来:
| 扩展名 | 渲染方式 |
|---|---|
md、markdown、mdown、mkd、mdx |
Markdown:标题、段落、列表、表格、引用、分隔线、带语言标签的围栏代码块,以及行内代码 / 强调 / 删除线 / 链接 |
html、htm、xhtml |
在沙箱框架(sandbox="")中渲染,先剥离脚本元素、行内事件处理器与 javascript: URL |
yml、yaml |
保留文档自身嵌套层级的缩进键值大纲 |
json、jsonc、json5 |
格式化的 JSON;文档损坏时回落到原始文本 |
| 其它 | 纯文本 |
任何格式都能回落到纯文本,所以无法识别或已损坏的文档照样能看到内容。
代码文件(js、ts、py、json、yml 等)以编辑器形态打开:吸附式行号栏、语法高亮,以及报告语言、行数、体积与编码的状态栏。
产物来源
宿主为每个产物从会话日志里折出三项事实,面板会展示它们:
- 交付 或 产出 —— 会话明确交付给用户的文件标记为「交付」,其余标记为「产出」。
- 轮次 —— 这次交付来自对话的第几轮。
- 说明 —— 会话当时对这个文件说了什么。
列表行只带徽章,好让文件名保留自己的空间;预览区头部则完整展示轮次与说明。
把产物带走
预览区头部提供复制内容与复制路径。复制优先走异步 Clipboard API,宿主不支持时(缺少该 API、权限被拒)回退到隐藏 textarea 加 execCommand('copy') —— 与宿主自身的原语顺序一致。剪贴板拒绝写入时,按钮会如实显示失败,而不是假装成功。
二进制文件与工作区之外的文件没有内容可复制,但路径仍然可以复制。
查找产物
- 搜索跨三个层级过滤 —— 工作区、会话、产物。空格分隔的多个词是备选而非收窄,所以
client json既能找到client.js也能找到package.json。命中的词会高亮,搜索框旁显示结果数,Ctrl/Cmd+F可聚焦。 - 折叠把会话收成标题行。默认只展开首屏放得下的会话;被手动折叠或展开的会话会记住那个选择。
收藏夹
产物行上的星标即可收藏,收藏项汇总在收藏夹视图里(头部那个星标按钮)。
- 收藏以「所属会话 + 路径」为键,因为两个会话可能产出同名路径,而那是不同的产物。
- 收藏通过
localStorage跨重启保留 —— 与宿主自己的客户端 store 用的是同一条通道。每条收藏各占一个键,所以取消收藏会直接删掉那个键,磁盘上不留任何东西。存储不可用时(隐私窗口、配额已满),功能降级为仅本次会话有效,而不是报错。 - 收藏的生命周期可以比会话长。所属会话被删除后,该条目会被标记为失效且无法打开;收藏夹头部的清理 N 项失效按钮会删除这些条目,并同步删掉它们的存储记录。
- 失效条目绝不自动清理:宿主会在会话日志不可读或等待迁移时把该行整个丢掉,所以「列表里没有」并不能证明「文件已删除」,据此自动清扫会误删用户仍想要的收藏。
安装
从插件市场安装
打开 Settings → Plugins → Discover,搜索 Artifact Space 并安装。市场会安装索引中指定的确切版本,并通过 profile 补丁启用它。
从 registry 安装
npm install @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中声明了该范围,运行版本不满足时宿主会拒绝加载。 - 不使用任何宿主私有 API。插件只通过公开的
ctx.connection.fetch路由通信,收藏持久化在localStorage里。
浏览器半边通过 dsh-client-hmr 热重载;改动宿主半边则需要重新启用插件(或重启应用),以便模块被重新导入。
隐私
插件只读取宿主本就已开放给它的会话日志与工作区文件。它不发起任何自己的网络请求,也不向任何地方发送数据。
收藏保存在你浏览器的本地 profile 下,键名前缀为 artifactSpace.favorite.v1.*。取消收藏会删除对应条目,收藏夹头部的清空按钮会连同它们的存储记录一起删除全部收藏。
许可证
MIT —— 见 LICENSE。
No comments yet. Be the first to write one.