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

多账号切换 kuanaha1228-gif/dsh-workbuddy-switchaccount

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

记住多个 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
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 12 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
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 保留自上游。
预览分享卡片长什么样 ↓kuanaha1228-gif/dsh-workbuddy-switchaccount
分享 · DeepSeek Harness Hub
kuanaha1228-gif/dsh-workbuddy-switchaccount

记住多个 WorkBuddy 账号,随时一键切换免重登

回到顶部