DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Amoled Proxyapi — DeepSeek Harness 插件(DSH Plugin)
← Plugins
A

dsh-amoled-proxyapi

Amoled Proxyapi

AMOLED 主题系列(8 种强调色)以及用于 DeepSeek Harness Web GUI 的 ProxyAPI 余额显示

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:zyutsu/dsh-amoled-proxyapi#bb0d2f8e3f749252a938e574fb33df5b9a5bf02a
README兼容性版本

兼容性与来源证明

Amoled Proxyapi 以 dsh-amoled-proxyapi 发布,当前版本为 1.0.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/10/9

版本

1.0.0stable
2026/10/9

相关插件

正在加载相关插件…

最新版
1.0.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 1
周下载
0
最近提交
2026/10/9
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录

相关插件

继续浏览 ui-customization 分类下经过校验的插件。

Whale Widgetdsh-whale-widgetDSH Web 界面右下角的 DeepSeek 余额小鲸鱼挂件:余额/今日已用/峰谷定价、自定义泡泡点击序列(文本/余额/今日/峰谷/图片/随机语句与并列加权选择)、逐行样式与字体、悬浮快捷编辑、音效与每轮消耗、自定义角色/动图/音效、吸附与翻转自定义Client Ui Skill Explorer@linxin666/dsh-client-ui-skill-explorerDSH 技能中心:按来源(bundled / project / user / custom / runtime)浏览已加载的技能,在 Web GUI 面板中启用或禁用、创建和删除技能。Remote Web Ui@linxin666/dsh-remote-web-ui通过扫码配对访问 dsh Web GUI,共享一个官方界面:设置按钮旁的二维码可将手机和 PC 配对到同一个 Web GUI(手机采用竖屏触控适配层,PC 使用完整桌面界面),通过一次性令牌和 rClient Ui Task Board@linxin666/dsh-client-ui-task-board面向 DSH Web GUI 的主机权威任务面板,支持实际会话执行、主机 cron 调度以及可选的跨平台空闲睡眠保护;以挂载方式提供,无需修改 DSH 源代码。

README

dsh-amoled-proxyapi

A family of AMOLED (pure-black) themes for the DeepSeek Harness web GUI — one per accent colour — plus a ProxyAPI balance readout in the sidebar foot that opens the usage page.

sidebar foot  ● 1 234,56 ₽      ← click → console.proxyapi.ru/usage
              ⚙ Settings

Install

This package is a DSH bundle: package.json declares dsh.bundle.patch, so a profile installs it as a single Loader entry, and dsh.client marks the browser half the Host serves to the page. lib/ is committed, so a checkout works without a build step.

Install it into a profile through that profile's plugin manager, handing it either the package path or the repository spec:

github:zyutsu/dsh-amoled-proxyapi

By hand: clone the repository into <DSH_HOME>/profiles/<profile>/plugins/ and add the entry from cordis.patch.yml to the profile's own cordis.patch.yml.

Requires DSH ≥ 0.2.0-rc.0 and Node ≥ 20.

What it installs

ContributionWherePackage half
amoled-* theme family (dark scheme, 158 alias tokens each)ctx.theme.registerbrowser
AMOLED тема row: accent swatches + switchSettings → General, last rowbrowser
Balance pillsidebar.footer.action (above Settings)browser
GET /amoled-proxyapi/balanceHost HTTP routeNode

The two halves ship in one package: lib/index.js is the Loader entry (the node half), and dsh.client in package.json marks lib/client.js as the browser half the Host serves to the page.

The theme family

Eight themes share one audited black geometry, one hue apart:

IdAccentText on the accent
amoled-red#ff2d3fwhite
amoled-orange#ff7a1anear-black
amoled-amber#ffc02enear-black
amoled-green#2fd36bnear-black
amoled-teal#17d1c0near-black
amoled-blue#3b82f6white
amoled-violet#a06bffwhite
amoled-magenta#ff4d94white

