Introduction

When performing download tasks in DeepSeek Harness (DSH), command-line logs often only show current progress, making it difficult to distinguish between multiple concurrent download tasks. Especially for scenarios like downloading large GitHub files, mirror acceleration, and multi-threaded downloads, it is best to have progress, speed, and remaining time displayed persistently.

dsh-download-progress is a download manager plugin for DSH that provides a persistent floating panel in the bottom-right corner, displaying the filename, percentage, speed, and remaining time for each download task.

What is this

dsh-download-progress is maintained by azhe411 and is licensed under MIT.

It mainly solves the problem of DSH download tasks lacking a persistent progress panel:

  • Persistent download panel in the bottom-right corner;
  • Filename, percentage, speed, and remaining time displayed for each task;
  • Support for concurrent multi-tasking, with independent progress bars for each task;
  • Retains history of completed and failed tasks, up to 20 entries;
  • Supports locating completed or failed files in the file explorer;
  • Panel supports dragging and resizing;
  • Download tools support resume download, HTTP redirect following, and GitHub mirror acceleration;
  • Optional aria2 multi-threaded download using 16 concurrent connections;
  • Download task status is written to ~/.dsh/downloads/tasks/<task>.json;
  • Supports both dynamic plugin loading and static plugin loading.

DSH’s plugin ecosystem emphasizes “everything is a plugin”. dsh-download-progress belongs to the download manager plugins in the community directory. The community directory is an independent site and has no official affiliation with DeepSeek / Huafan.

Core Features

Persistent Download Panel

The panel stays in the bottom-right corner and does not disappear when there are no tasks. The panel displays a “Standby” status and shows specific progress once download tasks begin.

Multi-task Concurrency

Each download task is displayed on a separate line:

  • Filename;
  • Percentage;
  • Speed;
  • Remaining time;
  • Independent progress bar.

History

Completed and failed tasks are retained in the list, up to 20 entries. You can locate the corresponding file in the file explorer via the “Open” button in the list.

Panel Operations

  • Task list supports collapsing/expanding;
  • Panel can be dragged via the title bar;
  • Panel can be resized via the handle in the bottom-right corner.

Download Capabilities

The download tools support:

  • Resume download;
  • HTTP redirect following;
  • GitHub mirror acceleration;
  • Optional aria2 multi-threaded download using 16 concurrent connections.

Download task status will be written to:

~/.dsh/downloads/tasks/<task>.json

The panel reads these task statuses to display progress.

Installation and Enablement

This plugin has two loading methods:

  1. Dynamic Plugin Method: Temporary use, lost after restart;
  2. Static Plugin Method: Recommended for automatic loading after restart. Requires copying the plugin package to the profile’s @local directory, modifying cordis.patch.yml, and restarting dsh web.

If you are just temporarily verifying, you can use the dynamic plugin method. If you want automatic loading after restart, the static plugin method is recommended.

Static Plugin Installation Command

Here is the copy command for the static plugin package:

cp -r @local/dl-manager ~/.dsh/profiles/web/node_modules/@local/dl-manager

After copying, you also need to add the plugin’s loading configuration in cordis.patch.yml and restart dsh web.

The static version of the plugin is recommended for long-term use of the download panel. The dynamic plugin method is suitable for temporary debugging and will be lost after a restart.

Typical Usage

The following command examples are from the plugin documentation.

Regular Download

node ~/.dsh/scripts/download.cjs <URL> <output_path>

Once the download starts, the panel in the bottom-right corner will display the progress of that task.

Using GitHub Mirror Acceleration

node ~/.dsh/scripts/download.cjs <URL> <output_path> --mirror=https://gh-proxy.com/

Suitable for scenarios where direct connections to GitHub large files in China are prone to timeout. The README mentions that recommended mirrors may be occasionally unstable; if a failure occurs, you can switch mirrors or retry.

Using aria2 Multi-threaded Download

node ~/.dsh/scripts/aria2-dl.cjs <URL> <output_path> --mirror=https://gh-proxy.com/

The aria2 mode uses 16 concurrent connections and is suitable for larger files. Progress is also written to the task status directory and drives the display in the bottom-right panel.

Use Cases and Notes

Who is this suitable for

If you frequently need to download files in a DSH web session, especially large GitHub files, multi-task downloads, or mirror-accelerated downloads, this plugin is suitable for you.

Pre-installation Notes

The plugin runs with the permissions of the current dsh process. It is recommended to check the source code and confirm the license before installation. This plugin is licensed under MIT.

Path Issues

If fs.resolve('~/.dsh/...') does not correctly expand ~, the progress bar may stay in “Standby” status. In this case, you need to change the relevant path to an absolute path, for example, changing ~/.dsh/downloads/tasks to the actual absolute path under the current user’s directory.

Dynamic Plugin Notes

The DSH dynamic client does not have browser timer globals. When you need to refresh periodically inside a dynamic plugin, you should use ctx.interval from the timer service, and the plugin needs to declare:

"inject": ["timer"]

Static Plugin Notes

The static version of the plugin cannot directly use harness.handle from dynamic plugins. The static host side should use ctx.webServer.register to register HTTP endpoints, and the client side should use fetch for polling.

aria2 RPC Notes

  • aria2 RPC requests must include Content-Length, otherwise the aria2 RPC server may report a Parse error;
  • In aria2 RPC mode, the download process does not exit automatically after completion. You need to poll tellStopped to clean up and write the done status, then execute aria2.shutdown.

Other Notes

  • Speed limit functionality has been removed;
  • Mirrors recommended in the README may be occasionally unstable;
  • The dynamic plugin method is marked as temporary and will be lost after restart;
  • The static plugin method is recommended for automatic loading after restart.

Conclusion

The value of dsh-download-progress lies in transforming DSH download tasks from “waiting in the command line” to “observing in a persistent panel,” especially suitable for multi-task downloads, GitHub mirror acceleration, and aria2 multi-threaded download scenarios.

Related links:

  • Plugin Directory Page: https://www.skillhub.cn/plugins/azhe411/dsh-download-progress
  • GitHub Repository: https://github.com/azhe411/dsh-download-progress