🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

对话分享 RestartBaiYe/dsh-share

DeepSeek Harness
RestartBaiYe10 天前有提交已提供中文文档扫描:含敏感能力

把对话生成只读网页,免账号限时分享给他人

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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 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 不需要部署它们,也不需要账号或用户自有服务器。
预览分享卡片长什么样 ↓RestartBaiYe/dsh-share
分享 · DeepSeek Harness Hub
RestartBaiYe/dsh-share

把对话生成只读网页,免账号限时分享给他人

这是你的仓库?认领条目

回到顶部