dsh-rich-artifacts

by Inkotake

0 会话与消息github 检测到 manifest dsh.plugin.json收录于 08-16

DeepSeek Harness插件:将工作区文件作为聊天附件发布,支持内嵌图片预览和下载卡片。

DeepSeek Harness Artifact/Deliverable plugin: publish workspace files as chat artifacts with inline image previews and download cards.

安装

dsh plugin --profile web add github:Inkotake/dsh-rich-artifacts

GitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试

安装与环境配置指引、插件开发教程见 DSH 中文社区文档 ↗

安装即在你的机器上以你的权限运行第三方代码——它可读写文件、使用凭据、访问网络,DSH 的工具审批不会为插件代码加沙箱。「检测到 manifest」仅代表发现 dsh.bundle / dsh.plugin 清单,不构成兼容性或安全审查;安装前请审阅源码,不熟悉的插件先在不含密钥的环境试用。

README

目录

English | 中文

一个 DeepSeek Harness(dsh)双端插件:把工作区文件变成聊天产物——图片直接内联在对话里,其他文件显示下载卡片。

不再有 file:///... 链接,也不再只是“文件已生成在 output/”——模型创建面向用户的文件后,调用 publish_artifact,文件就能持久地通过聊天 UI 交付给用户。

功能

  • publish_artifact 工具
    • path(必填):要发布的工作区文件路径
    • title(可选):显示标题
    • display:auto(默认)· inline · download
  • ArtifactStore
    • SHA-256 content-addressed 存储
    • metadata 独立存放在 ~/.dsh/artifacts/v1/
  • 持久会话事件 artifact/published
    • 会话日志只保存 artifact metadata
    • 历史会话重载 / fork 后产物仍能显示
  • HTTP 端点
    • GET /api/artifacts/:id/content — 内联安全预览
    • GET /api/artifacts/:id/download — 附件下载
  • Web UI turn-tail 画廊
    • PNG / JPEG / WebP / GIF 直接内联
    • 其他文件显示下载卡片
  • 安全
    • fs.resolve + fs.contains 工作区约束
    • 拒绝最终组件 symlink
    • magic-byte MIME 嗅探(.png 实际是 HTML 不会内联)
    • V0.1 中 SVG / HTML 只允许下载
    • 文件大小、图片大小与像素上限

安装

dsh plugin --profile web add github:Inkotake/dsh-rich-artifacts

如需锁定到具体 commit:

dsh plugin --profile web add github:Inkotake/dsh-rich-artifacts#<commit>

安装后重启 dsh web(或你安装的目标 profile)。

使用

插件注册了 system-prompt 提示,模型创建交付物时会自动调用工具;你也可以直接要求:

帮我画训练 loss 曲线,导出 CSV,并把两个文件发布为聊天产物。

Agent 会执行:

publish_artifact({ "path": "output/loss.png", "display": "auto" })
publish_artifact({ "path": "output/loss.csv" })

回合尾部就会显示内联图片和 CSV 下载卡片。

配置

在 profile 的 cordis.patch.yml 中:

- id: dsh-rich-artifacts
  name: dsh-rich-artifacts
  config:
    root: ~/.dsh/artifacts
    maxFileBytes: 104857600
    maxTurnBytes: 524288000
    maxImageBytes: 20971520
    maxImagePixels: 40000000
    inline:
      png: true
      jpeg: true
      webp: true
      gif: true
      svg: false
字段 默认值 说明
root ~/.dsh/artifacts 产物存储根目录
maxFileBytes 104857600 单文件大小上限
maxTurnBytes 524288000 预留的每回合上限(V0.1 尚未强制)
maxImageBytes 20971520 可内联图片大小上限
maxImagePixels 40000000 可内联图片像素上限(尽力解析)
inline.* png/jpeg/webp/gif: true,svg: false 允许内联的图片类型

构建

pnpm install
pnpm run build

lib/index.js 是 ESM host 插件,lib/client.js 是浏览器 bundle (window.__ModuleLoader__.load(...))。两者都已提交,源码安装无需构建。

测试

node tests/artifact-store.test.mjs

架构

DeepSeek Agent
     │  创建文件
     ▼
Workspace File
     │  publish_artifact
     ▼
ArtifactStore ──────────────► artifact/published 会话事件
     │                                  │
     │ (blob + metadata)                │ (artifact_id + metadata)
     ▼                                  ▼
HTTP /api/artifacts/:id/*        Session log(可重放)
     │                                  │
     └──────────────┬───────────────────┘
                    ▼
              Web UI turn-tail
              ┌─────────┴──────────┐
              ▼                    ▼
        ImageArtifact         FileArtifact

实现说明

  • artifact/published 是 log-only 事件。当前 Harness 对 out-of-repo 插件还没有 会话事件注册面,host 启动时会把该事件类型加入 KNOWN_SESSION_EVENT_TYPES (运行时为可变 Set),这样持久化会话在插件安装期间可正常恢复。
  • MIME 以 magic bytes 为准,扩展名仅作次要提示。
  • V0.1 刻意不内联 SVG 和 HTML。

许可证

MIT

原始 README: https://github.com/Inkotake/dsh-rich-artifacts/blob/main/README.zh.md ↗