把对话生成只读网页,免账号限时分享给他人
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/25 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add RestartBaiYe/dsh-share该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · chat
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 10 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 72 处,展示前 70 条)
- 读取本地文件lib/index.js:206
const text = readFileSync(join(home, "shares", "public-base-url.txt"), "utf8"); - 读取密钥环境变量lib/index.js:285
const fromEnv = [process.env.GITHUB_TOKEN, process.env.GH_TOKEN].find((value) => typeof value === "string" && value !== ""); - 删除本地文件lib/index.js:292
rmSync(join(sharesDir, "public-base-url.txt"), { force: true }); - 发起网络请求lib/index.js:586
const check = await fetch(row.publishedUrl, { method: 'HEAD', redirect: 'error', signal: AbortSignal.timeout(8000) }); - 发起网络请求lib/client.js:52
const response = await fetch(PREFIX + path, { method: body === undefined ? 'GET' : 'POST', credentials: 'same-origin', headers: {'content-type':'appli - 写入剪贴板lib/client.js:58
try { await navigator.clipboard.writeText(text); return true; } catch { } - 写入本地文件lib/store.js:38
await writeFile(temporary, text, { encoding: 'utf8', mode: 0o600, flag: 'wx' }); - 写入本地文件lib/store.js:39
await rename(temporary, path); - 删除本地文件lib/store.js:40
} finally { await rm(temporary, { force: true }).catch(() => {}); } - 读取本地文件lib/store.js:63
const raw = await readFile(indexFile, "utf8"); - 读取本地文件lib/store.js:73
for (const filename of await readdir(pendingDir)) { - 读取本地文件lib/store.js:77
const patch = JSON.parse(await readFile(join(pendingDir, filename), 'utf8')); - 读取本地文件lib/store.js:85
const pending = await readdir(pendingDir).catch(error => { if (error.code === 'ENOENT') return []; throw new ShareStoreError(); }); - 写入本地文件lib/store.js:94
await mkdir(root, { recursive: true, mode: 0o700 }); - 写入本地文件lib/store.js:104
await mkdir(pendingDir, { recursive: true, mode: 0o700 }); - 读取本地文件lib/store.js:129
const raw = await readFile(join(root, `${id}.json`), "utf8"); - 写入本地文件lib/store.js:148
await mkdir(root, { recursive: true, mode: 0o700 }); - 删除本地文件lib/store.js:176
await rm(join(pendingDir, id + '.json'), { force: true }); - 删除本地文件lib/store.js:188
await rm(join(root, `${id}.json`), { force: true }); - 删除本地文件lib/store.js:192
await rm(join(pendingDir, id + '.json'), { force: true }); - 读取本地文件lib/store.js:203
for (const name of await readdir(root)) if (name.endsWith(".json") && name !== "index.json") present.add(name.slice(0, -5)); - 读取本地文件lib/tunnel.js:83
have = statSync(target).size; - 发起网络请求lib/tunnel.js:92
const response = await fetch(url, { redirect: "follow", headers: have > 0 ? { range: `bytes=${have}-` } : {} }); - 写入本地文件lib/tunnel.js:108
await pipeline(source, createWriteStream(target, { flags: have > 0 ? "a" : "w" })); - 读取本地文件lib/tunnel.js:113
have = statSync(target).size; - 写入本地文件lib/tunnel.js:129
mkdirSync(directory, { recursive: true }); - 写入本地文件lib/tunnel.js:130
writeFileSync(join(directory, "public-base-url.txt"), `${url}\n`, "utf8"); - 读取本地文件lib/tunnel.js:167
const stats = statSync(binaryPath); - 写入本地文件lib/tunnel.js:172
mkdirSync(cacheDir, { recursive: true }); - 写入本地文件lib/tunnel.js:177
chmodSync(binaryPath, 0o755); - 读取本地文件lib/tunnel.js:190
if (statSync(binaryPath).size > 1024 * 1024) return "cloudflared"; - 发起网络请求lib/tunnel.js:204
const response = await fetch(`${url}/share/__reachability__`, { headers: { "user-agent": "dsh-share/1" } }); - 写入本地文件lib/tunnel.js:240
mkdirSync(cacheDir, { recursive: true }); - 执行外部命令来自配置/变量lib/tunnel.js:250
child = spawn(command, args, { stdio: ["ignore", "pipe", "pipe"], windowsHide: true }); - 读取本地文件install-safe.mjs:12
const version = JSON.parse(await readFile(join(source, 'package.json'), 'utf8')).version; - 读取本地文件install-safe.mjs:15
const raw = await readFile(manifestPath, 'utf8'); - 写入本地文件install-safe.mjs:20
await mkdir(backup, { recursive: true }); - 写入本地文件install-safe.mjs:21
await writeFile(join(backup, 'package.json'), raw); - 读取本地文件install-safe.mjs:24
try { patch = await readFile(patchPath, 'utf8'); await writeFile(join(backup, 'cordis.patch.yml'), patch); } - 写入本地文件install-safe.mjs:24
try { patch = await readFile(patchPath, 'utf8'); await writeFile(join(backup, 'cordis.patch.yml'), patch); } - 写入本地文件install-safe.mjs:29
await mkdir(target, { recursive: true }); - 读取本地文件install-safe.mjs:32
if (await realpath(source) !== await realpath(target)) for (const entry of releaseFiles) await cp(join(source, entry), join(target, entry), { recursiv - 写入本地文件install-safe.mjs:34
await mkdir(join(profile, 'node_modules'), { recursive: true }); - 读取本地文件install-safe.mjs:36
await lstat(link); - 读取本地文件install-safe.mjs:38
if (await realpath(link) !== await realpath(target)) { - 写入本地文件install-safe.mjs:49
await writeFile(nextManifest, JSON.stringify(manifest, null, 2) + '\n', { flag: 'wx' }); - 发起网络请求smoke-cloud.mjs:33
const page = await fetch(published.url, { signal: AbortSignal.timeout(12000), redirect: 'error' }); - 发起网络请求smoke-cloud.mjs:40
const check = await fetch(published.url, { method: 'HEAD', signal: AbortSignal.timeout(12000) }); - 读取本地文件test-client-flow.mjs:30
new Function('window','navigator','fetch',readFileSync(new URL('lib/client.js',import.meta.url),'utf8'))(window,navigator,fetch); - 删除本地文件递归test-default-publishing.mjs:44
await rm(root, { recursive: true, force: true }); - 写入本地文件test-install.mjs:12
const profile=join(home,'profiles','desktop');await mkdir(profile,{recursive:true}); - 写入本地文件test-install.mjs:14
await writeFile(join(profile,'package.json'),JSON.stringify(manifest));await writeFile(join(profile,'cordis.patch.yml'),'# keep user settings\n'); - 读取本地文件test-install.mjs:18
const result=JSON.parse(await readFile(join(profile,'package.json'),'utf8')); - 读取本地文件test-install.mjs:20
assert.equal(await readFile(join(profile,'cordis.patch.yml'),'utf8'),'# keep user settings\n'); - 读取本地文件test-install.mjs:21
assert.equal((await readdir(join(profile,'.dsh-share-backup'))).length,2); - 读取本地文件test-install.mjs:22
assert.equal(JSON.parse(await readFile(join(home,'plugins','dsh-share','package.json'),'utf8')).version,'0.5.0'); - 删除本地文件递归test-install.mjs:23
}finally{await rm(home,{recursive:true,force:true});} - 读取本地文件test-publication-journal.mjs:17
assert.ok(!(await readFile(join(root, 'index.json'), 'utf8')).includes('private-journal-key')); - 读取本地文件test-publication-journal.mjs:23
await assert.rejects(readFile(join(root, 'pending-publications', id + '.json')), { code: 'ENOENT' }); - 写入本地文件test-publication-journal.mjs:26
await writeFile(join(root, 'pending-publications', 'damaged12345.json'), '{invalid'); - 读取本地文件test-publication-journal.mjs:28
assert.equal(await readFile(join(root, 'pending-publications', 'damaged12345.json'), 'utf8'), '{invalid'); - 删除本地文件递归test-publication-journal.mjs:29
} finally { await rm(root, { recursive: true, force: true }); } - 删除本地文件递归test-reliability.mjs:28
finally {globalThis.fetch=oldFetch;if(oldHome===undefined)delete process.env.DSH_HOME;else process.env.DSH_HOME=oldHome;await rm(root,{recursive:true, - 删除本地文件test-reliability.mjs:76
await rm(join(root,'shares',id+'.json')); - 写入本地文件test-reliability.mjs:89
await writeFile(join(root,'index.json'),corrupt); - 读取本地文件test-reliability.mjs:91
assert.equal(await readFile(join(root,'index.json'),'utf8'),corrupt); - 读取本地文件test-reliability.mjs:94
if(process.platform!=='win32')assert.equal((await stat(join(root,rows[0].id+'.json'))).mode & 0o777,0o600); - 删除本地文件递归test-reliability.mjs:95
}finally{await rm(root,{recursive:true,force:true});} - 删除本地文件递归test-share-flow.mjs:115
await rm(root, { recursive: true, force: true }); - 删除本地文件递归test-trust-fence.mjs:29
await rm(root, { recursive: true, force: true });
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DSH 会话分享支持免账号的 1/3/7/30 天链接,本地脱敏,可随时撤销。
README
由 DeepSeek 最新模型翻译生成dsh-share 0.4.1
English · 下载 v0.4.1 · 反馈问题
把 DeepSeek Harness 对话生成可独立阅读的只读网页。新增 BrewPage 限时分享:不用注册额外账号,可选 1 天 / 3 天 / 7 天 / 30 天,发布成功后可以关闭 DSH 或电脑。
使用
1. 打开一段 DSH 对话,点击标题栏「分享」。
2. 先用「本机链接」预览内容,确认可以公开分享。
3. 在「BrewPage 分享有效期」中选择 1、3、7 或 30 天,默认 7 天。
4. 点击 「使用 BrewPage 限时分享」,只把快照上传至 brewpage.app。
5. 弹窗显示分享链接和服务端返回的到期时间。复制链接发送即可,对方无需账号,DSH 无需保持运行。
6. 回到原对话的分享弹窗可恢复链接或提前撤销。撤销失败时保留管理凭据,便于重试。
已有链接的有效期不会因再次点击而续期。要变更时长,先撤销再重新分享;已到期的记录可重新选择时长并发布。服务端执行有效期,不依赖本机定时器。有效期无法收回接收者已保存的副本。
验证状态
- BrewPage 已完成真实公网测试:选择 1 天、服务端返回匹配的到期时间、发布子进程退出后页面读取 200 且内容匹配、撤销后读取 404。
展开完整文档(README 剩余 1 节)
dsh-share 0.4.1 English · 下载 v0.4.1 · 反馈问题 把 DeepSeek Harness 对话生成可独立阅读的只读网页。新增 BrewPage 限时分享:不用注册额外账号,可选 1 天 / 3 天 / 7 天 / 30 天,发布成功后可以关闭 DSH 或电脑。 使用 1. 打开一段 DSH 对话,点击标题栏「分享」。 2. 先用「本机链接」预览内容,确认可以公开分享。 3. 在「BrewPage 分享有效期」中选择 1、3、7 或 30 天,默认 7 天。 4. 点击 「使用 BrewPage 限时分享」,只把快照上传至 brewpage.app。 5. 弹窗显示分享链接和服务端返回的到期时间。复制链接发送即可,对方无需账号,DSH 无需保持运行。 6. 回到原对话的分享弹窗可恢复链接或提前撤销。撤销失败时保留管理凭据,便于重试。 已有链接的有效期不会因再次点击而续期。要变更时长,先撤销再重新分享;已到期的记录可重新选择时长并发布。服务端执行有效期,不依赖本机定时器。有效期无法收回接收者已保存的副本。 验证状态 - BrewPage 已完成真实公网测试:选择 1 天、服务端返回匹配的到期时间、发布子进程退出后页面读取 200 且内容匹配、撤销后读取 404。 - 没有等待满 1 天验证自然过期;已核对官方 TTL 接口、实际请求和服务返回的 expiresAt。1 / 3 / 7 / 30 天均有接口及界面测试。 - 本地测试还覆盖不自动转传、同一快照复用不续期、修改有效期需先撤销、管理凭据过滤、撤销失败保留凭据、进程中断后的凭据恢复。 - DSH Share / HTML Hoster 旧通道保留。它们此前在本机分别遇到 Cloudflare 拦截、DNS 失败,不会在 BrewPage 失败后被自动调用。 - 本次公网测试仅使用程序生成的文字,未使用真实聊天记录。 安装 Desktop:在 DSH 的「添加插件」中粘贴: github:RestartBaiYe/dsh-share#v0.4.1 Web:使用正常的 DSH 插件管理器安装: dsh plugin --profile web add 'github:RestartBaiYe/dsh-share#v0.4.1' 也可在 Releases 下载 .tgz,将下载地址交给插件管理器。插件没有 npm 安装脚本或构建步骤。 下面的本地安装器供需要手动链接源码的用户使用: 已有 DSH Desktop profile 的用户双击 install-desktop.cmd,或运行: node install.mjs --profile desktop Web profile node install.mjs --profile web 支持 DSH_HOME / DSH_PROFILE_DIR。安装器不修改 app.asar,不删除原插件目录;旧插件和 profile 配置备份至 <profile>/.dsh-share-backup/<时间>/。安装后刷新 DSH 页面,必要时重启。 也可以通过 DSH 的插件管理安装本目录生成的 dsh-share-0.4.1.tgz。 配置 - id: dsh-share config: brewpageEnabled: true # 显示 BrewPage 按钮;有效期在分享时选择 relayUrl: "" # 可选:填写自行部署的中转地址 publishProvider: auto htmlhosterEnabled: true # 独立按钮,不参与默认流程 ttlDays: 0 # 原通道和本机快照的默认有效期 publicTunnel: false redactPaths: true includeReasoning: false includeTools: false maxMessages: 1000 插件不再内置任何个人账号或个人中转域名。未配置 relayUrl 时,中转按钮隐藏且请求被拒绝,不会回退上传至其他服务。BrewPage 和 HTML Hoster 仍需手动选择。publishProvider: none 禁用所有上传。brewpageEnabled: false 隐藏并禁用 BrewPage。BrewPage 本次选取的期限传给其服务端,原 ttlDays 配置不替代这项选择。配置了 ttlDays > 0 时 HTML Hoster 被禁用,因为该服务未提供可验证的自动到期机制。 分享与隐私 - 快照不会自动跟随新消息更新;只有点击具体服务的按钮才上传,也不会自动转传给另一家。 - BrewPage 使用每次随机生成的非 public 命名空间,避免进入其公开列表和站点地图;链接持有者仍可直接阅读。 - 默认不分享思考、工具输出、系统提示和内部会话 ID;标题和正文中的本地路径、用户名、IP 默认脱敏。自动脱敏不能识别所有秘密,应先预览。 - BrewPage 服务器返回的主分享链接原样使用;不会从内部 ID 猜测子域名。管理凭据只发给固定的 apex 删除接口,不发给内容子域名。 - 管理凭据保存在 $DSH_HOME/shares/index.json 或 pending-publications/ 恢复日志中,不返回给公开页面或分享列表;删除本机全部分享数据后无法恢复它们。 - 撤销会检查公开地址返回 404 / 410,未确认删除时保留凭据。第三方可能添加其标识,存储及可达性受其运营和网络限制影响。 - 「导出网页对话」仍可生成自包含 HTML 文件,直接发送并离线阅读。 BrewPage 官方文档:https://brewpage.app/llms-full.txt 。仅参考官方 HTTP 协议,未安装任何远程技能或脚本。 开发验证 npm test npm run test:cloud 真实公网测试,仅上传程序生成的演示文字,结束时撤销 node smoke-cloud.mjs --provider brewpage --ttl-days 1 cloud/ 是原 DSH Share 服务,relay/server.mjs 是可自行部署的 Node 中转。接入 BrewPage 不需要部署它们,也不需要账号或用户自有服务器。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
RestartBaiYe/dsh-share
把对话生成只读网页,免账号限时分享给他人
相关插件 · 对话 / 记忆
上下文中枢oceanbase/powercontext
上下文跟着工作走 —— 跨会话、跨智能体、跨人。
★ 1,489已汉化DSH
73.1
智能体记忆库plastic-labs/honcho
Honcho 是记忆基础设施,用来构建有状态的智能体。这些智能体能理解不断变化的人、智能体、群组、项目和想法。
★ 7,918已汉化DSH
71.7
长程智能体控制面loopx-project/loopx
给 Agent 一个目标,让工作持续向前。
★ 6,358已汉化DSH
71.3
智能体上下文数据库volcengine/OpenViking
给 AI 智能体用的上下文数据库
★ 41,453已汉化DSH
71.3
长效机器人团队Fei2411/DS-Bot
Download DS Bot for Windows 10/11 64-bit / 下载 Windows…
★ 5,293已汉化DSH
71.2
可携带记忆层EverMind-AI/EverOS
为什么选择 EverOS
★ 13,797已汉化DSH
71.1
这是你的仓库?认领条目