DeepSeek Harness plugin

dsh-file-preview

Floating workspace file-preview window for the Web client: lazy file tree, CodeMirror preview and in-window edit with save, Markdown and image preview, Quick Open search, and opening paths clicked in the conversation.

Jump to install

Source facts

Repository
UndeadSheep/dsh-file-preview
Latest update
Aug 18, 2026
Category
UI Enhancements
GitHub stars
0

Install

Start with a prompt that asks an agent to read the source. Switch to the command if you want to install it yourself.

Copy this prompt into DSH, Codex, or another agent and ask it to read the page and repository first.

Do not install anything yet. Read this DeepSeek Harness plugin and explain what it does, which files, networks, or credentials it can access, and how to install and remove it.

Plugin page: https://deepseekplugins.org/plugins/UndeadSheep/dsh-file-preview~23dsh-file-preview
GitHub: https://github.com/UndeadSheep/dsh-file-preview/tree/main/packages/dsh-file-preview
Plugin: dsh-file-preview#dsh-file-preview
Author: UndeadSheep
Install command: dsh plugin --profile web add github:UndeadSheep/dsh-file-preview#path:/packages/dsh-file-preview

Do not run the install command until I confirm.

Check the source files

Read the README and other files from this plugin directory before installing.

File explorer3 files
README.mdSource · read only

@undeadsheep/dsh-file-preview

Workspace file-preview host half: a Typert Remote (filePreview) that lists the workspace tree, reads/writes text files, and resolves the preview theme and config for the browser half.

The browser UI lives in a separate package: [@undeadsheep/dsh-client-ui-file-preview](../dsh-client-ui-file-preview).

Remote surface

| Method | Request | Result | |--------|---------|--------| | listDir | { sessionId, path } | Ok<FileTreeNode[]> \| Rejected | | readFile | { sessionId, path } | Ok<{ path, content }> \| Rejected | | readImage | { sessionId, path } | Ok<{ path, mimeType, data }> \| Rejected | | writeFile | { sessionId, path, content } | Ok<{ path }> \| Rejected | | readTheme | { sessionId } | Ok<{ colors, bg, fg }> | | readConfig | { sessionId } | Ok<{ indentSize, useTabs, pollInterval, fontSize }> |

Business results use the repo's { ok: true, value } | { ok: false, error: { code, ... } }

convention; the generated ./remote face wraps them in the RemoteResult carrier. Wire codecs are generated from the @Remote method types by typert codegen — there is no hand-written schema file.

listDir lists a single directory (path = '' for the workspace root) and skips heavy/noise directories (node_modules, .git, .next, .ssh, …) plus sensitive filenames (.env*, id_rsa*, *.pem, *.key, …). A single listing is capped at 1000 children. Dir nodes carry empty children, which the browser half fills lazily by calling listDir again when a directory is expanded. readFile / readImage / writeFile also refuse those sensitive paths, so typing them in Quick Open does not bypass the tree filter.

Config

KeyDefaultMeaning
maxFileBytes2097152Maximum UTF-8 byte length the preview will read or write
maxImageBytes5242880Maximum byte length of an inline image the preview will read

Workspace config files (read per Session, optional)

  • preview.config.jsonindentSize, useTabs, pollInterval, fontSize

(with .prettierrc / package.json#prettier fallback for indent knobs)

  • preview-theme.jsonkeyword, string, number, comment, tag,

function, type, variable, background, foreground

  • .vscode/settings.jsoneditor.tokenColorCustomizations and

workbench.colorCustomizations are read as a fallback theme

Known limitations

  • Preview is text-only (plus raster png/jpeg/gif/webp); binary, SVG-as-image,

or oversized files return not-text / too-large. A stat with no size is refused rather than reading the whole file into memory. Writes use the same byte cap as text reads.

  • listDir returns at most 1000 children per directory.
  • Symlink following after resolve is the host ctx.fs implementation's

responsibility; this plugin re-resolves search children against workspaceRoot but cannot realpath on its own.

  • Syntax highlighting is a lightweight hand-written tokenizer (not highlight.js /

TextMate), and a prettier engine cannot be embedded.

  • Auto-refresh is polling (pollInterval, clamped 500–60000 ms), not a real file watcher.