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

用量统计与 OAuth 网关 lninghaha/dsh-hub-oauth-gateway

DeepSeek Harnessv1.13.4
lninghaha50 天前有提交已提供中文文档扫描:含敏感能力

统计 Token 成本与配额,接入编码订阅 OAuth 并转发 API

30.7/100
综合分
1
GitHub 星标
726
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-hub-oauth-gateway
npm 源 · dsh-hub-oauth-gateway 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/10/25·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 50 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-hub-oauth-gateway @ 1.13.4
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/12 15:06:02

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 61 处,展示前 45 条)
  • 请求外部主机json-schema.org
    lib/client.js:68
    Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let a of e.seen.entries()){let s=a[1];if(t===a[0]){i(a);continu
  • 请求外部主机json-schema.org
    lib/client.js:68
    Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let a of e.seen.entries()){let s=a[1];if(t===a[0]){i(a);continu
  • 请求外部主机json-schema.org
    lib/client.js:68
    Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let a of e.seen.entries()){let s=a[1];if(t===a[0]){i(a);continu
  • 请求外部主机json-schema.org
    lib/client.js:68
    Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let a of e.seen.entries()){let s=a[1];if(t===a[0]){i(a);continu
  • 请求外部主机json-schema.org
    lib/client.js:68
    Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let a of e.seen.entries()){let s=a[1];if(t===a[0]){i(a);continu
  • 请求外部主机json-schema.org
    lib/client.js:68
    Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let a of e.seen.entries()){let s=a[1];if(t===a[0]){i(a);continu
  • 发起网络请求
    lib/client.js:68
    Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let a of e.seen.entries()){let s=a[1];if(t===a[0]){i(a);continu
  • 发起网络请求
    lib/bin.js:8228
    stream = session.request(headers, { endStream: false, signal });
  • 发起网络请求
    lib/bin.js:8248
    stream = session.request(headers, { endStream: false, signal });
  • 发起网络请求
    lib/bin.js:8306
    stream = session.request(headers, { endStream: shouldEndStream, signal });
  • 发起网络请求
    lib/bin.js:8310
    stream = session.request(headers, {
  • 读取本地文件
    lib/bin.js:25920
    text = await readFile(filename, "utf8");
  • 读取本地文件
    lib/bin.js:26000
    listed = await lstat(path);
  • 写入本地文件
    lib/bin.js:26448
    await mkdir(dirname(this.filename), { recursive: true, mode: 448 });
  • 删除本地文件
    lib/bin.js:26464
    await rm(this.filename, { force: true });
  • 写入本地文件
    lib/bin.js:26554
    await mkdir(dirname(this.filename), { recursive: true, mode: 448 });
  • 删除本地文件
    lib/bin.js:26555
    await withFileLock(this.filename, () => rm(this.filename, { force: true }));
  • 发起网络请求
    lib/bin.js:27188
    response = await fetch(new URL(DISCOVERY_PATH, approvedIssuer).href, {
  • 发起网络请求
    lib/bin.js:27406
    response = await fetch(tokenEndpoint, {
  • 写入本地文件
    lib/bin.js:27643
    await mkdir2(dirname2(file), { recursive: true, mode: 448 });
  • 读取本地文件
    lib/bin.js:27645
    const old = JSON.parse(await readFile2(file, "utf8"));
  • 写入本地文件
    lib/bin.js:27648
    await copyFile(file, `${file}.pre-selection-mode`, constants2.COPYFILE_EXCL);
  • 写入本地文件
    lib/bin.js:27649
    await chmod(`${file}.pre-selection-mode`, 384);
  • 读取本地文件
    lib/bin.js:27764
    this.selectedIds = parseCache(await readFile3(this.cacheFile, "utf8"));
  • 写入本地文件
    lib/bin.js:27822
    await mkdir3(dirname3(this.cacheFile), { recursive: true, mode: 448 });
  • 删除本地文件
    lib/bin.js:27823
    await rm2(this.cacheFile, { force: true });
  • 读取本地文件
    lib/bin.js:28201
    const cache = parseCache2(await readFile4(this.cacheFile, "utf8"));
  • 删除本地文件
    lib/bin.js:28274
    await rm3(this.cacheFile, { force: true });
  • 执行外部命令来自配置/变量
    lib/bin.js:28299
    const child = spawn(command.file, command.args, {
  • 读取本地文件
    scripts/install.mjs:34
    const sourcePackage = JSON.parse(await readFile(join(sourceRoot, "package.json"), "utf8"));
  • 读取本地文件
    scripts/install.mjs:96
    return await readFile(path, "utf8");
  • 读取本地文件
    scripts/install.mjs:112
    await access(source);
  • 写入本地文件
    scripts/install.mjs:116
    await mkdir(dirname(destination), { recursive: true });
  • 读取本地文件
    scripts/install.mjs:118
    const existing = await lstat(destination);
  • 删除本地文件递归
    scripts/install.mjs:119
    if (existing.isSymbolicLink() || existing.isDirectory()) await rm(destination, { recursive: true, force: true });
  • 写入本地文件
    scripts/install.mjs:197
    await mkdir(dirname(path), { recursive: true });
  • 删除本地文件
    scripts/install.mjs:198
    await rm(temporary, { force: true });
  • 写入本地文件
    scripts/install.mjs:200
    await writeFile(temporary, value, "utf8");
  • 写入本地文件
    scripts/install.mjs:201
    await rename(temporary, path);
  • 删除本地文件
    scripts/install.mjs:203
    await rm(temporary, { force: true });
  • 删除本地文件递归
    scripts/install.mjs:208
    await rm(installed, { recursive: true, force: true });
  • 写入本地文件
    scripts/install.mjs:209
    if (backup !== null) await rename(backup, installed);
  • 删除本地文件
    scripts/install.mjs:213
    if (previous === null) await rm(path, { force: true });
  • 写入本地文件
    scripts/install.mjs:252
    await mkdir(dirname(target), { recursive: true });
  • 删除本地文件递归
    scripts/install.mjs:253
    await rm(staging, { recursive: true, force: true });
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
涉及外部主机:json-schema.org

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-layout@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-sidebar@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-atomic-write@deepseek-ai/dsh-attachment@deepseek-ai/dsh-client-web@deepseek-ai/dsh-credentials
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 统计Token成本与配额
  • 接入编码套餐OAuth

DSH Web 插件:用量中心,带 Hub 快照与成本分析、编码套餐 OAuth,以及可选的回环 OpenAI 兼容网关

v1.13.62026-10-23
· 修复 · 安装时通过 engines.dsh 加 SemVer 对等版本范围,接受 DSH 0.1.x–0.2.x(与订阅 #51 对齐)。已验证构建 BOM 仍为 0.1.1-rc.2;0.2.1-rc.2 记为未验证候选。 发布后从 npm 安装,或用这个 tarball 安装: dsh plugin --profile web add /path/to/dsh-hub-oauth-gateway-1.13.6.tgz 安装后重启现有 DSH Web 进程一次。搭配 Subscription 0.8.7 使用。
v1.13.52026-10-17
· 已修复 · 当 apiKey 缺失时,从解析后的 OAuth 认证中读取 Bearer token,这样 Kimi Code 订阅发送在登录完成后不再报「未登录」(#45、#50)。 发布后从 npm 安装,或用这个 tarball 安装: dsh plugin --profile web add /path/to/dsh-hub-oauth-gateway-1.13.5.tgz 安装后重启现有的 DSH Web 进程一次。搭配 Subscription 0.8.6 使用。
v1.13.42026-09-15
· dsh-hub-oauth-gateway 1.13.4 · 修复 · 在 Go 路径上把 OpenCode 的 RegionError 映射为 region-opt-in-required(#49)。 · 在 Go 路径上锁定 DeepSeek 模型 id,不再走官方 DeepSeek 服务商目录(#48)。 安装: dsh plugin --profile web add dsh-hub-oauth-gateway@1.13.4 · 或从附件 tarball 安装: dsh plugin --profile web add /path/to/dsh-hub-oauth-gateway-1.13.4.tgz 然后重启一次 DSH Web。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-hub-oauth-gateway v1.13.4 · 原名 dsh-usage-stats 面向 DeepSeek Harness Web 的本地优先用量中心。 Token、估算成本、账户余额、订阅配额、趋势、预测、提醒与导出——外加编码订阅 OAuth(Grok Build、Codex、Kimi Code、Claude Code)、可选回环 API 网关,以及可选的本机认证/用量监控。不要把 token 粘贴进聊天。 CI License Contributions welcome English · 中文版 · 日本語 · 한국어 · Português (BR) · Español · Français · Deutsch · Русский 升级: 按 docs/01-install.md 的版本化步骤操作。Hub 1.13.4 与 Subscription 0.8.5 共用已验证的 DSH 0.1.1-rc.2 契约,并精确固定 dsh-coding-oauth-core@0.1.2 与 undici@7.29.0。保留 profile、配置和凭据文件,在同一个 Web profile 中更新两个插件,再重启一次现有 DSH Web 进程。Core 仍是共享 npm 依赖,不是需要单独安装的 DSH 插件。
展开完整文档(README 剩余 1 节)
dsh-hub-oauth-gateway

v1.13.4 · 原名 dsh-usage-stats

面向 DeepSeek Harness Web 的本地优先用量中心。 Token、估算成本、账户余额、订阅配额、趋势、预测、提醒与导出——外加编码订阅 OAuth(Grok Build、Codex、Kimi Code、Claude Code)、可选回环 API 网关,以及可选的本机认证/用量监控。不要把 token 粘贴进聊天。

CI
License
Contributions welcome

English · 中文版 · 日本語 · 한국어 · Português (BR) · Español · Français · Deutsch · Русский

升级: 按 docs/01-install.md 的版本化步骤操作。Hub 1.13.4 与 Subscription 0.8.5 共用已验证的 DSH 0.1.1-rc.2 契约,并精确固定 dsh-coding-oauth-core@0.1.2 与 undici@7.29.0。保留 profile、配置和凭据文件,在同一个 Web profile 中更新两个插件,再重启一次现有 DSH Web 进程。Core 仍是共享 npm 依赖,不是需要单独安装的 DSH 插件。已发布的 dsh-coding-oauth-core@0.1.2(含 helper 与 subpath exports)从 npm 消费;Hub 仍保留 vendor/dsh-coding-oauth-core 作为后续发版源。

项目更名

最初发布名为 dsh-usage-stats。自 1.1.0 起包名与仓库为 dsh-hub-oauth-gateway。请先移除旧 entry 再重新安装。本地数据文件与内部 Cordis 插件 id 不变,历史统计得以保留。

| | 请用这个 | 仍然可用 / 不变 |
| npm(推荐) | dsh plugin --profile web add dsh-hub-oauth-gateway | 旧 npm 包名不再更新 |
| GitHub / 开发 | dsh-hub-oauth-gateway | — |
| Cordis 插件 id | usage-stats | 不变 |
| SQLite 数据库 | ${DSH_HOME}/storages/usage-stats-v1.sqlite | 不变 |
| CLI | dsh-hub-oauth | dsh-hub-grok-build(别名)。Subscription 拥有的 dsh-coding-oauth / dsh-grok-build 不属于本包 |

版本历史见 CHANGELOG.md。

特性

- Quick Peek + Full Dashboard —— 悬浮小窗(或侧栏按钮);概览 / 趋势 / 账户 / 明细 / 本机页签;today / 7d / 30d / month;上一周期对比;手动刷新。
- 分栏设置 —— Settings → 用量中心:显示 / 订阅账号 / 网关 / 能力 / 供应商 / 费用。
- 预设与模块编排 —— Minimal、Quota、Cost、Analyst;自定义模块顺序;密度、动效、供应商别名与颜色。
- 活动热力图 —— 配置时区下 370 天日历 + streak。
- 本地历史 —— 按 (session, turn, step) 投影到 SQLite;后写覆盖,不累计放大。
- 成本估算 —— 用户维护的每百万 Token 价格与覆盖率;缺失价格绝不当作免费。
- 订阅费用账本 —— 本地订阅/充值;货币一致时可显示回本倍数。
- 趋势与预测 —— 小时/日/周/月桶;有界线性外推为独立序列。
- 账户与配额适配器 —— 余额、窗口、重置时间、陈旧/上次成功、软提醒(无硬阻断、不外发通知)。
- CSV / JSON 导出 —— 过滤、日序列或打包;可选会话脱敏;电子表格公式注入防护。
- 编码订阅 OAuth —— Grok Build、Codex、Kimi Code、Claude Code(设备码 / 浏览器 / PKCE 粘贴);配置 oauthDevice.copilotClientId 后可选 GitHub Copilot LLM 路由;多账号存储(最多 8)与可选 codingOAuth.pool(off | priority | quota_aware);Claude Code 导入走 Import Claude Code(macOS Keychain Claude Code-credentials 或文件回退;preview → commit;覆盖仍需确认);模型标注 (OAuth);单向 CLI 凭据拉取。
- 可选回环 API 网关 —— 默认关闭的 OpenAI/Anthropic 兼容服务,仅供本机工具。
- OpenCode Go — 在账户与模型下以独立供应商 coding-opencode-go 连接(与 DSH 原生 opencode-go 隔离)。外部工具使用 coding-opencode-go/(过渡期仍接受 opencode-go/)与对应协议,并发送稳定会话标识。本地网关密钥与上游凭据分开;缺少会话标识会明确失败。若旧版插件配置仍在原生槽,可在账户卡片迁移。
- 可选能力 —— Codex 搜索 / 图像 / 用量 / Fast 与 Grok Imagine 默认关闭,打开后立即生效。
- 可选本机监控 —— 只读 CLI 认证快照与跨工具 Token 扫描(从不读取对话内容)。
- 可选供应商状态页探测 —— 白名单公开 Statuspage GET(默认关;无凭据;与用量主路径隔离)。
- 中英文界面 —— 复用 DSH locale 服务。

产品调研:docs/research/usage-analytics-landscape.md。架构:docs/02-architecture.md。

产品截图

在 DeepSeek Harness Web 安装本插件后截取(全新隔离 profile 下本地历史为空属正常)。

悬浮 HUD —— 今日指标与多账户配额芯片

用量速览 —— 紧凑 2×2 KPI,一键进入完整仪表盘

完整仪表盘 —— 时间范围、页签、刷新与 CSV / JSON 导出

设置 → 用量中心 —— 显示 / 订阅账号 / 网关 / 能力 / 供应商 / 费用

本插件解决的问题

| 你搜到 / 看到的 | 实际坏在哪 | 本插件怎么处理 |
| 用量 / 成本 / 配额散落在各 CLI 与供应商 | 没有统一的本地历史与带覆盖率的成本视图 | SQLite 投影 + 价格规则 + 账户适配器,集中在用量中心 |
| 想在 DSH 用 SuperGrok / ChatGPT Plus / Kimi Code / Claude Pro,又不想再买 API | 内置路由多为按量 API-key | 本地 OAuth 路由与现有 API-key 供应商共存 |
| 本轮运行失败 API key is invalid / AUTH | GUI 把所有 AUTH 都显示成这句;OAuth access token 会过期 | 编码 OAuth 路由主动刷新并对 AUTH 重试 |
| 想用 OpenAI/Anthropic 兼容工具对接订阅会话 | 没有安全的本机桥 | 可选回环网关(不是公网中继) |
| OpenCode Go: MissingSessionID | Missing stable conversation ID | DSH: use Accounts & Models; external tools: provide x-opencode-session. See migration. |
| 想要 Token Monitor 风格的 CLI 状态,又不想贴密钥 | 手工翻文件或粘贴到聊天 | 可选 localMonitor / localUsage,硬化白名单路径 |

快速开始

1. 安装当前 npm 发布版到 web profile
dsh plugin --profile web add dsh-hub-oauth-gateway

2. 自行选择时机重启常驻 DSH Web 进程官方 dsh web 是启动 web profile 的 CLI 别名,不是服务单元名。
请使用这台机器实际配置的进程管理器重启现有进程。

然后打开 设置 → 用量中心。订阅账号 / 网关 / 能力按需登录或打开开关。完整安装选项(npx 安装器、GitHub tarball、代理)见 docs/01-install.md。

目录

- 项目更名
- 特性
- 产品截图
- 本插件解决的问题
- 快速开始
- 要求
- 安装
- 使用
- 设置页
- 编码 OAuth
- 本地 API 网关
- 可选能力
- 运行配置
- 凭据
- 数据与迁移
- 隐私与安全
- 架构
- 文档
- 贡献
- 许可证

要求

- DeepSeek Harness Web,已验证 @deepseek-ai/dsh 0.1.1-rc.2(精确 BOM)。0.1.5-rc.1 等未验证候选仅记在 compatibility/dsh-bom.json,见 docs/01-install.md。
- Node.js ^22.19.0 || >=24.0.0
- DSH Web 后端保持回环;可通过受控本机 HTTPS 反向代理向已认证私网提供完整 Web。不要单独暴露插件 API,也不要无认证发布到公网。

安装

dsh plugin --profile web add dsh-hub-oauth-gateway
dsh plugin --profile web update dsh-hub-oauth-gateway
dsh plugin --profile web remove dsh-hub-oauth-gateway

无插件管理器时可用兼容安装器:npx --yes dsh-hub-oauth-gateway-install。GitHub /path/to/.tgz 与本地开发安装见 docs/01-install.md。安装后通过测试机实际配置的进程管理器重启现有 DSH Web 进程,再刷新 http://127.0.0.1:3080;DSH 官方不提供统一的服务单元名。

使用

1. 默认点悬浮用量小窗(或在 设置 → 显示 → 入口形态 改回侧栏按钮)打开 Quick Peek;设置页也可打开速览 / 完整仪表盘。
2. Full Dashboard 用顶部页签切换概览 / 趋势 / 账户 / 明细 / 本机,并选择时间范围、指标与 provider/model 维度。
3. 点刷新才会立即投影用量并刷新账户;普通 GET 只读本地快照。
4. 在 设置 → 用量中心 调整显示、订阅账号、网关、能力、供应商与费用。
5. 成本始终是估算——关注 coverage;未定价 Token 不是免费。

CLI:dsh-hub-oauth login [--pkce] | import | status | logout(dsh-hub-grok-build 为别名)。

设置页

设置 → 用量中心 六个顶部标签:显示、订阅账号、网关、能力、供应商、费用。已登录供应商卡片默认折叠。「供应商」页卡片内可直接维护认证——保存/清除 API Key、Copilot 设备授权、按供应商刷新;OAuth 卡片一键跳转「订阅账号」登录/拉取。

编码 OAuth

在 订阅账号 登录 Grok Build、Codex、Kimi Code 或 Claude Code(远程/无头优先设备码;浏览器/PKCE 可粘贴授权码或完整回调 URL)。已认证模型以 (OAuth) 出现在选择器。

每个 provider 凭据文件可存多个 AuthDocument v2 账号(最多 8)。用订阅账号页的控件可添加、设默认或删除账号。已登录卡片可显示 Usage Center 缓存配额条(仅 GET;无快照时隐藏)。

Import Claude Code 走 preview → commit(可能时用 accountMode: add)。macOS 优先 Keychain Claude Code-credentials,其它平台用白名单文件路径。覆盖写入仍需显式确认。

可选粘性路由:同一 provider 有两个及以上账号时,可将 codingOAuth.pool.mode 设为 priority 或 quota_aware。默认 off。细节见 docs/03-configuration.md。

GitHub Copilot LLM 路由(github-copilot-oauth)在配置 oauthDevice.copilotClientId 之前保持失败关闭。

白名单内官方 CLI OAuth 文件只读发现。同步是显式单向 拉取(发现 → 预览 → 确认),不是自动导入,也不写官方 CLI 文件。

本地 API 网关

默认关闭。启用后在独立 node:http 监听器(非 DSH web 端口)上提供 GET /healthz、GET /v1/models、POST /v1/chat/completions、POST /v1/responses、POST /v1/messages,复用已登录 OAuth 会话。bind 仅 YAML;非回环 bind 必须有 Bearer key。不是远程中继。细节见 docs/01-install.md。

在账户与模型下以独立供应商 coding-opencode-go 连接(与 DSH 原生 opencode-go 隔离)。外部工具使用 coding-opencode-go/(过渡期仍接受 opencode-go/)与对应协议,并发送稳定会话标识。本地网关密钥与上游凭据分开;缺少会话标识会明确失败。若旧版插件配置仍在原生槽,可在账户卡片迁移。 Migration / 迁移.

可选能力

七项开关默认关闭,打开后立即生效:codexSearch、codexImages、codexImageEdits、codexUsage、codexFast、grokImagineImage、grokImagineVideo。Codex Fast / 私有端点与 Grok Imagine 在打开前保持失败关闭。打开 codexFast 后,会话选择器使用已有的 codex-oauth-fast 路由(能力页有 Standard/Fast 提示)。该路由仅在 live catalog 列出 priority 资格模型后出现,不是第二套 Fast 栈。见 docs/01-install.md 与 docs/03-configuration.md。

运行配置

在现有 Cordis entry 下合并 config,不要新增第二个 entry:

~/.dsh/profiles/web/cordis.patch.yml
- insert:
- id: usage-stats
name: dsh-hub-oauth-gateway
config:
refresh:
usageSeconds: 30
accountMinutes: 5
accountConcurrency: 3
timeoutMs: 15000
retention:
usageDays: 730
accountSnapshotDays: 180
preserveDeletedSessions: true
pricing:
baseCurrency: USD
accounts:
monitors: {}
oauthDevice:
copilotClientId: YOUR_PUBLIC_OAUTH_CLIENT_ID
codingOAuth:
enabled: true
pool:
mode: off
switchMargin: 2
localMonitor:
enabled: false
localUsage:
enabled: false
intervalMinutes: 30
statusProbes:
enabled: false

完整字段、monitor、代理与价格导入:docs/03-configuration.md 与 docs/01-install.md。旧根级 config.monitors 映射到 config.accounts.monitors(不要同时配置)。

凭据

- 经 DSH credential seam 存储;浏览器只收到 configured / source / writable 元数据,永不收到值。
- 本地 CLI 导入(Claude、Codex、Gemini、Grok、Amp)不在日志暴露绝对路径。
- Copilot 设备流把 device code 留在服务端;浏览器只持有随机 flow ID。启用前须配置自己的公共 OAuth client ID。
- 编码 OAuth 文件:$DSH_HOME/.grok-build-auth.json、.codex-oauth-auth.json、.kimi-code-oauth-auth.json、.claude-code-oauth-auth.json,以及配置 Copilot 时的 .github-copilot-oauth-auth.json(0600、原子写)。任何 HTTP 状态、日志或 UI 都不得返回 token。

数据与迁移

${DSH_HOME:-~/.dsh}/storages/usage-stats-v1.sqlite

目录 0700、主文件 0600、WAL。默认保留 730 天 usage facts、180 天账户快照。首次启动迁移与回滚:docs/04-migration-v1.md。

隐私与安全

- 默认要求回环 peer + 回环 Host。受信任 HTTPS 反向代理必须满足完整 owner policy:trusted peer、精确 HTTPS Origin 与匹配的公网 Host、owner proof、同源 Fetch Metadata,变更请求还需 CSRF;仅转发 forwarded headers 不会授予访问权,策略不完整时 fail closed。
- 普通 GET 只读本地;带凭据刷新为显式 POST 或调度。
- monitor 默认 HTTPS、禁止 URL 内嵌凭据、手动 redirect、限制大小、连接前 DNS pinning。
- SQLite 不含凭据、prompt、response、cwd 或供应商原始响应。
- 统计与估算不是账单。仅监测你拥有或获授权的账户与 endpoint。

威胁模型与报告:.github/SECURITY.md。

架构

flowchart LR
subgraph DSH["DSH Harness Web"]
UI[设置 / Peek / 仪表盘] --> API[usage-stats v1 API]
UI --> OAuthUI[订阅账号 / 网关 / 能力]
end
API --> SQLite[(本地 SQLite)]
API --> Adapters[账户适配器]
OAuthUI --> CodingOAuth[coding-oauth 路由]
CodingOAuth --> Creds["$DSH_HOME/-oauth-auth.json"]
CodingOAuth --> LLM[LLM OAuth 路由]
LLM --> Providers[Grok / Codex / Kimi / Claude / Copilot]

细节:docs/02-architecture.md · 中文。OAuth 归因:docs/oauth-provenance.md。

文档

| 文档 | 用途 |
| docs/01-install.md | 安装、代理、网关、能力、故障排查 |
| CHANGELOG.md | 版本历史 |
| docs/00-project-rules.md | 发布分层、版本、发版循环 |
| docs/02-architecture.md | 内部架构 · 中文 |
| docs/03-configuration.md | 运行配置参考 |
| docs/04-migration-v1.md | 1.0 数据迁移 |
| docs/05-dsh-alpha-smoke.md | 未验证 DSH 候选宿主的隔离冒烟(0.1.2-alpha.*、0.1.5-rc.1) |
| catalog/ | Desktop Market Path A 目录源(catalog-source.json、v1/plugins.json);不在 npm 包 files 白名单内 |
| .github/CONTRIBUTING.md | 贡献指南 |
| .github/SECURITY.md | 安全策略 |

贡献

在 Cursor Cloud / 本仓库云工作区用声明的 Node.js 与 pnpm 验证即可(Docker sandbox 可选,非强制)。DSH 冒烟使用隔离 DSH_HOME。见 .github/CONTRIBUTING.md。不要在 issue、PR、截图或日志中提交密钥、prompt 或个人路径。

若语言切换行缺少你的语言,欢迎 PR 一份 README 翻译。

许可证

MIT · 参见 NOTICE。独立社区项目,不暗示供应商背书。编码 OAuth 相关部分按要求保留 Apache-2.0 归因(LICENSES/Apache-2.0.txt)。
预览分享卡片长什么样 ↓lninghaha/dsh-hub-oauth-gateway
分享 · DeepSeek Harness Hub
lninghaha/dsh-hub-oauth-gateway

统计 Token 成本与配额,接入编码订阅 OAuth 并转发 API

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部