WhaleDraw:无限画布 AI 创作工作台,支持 DeepSeek HarnessDSH插件。
32.1/100
综合分
3
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/21 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:npm 同名包「dsh-infinite-canvas」归属 kenrep0/dsh_infinite_dialogue_canvas,装到的可能不是本插件;安装清单取自 plugins/dsh-infinite-canvas/package.json。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Prokint/WhaleDraw该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · other
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 15 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/10/30) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意npm 同名包「dsh-infinite-canvas」归属 kenrep0/dsh_infinite_dialogue_canvas,装到的可能不是本插件;安装清单取自 plugins/dsh-infinite-canvas/package.json
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-infinite-canvas @ 0.2.2
✓Node 引擎要求 >=22.19.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/12 21:21:22
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 54 处,展示前 39 条)
- 请求外部主机api.github.comcanvas-agent/src/version-check.ts:43
const response = await fetch("https://api.github.com/repos/Prokint/WhaleDraw/releases/latest", { signal: AbortSignal.timeout(10_000) }); - 发起网络请求canvas-agent/src/version-check.ts:43
const response = await fetch("https://api.github.com/repos/Prokint/WhaleDraw/releases/latest", { signal: AbortSignal.timeout(10_000) }); - 执行外部命令来自配置/变量canvas-agent/src/version-check.ts:54
return execFileSync(command, ["--version"], { encoding: "utf8", timeout: 5_000 }).match(/ + + +/)?.[0] || ""; - 发起网络请求canvas-proxy/index.js:158
upstream = await fetch(target, { method: req.method, headers: requestHeaders(req), body, redirect: "manual", signal: controller.signal }); - 执行外部命令来自配置/变量canvas-proxy/index.test.mjs:20
const child = spawn(process.execPath, [fileURLToPath(new URL("./index.js", import.meta.url)), "--port", String(port), "--allow-origin", "http://allowe - 发起网络请求canvas-proxy/index.test.mjs:31
const denied = await fetch(`${proxy}${target}`, { headers: { origin: "http://denied.test" } }); - 发起网络请求canvas-proxy/index.test.mjs:34
const allowed = await fetch(`${proxy}${target}`, { headers }); - 请求外部主机169.254.169.254canvas-proxy/index.test.mjs:38
const metadata = await fetch(`${proxy}http://169.254.169.254/latest/meta-data/`, { headers }); - 发起网络请求canvas-proxy/index.test.mjs:38
const metadata = await fetch(`${proxy}http://169.254.169.254/latest/meta-data/`, { headers }); - 发起网络请求canvas-proxy/index.test.mjs:40
const redirect = await fetch(`${proxy}${target}/redirect`, { headers, redirect: "manual" }); - 发起网络请求canvas-proxy/index.test.mjs:43
const oversized = await fetch(`${proxy}${target}`, { method: "POST", headers, body: Buffer.alloc(32 * 1024 * 1024 + 1) }); - 发起网络请求canvas-proxy/index.test.mjs:46
const recovered = await fetch(`${proxy}${target}`, { headers }); - 发起网络请求plugins/dsh-infinite-canvas/src/canvas-launcher.mjs:20
const response = await fetch(`${config.url}/agent/dsh/${action}`, { - 发起网络请求plugins/dsh-infinite-canvas/src/client.js:49
const reportOpen = (sessionId, result) => fetch(`${appPath}/host-result?${new URLSearchParams({ hostId, sessionId, ...result })}`); - 发起网络请求plugins/dsh-infinite-canvas/src/client.js:61
const response = await fetch(`${appPath}/host-sessions?${params}`, { cache: "no-store" }); - 发起网络请求plugins/dsh-infinite-canvas/src/client.js:118
void fetch(`${appPath}/host-request?${new URLSearchParams({ hostId, sessionId, requestId })}`, { cache: "no-store" }) - 读取本地文件plugins/dsh-infinite-canvas/src/index.mjs:18
if (!existsSync(new URL("../dist/app/index.html", import.meta.url))) { - 执行外部命令来自配置/变量plugins/dsh-infinite-canvas/src/index.mjs:31
child = spawn(process.execPath, [fileURLToPath(new URL("./agent.mjs", import.meta.url))], { env: { ...process.env, ELECTRON_RUN_AS_NODE: "1" }, stdio: - 发起网络请求plugins/dsh-infinite-canvas/src/index.mjs:37
const response = await fetch(`${config.url}/health`, { signal: AbortSignal.timeout(DEFAULT_PROBE_TIMEOUT_MS) }); - 读取本地文件plugins/dsh-infinite-canvas/src/plugin-update.mjs:30
try { currentVersion = valid(JSON.parse(await readFile(new URL("../dist/app/version.json", import.meta.url), "utf8")).version); } - 请求外部主机api.github.complugins/dsh-infinite-canvas/src/plugin-update.mjs:35
const response = await fetch(`https://api.github.com/repos/${repository}/releases/tags/${encodeURIComponent(tag)}`, { - 发起网络请求plugins/dsh-infinite-canvas/src/plugin-update.mjs:35
const response = await fetch(`https://api.github.com/repos/${repository}/releases/tags/${encodeURIComponent(tag)}`, { - 写入本地文件plugins/dsh-infinite-canvas/src/plugin-update.mjs:106
await mkdir(root, { recursive: true }); - 发起网络请求plugins/dsh-infinite-canvas/src/plugin-update.mjs:115
const response = await fetch(info.url, { cache: "no-store", signal }); - 写入本地文件plugins/dsh-infinite-canvas/src/plugin-update.mjs:122
await pipeline(Readable.fromWeb(response.body), counter, createWriteStream(file, { flags: "wx" }), { signal }); - 读取本地文件plugins/dsh-infinite-canvas/src/plugin-update.mjs:126
for await (const chunk of createReadStream(file, { signal })) hash.update(chunk); - 删除本地文件递归plugins/dsh-infinite-canvas/src/plugin-update.mjs:137
if (!installStarted) await rm(directory, { recursive: true, force: true }).catch(() => {}); - 读取本地文件plugins/dsh-infinite-canvas/src/verified-install.mjs:26
for (const name of (await readdir(dir)).sort()) { - 读取本地文件plugins/dsh-infinite-canvas/src/verified-install.mjs:30
const stat = await lstat(path); - 读取本地文件plugins/dsh-infinite-canvas/src/verified-install.mjs:31
if (stat.isSymbolicLink()) files[key] = ["link", linkName(await readlink(path))]; - 读取本地文件plugins/dsh-infinite-canvas/src/verified-install.mjs:33
else if (stat.isFile()) files[key] = ["file", await streamHash(createReadStream(path))]; - 读取本地文件plugins/dsh-infinite-canvas/src/verified-install.mjs:69
try { return await lstat(path); } - 读取本地文件plugins/dsh-infinite-canvas/src/verified-install.mjs:79
for (const entry of await readdir(downloads, { withFileTypes: true })) { - 写入本地文件plugins/dsh-infinite-canvas/src/verified-install.mjs:101
await mkdir(expected); - 写入本地文件plugins/dsh-infinite-canvas/src/verified-install.mjs:182
try { await rename(modules, previous); } - 写入本地文件plugins/dsh-infinite-canvas/src/verified-install.mjs:188
await mkdir(modules); - 删除本地文件plugins/dsh-infinite-canvas/src/verified-install.mjs:198
await unlink(target); - 写入本地文件plugins/dsh-infinite-canvas/src/verified-install.mjs:219
if (await exists(modules)) await rename(modules, join(directory, "failed-node_modules")); - 写入本地文件plugins/dsh-infinite-canvas/src/verified-install.mjs:227
await rename(previous, modules);
扫描于 2026/11/2(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库
涉及外部主机:api.github.com、169.254.169.254
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 侧栏创作图片视频
- Agent读写画布
- 桌面插件集成
Infinite Canvas 分支版,带 DeepSeek Harness 桌面插件和 Canvas Agent MCP 集成
README
由 DeepSeek 最新模型翻译生成WhaleDraw
把灵感铺开,让创作连接起来。
在 DeepSeek Harness 中,用无限画布串联参考图、提示词与 AI 创作。
下载安装 ·功能预览 ·插件文档 · MIT 开源
画布里的创作
从一张参考图开始,在同一片画布上组织素材、尝试不同提示词,再继续迭代结果。
| 无限画布 | AI 创作 | DSH Agent |
| 用节点和连线组织图片、文本与创作思路。 | 图片与视频创作,配合提示词库和素材管理。 | 在聊天旁打开画布,让 Agent 读取与操作已连接的画布。 |
参考图 → 素材组合 → 创作结果 · 截图来自较早版本,当前界面名称为 WhaleDraw。
开始使用
1. 安装插件
先安装并打开一次 DeepSeek Harness,完成初始化后彻底退出。从 最新 Release 下载 whaledraw-<版本号>.tgz,将下方路径替换为安装包的绝对路径:
dsh plugin --profile desktop add "file:<安装包的绝对路径>"
浏览器版 DSH 使用对应的 profile,例如把 desktop 改为 web。安装后手动重启 DSH。
2. 打开你的画布
点击侧栏的 WhaleDraw,进入「我的画布」,新建或打开项目。
展开完整文档(README 剩余 1 节)
WhaleDraw 把灵感铺开,让创作连接起来。 在 DeepSeek Harness 中,用无限画布串联参考图、提示词与 AI 创作。 下载安装 ·功能预览 ·插件文档 · MIT 开源 画布里的创作 从一张参考图开始,在同一片画布上组织素材、尝试不同提示词,再继续迭代结果。 | 无限画布 | AI 创作 | DSH Agent | | 用节点和连线组织图片、文本与创作思路。 | 图片与视频创作,配合提示词库和素材管理。 | 在聊天旁打开画布,让 Agent 读取与操作已连接的画布。 | 参考图 → 素材组合 → 创作结果 · 截图来自较早版本,当前界面名称为 WhaleDraw。 开始使用 1. 安装插件 先安装并打开一次 DeepSeek Harness,完成初始化后彻底退出。从 最新 Release 下载 whaledraw-<版本号>.tgz,将下方路径替换为安装包的绝对路径: dsh plugin --profile desktop add "file:<安装包的绝对路径>" 浏览器版 DSH 使用对应的 profile,例如把 desktop 改为 web。安装后手动重启 DSH。 2. 打开你的画布 点击侧栏的 WhaleDraw,进入「我的画布」,新建或打开项目。在 WhaleDraw 设置中配置模型接口与 API Key,即可开始创作;插件使用 DSH 提供的页面服务,无需额外启动前端服务。 3. 和 Agent 一起创作 在 DSH 会话中提出画布或生图请求,插件会引导选择已有画布、新画布或「生图工作台」,并打开对应页面连接 Agent。侧边栏与默认绑定画布不同时,可选择本次操作位置。 已安装 v0.1.4 或更早版本?首次切换到 WhaleDraw 更新来源需要手动安装;源码 link: 安装请按开发流程处理。先阅读 升级与数据保护说明。 文档与开发 | 入口 | 内容 | | DSH 插件文档 | 源码构建、安装、Agent 连接与安全升级 | | 项目文档索引 | 独立运行、功能说明与开发文档 | | 版本记录 | 本分支的更新内容 | | 更新与上游同步 | 独立发版、同步上游与冲突处理 | 画布、素材与记录保存在对应浏览器或 DSH WebView 的本地存储中,不会自动跨来源同步。模型 API Key 保存在浏览器本地,由前端直接请求所配置的模型接口;版本检查等功能仍需联网。 来源与许可 WhaleDraw 基于 basketikun/infinite-canvas,保留完整画布应用并增加 DSH 插件适配。本分支独立维护与发版,保留上游作者署名,采用 MIT 许可证。 现有插件内部身份、连接协议和数据库标识沿用原名,已有安装与数据无需因品牌改名迁移。 WhaleDraw · 让每一个灵感,都有展开的空间。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Prokint/WhaleDraw
WhaleDraw:无限画布 AI 创作工作台,支持 DeepSeek HarnessDSH插件。
相关插件 · 其他
模型破甲清洗YuJunZhiXue/dsh-purge
⚔️ DeepSeek Harness 网络安全红队工具dsh-purge
★ 16,148已汉化DeepSeek 客户端
73
女娲蒸馏alchaincyf/nuwa-skill
输入名人名字,提炼其思维模型与决策方式供你调用
★ 37,308已汉化DSH
72
逆向分析桥接Fanqi89/dsh-rea
REA(Reverse Engineer Anything)MCP 桥接,用来把 REA 逆向工具接入 DSH 插件
★ 51已汉化DSH
72
语音女友beiyege-01/dsh-voice-ai-girlfriend
语音 AI 女友Voice AI girlfriend for DeepSeek Harness:Whisper…
★ 888已汉化DSH
71.6
红队越狱测试套件Minglink/dsh-infinite-gen-5
DeepSeek v4.1 flash 逆向工具无限五代 求 Star 收藏 ⭐欢迎大家提交项目的改进
★ 3,759已汉化DSH
71.4
协同办公空间dream-num/univer-workspace
一个让人类与 AI Agent 共同创作、协作和审阅的开源 Office 工作空间。
★ 2,266已汉化DSH
70.7
这是你的仓库?认领条目