timacek/DEEPSEEK-HARNESS-PLUGINS--packages-suite ↗★ 0
dsh-plugin-suite
个人 DSH 插件及功能合集包 适合需要一键安装作者个人套件(含 hello、offpeak 等功能)的用户。
安裝
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:timacek/DEEPSEEK-HARNESS-PLUGINS#409de076731323e1b91e9aa96a224423525fdaff&path:packages/suite說明文件
閱讀完整 README ↗dsh-plugin-suite
Personal DeepSeek Harness bundle. One bundle, one row per feature.
| Package | dsh-plugin-suite |
| Install path | this directory (absolute) |
| Rows | dsh-plugin-suite (Client anchor), dsh-hello, dsh-offpeak |
| Runtime pins | dsh 0.2.0-rc.2, cordis 4.0.4, dsh-tools 0.2.0-rc.2, schemastery 3.18.4 |
| Client half | client/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:
dsh.clientinpackage.json(platform: 'web') plus anexports["./client"]entry pointing at the hand-written file, andclientinfiles;- exactly one row resolves the bundle package, and its
nameis 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-modulesreject the package (resolves from multiple active Loader sources) and drop the browser half; - that anchor module must export
apply, even asexport 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. Anexport {}module looks installed and active in every Host view while serving nothing; __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 id | Module | Tool | Client half | Config |
|---|---|---|---|---|
dsh-plugin-suite | src/index.ts | - | anchor for client/offpeak.client.js | - |
dsh-hello | features/hello | hello | - | greeting (default Hello), excited (default false) |
dsh-offpeak | features/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.
| State | Color | Token |
|---|---|---|
| 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
singleand the officialDeepSeek Harnesswordmark occupies it, so the clock replaces the wordmark while the row is active (the clock registers withpriority: -1000to 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:
| Copy | Path | Used by |
|---|---|---|
| Host | src/features/offpeak.ts (Config.holidays, and the row config: in cordis.patch.yml) | row validation and the user-visible setting |
| Client | client/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.