deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:HaoyueQin/deepseek-harness-background
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
A custom background image plugin for the DeepSeek Harness Web GUI (dsh web): upload a local picture, or paste an image URL, and render it behind the whole app surface with adjustable opacity, readability scrim, panel transparency and frosted-glass blur — everything live-previewed inside the settings panel and committed automatically on release.
The look (fixed wallpaper layer + theme-aware scrim + translucent glass panels driven by --dsw-* design tokens) is modeled on the community dsh-wallpaper-engine implementation.
| Home | ![]() |
| Conversation | ![]() |
| Settings | ![]() |
http(s) image link and press Enter.cover (fill, crop) or contain (whole image). Under cover the preview card is a pan surface: it can move the image along the crop's slack axis (up/down when the art fills the width, left/right when it fills the height) with a four-way move cursor — drag, arrow keys (Shift for a coarse step), double-click or the recenter chip. contain letterboxes and offers no pan; either way the card keeps tracking the window ratio.backdrop-filter): the composer card and message bubbles, code blocks / terminal / diff / tool-IO cards / skill & MCP call cards and inline code, the agent task strips and their takeover panels (approval / question / plan review), the chrome buttons (new session, composer plus, scroll-to-bottom), the load-earlier history button, the subagent lineage popover, the sidebar build badge, and the home hero "preview" badge — every glassed surface carries the full recipe (fill + sheen + blur), never translucency without frost. Reading surfaces — dialogs, the settings UI, menus, tooltips, toasts, hover fills and every accent (the send button stays blue) — keep their official opaque paints so nothing legible turns washy (the one documented exception: the turn rail's hover preview, which is rail chrome over the art and joins the glass sheet). The blur radius is driven by the glass-blur slider; panelOpacity at 100% restores the official paints on the whitelisted list too.window.__DSH_BACKGROUND_GLASS__ global + the dsh-background-glass:ready event): token mode adds the missing sheen + blur chain when the panel already fills with an overridden --dsw-* token, fill mode takes the fill over as well; every rule sits under the data-dsh-bg-glass gate so it toggles with the glass automatically. Consumers take zero dependencies and degrade gracefully when this plugin is absent; the whole bridge tears down with it. See docs/GLASS_API.md.prefers-reduced-motion places directly). The rail's full ladder (turnOutline outline + loaded window) leaves unloaded marks to the kernel's own loadThrough jump — and while one of those kernel jumps is still paging (the mark pulses aria-busy) the plugin stands down entirely. Because the official hover preview card paints an opaque fill, it joins the glass sheet under the wallpaper gate instead (same explicit-fill recipe as the composer card, driven by the glass-blur slider); the tick column carries the DeepSeek-web edge dissolve (paint layer only, hit-testing untouched). The rail's active-mark state stays the kernel's own — the glide scrolls the real scrollport, so the stock scroll handler keeps updating it and the persisted scroll position. The bottom-follow state is detached one frame before the glide (streaming growth / turn-end re-renders cannot yank it back to the floor). Toggle it off with the timeline switch in the row.ui-background namespace in $DSH_HOME/settings.yaml on dsh ≤ 0.1.6, and this plugin's profile entry in the active profile's patch from dsh 0.1.7 on (a pre-0.1.7 section is adopted once, and the settings row says so).| Plugin release | Supported dsh versions |
|---|---|
| 0.6.1 | dsh 0.1.2-rc.1 and 0.1.3-alpha.x (verified on alpha.2), plus 0.1.5-alpha.1/alpha.2/rc.1/rc.2 (verified on rc.2), 0.1.6-alpha.1/alpha.2, 0.1.7-alpha.1/alpha.2/rc.1/rc.2 (verified on rc.2), 0.2.0-rc.1 (verified on rc.1) and 0.2.0-rc.2 (verified on rc.2) |
| 0.6.0 | dsh 0.1.2-rc.1 and 0.1.3-alpha.x, plus 0.1.5-alpha.1/alpha.2/rc.1/rc.2 and 0.1.6-alpha.1/alpha.2, 0.1.7-alpha.1/alpha.2/rc.1/rc.2 and 0.2.0-rc.1 |
| 0.5.6 | dsh 0.1.2-rc.1 and 0.1.3-alpha.x, plus 0.1.5-alpha.1/alpha.2/rc.1/rc.2 and 0.1.6-alpha.1/alpha.2, 0.1.7-alpha.1/alpha.2/rc.1/rc.2 |
| 0.5.5 | dsh 0.1.2-rc.1 and 0.1.3-alpha.x, plus 0.1.5-alpha.1/alpha.2/rc.1/rc.2 and 0.1.6-alpha.1/alpha.2, 0.1.7-alpha.1 |
| 0.5.3 – 0.5.4 | dsh 0.1.2-rc.1 and 0.1.3-alpha.x, plus 0.1.5-alpha.1/alpha.2/rc.1/rc.2 and 0.1.6-alpha.1/alpha.2 |
| 0.5.2 | dsh 0.1.1-rc.2 and 0.1.2-alpha.1 ~ alpha.5 |
⚠️ On older dsh (0.1.1-rc.2, 0.1.2-alpha.x or earlier) install an older
plugin release (dsh plugin --profile web add deepseek-harness-background@0.5.2);
this plugin no longer adapts to the pre-rc.1 kernels.
The plugin is a standard out-of-tree dsh bundle, published on npm:
dsh plugin --profile web add deepseek-harness-background
From a local checkout (development):
dsh plugin --profile web add /path/to/deepseek-harness-background
From a source checkout:
pnpm dsh plugin --profile web add /path/to/deepseek-harness-background
Or from git:
dsh plugin --profile web add github:<you>/deepseek-harness-background#<commit>
Restart to load it:
dsh --profile web
dsh --profile web) and open it in a browser.| Control | Meaning |
|---|---|
| 不透明度 / Opacity | 0..100% image opacity (5% steps); lowering it fades the wallpaper toward the surface. |
| 遮罩 / Scrim | 0..95% readability veil over the image (5% steps); white in light mode, black in dark mode. |
| 面板不透明度 / Panel opacity | 0..100% surface transparency (5% steps); at 100% the official panels stay opaque (no glass). |
| 毛玻璃模糊 / Glass blur | 0..40px backdrop-filter blur on the translucent surfaces (1px steps). |
| 壁纸模糊 / Wallpaper blur | 0..60px blur of the wallpaper image itself (2px steps). |
| 填充方式 / Fit | cover (fill, crop) or contain (whole image); under cover the preview drags the image along the crop's slack axis (arrow keys nudge, double-click or the recenter chip recenters). |
| 会话时间线 / Timeline | on/off switch for the conversation timeline (default on). On dsh ≥ 0.1.2-rc.1 the row is labelled 会话时间线增强 / enhancement: the official rail stays and this only improves its behaviour (smooth jumps for loaded turns); turning it off restores stock behaviour. |
settings.general.item slot), next to the Appearance row. Its chrome uses only --dsw-alias-* design tokens (buttons / pills / segmented control / slider track match the official shell); sliders are native input[type=range] with 5% / 1–2px steps and release-commit. The preview card's box is computed from the live window ratio (shrinking and centering as a whole past a height cap), and the wallpaper framing is stored as normalized 0..1 offsets mapped onto object-position — so one stored framing holds across every window size and source./api/bg-wallpaper/*: settings, upload, image/<id>) read/write the section and serve uploads with same-origin + size caps + MIME/signature checks + a path-escape fence. A custom route family is used because the api-proxy settings allowlist does not expose third-party namespaces over the settings RPC.z-index:-2 wallpaper layer plus a z-index:-1 scrim on body, toggled by the data-dsh-bg attribute; the scrim switches white/black by data-ds-dark-theme in the injected stylesheet. Frosted glass is whitelist-scoped: only the whitelisted surfaces get --dsw-* surface-token overrides, while everything else is painted by explicit data-dsh-bg-glass-gated rules carrying the FULL recipe (fill + sheen + blur chain): the three chrome buttons, the load-earlier history button, the composer dock family (agent task strips TodoPanel / GoalBar / QueueDock and their takeover panels — approval, question, plan review — whose tokens turn translucent and need the blur added), the subagent lineage popover, the home hero preview badge and the sidebar build badge — every other official token and reading surface (menus, dialogs, tooltips, toasts) stays untouched.conversation.input.dock slot (per-session lifecycle). Detection is a capability check on the slot props rather than a version compare: the official rail is rendered from the very index ui-chat publishes as a session hook (useChat(s => s.navigation.items()), dsh >= 0.1.2), so the presence of that hook is the presence of the official rail — and it survives pre-releases, forks and deployments that mount a different conversation target. With the hook the plugin renders nothing and intercepts clicks on the official rail's loaded marks in the capture phase (React 18 dispatches onClick from the root container during the bubble phase, so a capture listener on the rail runs first and stopImmediatePropagation() keeps the stock handler from ever firing) — resolving the click index against the merged ladder the kernel actually renders (turnOutline outline + loaded window, mirroring mergeTurnRailItems in ui-chat), with marks outside the loaded window (no anchor key) left to the kernel's own load-through jump — and while one of those kernel jumps is still paging (a mark pulses aria-busy) the plugin stands down entirely, because the kernel's loaded branch cancels its own pending jump before landing and an interception would bypass that cancellation. The official hover preview joins the glass sheet under the wallpaper gate (same explicit fill recipe as the composer card), and the tick column carries the DeepSeek-web edge dissolve. Two rail generations are handled by capability, never by version compare: the frame-style rail (dsh 0.1.2-rc.1 … 0.1.6), whose marks are mapped by geometry over the metrics it publishes inline, and the virtualized rail (dsh 0.1.7+), whose rendered marks carry their own ladder index and which mounts only a window of them at a time. Supported baseline: dsh >= 0.1.2-rc.1; older dsh (0.1.2-alpha.x and 0.1.1-rc.2 or earlier) installs an older plugin release (see Version compatibility).src/client/glass-registry.ts) publishes its bridge on client apply — before any repaint can race it: register({ plugin, selectors, mode }) is idempotent per (plugin, mode, selector) triple and synthesizes explicit body[data-dsh-bg-glass]-gated recipe rules into a dedicated <style data-plugin-css> tag; selectors are structurally validated first (no { } ; @ < > ,, no backslashes, 500-char cap) with per-selector warn-and-drop that never blocks valid siblings; disposing the client fiber retracts the whole bridge (stylesheet, entries, window key). Contract docs in docs/GLASS_API.md / GLASS_API.zh.md; behavior locked by tests/glass-registry.spec.ts.$DSH_HOME/deepseek-harness-background/ (content-addressed ids). Switching to a new image or clearing the background deletes the superseded upload file, so the directory does not accumulate dead images in normal use. (An upload that is never saved into the section — e.g. the tab closes right after an upload — can leave one orphaned file behind.) Disable / uninstall leaves nothing behind.pnpm install # first time; runs prepare (build)
pnpm run typecheck # tsc
pnpm test # vitest contract tests
pnpm run build # tsdown: lib/index.js (host) + lib/client.js (browser bundle)
deepseek-harness-background/ # the plugin repo (package name stays the npm-style id)
├── package.json # dsh.bundle.patch + dsh.client.inject declarations
├── cordis.patch.yml # inserts the deepseek-harness-background row into the web roster
├── tsdown.config.ts # official clientBundle preset
├── src/
│ ├── index.ts # host half: settings namespace + API routes
│ ├── routes.ts # /api/bg-wallpaper/{settings,upload,image/<id>}
│ ├── migrate.ts # one-shot adoption of a pre-0.1.7 settings section
│ ├── schema.ts # host-side schemastery schema (+ the volatile Config)
│ ├── settings.ts # constants/types shared with the client
│ ├── harness-home.ts # $DSH_HOME / ~/.dsh resolution
│ └── client/
│ ├── index.ts # painter lifecycle + settings row registration
│ ├── backdrop.ts # fixed wallpaper layer + scrim + glass surface + preview vars
│ ├── background-css.ts # injected stylesheet (layers, glass, light/dark scrim, variables, read_image card)
│ ├── glass-registry.ts # third-party glass registry (window bridge + gated rule synthesis)
│ ├── timeline/
│ │ ├── index.tsx # dock entry: official-rail capability probe + re-exports
│ │ ├── official-enhance.tsx # dsh>=0.1.2-rc.1: smooth-jump interception for loaded marks
│ │ ├── jump.ts # shared jump engine (paging + glide)
│ │ ├── rail-pointer.ts # rail tick resolution (data-index / frame geometry) & full-ladder merge
│ │ └── types.ts # shared shapes
│ ├── SettingsRow.tsx # the General-settings row (preview surface + stepped sliders)
│ ├── SettingsRow.module.css # row styles (official tokens)
│ ├── settings-client.ts# fetch transport (read/write/upload)
│ └── locales.ts # zh/en copy
└── tests/ # schema, routes, apply (painter), settings-row contracts
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。