多账号切换 kuanaha1228-gif/dsh-workbuddy-switchaccount
DeepSeek Harness记住多个 WorkBuddy 账号,随时一键切换免重登
31.3/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/22 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add kuanaha1228-gif/dsh-workbuddy-switchaccount该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · model
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 12 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 75 处,展示前 53 条)
- 读取本地文件lib/index.js:71
document = JSON.parse(await readFile(this.path, "utf8")); - 读取本地文件lib/index.js:331
if (existsSync(this.path)) try { - 读取本地文件lib/index.js:332
const parsed = JSON.parse(readFileSync(this.path, "utf8")); - 读取本地文件lib/index.js:373
if (!existsSync(directory)) mkdirSync(directory, { recursive: true }); - 写入本地文件lib/index.js:373
if (!existsSync(directory)) mkdirSync(directory, { recursive: true }); - 写入本地文件lib/index.js:379
writeFileSync(temporary, `${JSON.stringify(document, null, 2)}\n`, { mode: 384 }); - 写入本地文件lib/index.js:380
renameSync(temporary, this.path); - 读取本地文件lib/index.js:452
if (existsSync(this.path)) try { - 读取本地文件lib/index.js:453
const parsed = JSON.parse(readFileSync(this.path, "utf8")); - 写入本地文件lib/index.js:493
if (!existsSync(directory)) mkdirSync(directory, { recursive: true }); - 写入本地文件lib/index.js:499
writeFileSync(temporary, `${JSON.stringify(document, null, 2)}\n`, { mode: 384 }); - 写入本地文件lib/index.js:500
renameSync(temporary, this.path); - 写入剪贴板lib/client.js:151
await navigator.clipboard.writeText(text); - 发起网络请求lib/client.js:1270
const response = await fetch(variant.statusPath, { - 发起网络请求lib/client.js:1343
const response = await fetch(variant.probePath, { - 发起网络请求lib/client.js:1388
const response = await fetch(variant.probePath, { - 发起网络请求lib/client.js:1984
const response = await fetch(WORKBUDDY_STATUS_PATH, { - 发起网络请求lib/client.js:2025
const response = await fetch(WORKBUDDY_PROBE_PATH, { - 发起网络请求lib/client.js:2265
const response = await fetch(card.statusPath, { - 写入剪贴板lib/client.js:2840
await navigator.clipboard.writeText(prompt); - 读取本地文件lib/version-resolve-Ddm_cZUk.js:65
text = await readFile(plistPath, "utf8"); - 读取本地文件lib/version-resolve-Ddm_cZUk.js:125
const saved = JSON.parse(await readFile(path, "utf8")); - 读取本地文件lib/version-resolve-Ddm_cZUk.js:218
document = JSON.parse(await readFile(cliPackagePath(bundle), "utf8")); - 读取本地文件lib/version-resolve-Ddm_cZUk.js:319
const saved = JSON.parse(await readFile(savedPath, "utf8")); - 发起网络请求lib/version-resolve-Ddm_cZUk.js:1098
response = await fetch(`${chatBase(credential)}/v2/chat/completions`, { - 发起网络请求lib/version-resolve-Ddm_cZUk.js:1129
const response = await fetch(`${chatBase(credential)}/v2/plugin/auth/token/refresh`, { - 发起网络请求lib/version-resolve-Ddm_cZUk.js:1183
const response = await fetch(`${chatBase(credential)}/v3/config`, { - 发起网络请求lib/version-resolve-Ddm_cZUk.js:1223
const response = await fetch(`${chatBase(credential)}/console/enterprises/personal/models`, { - 发起网络请求lib/version-resolve-Ddm_cZUk.js:1280
const response = await fetch(`${billingBase(credential)}/v2/billing/meter/get-user-resource`, { - 发起网络请求lib/version-resolve-Ddm_cZUk.js:1346
const response = await fetch(`${CN_BILLING_BASE}/v2/billing/meter/get-enterprise-user-usage`, { - 执行外部命令来自配置/变量lib/version-resolve-Ddm_cZUk.js:2423
const child = execFile(bin, [...args], { - 执行外部命令来自配置/变量lib/version-resolve-Ddm_cZUk.js:2508
const child = execFile(regPath, [ - 执行外部命令来自配置/变量lib/version-resolve-Ddm_cZUk.js:2564
const child = execFile(powershellPath, [ - 执行外部命令来自配置/变量lib/version-resolve-Ddm_cZUk.js:2684
execFile(file, args, { - 读取本地文件lib/version-resolve-Ddm_cZUk.js:2901
statSync(candidate); - 执行外部命令来自配置/变量lib/version-resolve-Ddm_cZUk.js:3008
execFile(electronPath, [HELPER_SCRIPT_ARGUMENT_FLAG, HELPER_SCRIPT], { - 读取本地文件lib/version-resolve-Ddm_cZUk.js:3132
binaryStat = statSync(electronPath); - 删除本地文件lib/version-resolve-Ddm_cZUk.js:3554
await rm(this.ownPath, { force: true }); - 删除本地文件lib/version-resolve-Ddm_cZUk.js:3555
await rm(`${this.ownPath}.lock`, { force: true }); - 写入本地文件lib/version-resolve-Ddm_cZUk.js:4634
await writeFile(workbuddyHostHeartbeatPath(), JSON.stringify(document), "utf8"); - 删除本地文件lib/version-resolve-Ddm_cZUk.js:4640
await rm(workbuddyHostHeartbeatPath(), { force: true }); - 执行外部命令固定命令lib/version-resolve-Ddm_cZUk.js:4708
const token = execFileSync("wmic", [ - 写入本地文件lib/lib-D_mlMAwT.js:36
await rename(temp, filename); - 写入本地文件lib/lib-D_mlMAwT.js:63
await mkdir(dirname(filename), { - 写入本地文件lib/lib-D_mlMAwT.js:69
await writeFile(temp, content, { - 删除本地文件lib/lib-D_mlMAwT.js:75
await rm(temp, { force: true }); - 读取本地文件lib/lib-D_mlMAwT.js:85
await lstat(lockPath); - 读取本地文件lib/lib-D_mlMAwT.js:107
return await readFile(lockPath, "utf8"); - 写入本地文件lib/lib-D_mlMAwT.js:127
await writeFile(claim, `${process.pid}\n`, { - 删除本地文件lib/lib-D_mlMAwT.js:139
await rm(lockPath, { force: true }); - 删除本地文件lib/lib-D_mlMAwT.js:145
await rm(claim, { force: true }).catch((error) => {}); - 写入本地文件lib/lib-D_mlMAwT.js:197
await writeFile(lockPath, `${process.pid}\n`, { - 删除本地文件lib/lib-D_mlMAwT.js:216
await rm(lockPath, { force: true });
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-atomic-write@deepseek-ai/dsh-attachment@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-model-selection@deepseek-ai/dsh-client-ui-plugin-manager@deepseek-ai/dsh-client-ui-settings-plugins@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-credentials@deepseek-ai/dsh-authorization给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
一个仓库,用于 workbuddy 应用的多账号连接
README
由 DeepSeek 最新模型翻译生成DSH WorkBuddy 多账号版
把 WorkBuddy 桌面 App 的模型接进 DeepSeek Harness,并支持记住多个账号、随时切换。
原版一次只能用一个 WorkBuddy 账号:切走之后旧账号的令牌就丢了,想切回去只能重新登录。
这个版本把登录过的账号都记下来,随时切回,不用重新扫码。
装之前先确认
| 要求 | 说明 |
| DeepSeek Harness | 内核版本 0.2.1-rc.2 |
| Node.js | 22 或更高 |
| 网络 | 需要能访问 npm(装一个依赖 @earendil-works/pi-ai) |
| WorkBuddy | 已登录过至少一次(插件复用它的登录态) |
不确定自己的版本?装完在 DSH 的 设置 → 插件 里能看到版本号。
安装
打开 PowerShell,粘贴这一行:
dsh plugin --profile desktop add github:kuanaha1228-gif/dsh-workbuddy-connect-accounts
desktop 是你的 profile 名。不确定的话,看 DSH 设置 → 插件 页顶部的 profile 名字。
展开完整文档(README 剩余 1 节)
DSH WorkBuddy 多账号版 把 WorkBuddy 桌面 App 的模型接进 DeepSeek Harness,并支持记住多个账号、随时切换。 原版一次只能用一个 WorkBuddy 账号:切走之后旧账号的令牌就丢了,想切回去只能重新登录。 这个版本把登录过的账号都记下来,随时切回,不用重新扫码。 装之前先确认 | 要求 | 说明 | | DeepSeek Harness | 内核版本 0.2.1-rc.2 | | Node.js | 22 或更高 | | 网络 | 需要能访问 npm(装一个依赖 @earendil-works/pi-ai) | | WorkBuddy | 已登录过至少一次(插件复用它的登录态) | 不确定自己的版本?装完在 DSH 的 设置 → 插件 里能看到版本号。 安装 打开 PowerShell,粘贴这一行: dsh plugin --profile desktop add github:kuanaha1228-gif/dsh-workbuddy-connect-accounts desktop 是你的 profile 名。不确定的话,看 DSH 设置 → 插件 页顶部的 profile 名字。 装完完全退出 DSH 再打开 —— 不是关窗口,是右键托盘图标选「退出」,或者在任务管理器里结束所有 DeepSeek Harness 进程。 如果上面那条装不上 改用本地包方式,更稳: 1. 下载并解压 git clone https://github.com/kuanaha1228-gif/dsh-workbuddy-connect-accounts.git cd dsh-workbuddy-connect-accounts 2. 打包成 tgz npm pack 3. 装 dsh plugin --profile desktop add "file:./kuanaha1228-gif-dsh-workbuddy-connect-accounts-0.7.9.tgz" 怎么用 登录账号 设置 → 插件 → 展开卡片,点登录按钮,跳到 WorkBuddy 网页登录。 登录过的账号会自动进档案,不用额外操作。 想加第二个账号,在同一步再登录一次另一个账号即可 —— 两个都会留在档案里。 切换账号 两个地方都能切,改的是同一份状态: | 位置 | 适合 | | 输入框右侧的下拉框 | 日常快速切换,和选模型并排,向上弹出 | | 设置 → 插件 → 账号列表 | 管理账号,可切换、可移除 | 下拉框只在你登录了 2 个以上账号时才出现;只有一个账号时自动隐藏,不占位置。 移除账号 设置 → 插件 → 账号列表,点对应账号的「移除」。 移除只删本地档案,不影响 WorkBuddy 桌面 App 自己的登录。 常见问题 账号会丢吗? 不会。账号档案存在 ~/.dsh/.workbuddy-accounts-workbuddy.json,不在插件目录里,所以升级、重装、覆盖代码都不影响它。 能同时用多个账号的模型吗? 不能。同一时间只有一个账号生效,但这个账号可以随时换。 装完插件页没有账号卡片? 按顺序检查: 1. 是否完全退出了 DSH 再开(关窗口不算) 2. 设置 → 插件里,dsh-workbuddy-switchaccount 的开关是否为「运行中」 3. 如果之前装过 dsh-workbuddy-connect,必须先禁用它 —— 两者注册相同的 provider id,不能同时开 和原版 dsh-workbuddy-connect 能一起用吗? 不能。本插件是它的多账号分支,注册的是同一组 provider id(workbuddy、workbuddy-ai)。 在 profile 的 cordis.patch.yml 里把原版设成 disabled: true,或者直接卸载原版。 升级 DSH 之后不能用了? 本插件针对内核 0.2.1-rc.2 构建。DSH 内核升级后如果 API 变了,等本仓库更新。 可以先用 npm view @deepseek-ai/dsh-llm version 看内核包版本是否还匹配。 数据与隐私 - 账号档案存在本机,权限 0600,不会上传到任何地方 - 插件只把 WorkBuddy 的令牌存在本地,用来调用它自己的接口 - 状态接口只返回昵称、uid、到期时间,从不返回令牌本身 - 切换账号不会改动 WorkBuddy 桌面 App 自己的登录文件 设置项 | 环境变量 | 作用 | | DSH_WORKBUDDY_HOME | 覆盖 DSH 配置目录(默认 ~/.dsh) | 它是怎么做的 | 文件 | 作用 | | lib/index.js | Host 侧:注册模型提供方、处理账号档案、提供状态与切换接口 | | lib/client.js | 浏览器侧:设置卡片、工作台账号下拉框、推理档位探测 | | cordis.patch.yml | 向 profile 注册插件入口 | | lib/version-resolve-*.js | 内联的版本兼容层 | lib/ 是构建产物,直接提交进仓库 —— 这样 dsh plugin add github:… 不需要在你的机器上跑构建工具。 致谢 - corrinehu/dsh-workbuddy-connect —— 原始插件 - Sliverkiss/workbuddy2api —— 协议参考 许可证 MIT。LICENSE 与 THIRD_PARTY_NOTICES.txt 保留自上游。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
kuanaha1228-gif/dsh-workbuddy-switchaccount
记住多个 WorkBuddy 账号,随时一键切换免重登
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个给…
★ 761已汉化DSH
68.7
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 379已汉化DSH
67.8
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1