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

多通道模型接入 ShanWuYinShe/dsh-plugins

DeepSeek 客户端
ShanWuYinShe5 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

免密接入多家桌面端与免费模型通道,开箱即用

31.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/29 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/ShanWuYinShe/dsh-plugins.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
本站尚未做安装检查
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 101 处,展示前 101 条)
  • 读取本地文件
    packages/dsh-any-connect/src/app-version.ts:77
    text = await readFile(plistPath, 'utf8')
  • 读取本地文件
    packages/dsh-any-connect/src/app-version.ts:144
    const saved: unknown = JSON.parse(await readFile(path, 'utf8'))
  • 读取本地文件
    packages/dsh-any-connect/src/auth-desktop-inspect.ts:24
    text = await readFile(desktopPath, 'utf8')
  • 读取本地文件
    packages/dsh-any-connect/src/auth-desktop-inspect.ts:45
    text = await readFile(desktopPath, 'utf8')
  • 读取本地文件
    packages/dsh-any-connect/src/auth-desktop-read.ts:37
    text = await readFile(desktopPath, 'utf8')
  • 读取本地文件
    packages/dsh-any-connect/src/auth-desktop-read.ts:57
    text = await readFile(desktopPath, 'utf8')
  • 删除本地文件
    packages/dsh-any-connect/src/auth-store.ts:260
    await rm(this.ownPath, { force: true })
  • 删除本地文件
    packages/dsh-any-connect/src/auth-store.ts:261
    await rm(`${this.ownPath}.lock`, { force: true })
  • 读取本地文件
    packages/dsh-any-connect/src/auth-store.ts:319
    return parseOwnDocument(await readFile(this.ownPath, 'utf8'))
  • 读取密钥环境变量
    packages/dsh-any-connect/src/auth-zcode-crypto.ts:52
    if (process.env.ZCODE_CREDENTIAL_SECRET) {
  • 读取密钥环境变量
    packages/dsh-any-connect/src/auth-zcode-crypto.ts:53
    secrets.push(process.env.ZCODE_CREDENTIAL_SECRET)
  • 读取本地文件
    packages/dsh-any-connect/src/auth-zcode.ts:139
    return parseZCodePlanSelection(readFileSync(join(dirname(desktopPath), 'setting.json'), 'utf8'))
  • 读取本地文件
    packages/dsh-any-connect/src/auth-zcode.ts:162
    const telemetry = JSON.parse(readFileSync(join(dirname(desktopPath), 'telemetry-state.json'), 'utf8')) as Record<string, unknown>
  • 读取本地文件
    packages/dsh-any-connect/src/auth-zcode.ts:174
    const persisted = readFileSync(fallbackPath, 'utf8').trim()
  • 读取本地文件
    packages/dsh-any-connect/src/auth-zcode.ts:180
    const legacy = readFileSync(legacyPath, 'utf8').trim()
  • 写入本地文件
    packages/dsh-any-connect/src/auth-zcode.ts:183
    mkdirSync(stateDir, { recursive: true, mode: 0o700 })
  • 写入本地文件
    packages/dsh-any-connect/src/auth-zcode.ts:184
    writeFileSync(fallbackPath, `${legacy}\n`, { mode: 0o600 })
  • 删除本地文件
    packages/dsh-any-connect/src/auth-zcode.ts:185
    rmSync(legacyPath, { force: true })
  • 写入本地文件
    packages/dsh-any-connect/src/auth-zcode.ts:196
    writeFileSync(fallbackPath, `${generated}\n`, { mode: 0o600 })
  • 写入本地文件
    packages/dsh-any-connect/src/catalog-store.ts:128
    mkdirSync(dirname(this.path), { recursive: true, mode: 0o700 })
  • 读取本地文件
    packages/dsh-any-connect/src/catalog-store.ts:154
    if (!existsSync(path)) return {}
  • 读取本地文件
    packages/dsh-any-connect/src/catalog-store.ts:155
    parsed = JSON.parse(readFileSync(path, 'utf8'))
  • 读取本地文件
    packages/dsh-any-connect/src/desktop-app-discovery.ts:86
    statSync(candidate)
  • 执行外部命令来自配置/变量
    packages/dsh-any-connect/src/desktop-at-rest-key.ts:298
    execFile(electronPath, [HELPER_SCRIPT_ARGUMENT_FLAG, HELPER_SCRIPT], {
  • 读取本地文件
    packages/dsh-any-connect/src/desktop-discovery-windows.ts:44
    if (statSync(candidate).isFile()) return candidate
  • 执行外部命令来自配置/变量
    packages/dsh-any-connect/src/desktop-discovery-windows.ts:76
    const child = execFile(regPath, ['query', root, '/s'], {
  • 读取本地文件
    packages/dsh-any-connect/src/desktop-discovery-windows.ts:202
    binaryStat = statSync(electronPath)
  • 读取本地文件
    packages/dsh-any-connect/src/desktop-discovery-windows.ts:209
    accessSync(electronPath, constants.X_OK)
  • 读取本地文件
    packages/dsh-any-connect/src/desktop-discovery-windows.ts:218
    version = readFileSync(join(installRoot, 'version'), 'utf8').trim()
  • 读取本地文件
    packages/dsh-any-connect/src/desktop-discovery-windows.ts:230
    if (!readdirSync(join(installRoot, 'resources')).includes('app.asar')) return undefined
  • 执行外部命令来自配置/变量
    packages/dsh-any-connect/src/desktop-discovery.ts:160
    const child = execFile(bin, [...args], { maxBuffer: maxBytes, timeout: WORKBUDDY_DISCOVERY_STEP_TIMEOUT_MS }, (error, stdout) => {
  • 读取本地文件
    packages/dsh-any-connect/src/desktop-discovery.ts:230
    if (options.wsl === true) return statSync(path).isFile()
  • 读取本地文件
    packages/dsh-any-connect/src/desktop-discovery.ts:231
    accessSync(path, constants.X_OK)
  • 写入本地文件
    packages/dsh-any-connect/src/host-heartbeat.ts:59
    await mkdir(dirname(workbuddyHostHeartbeatPath()), { recursive: true })
  • 写入本地文件
    packages/dsh-any-connect/src/host-heartbeat.ts:60
    await writeFile(workbuddyHostHeartbeatPath(), JSON.stringify(document), 'utf8')
  • 删除本地文件
    packages/dsh-any-connect/src/host-heartbeat.ts:69
    await rm(workbuddyHostHeartbeatPath(), { force: true })
  • 读取本地文件
    packages/dsh-any-connect/src/host-heartbeat.ts:79
    raw = await readFile(workbuddyHostHeartbeatPath(), 'utf8')
  • 执行外部命令固定命令
    packages/dsh-any-connect/src/host-heartbeat.ts:124
    const out = execFileSync(
  • 执行外部命令固定命令
    packages/dsh-any-connect/src/host-heartbeat.ts:150
    const out = execFileSync(
  • 读取本地文件
    packages/dsh-any-connect/src/model-filter-store.ts:31
    if (!existsSync(this.path)) return
  • 读取本地文件
    packages/dsh-any-connect/src/model-filter-store.ts:32
    const raw = readFileSync(this.path, 'utf8')
  • 读取本地文件
    packages/dsh-any-connect/src/model-filter-store.ts:67
    if (!existsSync(dir)) {
  • 写入本地文件
    packages/dsh-any-connect/src/model-filter-store.ts:68
    mkdirSync(dir, { recursive: true })
  • 读取本地文件
    packages/dsh-any-connect/src/probe-store.ts:134
    if (!existsSync(path)) return undefined
  • 读取本地文件
    packages/dsh-any-connect/src/probe-store.ts:137
    parsed = JSON.parse(readFileSync(path, 'utf8'))
  • 读取本地文件
    packages/dsh-any-connect/src/probe-store.ts:276
    if (!existsSync(directory)) mkdirSync(directory, { recursive: true })
  • 写入本地文件
    packages/dsh-any-connect/src/probe-store.ts:276
    if (!existsSync(directory)) mkdirSync(directory, { recursive: true })
  • 读取本地文件
    packages/dsh-any-connect/src/state-store.ts:208
    text = await readFile(sourcePath, 'utf8')
  • 删除本地文件
    packages/dsh-any-connect/src/state-store.ts:225
    await rm(sourcePath, { force: true })
  • 读取本地文件
    packages/dsh-any-connect/src/upstream-opencode.ts:702
    if (!existsSync(cachePath)) return undefined
  • 读取本地文件
    packages/dsh-any-connect/src/upstream-opencode.ts:703
    const text = readFileSync(cachePath, 'utf8')
  • 发起网络请求
    packages/dsh-any-connect/src/upstream-opencode.ts:872
    return fetch(endpoint, {
  • 发起网络请求
    packages/dsh-any-connect/src/upstream-opencode.ts:929
    const response = await fetch(OPENCODE_MODELS_URL, {
  • 发起网络请求
    packages/dsh-any-connect/src/upstream-workbuddy.ts:65
    fetch(`${chatBase(credential)}/v2/chat/completions`, {
  • 发起网络请求
    packages/dsh-any-connect/src/upstream-workbuddy.ts:114
    response = await fetch(`${chatBase(credential)}/v2/chat/completions`, {
  • 发起网络请求
    packages/dsh-any-connect/src/upstream-workbuddy.ts:139
    const response = await fetch(`${chatBase(credential)}/v2/plugin/auth/token/refresh`, {
  • 发起网络请求
    packages/dsh-any-connect/src/upstream-workbuddy.ts:180
    const response = await fetch(
  • 发起网络请求
    packages/dsh-any-connect/src/upstream-workbuddy.ts:242
    const response = await fetch(`${billingBase(credential)}/v2/billing/meter/get-user-resource`, {
  • 请求外部主机zcode.z.ai
    packages/dsh-any-connect/src/upstream-zcode-start-plan.ts:65
    fetch('https://zcode.z.ai/api/v1/zcode-plan/anthropic/v1/messages', {
  • 发起网络请求
    packages/dsh-any-connect/src/upstream-zcode-start-plan.ts:65
    fetch('https://zcode.z.ai/api/v1/zcode-plan/anthropic/v1/messages', {
  • 请求外部主机zcode.z.ai
    packages/dsh-any-connect/src/upstream-zcode-start-plan.ts:116
    const response = await fetch('https://zcode.z.ai/api/v1/zcode-plan/billing/balance', {
  • 发起网络请求
    packages/dsh-any-connect/src/upstream-zcode-start-plan.ts:116
    const response = await fetch('https://zcode.z.ai/api/v1/zcode-plan/billing/balance', {
  • 请求外部主机zcode.z.ai
    packages/dsh-any-connect/src/upstream-zcode-start-plan.ts:193
    const response = await fetch('https://zcode.z.ai/api/v1/zcode-plan/billing/balance', {
  • 发起网络请求
    packages/dsh-any-connect/src/upstream-zcode-start-plan.ts:193
    const response = await fetch('https://zcode.z.ai/api/v1/zcode-plan/billing/balance', {
  • 请求外部主机bigmodel.cn
    packages/dsh-any-connect/src/upstream-zcode.ts:98
    const response = await fetch('https://bigmodel.cn/api/monitor/usage/quota/limit', {
  • 发起网络请求
    packages/dsh-any-connect/src/upstream-zcode.ts:98
    const response = await fetch('https://bigmodel.cn/api/monitor/usage/quota/limit', {
  • 请求外部主机open.bigmodel.cn
    packages/dsh-any-connect/src/upstream-zcode.ts:130
    return fetch('https://open.bigmodel.cn/api/anthropic/v1/messages', {
  • 发起网络请求
    packages/dsh-any-connect/src/upstream-zcode.ts:130
    return fetch('https://open.bigmodel.cn/api/anthropic/v1/messages', {
  • 请求外部主机open.bigmodel.cn
    packages/dsh-any-connect/src/upstream-zcode.ts:170
    const response = await fetch('https://open.bigmodel.cn/api/paas/v4/models', {
  • 发起网络请求
    packages/dsh-any-connect/src/upstream-zcode.ts:170
    const response = await fetch('https://open.bigmodel.cn/api/paas/v4/models', {
  • 请求外部主机bigmodel.cn
    packages/dsh-any-connect/src/upstream-zcode.ts:240
    const response = await fetch('https://bigmodel.cn/api/biz/subscription/list', {
  • 发起网络请求
    packages/dsh-any-connect/src/upstream-zcode.ts:240
    const response = await fetch('https://bigmodel.cn/api/biz/subscription/list', {
  • 读取本地文件
    packages/dsh-any-connect/src/zcode-builtin-catalog.ts:123
    if (!existsSync(path)) continue
  • 读取本地文件
    packages/dsh-any-connect/src/zcode-builtin-catalog.ts:124
    const parsed = codingPlanWhitelistFromConfig(JSON.parse(readFileSync(path, 'utf8')) as unknown)
  • 发起网络请求
    packages/dsh-any-connect/src/zcode-plan-claim.ts:84
    const response = await fetch(buildPreviewUrl(info), {
  • 发起网络请求
    packages/dsh-any-connect/src/zcode-plan-claim.ts:153
    const response = await fetch(`${ZCODE_ACCOUNT_BASE}/api/v1/zcode-plan/billing/claim`, {
  • 发起网络请求
    packages/dsh-any-connect/src/zcode-signer.ts:132
    fetch(this.handshakeUrl, {
  • 发起网络请求
    packages/provider-usage/src/provider-shared.ts:41
    const response = await fetch(url, {
  • 读取本地文件
    packages/sandbox-extra-roots/src/common.ts:156
    return await stat(path, { bigint: true });
  • 读取本地文件
    packages/sandbox-extra-roots/src/config-store.ts:61
    if (!existsSync(file)) return undefined;
  • 读取本地文件
    packages/sandbox-extra-roots/src/config-store.ts:62
    const parsed = JSON.parse(readFileSync(file, "utf8"));
  • 读取本地文件
    packages/sandbox-extra-roots/src/config-store.ts:72
    if (!existsSync(file)) return;
  • 读取本地文件
    packages/sandbox-extra-roots/src/config-store.ts:74
    for (let index = 1; existsSync(target); index++) target = `${file}.imported.${index}`;
  • 写入本地文件
    packages/sandbox-extra-roots/src/config-store.ts:75
    renameSync(file, target);
  • 读取本地文件
    packages/sandbox-extra-roots/src/roots-filter.ts:24
    ok = statSync(root, { throwIfNoEntry: false })?.isDirectory() === true;
  • 读取本地文件
    packages/session-archive/src/archive-host-context.ts:89
    delay(REAPPEAR_SETTLE_MS).then(() => stat(path).then(
  • 读取本地文件
    packages/session-archive/src/archive-host-context.ts:163
    entries = await readdir(dir);
  • 读取本地文件
    packages/session-archive/src/archive-host-context.ts:172
    const info = await stat(candidate);
  • 读取本地文件
    packages/session-archive/src/archive-host-context.ts:192
    const info = await stat(candidate);
  • 读取本地文件
    packages/session-archive/src/archive-host-context.ts:213
    await stat(path);
  • 读取本地文件
    packages/session-archive/src/archive-host-mutations.ts:75
    let fresh: { size: number; mtimeMs: number } | null = await stat(path).then(
  • 读取本地文件
    packages/session-archive/src/archive-host-mutations.ts:87
    fresh = await stat(path).then(
  • 删除本地文件
    packages/session-archive/src/archive-host-mutations.ts:115
    await rm(path, { force: true });
  • 删除本地文件
    packages/session-archive/src/archive-host-mutations.ts:129
    await rm(path, { force: true });
  • 读取本地文件
    packages/session-archive/src/config-store.ts:61
    if (!existsSync(file)) return undefined;
  • 读取本地文件
    packages/session-archive/src/config-store.ts:62
    const parsed = JSON.parse(readFileSync(file, "utf8"));
  • 读取本地文件
    packages/session-archive/src/config-store.ts:72
    if (!existsSync(file)) return;
  • 读取本地文件
    packages/session-archive/src/config-store.ts:74
    for (let index = 1; existsSync(target); index++) target = `${file}.imported.${index}`;
  • 写入本地文件
    packages/session-archive/src/config-store.ts:75
    renameSync(file, target);
  • 读取本地文件
    packages/session-archive/src/session-scan.ts:46
    entries = await readdir(dir);
  • 删除本地文件递归
    packages/session-archive/src/session-scan.ts:62
    await rm(dir, { recursive: true, force: true });
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库
涉及外部主机:zcode.z.ai、bigmodel.cn、open.bigmodel.cn

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
dsh-plugins — DSH host 层插件集 DeepSeek Harness(DSH)host 层全局插件 monorepo,包含官方级能力的 host 插件与 Web client 扩展。 | 插件包 | 核心功能 | 当前版本 | 适配 DSH | | @chaoset/dsh-any-connect | 多渠道桌面端与免密模型接入:WorkBuddy(国内/国际版)、ZCode(Coding/Start Plan 双通道)、OpenCode Free 官方免密免费模型通道;支持思考强度自测与补全、积分倍率显示、图片多模态、自定义模型隐藏与 CLI 诊断 | 0.4.23 | 0.2.1-rc.3 | | @chaoset/provider-usage | 对话底栏模型额度指示器:在输入框状态栏(composer dock)实时显示当前会话 provider 剩余额度与重置时间,点击展开可视化进度条与详细计费包;内置 8+ 种 Provider 查询器并提供开放注册 Seam | 0.1.12 | 0.2.1-rc.3 |
展开完整文档(README 剩余 1 节)
dsh-plugins — DSH host 层插件集

DeepSeek Harness(DSH)host 层全局插件 monorepo,包含官方级能力的 host 插件与 Web client 扩展。

| 插件包 | 核心功能 | 当前版本 | 适配 DSH |
| @chaoset/dsh-any-connect | 多渠道桌面端与免密模型接入:WorkBuddy(国内/国际版)、ZCode(Coding/Start Plan 双通道)、OpenCode Free 官方免密免费模型通道;支持思考强度自测与补全、积分倍率显示、图片多模态、自定义模型隐藏与 CLI 诊断 | 0.4.23 | 0.2.1-rc.3 |
| @chaoset/provider-usage | 对话底栏模型额度指示器:在输入框状态栏(composer dock)实时显示当前会话 provider 剩余额度与重置时间,点击展开可视化进度条与详细计费包;内置 8+ 种 Provider 查询器并提供开放注册 Seam | 0.1.12 | 0.2.1-rc.3 |
| @chaoset/sandbox-extra-roots | 沙盒额外允许写入目录:为 workspace-write 沙盒安全追加工具缓存目录(npm/pip/cargo/go 等);跨平台 Seatbelt/bwrap/Landlock 原生沙盒引擎注入;严格防范危险根与 TOCTOU 符号链接逃逸 | 0.4.26 | 0.2.1-rc.3 |
| @chaoset/session-archive | 归档会话完整生命周期管理:Web 侧边栏专属归档面板与实时徽标;抽屉式只读浏览历史会话事件流;批量安全恢复到会话树;两段式彻底物理删除与落盘防竞态保护;纯前端毫秒级检索与排序 | 0.3.30 | 0.2.1-rc.3 |

插件特性详解

1. @chaoset/dsh-any-connect — 多渠道桌面端与免密模型接入

把各类桌面 AI Agent 与免密官方通道的模型接入 DSH,无需手动配置复杂的 API Key,开箱即用。

- 多上游通道无缝接入:
- WorkBuddy 国内版 (workbuddy):零配置自动读取本机桌面 App 登录态;深度支持 WorkBuddy 5.6+ 针对 accessToken/refreshToken 的 $wbEncrypted 加密信封(自动定位 macOS Bundle 或 Windows 注册表/安装目录的 Electron 二进制充当解密助手,亦支持 WORKBUDDY_ELECTRON_BIN 覆盖);支持图片多模态输入;模型选择器与 /model 弹窗直接标明积分倍率(如 · x0.79)与限免标签。
- WorkBuddy AI 国际版 (workbuddy-ai):独立接入国际版桌面 App,提供独立的「WorkBuddy AI」模型分组(GPT、Gemini 系列等)、独立凭据与账号积分卡片。
- ZCode Coding Plan (zcode):接入智谱 ZCode 桌面端 Coding Plan 官方渠道;按桌面端 setting.json 当前激活计划精准取用 API Key;以客户端本地内置白名单(zcode-builtin.json)动态约束模型,随客户端升级自动更新;支持 23:00–09:00 夜间免费时段自动识别与费率联动。
- ZCode Start Plan (zcode-start-plan):独立专属通道(zcode.z.ai/api/v1/zcode-plan/anthropic)与独立额度池;采用账号 JWT + 设备标识认证,扣减当日一次性 Token 包(过期不结转);每日领取活动自动探测并在设置卡片中醒目提醒(提供一键复制 Plan ID);动态跟随用户今日实际权益展示模型,未领取或过期如实隐藏。
- OpenCode Free (opencode-free):官方免密免费模型通道(Muse Spark 1.2/1.3、Qwen3.6 Plus、MiniMax 系列、Nemotron 3.5 Super VL、DeepSeek V4.1 Flash、Big Pickle 等);自动过闸标头与 read 只读工具守卫注入,解除 "free tier can only be used from within OpenCode" 网关限制;多协议实时流式转码(OpenAI Responses、Anthropic Messages、OpenAI-compatible Chat Completions 统一转为标准 OpenAI SSE 流,完整支持 reasoning_content 思考过程输出);自动读取本地官方 specs 缓存(~/.cache/opencode/models.json)决议精确上下文与多模态能力。
- 思考强度智能适配:
- 支持 low / medium / high / max 等思考等级选项,在 DSH 模型选择器即可切换;
- 后台全自动探测与补测未声明档位的模型;
- 对只能在思考态工作的模型(onlyReasoning),选择器「默认」档位智能补选最高档,OpenAI 通道补 reasoning_effort,Anthropic 通道补 thinking 预算对象并相应调整 max_tokens。
- 自定义模型管理与优雅体验:
- 设置页模型表格中支持点击删除图标自定义隐藏/排除不常用模型;
- 表格上方展示已排除模型统计,提供一键「恢复默认」入口;
- 完整展示模型名、费率倍率、真实与可选上下文窗口、思考档位与特性标签;
- 与 DSH 原生主题视觉完美融合,刷新与状态切换平滑无抖动。
- 独立诊断 CLI:
- 附带 dsh-any-connect doctor(体检凭据、加密格式、解密助手、心跳与模型数)、status、logout 命令,支持 --provider <id> 针对指定渠道排查。

2. @chaoset/provider-usage — 对话底栏模型剩余额度指示器

在对话区底部的状态栏(composer dock)直观显示当前会话 provider 的剩余额度、余额与重置周期。

- Composer Dock 状态栏原生呈现:
- 与 DSH 自带的 Token 消耗、步数、轮数指标并排展示,形如 workbuddy · 23 credits left、DeepSeek · ¥45.20、OpenRouter · $5.00 left;
- 额度来源与对话框当前所选模型同源(ctx.modelDirectories),切换模型即刻自动联动切换额度 pill。
- 交互式额度抽屉 (Popover):
- 点击底栏 pill 展开详细计费抽屉;
- 每个计费包配有字符级与图形化进度条(▓▓▓▓▓░░░░░ 23 / 100);
- 明确展示套餐名称、额度余量/总量、重置倒计时与阶梯限额。
- 全面的内置 Provider 查询器:
- DeepSeek:全面支持 DSH 0.2.1+ 官方的两条路由——deepseek-account(OAuth 账户余额与赠送代金券钱包)和 deepseek-official(API Key GET /user/balance 现金与代金券),亦兼容自定义 deepseek 路由;
- OpenRouter:/api/v1/key + /api/v1/credits,API Key 自身限额优先,回落到账户额度;
- Moonshot (Kimi):GET /v1/users/me/balance 可用余额、现金、代金券分列;
- SiliconFlow (硅基流动):GET /v1/user/info 总额、可用、充值分列;
- BigModel (智谱):GET /api/monitor/usage/quota/limit Coding Plan 滚动窗口与订阅套餐;
- MiniMax:GET /v1/token_plan/remains 5 小时滚动窗口与周额度窗口;
- OpenAI / OneAPI:GET /dashboard/billing/subscription 余额与限额用量;
- OpenCode / OpenCode Go:GET /usage 滚动、周、月窗口用量百分比。
- 开放查询器注册架构 (Seam):
- 宿主服务暴露 ctx.providerUsage,任何第三方 provider 插件均可通过 register() 挂载自有查询器(覆盖重写语义,支持热重载);
- @chaoset/dsh-any-connect 自动通过此机制注入 WorkBuddy 与 ZCode 的额度查询。
- 稳健的高可用设计:
- 绝不消耗额度:仅调用只读余额接口;
- 并发单飞与缓存:60s 本地缓存 + 并发单飞合并,多个组件读取共用一次请求;
- 敏感信息脱敏:请求失败保留上次成功快照,报错信息严格脱敏(过滤 JWT、sk- 密钥与 URL 参数凭据);
- 会话搁置自愈:防范窗口长期失焦休眠后的数据滞后,激活时具备唤醒恢复机制;
- 延迟就绪挂载:严格等待模型目录服务就绪后再注册 slot,杜绝宿主缓存 undefined 导致整页丢失 pill。

3. @chaoset/sandbox-extra-roots — 沙盒额外允许写入目录

为 DSH 的 workspace-write 沙盒模式安全追加用户指定的写入白名单,解决工具缓存无权写入的痛点。

- 解决开发痛点:
- DSH 的 workspace-write 沙盒模式默认严格限制命令仅能写入 workspace 根目录与系统 /tmp,使 npm、pip、cargo、go、uv 等工具的全局缓存因无权写入而报错。
- 追加式白名单:
- 官方安全白名单始终严格保留,只追加用户明确配置的额外允许写入目录。
- 跨平台原生沙盒多引擎适配:
- macOS:重构 Seatbelt (SBPL) profile,安全注入允许写入子路径;
- Linux:在官方 profile 基础上安全插入 bwrap --bind 与 Landlock --rw;
- Windows:识别 ACL runner 限制并提供清晰友好的单次告警;
- FS Fence:扩展 checkedTarget 文件系统围栏,对额外目录安全放行。
- 多层次安全防护:
- 绝对禁止危险根:严禁将 /、盘根、用户主目录本身及其父目录(如 /Users、/home)设为可写;
- 系统关键路径过滤:自动忽略操作系统核心目录(/etc、/usr、/bin、/sbin、/private);
- TOCTOU 符号链接防御:运行时动态解析软链接真实目标,一旦被替换为危险根立即剔除权限。
- 可视化配置与即时热生效:
- 设置页「插件配置」提供专属卡片,支持路径实时校验预览与错误提示;
- 预置常用工具缓存一键快速添加(npm / pip / cargo / go);
- 经官方 config-editor 直接保存到 cordis.patch.yml,修改即时热生效,无需重启。

4. @chaoset/session-archive — 归档会话完整生命周期管理

补全 DSH 仅有「归档动作」而缺失后续查看、恢复、检索与清理的断环,提供完整的会话归档管理。

- Web 侧边栏专属面板与动态徽标:
- 侧边栏底部添加「归档」图标入口;
- 徽标实时显示当前有效归档会话数量(轻量订阅 + 轮询兜底)。
- 历史会话只读抽屉浏览:
- 会话列表展示标题、原工作区路径、时间、占用磁盘大小;
- 点击任意会话可展开抽屉式只读浏览完整用户与助手消息,内置安全截断与字符保护,无需恢复即可回溯历史上下文。
- 批量一键安全恢复:
- 支持多选会话一键恢复到原工作区的会话树;
- 针对底层文件被删除等异常孤儿会话,返回逐条精确的原因诊断。
- 彻底物理删除与安全防竞态:
- 两段式防误删确认(首次点击进入确认态,4 秒内二次确认执行);
- 干净清理底层会话持久化数据与目录;
- 沉降观察窗检测:若会话正处于活跃生成落盘中,严正拒绝删除,防止数据损坏;
- 内存会话占位墓碑机制:防止删除后的内存残留会话复活,对内存尚未消亡的会话明确提示 needsRestart。
- 高效检索与状态记忆:
- 纯前端即时关键字搜索(标题、工作区路径、会话 ID);
- 多维度排序(修改时间、体积大小、标题名称);
- sessionStorage 状态记忆:刷新页面不丢失当前的搜索词与排序规则;
- 分页流式加载,海量归档会话渲染零卡顿。
- Remote API:
- 暴露 ctx.remote.sessionArchive(支持 list()、count()、detail(id)、delete(ids)、unarchive(ids))。

安装与使用

推荐用 DSH 自带的 dsh plugin 命令安装:它会自动调用 pnpm 安装依赖,把包加入 dsh.profile.bundles,再由 DSH 应用包内自带的 cordis.patch.yml 完成插件注册。

本仓库通过 GitHub Releases 分发。Release 资产是标准 npm tarball(命名规则:chaoset-<包名>-<版本>.tgz,tag 名 <包名>-v<版本>),公开仓库直接安装对应 URL 即可:

查看 Releases 列表获取最新版本:https://github.com/ShanWuYinShe/dsh-plugins/releases

1. 安装 @chaoset/dsh-any-connect(模型接入)
dsh plugin --profile web add https://github.com/ShanWuYinShe/dsh-plugins/releases/download/dsh-any-connect-v0.4.19/chaoset-dsh-any-connect-0.4.19.tgz

2. 安装 @chaoset/provider-usage(底栏额度显示)
dsh plugin --profile web add https://github.com/ShanWuYinShe/dsh-plugins/releases/download/provider-usage-v0.1.10/chaoset-provider-usage-0.1.10.tgz

3. 安装 @chaoset/sandbox-extra-roots(沙盒额外目录)
dsh plugin --profile web add https://github.com/ShanWuYinShe/dsh-plugins/releases/download/sandbox-extra-roots-v0.4.24/chaoset-sandbox-extra-roots-0.4.24.tgz

4. 安装 @chaoset/session-archive(归档会话管理)
dsh plugin --profile web add https://github.com/ShanWuYinShe/dsh-plugins/releases/download/session-archive-v0.3.28/chaoset-session-archive-0.3.28.tgz

从本地源码安装(开发调试时使用绝对路径)
dsh plugin --profile web add /absolute/path/to/dsh-plugins/packages/dsh-any-connect

卸载插件
dsh plugin --profile web remove @chaoset/dsh-any-connect
dsh plugin --profile web remove @chaoset/provider-usage
dsh plugin --profile web remove @chaoset/sandbox-extra-roots
dsh plugin --profile web remove @chaoset/session-archive

安装后重启 DSH harness(例如 dsh web)生效。

常见安装排障

- pnpm 供应链策略拦截安装:pnpm v11 默认拦截依赖的构建脚本,并启用「发布满 24 小时才可安装」策略。首次执行 dsh plugin add 若报错 pnpm failed:
1. 打开目标 profile 目录($DSH_HOME/profiles/<name>/pnpm-workspace.yaml);
2. 将 allowBuilds 占位的 set this to true or false 改为 true;
3. 将刚发布的 @chaoset/*@<版本> 加入 minimumReleaseAgeExclude 列表;
4. 重新执行一次 dsh plugin add 命令(首次失败时 bundle 对账未完成,必须重跑以完成注册)。
⚠️ 不要直接用 pnpm add 或手动写 profile 的 package.json:这样跳过了 bundle 对账,web 启动时会报 pending (waiting for service: remote.xxx)。

- pnpm store 漂移(宿主升级后安装报错,全部 profile 通用):宿主升级若更换了内置 pnpm 的大版本,每一个旧 profile 的 node_modules 都是上一版 pnpm 安装的——只要该 profile 执行过 dsh plugin add 就会报 ERR_PNPM_UNEXPECTED_STORE(use the new store location …):node_modules 里的 .modules.yaml 记录着旧 store 位置,与新 pnpm 解析出的不一致。逐 profile 修复,对每个受影响的 profile 各做一遍:

修复就是删掉重装(node_modules 是纯安装产物,删掉连旧 store 记录一起归零;插件配置在 cordis.patch.yml,不受影响):

rm -rf $DSH_HOME/profiles/<name>/node_modules
dsh plugin --profile <name> add <同一个 tarball URL>

一次 plugin add 会按 package.json 把该 profile 已装的全部插件一并装回,store 位置直接写对。(2026-10-24 实测:宿主 0.2.1-rc.3 内置 pnpm v11.28.5,web 与 desktop 两个 profile 各用一条命令重装四包;修复后核对 node_modules/.modules.yaml 的 storeDir 应指向 $DSH_HOME 内。)

给 AI Agent

若由 AI Agent 代为在环境中安装,请直接执行 dsh plugin ... 命令,严禁手动编辑 cordis.patch.yml:
1. 确认 dsh 与 pnpm 已在 PATH 中;
2. 确定目标配置档(默认为 web);
3. 执行 dsh plugin --profile web add <tarball URL>;
4. 验证安装:dsh plugin --profile web list 或 dsh --profile web --dump-config | grep chaoset;
5. 重启 DSH。

开发

本项目用 Bun 作为包管理器(由根目录 packageManager 锁定),所有包源码均用 TypeScript 开发。

bun install # 安装依赖(切分支后记得重新 install)
bun run build # 全仓构建:tsc 编译 host (src/ -> lib/),esbuild 打包 client
bun run typecheck # 类型检查:host + client 两套 tsconfig --noEmit
bun run test # 运行 vitest 单元与集成测试
bun run test:ci # build + typecheck + test 门禁验证(提交/发版前必跑)
bun run dsh-status # 核对本地依赖基线 vs DSH 上游稳定/预发布线
bun run gate # 发布门禁干跑(检查 tag 与待发布包)
bun run audit # 依赖漏洞审计(基于 OSV.dev)

分支与版本规范

- 双分支跟随策略:
- 待命期(DSH 处于稳定线):无 alpha 分支,所有功能与修复直接在 main 分支推进,版本号为纯 semver 正式版(如 0.4.19),发布正式 Release。
- 活跃期(DSH 开启高于当前正式版的新 -alpha 线):从 main 拉出 alpha 分支,版本号为 -alpha.N(进 rc 后换 -rc.N),发布预发布 Release。
- 收敛期:DSH 发完最新 rc 正式转正后,在 alpha 适配去后缀转正,压缩合入 main,发正式 Release 并彻底删除 alpha 分支。
- 完整的发布流程、推送门禁与分支纪律详见 RELEASING.md。
预览分享卡片长什么样 ↓ShanWuYinShe/dsh-plugins
分享 · DeepSeek Harness Hub
ShanWuYinShe/dsh-plugins

免密接入多家桌面端与免费模型通道,开箱即用

这是你的仓库?认领条目

回到顶部