前言¶
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