usavv1547-cyber/dsh-plugin-inline-image ↗★ 0
dsh-plugin-inline-image
DSH Web 插件:通过受限的 /dsh-image 路由提供工作区图片文件服务,允许 Agent 在对话中内嵌显示图片。
AI 分析
核心用途是让 Agent 能够直接在聊天会话中内嵌并展示本地工作区或指定目录下的图片。适合需要在对话中直观查看图表、图像产物的用户。
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:usavv1547-cyber/dsh-plugin-inline-image说明文档
阅读完整 README ↗3) 配置插件(见下),然后重启 dsh web
> 本地开发时可用 `dsh plugin --profile web add file:/本地路径/dsh-plugin-inline-image` 代替第 1 步。
### 配置(~/.dsh/profiles/web/cordis.patch.yml)
在 `cordis.patch.yml` 里追加:
```yaml
- insert:
- id: inline-image
name: 'dsh-plugin-inline-image'
config:
# alias -> 允许对外提供图片的绝对目录
roots:
sixsigma: /Users/guoguo/6sigma
# 默认 false:.svg 不开放(可携带脚本,XSS 面);确需时改为 true
allowSvg: false
不配置 roots 时,插件会自动回退到 harness 已注册的全部 workspace
(按 workspace id 作为 alias),方便直接用现有工作区。
使用
配置了 alias sixsigma 指向 /Users/guoguo/6sigma 后:
| 消息内容 | 效果 |
|---|---|
 | 内嵌显示 /Users/guoguo/6sigma/fig.png |
 | 内嵌显示子目录图片 |
给 agent 的提示词可以加一句:"要内嵌展示图片时,用相对链接
/dsh-image//,如 。"
安全设计(纵深防御)
- 只允许 GET / HEAD,其余方法返回 405;
- 逐段校验:每个路径段先 URL 解码,段不得为空、不得为
./..、 不得在解码后包含/、\、NUL(%2e%2e、..%2f等编码穿越均被拒); - 词法包含检查:
resolve + normalize后必须仍在 root 之下,否则 403; - 真实路径检查:
realpath()解析符号链接后再次校验必须仍在 root 之下, 防止 root 内的符号链接逃逸到任意文件(403); - 扩展名白名单:仅常见栅格图格式(png/jpg/jpeg/webp/gif/avif/bmp/ico);
SVG 默认 415(可选
allowSvg打开);Content-Type 一律由白名单推导; - 服务器进程外无任何暴露(路由挂在现有
dsh web进程上)。
测试
cd dsh-plugin-inline-image
npm install
node --test # 15 项:正常读取 / HEAD / 405 / 各类穿越 / 符号链接逃逸 / MIME / SVG / 404 / 插件接线
与官方路线的关系
DSH 消息协议已为"助手输出图片"预留了 ImageBlock
(packages/llm 中类型注释:valid in user or assistant content … assistant-side
rendering is forward compatibility)。本插件是让这一能力当下可用的轻量落地;
官方后续若实现完整的 assistant 附件通道,本插件可作为过渡方案。
功能请求已提交:https://github.com/deepseek-ai/deepseek-harness/discussions/2995
参与贡献
欢迎提交 issue 和 PR!插件小而聚焦:单文件实现 + 一套覆盖正常路径与各类 逃逸尝试的测试。路径处理是本插件的安全核心契约,改动路径/路由/扩展名 白名单的 PR 必须附带对应攻击面测试。
- 开发与测试指南、发布流程:CONTRIBUTING.md
- CI:push/PR 自动在 Node 18/20/22 上运行全部测试
- 发布:打
vtag 即自动npm publish+ 生成 GitHub Release
License
MIT
配置(~/.dsh/profiles/web/cordis.patch.yml)
在 cordis.patch.yml 里追加:
- insert:
- id: inline-image
name: 'dsh-plugin-inline-image'
config:
# alias -> 允许对外提供图片的绝对目录
roots:
sixsigma: /Users/guoguo/6sigma
# 默认 false:.svg 不开放(可携带脚本,XSS 面);确需时改为 true
allowSvg: false
不配置 roots 时,插件会自动回退到 harness 已注册的全部 workspace
(按 workspace id 作为 alias),方便直接用现有工作区。
使用
配置了 alias sixsigma 指向 /Users/guoguo/6sigma 后:
| 消息内容 | 效果 |
|---|---|
 | 内嵌显示 /Users/guoguo/6sigma/fig.png |
 | 内嵌显示子目录图片 |
给 agent 的提示词可以加一句:"要内嵌展示图片时,用相对链接
/dsh-image//,如 。"