A third-party theme is an alias-token override set. ctx.theme.register({ id, colorScheme: 'dark', tokens }) publishes it; ui-layout's ThemePresenter writes every entry as an inline custom property on <body>, and inline properties beat the token stylesheets. So the palette works in two layers:

  • src/palette.js → AMOLED_STATIC re-points the raw scales the shipped dark palette is computed from: the bluish neutral scale becomes near-blacks (#000000 canvas, #0a0507 … #2f2429 surfaces) and the "deepseek blue" accent scale takes the theme's own hue.
  • AMOLED_ALIAS pins the decisions that must be absolute — pure black canvas and sidebar, hairline borders, brand/primary buttons, label scale, black masks, code tokens, onboarding gradients.

That template is hand-reviewed once, in red. The other seven themes are generated from it by createTokens(): each literal colour in the template is rotated onto the accent's chroma vector, so lightness and alpha are preserved token by token and only the hue moves — the blue theme has exactly the red theme's contrast, one hue over. Two small sets are pinned instead of rotated:

  • ACCENT_PINS — brand, active-nav accent, onboarding accent and the accent rung of both scales are the accent exactly, so the swatch never lies.
  • SEMANTIC_KEEP — the error reds. A red error must not turn blue because the theme is blue. Green and amber state tokens are not in the template at all and keep the shipped values in every theme for the same reason.

--dsw-alias-label-primary-foreground is the per-accent onAccent colour, so bright accents (amber, green, teal) get dark text on their primary button.

Because a third-party theme id is an in-process preference that the durable settings schema does not carry, the plugin re-applies the stored accent on every load, driven by localStorage["dsh-amoled:enabled"] (on by default) and localStorage["dsh-amoled:color"] (the accent id). The Settings row and the shipped Appearance control stay in sync through theme/change: picking light/dark/system there switches the family off, and the row writes the same preference back. Picking an accent always switches the family on. The pre-family key dsh-amoled-red:enabled is still honoured.

The balance readout

The browser cannot read the balance — the call needs the account API key, and the key must not reach the page. So the node half owns the network:

GET /amoled-proxyapi/balance          (Host, behind the connection trust fence)
  → ProxyAPI GET https://api.proxyapi.ru/proxyapi/balance
      Authorization: Bearer <key>

The key is resolved per read through the credentials service (PROXYAPI_API_KEY by default, the same reference the ProxyAPI model provider uses), falling back to the launch environment. Answers are cached in memory (20 s on success, 5 s on failure) and concurrent polls share one upstream read.

The route always answers HTTP 200 with a JSON envelope, so the pill can explain rather than just fail:

{"ok":true,"balance":1234.56,"budget":{"limit":50,"used":12.34},
 "currency":"RUB","source":"credentials","updatedAt":"…",
 "usageUrl":"https://console.proxyapi.ru/usage"}
{"ok":false,"code":"forbidden","status":403,
 "message":"ключу не разрешён запрос баланса",
 "hint":"Включите разрешение «Запрос баланса» в настройках ключа: https://console.proxyapi.ru/keys"}

code is one of no-key, forbidden, network, http, bad-payload, internal. forbidden is the common one: ProxyAPI refuses GET /proxyapi/balance with 403 until the key itself carries the «Запрос баланса» permission — enable it at https://console.proxyapi.ru/keys. A pill reading «нет доступа» with a red dot means exactly that, and its tooltip links to the page that fixes it.

Clicking the pill opens the usage page in the built-in browser panel when that tab type is registered, otherwise in a new browser tab.

Configuration

No plugin settings; every knob is an environment override, so a composition stays declarative:

VariableDefault
DSH_PROXYAPI_BASE_URLhttps://api.proxyapi.ru
DSH_PROXYAPI_BALANCE_PATH/proxyapi/balance
DSH_PROXYAPI_USAGE_URLhttps://console.proxyapi.ru/usage
DSH_PROXYAPI_KEY_REFPROXYAPI_API_KEY
DSH_PROXYAPI_OK_TTL_MS20000
DSH_PROXYAPI_FAIL_TTL_MS5000
DSH_PROXYAPI_TIMEOUT_MS15000

The same names are accepted as entry config (config.baseUrl, config.usageUrl, …), which take precedence over the environment.

Development

node build/build-client.mjs   # src/*.js -> lib/client.js (one lazy-CJS factory)
node build/test-host.mjs      # route contract against a fake carrier + fetch
node build/test-client.mjs    # bundle against a fake loader, React, DOM, theme

src/client.js and src/palette.js are plain scripts with no imports, so the bundle keeps exactly one external: react. The bundle's registered module id is the package name — the boot-graph row the Host waits for.