timacek/DEEPSEEK-HARNESS-PLUGINS--packages-suite ↗★ 0

dsh-plugin-suite

个人 DSH 插件及功能合集包 适合需要一键安装作者个人套件(含 hello、offpeak 等功能)的用户。

套件
dsh-plugin-suite
相容性
待驗證
Harness 依賴範圍
0.2.0-rc.2
Cordis 依賴範圍
4.0.4
版本
0.1.1
授權
MIT
最近更新
2026年10月2日

安裝

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:timacek/DEEPSEEK-HARNESS-PLUGINS#409de076731323e1b91e9aa96a224423525fdaff&path:packages/suite

dsh-plugin-suite

Personal DeepSeek Harness bundle. One bundle, one row per feature.

Packagedsh-plugin-suite
Install paththis directory (absolute)
Rowsdsh-plugin-suite (Client anchor), dsh-hello, dsh-offpeak
Runtime pinsdsh 0.2.0-rc.2, cordis 4.0.4, dsh-tools 0.2.0-rc.2, schemastery 3.18.4
Client halfclient/offpeak.client.js (./client export, dsh.client)

The Client anchor row

This bundle carries a browser half, and that is the only reason it has a row whose id is the package name. Getting this shape wrong fails silently - the widget simply never appears, the host rows keep working, and nothing in the UI says why. The full recipe is in ../../docs/plugin-development.md section 7; the short version:

  1. dsh.client in package.json (platform: 'web') plus an exports["./client"] entry pointing at the hand-written file, and client in files;
  2. exactly one row resolves the bundle package, and its name is exactly the package name: dsh-plugin-suite → src/index.ts. Every other row resolves a subpath (dsh-plugin-suite/features/). Two package-resolving rows make @deepseek-ai/dsh-client-modules reject the package (resolves from multiple active Loader sources) and drop the browser half;
  3. that anchor module must export apply, even as export function apply() {}. cordis refuses a row whose module is not "a function or an object with an apply method"; such a row gets no live fiber, and the client-module scan iterates live fibers only. An export {} module looks installed and active in every Host view while serving nothing;
  4. __ModuleLoader__.load({ id: ' ' }) in the client file - the id must equal the package name, and the page must be refreshed to re-fetch the artifact.

Both silent failures were hit while building this bundle. The clock is driven by the anchor row, not by dsh-offpeak: disabling dsh-offpeak only stops the Host-side configuration, while disabling the anchor row (or the whole bundle) removes the widget.

Build and install

pnpm install
pnpm build
node scripts/dsh.mjs plugin --profile desktop add ./packages/suite

Or in the app: Settings > Plugins > Add plugin, then paste the absolute path of this directory. The profile links this directory, so lib/ must exist: run pnpm build after every source change, then toggle the row (or restart).

A plain-JavaScript Client half needs no build of its own, but it only reaches the page after the host has published its bundle: refresh the page after changing it (a row toggle or restart is not enough for the browser artifact).

Features

Row idModuleToolClient halfConfig
dsh-plugin-suitesrc/index.ts-anchor for client/offpeak.client.js-
dsh-hellofeatures/hellohello-greeting (default Hello), excited (default false)
dsh-offpeakfeatures/offpeak--holidays (default: the Chinese 2026 list)

hello takes who (required) and excited (optional, falls back to the row config) and returns { message, length }, rendered as text.

dsh-offpeak: the peak/off-peak clock

While the row is active, a small clock sits beside the sidebar brand mark: the current wall-clock time plus DeepSeek's current price tier, in the theme's semantic colors.

StateColorToken
Off-peak (half price)green--dsw-alias-state-success-primary
Peak (full price)red--dsw-alias-state-error-primary

Hovering shows the next transition as HH:MM UTC.

Where it renders, and what it costs

The Client half registers into sidebar.brand.name - the seat beside the brand mark, which is what "next to the logo" means in this shell. Consequences worth knowing:

  • the slot is single and the official DeepSeek Harness wordmark occupies it, so the clock replaces the wordmark while the row is active (the clock registers with priority: -1000 to win the seat). Switching the row off restores the wordmark.
  • the whole brand row is the shell's New session button: clicking the clock starts a new session. The widget never stops that propagation.
  • the brand row only exists while the sidebar is expanded - in the collapsed rail there is no seat, so the clock disappears with the wordmark.

The rule

Source of record, checked 2026-10-02: (footnote 2) - "Off-peak rates are half of the peak rates. Peak hours are 01:00 - 04:00 and 06:00 - 10:00 UTC, Monday through Friday, excluding Chinese public holidays. All other hours are off-peak, including weekends and Chinese public holidays in full."

So green is the default and red marks the exception: Monday-Friday in UTC inside 01:00-04:00 or 06:00-10:00, unless that UTC date is a Chinese statutory holiday. Off-peak is 50 % off for both current models.

Both halves carry their own copy of the holiday list, because dsh has no Host-to-Client config channel:

CopyPathUsed by
Hostsrc/features/offpeak.ts (Config.holidays, and the row config: in cordis.patch.yml)row validation and the user-visible setting
Clientclient/offpeak.client.js (HOLIDAYS)what the clock actually reads

Both must be updated together. The 2026 list comes from the State Council notice Guo Ban Fa Ming Dian [2025] No. 7: Jan 1-3, Feb 15-23, Apr 4-6, May 1-5, Jun 19-21, Sep 25-27, Oct 1-7. Makeup workdays (Feb 14 and 28, May 9, Sep 20, Oct 10) stay off-peak through the weekend rule and are deliberately absent from the list - do not add them.

To move to the next year: replace the dates in both copies, run pnpm build, refresh the page. If DeepSeek changes the windows themselves, change PEAK_WINDOWS_UTC in client/offpeak.client.js and update the URL and date above.

Tuning the row

holidays is a comma-separated list of YYYY-MM-DD Beijing civil dates:

- id: dsh-offpeak
  config:
    holidays: '2027-01-01,2027-02-05'

Settings > Plugins edits the same value. Note that this changes what the row reports; the widget reads its own list in client/offpeak.client.js, so a config-only change does not yet move the clock.

Configuring a row

Overrides live in the profile patch, not in this repository:

- id: dsh-hello
  config:
    greeting: 'Ahoj'
    excited: true

Settings > Plugins edits the same values. Values survive upgrades because they are outside the bundle.

Add a feature

pnpm new-feature suite weather
pnpm build

That writes src/features/weather.ts and appends its row to cordis.patch.yml. Details: ../../docs/plugin-development.md.