dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
🇬🇧 English • 🇨🇳 中文说明 • 🇷🇺 Русский
|
⭐ If you like this plugin, please star it on GitHub — it shows me that the plugin is useful to you and motivates me to keep developing it.
🐛 If you find a bug or would like to request a feature, open a GitHub issue in any language — I will review your proposal and implement useful suggestions in a future plugin version. |
AI developers and engineers frequently work across multiple LLM providers, corporate subscriptions, and token plan tiers simultaneously (such as OpenCode GO, Ollama Cloud, Qwen Cloud, Kimi, GLM, MiniMax, Cline, DeepSeek, OpenRouter, and Command Code).
Without ambient, real-time quota tracking inside DeepSeek Harness (DSH):
dsh-key-limits solves this by delivering ambient, distraction-free quota monitoring directly within the DSH Web UI. It focuses strictly on quota limits and subscription balances without heavy accounting ledgers, historical spending databases, or complex analytics.
graph LR
subgraph Client ["DSH Web Client"]
FC["FloatChip (Draggable Badge)"]
CB["ActiveKeyButton (Composer Bar)"]
SC["Settings Card (Plugin Slot)"]
M["Modals (All Limits & One Limit)"]
end
subgraph Backend ["Cordis Plugin Backend"]
Router["HTTP API Router (/dsh-key-limits)"]
CredStore["Encrypted Credential Storage"]
Updater["Loopback Plugin Updater"]
end
subgraph Providers ["AI Providers & Services"]
P1["OpenCode GO / Ollama / Qwen"]
P2["Command Code / Cline / GLM"]
P3["DeepSeek / OpenRouter / MiniMax"]
NPM["npmjs.org Registry"]
end
FC -->|Click| M
CB -->|Click| M
M -->|Poll Quotas (60s)| Router
SC -->|Save Credentials| Router
SC -->|Trigger Update| Updater
Router --> CredStore
Router -->|Parallel 12s Abort| P1
Router -->|Parallel 12s Abort| P2
Router -->|Parallel 12s Abort| P3
Updater -->|Loopback Check / Install| NPM
FloatChip)localStorage.ActiveKeyButton)conversation.composer.bar, priority 10).order): In settings, arrange the display sequence of accounts using intuitive Up/Down controls (▲ / ▼).activeOnTop): Automatically moves the account currently in use by the active conversation to the top of the list. Enabled by default.fmtReset)5d 5h 19m).4h 59m).healthy / warning / exhausted), immediately surfacing accounts experiencing quota exhaustion or upstream timeouts.%/h) and automatic time-to-depletion projection (~X.X h left) derived from 24-hour rolling browser usage snapshots.Resets in 2h 15m).Alt+K: Instant access to the Limits Hub from any view or workflow without reaching for the mouse.credentials service. The local subs.json file only contains non-sensitive metadata and references.subs.json database and temporary swap files are enforced with strict POSIX 0600 file modes, preventing multi-user local inspection.redirect: 'error', preventing sensitive authorization headers (x-api-key, Bearer tokens) from leaking cross-origin across HTTP 301/302/307 redirects.| Provider ID | Name | Quota Windows | Authentication |
|---|---|---|---|
commandcode | Command Code | Rolling 5h / Weekly / Monthly (GOAT, Pro, Max plans) | API key (user_... or token) |
opencode-go | OpenCode GO | Rolling 5h / Weekly / Monthly | Session cookie (auth) & Workspace ID |
ollama | Ollama Cloud | Session / Weekly / Monthly | API key & Session cookie |
qwen | Qwen Cloud | 5h / 1-Week Token Plans | Session cookie & optional sec_token |
kimi | Kimi for Coding | Weekly Quota Limit | API key (sk-kimi-...) |
glm | GLM (Z.ai) | Daily / Monthly Quota | API key |
minimax | MiniMax Coding Plan | Coding Plan Quota | API key (sk-cp-...) |
cline | Cline | 5h / Weekly / Monthly | Bearer API token |
siliconflow | SiliconFlow (SiliconCloud) | Total Balance / Credits ($ / ¥) | API key (sk-...) |
anthropic | Anthropic | Requests / Tokens Rate Limits | API key (sk-ant-...) |
groq | Groq | RPM & TPM Rate Limits | API key (gsk_...) |
gemini | Google Gemini | API Status / Model Quota | API key (AIza...) |
deepseek | DeepSeek | Balance ($ / ¥) | API key (sk-...) |
openrouter | OpenRouter | Balance ($ credits remaining) | API key (sk-or-...) |
Install the official package into your active DSH profile:
dsh plugin --profile web add @goodandready/dsh-key-limits
Restart DSH Web:
dsh web --profile web
# Primary configuration: Settings -> Plugins -> Key Limits, or profile plugin config.
# Legacy import: ~/.dsh/profiles/web/settings.yaml
plugins:
'@goodandready/dsh-key-limits':
storageDir: ~/.dsh/storages/dsh-key-limits
refreshHours: 24
ui:
floatChip: true
composerBar: true
activeOnTop: true
order: []
| Parameter | Type | Default | Description |
|---|---|---|---|
storageDir | string | ~/.dsh/storages/dsh-key-limits | Directory where subscription metadata and cached cards are stored (read-only in UI, configured via profile plugin configuration, requires restart). |
refreshHours | number | 24 | Background polling interval in hours for refreshing quota windows from providers. |
ui.floatChip | boolean | true | Show floating draggable indicator chip in the viewport. |
ui.composerBar | boolean | true | Show active key button in the chat composer bar. |
ui.activeOnTop | boolean | true | Automatically pin the account matching the active chat session to the top of lists. |
ui.order | string[] | [] | User-defined sequence of subscription IDs for custom card ordering. |
| Method & Path | Access / Origin | Description |
|---|---|---|
GET /dsh-key-limits/health | Loopback / Same-Origin | Service health check ({ ok: true, name: "dsh-key-limits", status: "healthy" }) |
GET /dsh-key-limits/config | Public / Web | Public UI configuration and provider input schemas |
GET /dsh-key-limits/active-sub | Public / Web | Active session subscription binding (?sessionId=<id>) |
GET /dsh-key-limits/subs | Public / Web | List of all configured subscriptions, cards, and balances |
POST /dsh-key-limits/subs | Loopback / Same-Origin | Add, edit, or delete a subscription |
POST /dsh-key-limits/refresh-all | Loopback / Same-Origin | Force refresh all subscriptions (concurrent refresh lock) |
POST /dsh-key-limits/export | Loopback / Same-Origin | Export subscriptions encrypted with passphrase (AES-256-GCM) |
POST /dsh-key-limits/import | Loopback / Same-Origin | Decrypt and import subscription backup with deduplication |
GET /dsh-key-limits/update | Loopback / Same-Origin | Check npm registry for newer plugin versions |
POST /dsh-key-limits/update | Loopback / Same-Origin | Apply plugin update via internal npm runner |
Note: The published npm package and release tarball carry only runtime production files (
lib/,cordis.patch.yml, docs, and license). Development sources (src/client/,test/, and build scripts) are maintained in the source repository. To run automated tests or rebuild the client bundle, clone the development repository.
# Build unified client bundle from src/client/ into lib/client.js
npm run build:client
# Run automated offline test suite
npm test
.
├── lib/
│ ├── index.js # Cordis plugin entrypoint & HTTP routes
│ ├── client.js # Built client bundle
│ ├── cards.js # Card generation and formatting
│ ├── subs.js # Provider quota manager & normalization
│ ├── provider-fetchers.js # Core quota fetchers & HTML parsers
│ ├── provider-extra-fetchers.js # Extended quota fetchers (SiliconFlow, Anthropic, Groq, Gemini)
│ ├── crypto-backup.js # AES-256-GCM passphrase export & import
│ ├── paths.js # Path resolution helpers
│ └── plugin-updater.js # Secure loopback updater
├── src/client/ # Source modules for browser client
│ ├── 01-prelude.js # Scoped CSS & React setup
│ ├── 02-locale.js # Multi-language dictionaries (en, zh; ru via dsh-russian-lang)
│ ├── 03-format.js # Humanized countdowns & color classes
│ ├── 04-modals.js # AllLimitsModal & OneLimitModal
│ ├── 05-bar.js # Composer bar ActiveKeyButton
│ ├── 06-float.js # Draggable FloatChip
│ ├── 07-settings.js # Settings card, reorder list & updater
│ └── 08-apply.js # DSH plugin bootstrap & slot registrations
├── cordis.patch.yml # Cordis plugin declaration
└── test/ # Test suite
MIT © GooDAnDReaDY