Introduction

When developing agents using DeepSeek Harness (DSH), a common problem arises: knowing exactly which files were created or modified in a single turn often requires digging through long transcripts. The built-in Produced line only provides a general list of artifacts; to determine exactly what changed in a specific file, one must manually inspect it in the editor.

dsh-file-changes is a DSH Web plugin maintained by mixin-ai that solves a very specific problem: it lists the files created or modified in the current turn at the bottom of the answer message, supporting direct diff viewing, opening with the system default application, or locating the file in the OS file manager. This article introduces it in the order of features, installation, principles, and notes.

What is it

dsh-file-changes is a DeepSeek Harness Web plugin, licensed under the MIT license, with the current version being 0.1.0, and the code is hosted on GitHub (mixin-ai/dsh-file-changes).

It complements the built-in Produced line: beyond “Produced,” it adds created/modified badges, per-file diffs, and per-file filesystem location. When a turn creates or modifies files, the panel lists each file under the end message, along with three operations:

  • Open: Click the filename to open the file with the OS default application.
  • View diff: Opens a modal box using the harness’s DiffBlock primitive to render the actual changes applied this turn; for new files, it displays the full file content.
  • Reveal: Locates and selects the file in the OS file manager (macOS uses open -R, Windows uses explorer /select,, desktop Linux opens the containing directory). This action is only displayed when loopback access is available and a native opener is present.

Installation and Enablement

Install from GitHub:

dsh plugin --profile web add git+https://github.com/mixin-ai/dsh-file-changes

You can also install from a local checkout, which is convenient for modification and debugging:

dsh plugin --profile web add link:/path/to/dsh-file-changes

After installation, restart dsh web, then refresh the browser page, and the panel will take effect.

The plugin requires Node version ^22.19.0 || >=24.0.0. If you want to verify that the plugin logic is functioning correctly, you can run the tests in the repository root directory:

node smoke.test.mjs && node client.test.mjs

These two tests cover the host side and client logic, respectively.

How it Works

The plugin consists of two halves: host and client, mounted via the bundle patch in cordis.patch.yml:

  • lib/index.js: The host half, containing nested dispatch tap and two HTTP routes.
  • lib/client.js: The browser bundle, containing the turn accumulator and UI for the panel/diff/reveal.

There are two modes based on the data source:

  1. Native Mode. The client half registers a session definition (similar in approach to @deepseek-ai/dsh-client-ui-deliverables), accumulates this turn’s successful change-like tool calls from the presentation view (hunks with card: 'diff' or generic kind: 'edit' location), publishes them as turn-scoped data under the fileChanges key, and renders them through the conversation.chat.turnTail slot chain of the chat view.

  2. Code Mode (run_code). The nested dispatch does not carry the presentation view during transmission over the wire, so the client cannot obtain the information; therefore, the host half listens for executions with parent in tools/execute and tools/result (i.e., Code Mode sub-calls), rebuilds change records from the parameters of write / edit / str_replace_editor, and provides them to the frontend via /api/file-changes/changes.

The panel merges the two sources and deduplicates by file path, so regardless of how the file was changed, you can see it all in one place.

The Reveal function goes through the POST /api/file-changes/reveal endpoint: the server first validates the JSON payload, loopback origin, and absolute existence path, and only executes it via the platform opener after all checks pass.

Scenarios and Notes

Suitable scenarios:

  • Using the DSH Web interface for development in the browser and wanting to immediately confirm which files were changed after each turn.
  • Needing to view diffs per file, rather than flipping through code blocks in the transcript.
  • Wanting to jump to the file manager to locate files in a loopback environment with one click.

Notes to consider when using:

  • Files created indirectly by terminal commands (e.g., bash) will not be detected, which is the same vocabulary limitation as the official produced-files line.
  • The host side Code Mode change records exist in memory (a ring buffer of 2 hours or 2000 entries per session), and they are cleared after the server restarts.
  • The reveal endpoint only trusts JSON requests from the same origin as loopback; this is an intentional security design.

Additionally, a reminder: the plugin runs with the permissions of the current dsh process; it is recommended to check the source code and license before installing. This project is under the MIT license, the codebase is small, and the main logic is concentrated in lib/index.js and lib/client.js; the cost of reading through it is low.

Conclusion

What dsh-file-changes does is not complex, but it hits a daily pain point in DSH Web usage: making file changes in each turn visible, searchable, and navigable. It is compatible with both Native and Code Mode sources and performs boundary validation on reveal paths; it is a small, well-defined plugin.

DSH’s philosophy is “everything is a plugin,” and community-maintained plugins like this are a component of this ecosystem. The project address and directory page are as follows:

  • GitHub: https://github.com/mixin-ai/dsh-file-changes
  • Directory: https://www.skillhub.cn/plugins/mixin-ai/dsh-file-changes

It is worth noting that skillhub.cn is an independent community directory site with no official affiliation with DeepSeek / Hypothesis; please refer to the README in the repository for accuracy before use.