Introduction¶
When developing agents with DeepSeek Harness (DSH), a common requirement is to “monitor a set of metrics while chatting”: local CPU usage, API balance, or the latest release from a specific repository. Building a standalone frontend or repeatedly asking the model to paste tables in the chat either leads to high maintenance costs or consumes context and tokens.
dsh-pad is a client-side plugin for DSH. It attaches a draggable panel dock to the right side of the Web interface or the Jingyu (Whale) desktop client. Panels are generated and modified by the model during the conversation via pad_* tools. Data can be fetched via local commands or HTTP polling, or refreshed by a background agent running at intervals. The panel scripts can also call dsh.run to perform a pure text model inference. Below is an introduction to what it is, how to install it, how to use it, and the permissions and configurations to be aware of during installation.
What is this¶
- Name: dsh-pad (npm package name
dsh-pad) - Maintainer: ChisaAlter
- Category: Client-side (Injects Web UI)
- License: MIT
- Current Version (package.json): 0.2.2
- Directory Page: SkillHub - dsh-pad
- Source Code: GitHub - ChisaAlter/dsh-pad
In one sentence: A floating panel dock on the right side of DSH. AI generates sandboxed HTML panels within the conversation, supporting side-by-side tiling, local/HTTP data sources, AI scheduled refreshes, and in-panel dsh.run model invocation. The panel design concept is referenced from the maintainer’s custom panels and scheduled refresh panels in ChisaBot.
Core Features¶
Floating Dock and Layout¶
There is a draggable capsule on the right side; clicking it opens the panel list. When expanded on a wide screen, it yields space to the conversation area to avoid blocking the input box as much as possible. You can drag the left edge to adjust width, drag the title bar to move it vertically, and drag the top/bottom edges to adjust the overall height. Position and dimensions are saved in the browser’s localStorage.
Cards support tiling: dragging one card onto another places them side-by-side (defaulting to 50/50 split), with a maximum of 3 cards per row. The divider in the middle allows adjusting the ratio. Dragging a card to an empty area splits it back into a standalone row. Cards can be collapsed; collapsed cards stop polling data sources.
AI Generation and Modification¶
The model maintains panel definitions via tools like pad_create and pad_update. Panels render HTML/CSS/JS within an iframe with sandbox="allow-scripts", and the color scheme follows the dsh light/dark theme. You can simply describe your requirements in the conversation, such as observing server performance or displaying the DeepSeek API balance.
The + at the top of the dock inserts the prompt “Use pad_create to create a custom panel” into the input box (without sending it automatically). Send it after completing your requirements. When a new panel appears, the dock automatically expands and highlights it.
Two Data Fetching Methods¶
- Direct Data Source: Execute shell commands on the host side or request HTTP APIs, refreshing at second-level intervals without consuming conversation tokens. Suitable for structured data like performance metrics or balance APIs. Polling occurs only when the panel dock is expanded and the card is not collapsed. Command output is limited to 512KB, with a default timeout of 10 seconds.
- AI Refresh: Run a round of agent in the background according to
agent.everyMinutes, submitting results viapad_submit_data/pad_report_failure. Suitable for data requiring search, webpage reading, or multi-step reasoning. The background agent operates without manual approval; tool calls requiring approval will be rejected. For local commands, prefer using direct data sources.
Secrets are referenced using {{env:NAME}} in the data source configuration. They are resolved only on the host side and are not sent to the browser iframe.
In-Panel Model¶
Panels can configure a top-level model (provider / model / optional reasoningEffort). In the panel script, dsh.run(prompt) uses this model for a one-time pure text generation (no tools, no network, default 120s timeout, 2048 output tokens). AI refresh and dsh.run share this panel’s model configuration, which can also be switched via the “Panel Model” option in the card’s ⋯ menu.
Security and Approval¶
When creating or modifying a data source, a default approval prompt pops up (Allow Once / Reject). After rejection, an “Allow Run” button remains on the card. The configuration option autoApprove: true can disable the prompt (use at your own risk).
Auto Update Check¶
The first check for GitHub Releases occurs approximately 7 seconds after startup, with subsequent checks every 6 hours by default. A download icon appears at the top of the dock only when a new version is available. Clicking update pulls the built lib/ from the Release; it requires a restart of dsh to take effect after backing up to .dsh-pad-update-backup/. For installations linked to a development directory (containing .git/), it only prompts for a new version and does not overwrite the source code.
Installation and Activation¶
Environment Requirements: dsh ≥ 0.2.1-rc.2, using dsh web or the Jingyu desktop client.
The plugin is registered as a bundle (written to the profile’s dsh.profile.bundles). Do not manually copy this repository’s cordis.patch.yml into the profile’s cordis.patch.yml, otherwise modules cannot be resolved and the application may fail to start.
It is recommended to run a self-check in the plugin directory before installation:
node scripts/doctor.mjs
Install from GitHub (The repository contains the built lib/, no local build is needed):
dsh plugin --profile web add github:ChisaAlter/dsh-pad#7fc110b02fe34ea4dd518f79229f6477165d54da
Local development directory installation:
dsh plugin --profile web add /path/to/dsh-pad
After modifying the source code, you need to run npm install && npm run build in the plugin directory before installing. Restart dsh web or Jingyu after installation. To uninstall:
dsh plugin --profile web remove dsh-pad
If the application fails to start after installation, you can remove dsh-pad from dsh.profile.bundles and dependencies in $DSH_HOME/profiles/web/package.json, clean up incorrect cordis.patch.yml entries and the node_modules/dsh-pad link, and then restart. Run doctor.mjs again before reinstalling.
Typical Usage¶
Describe the panel in natural language within the conversation, for example:
Create a panel to observe this server’s performance: CPU, memory, disk, load, refresh every 3 seconds.
Create a panel to display my DeepSeek API balance, the key is in the environment variable DEEPSEEK_API_KEY.
Create a panel to watch the latest release of deepseek-ai/deepseek-harness, update it with AI every 6 hours.
The panel definition is a JSON structure containing title, html / css / script, sources (command or http), and optional model and agent. The repository’s examples/ directory contains three complete examples: server performance, DeepSeek balance, and GitHub release, which can serve as references for model output.
Inside the iframe, data is accessed via window.dsh: dsh.onData subscribes to updates, dsh.history views trends, dsh.refresh / dsh.ask / dsh.openUrl handle interactions, and dsh.fmt.* / dsh.chart.* handle display. Use dsh.run for real-time inference, but network data fetching should still rely on direct data sources or AI refresh.
Tools available to the model include: pad_list / pad_get, pad_test_source (test run data source, requires approval), pad_create / pad_update, pad_models, pad_refresh, pad_delete.
Configuration (Optional)¶
Patch the config of dsh-pad in $DSH_HOME/profiles/web/cordis.patch.yml (Note: patching replaces the entire config, so you must write out all keys you need). Common items example:
- id: dsh-pad
name: dsh-pad
config:
autoApprove: false
minIntervalSec: 2
Other keys include: dataFile (default $DSH_HOME/dsh-pad/panels.json), agentRefresh, minAgentMinutes, agentTimeoutSec, interactiveModel, runTimeoutSec, updateCheck / updateCheckHours, etc. See the repository README configuration table for details.
Use Cases and Notes¶
Suitable for: Developers already using DSH Web/Jingyu who want to pin monitoring/dashboards next to the conversation and are willing to let the model generate and maintain panel HTML.
Permissions: Direct data sources execute commands and HTTP requests under the dsh host process privileges. Before installation, you should read the source code and MIT license to ensure the scope of commands and URLs is acceptable. The plugin runs with the current profile, not as an independent privilege-reduced service.
Limitations: AI refresh generates independent session logs (approx. tens of KB per round) under $DSH_HOME/dsh-pad/refresh; you need to manually clean up the corresponding directory in $DSH_HOME/sessions/. Panel layout and dock dimensions are stored in browser localStorage; you need to readjust them if switching browsers. The dsh plugin API is still changing rapidly; the floating dock relies on host details like shell.overlay and may degrade to a pure floating layout during major host changes.
The community plugin directory SkillHub has no official affiliation with DeepSeek / High-Flyer. The DSH ecosystem emphasizes “Everything is a plugin,” and dsh-pad is one such implementation for client-side dashboards.
Conclusion¶
dsh-pad connects “saying what panel you want in the chat” with “local/HTTP polling + optional AI refresh + in-panel dsh.run” into a single workflow, using a tiling layout to avoid overlaps and gaps caused by free positioning. If you need to monitor a set of metrics in DSH long-term, you can install it from the directory page or GitHub using the official commands, and use doctor.mjs and data source approval to keep risks within acceptable limits.
- Directory Page: https://www.skillhub.cn/plugins/ChisaAlter/dsh-pad
- GitHub: https://github.com/ChisaAlter/dsh-pad