dsh-no-login
DSH(DeepSeek Harness)插件:移除 DeepSeek 账号登录功能。
A DeepSeek Harness plugin that removes DeepSeek account sign-in: no account menu, no account settings page, no first-run sign-in step, no
DeepSeek Accountmodel route.
装好之后,界面上不再有任何登录入口:
- 侧边栏底部的账号菜单(头像 / 登录 / 退出登录)
- 设置 → 「账号与余额」整页(充值余额、赠金余额、查询用量、充值)
- 首次启动引导里的「登录 DeepSeek 账号 / 添加 API Key」选择与额度引导
- 模型选择器里的
DeepSeek Account路由(用平台账号余额计费的那条) - 浏览器 OAuth 回调路由
/oauth/callback、赠金到账弹窗、登录失效提示
API Key 路由与第三方/网关路由完全不受影响。
实现方式
账号功能在 Harness 里不是一个开关,而是分散在四个出厂插件行里(Host 的 OAuth 提供者、RPC 控制器、模型路由,以及浏览器端的账号界面),没有任何一个对外暴露"关闭登录"的配置项。因此本插件是一个 bundle:
cordis.patch.yml把四个账号行置为disabled: true:行 id 插件 deepseek-account@deepseek-ai/dsh-deepseek-account-platformaccount-controller@deepseek-ai/dsh-api-account-controllerllm-deepseek-account@deepseek-ai/dsh-llm-deepseek-accountui-settings-account@deepseek-ai/dsh-client-ui-settings-account同一补丁插入本包的行
no-login,lib/index.js向 Cordis 提供一个永远未登录的deepseekAccount替身服务:读操作直接返回{ status: 'signed-out', attempt: null, links: {} }且不发任何网络请求,startSignIn()抛SIGN_IN_DISABLED,resolveToken()恒为undefined。
之所以需要替身而不是让服务消失:@deepseek-ai/dsh-client-product-analytics(产品遥测)对 deepseekAccount 是硬注入,服务彻底消失会让它一直停在 pending。该行只在 desktop profile 启用,Web profile 下本来就不加载,所以替身在 Web 上是纯保险。替身只在内存里,遥测拿到的 getDeviceIdentity() 只有 osVersion,没有 deviceId 与 userId。
- 插件加载时删除凭证库里遗留的
deepseek-account-platform/default授权记录——登录入口既已不存在,那份仍可用的平台会话 token 只会扩大暴露面。设备标识(deepseek-account-platform/device)与所有 API Key 一律不动。
安装
plugin_manager install_bundle target=<本目录绝对路径>
安装后插件行出现在设置 → 插件中,名称为「禁用登录」。改完无需重启:profile 的补丁层是 live reload 的,浏览器端刷新一次页面即可看到账号入口消失。
从 GitHub 安装:
git clone https://github.com/SwufeFox/dsh-no-login.git
再把 plugin_manager install_bundle 的 target 指向克隆下来的目录(profile 里是目录链接,之后 git pull 即更新)。
测试
node --test test/no-login.test.mjs
测试用假的 Cordis context 加载 lib/index.js,断言:
deepseekAccount被提供,且getState / getProfile / getBalance / getUnnotifiedBonuses / ackBonusNotified / cancelSignIn / signOut / getPlatformSession / resolveToken / rejectToken全部按"未登录"返回;startSignIn()以SIGN_IN_DISABLED拒绝,任何路径都无法发起授权;watch()只吐一次未登录状态后结束;- 只删除
deepseek-account-platform/default,不碰其它凭证。
已验证
在 DSH 0.2.1-rc.5 / web profile 上装好后实测:
dsh --profile web --dump-config:四行均为disabled: true,no-login行在列;- 插件清单里本 bundle 的
overrides正好是那四行,installed / enabled均为 true; - Host 运行态:四个账号行状态
inactive,no-login行已加载; - 浏览器运行态(Client Slot 查询):
settings.launcher占用者为空(账号菜单消失)、settings.section不再包含账号页、settings.models.sign-in占用者为空; GET /oauth/callback返回404,回调路由确实没有注册。
已知取舍
profile 级插件:装进某个 profile 后对该 profile 的所有会话生效。
首次启动引导与登录界面写在同一个 Client 插件里,所以装了这个 bundle 之后整条 onboarding 都没有了(欢迎页、额度引导一并消失),不只是登录那一步。
移除登录不等于移除模型:模型选择器里仍有 API Key 与第三方路由的模型,只是没有
DeepSeek Account那一组。只覆盖 Web / 桌面这类带 profile 的组合。上游若把账号功能拆成新的行 id,需要同步更新
cordis.patch.yml。不要单独停用插件行
no-login:它本身不创建任何界面,但停用后deepseekAccount服务会一起消失。恢复登录请按 bundle 级别停用或直接卸载:plugin_manager remove_bundle target=dsh-no-login移除后四行恢复启用,登录入口回归;账号相关的本地授权记录已在安装时清掉,需要重新登录一次。
文件
| 文件 | 作用 |
|---|---|
package.json |
包清单:dsh.bundle.patch 指向补丁 |
cordis.patch.yml |
禁用四个账号行并插入本包行 |
lib/index.js |
Host 侧未登录替身服务 + 清理遗留授权 |
locale/*.json |
插件列表中的标题与描述 |
icon.svg |
插件图标 |
test/no-login.test.mjs |
替身服务的单元测试 |
License
MIT © Magixyne
No comments yet. Be the first to write one.