Install verification: runtime verified (L5) · tested on dsh 0.2.1-rc.2 · last checked Install verification details →
What it doesAI
Connects any OpenAI-compatible image API to DSH so chat models can generate and edit images as native image cards.
- Adds generate image and image edit tools via any OpenAI-compatible API
- Image edit can reuse the session's latest image and outputs native image cards
- Per-tool confirmation popups, full settings page, upstream model discovery, /api/image/tool endpoint
Capability tags are AI-inferred or rule-extracted from the README (see badge) — vocabulary-limited, not install-verified. AI = inferred; README = literal keyword from the readme.
Installation
dsh plugin --profile web add github:lance808/dsh-image-toolInstall method: GitHub · runtime verified (L5)
Verification & Compatibility
Grouped by plugin version: each card lists the dsh versions actually tested against that artifact version and their install verdicts (L5 wins). Untested combinations are omitted — absence means untested, never assumed compatible. L1–L3 are a plugin-level static archive (independent of the dsh version — the same verdict on every dsh row): they sit in each row's level grid next to L4/L5, marked "static", while their evidence is stored once per plugin inside that row's "checks & evidence" instead of being duplicated per version.
External credentials (plugin-level): none detected
○ The author declares no dsh version requirement — install is not blocked by version.
| plugin \ dsh | dsh 0.2.1-rc.2 current | dsh 0.2.1-alpha.4 | dsh 0.2.1-alpha.2 |
|---|---|---|---|
| 9e73d3 | ✓ | ✓ | ✓ |
9e73d3github✓ 3 runtime-verified2026-10-18
https://github.com/lance808/dsh-image-tool
✓dsh 0.2.1-rc.2current2026-10-18L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-rc.2
- • Plugin artifact: github · https://github.com/lance808/dsh-image-tool (version unstated)
ID: dsh-image-tool@9e73d3@dsh0.2.1-rc.2 · profile: l4-sandbox
Issued: 2026-10-18 · expires: 2026-10-25
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.2.1-alpha.42026-10-16L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-alpha.4
- • Plugin artifact: github · https://github.com/lance808/dsh-image-tool (version unstated)
ID: dsh-image-tool@9e73d3@dsh0.2.1-alpha.4 · profile: l4-sandbox
Issued: 2026-10-16 · expires: 2026-10-23
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.2.1-alpha.22026-10-14L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-alpha.2
- • Plugin artifact: github · https://github.com/lance808/dsh-image-tool (version unstated)
ID: dsh-image-tool@9e73d3@dsh0.2.1-alpha.2 · profile: l4-sandbox
Issued: 2026-10-14 · expires: 2026-10-21
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
Author badges
Embed the official badges in your README to showcase security & install-test status:
`[](https://www.dsh.so/artifact/dsh-image-tool/)``[](https://www.dsh.so/artifact/dsh-image-tool/)`Security Report
Two automated layers, neither a manual review: a static scan (per-plugin rule checks) and a model-driven dynamic security audit that covers only the subset static-flagged at warn or above and never executes plugin code.
Static low, dynamic medium — stricter wins → overall medium.
v0.2.0dsh manifest0.2.0git2026-10-210.2.0same versionclean · gitVet is an AST static scan (npm artifact or git source).
show static findings (9)
- warningnetIp · network
client.js:698+ '本机生图服务(如 http://127.0.0.1:7860)同样支持。', - warningfsWrite · files
lib/diag.js:24fs.appendFileSync(file, `[${new Date().toISOString()}] ${message}\n`); - warningnetIp · network
lib/index.js:65apiUrl: z.string().default('').description('生图接口基址,例如 https://api.openai.com/v1(允许 http://127.0.0.1:xxxx 这类本地服务)').extra('volatile', true), - warningnetIp · network
lib/routes.js:90const url = new URL(req.url ?? '/', 'http://127.0.0.1'); - warningnetIp · network
lib/routes.js:318const url = new URL(req.url ?? '/', 'http://127.0.0.1'); - warningfsWrite · files
lib/save.js:54await fs.writeFile(path.join(dir, parts.at(-1)), stored.data, { flag: 'wx', signal }); - warningnetIp · network
scripts/mock-image-api.mjs:72const url = new URL(req.url ?? '/', 'http://127.0.0.1'); - warningnetIp · network
scripts/mock-image-api.mjs:128console.log(`[mock] 假生图服务已启动:http://127.0.0.1:${PORT}/v1`); - warningnetIp · network
scripts/mock-image-api.mjs:129console.log(`[mock] 把插件 apiUrl 设为 http://127.0.0.1:${PORT}/v1 即可(apiKey 随便填非空值)`);
show 2 audit findings
- mediumUpstream-image SSRF guard only matches hostname strings, leaving DNS and non-dotted IPv6 forms unfiltered
lib/generate.js:206assertFetchableImageUrl is the only gate before fetchImage(url) downloads an upstream-supplied URL. It inspects the literal hostname only: names that resolve to 127.0.0.1/169.254.169.254 (e.g. a relay-controlled A record, or 'localhost.' with a trailing dot, which fails the host === 'localhost' test) pass the check, and IPv4-mapped IPv6 written in hex form (e.g. [::ffff:7f00:1], bracketed and de-bracketed to '::ffff:7f00:1') does not match the dotted-quad regex and falls through to 'return false'. A malicious or compromised OpenAI-compatible relay (an explicitly supported deployment) can there
- lowDiagnostic log writes prompts and paths to a predictable world-readable temp file
lib/diag.js:15By default every run appends to <tmpdir>/dsh-image-tool.log with default permissions (typically 0644). Callers log user content into it: routes.js logs 'prompt=...' (truncated to 80 chars), the image reference and cwd, and index.js logs disk paths and upstream error text. On a shared/multi-user host any local user can read the user's image prompts, workspace paths and upstream error bodies. Only prompts/paths/metadata are exposed - the API key itself is never logged.
SSRF guard on upstream image URLs only string-matches hostnames (DNS/alternate-literal bypasses remain), and diag logs write prompts to a shared tmp file.
Rule: the dynamic audit can only raise risk, never lower it (raise-only, never an exemption); a wrong raise is withdrawn by human review and the tier falls back to the static verdict. Overall verdict = the stricter of the two layers.
Disclaimer: the static scan and the dynamic security audit are both automated analysis, not a security guarantee. Always review what you install.
Activity
Last commit 2026-10-14 · activity: Active
• Repo created: 2026-10-14
• Stars: ★ 1 · Forks: 0
• Health: Active — committed within last 30 days
Source
Author README
View on GitHub ↗The author's original README from the repository — fetched live, unedited (the English page loads the default README).
