DeepSeek Harness plugin

dsh-filelens

FileLens — right-column file explorer for DeepSeek Harness: lazy directory tree, multi-format preview (Markdown/JSON/CSV/diff/log/hex/image), search & grep, tabs, inline editing with containment + ver

Jump to install

Source facts

Repository
Han-Yao94/dsh-filelens
Latest update
Aug 17, 2026
Category
Tools & Capabilities
GitHub stars
3
Format
plugin
Catalog evidence
Upstream dsh.bundle evidence
Evidence path
package.json#dsh.bundle
Checked against
0.1.0-rc.8
Upstream check date
2026-08-20

This evidence comes from the upstream catalog. This site has not installed, run, or security-reviewed the plugin.

Install

Start with a prompt that asks an agent to review the GitHub repository and 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 review the GitHub repository and source first.

Do not install or run any commands yet. Read this plugin's GitHub repository, README, and relevant source code. Then answer the questions below clearly and directly so I can decide whether it fits my needs:

1. What is this plugin, and what problem does it solve?
2. Who is it for, and what are its typical use cases?
3. How is it used after installation? Include one minimal example.
4. What known limitations or privacy, security, compatibility, or maintenance risks does it have?
5. Give a clear recommendation: recommend, conditionally recommend, or do not recommend, with reasons.

Distinguish statements documented by the repository, inferences from source code, and unknowns. If evidence is insufficient, say so explicitly. Do not guess or simply repeat the README.

GitHub: https://github.com/Han-Yao94/dsh-filelens
Plugin: dsh-filelens
Author: Han-Yao94

Check the source files

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

File explorer4 files
README.mdSource · read only
README language

dsh-filelens

English | 中文

FileLens — a right-column file explorer for the DeepSeek Harness web UI. Browse a lazy directory tree, preview many formats, search file names and contents, open multiple tabs, and inline-edit text files — with containment guards and version-guarded writes built in.

A single npm package ships both halves:

  • Host half — the filelens Remote service (root / list / search /

grep / read / readMore / readHex / write / readImage) over the host fs service. Invocation definitions are registered into the Host Typert registry at runtime (typert.local) — no generated artifacts, no decorator markers, install-shape agnostic.

  • Browser half — the details-column UI, wired to the Host through the same

/api Remote transport the built-in client connection uses. No ctx.remote namespace injection is needed, so there is nothing to deadlock or misconfigure.

Features

  • Lazy directory tree — expand/collapse, hidden-dotfile toggle, breadcrumb

navigation, drag-resizable column, and every entry is shown (no per directory cap). Refresh keeps your open tabs. The tree and open previews auto-sync with the disk (~2.5 s poll): added/removed entries appear and disappear, and previews reload when file content changes.

  • Multi-tab preview — drag-sortable tabs, Ctrl+Tab / Ctrl+Shift+Tab

cycling; per-tab "pretty/raw" and word-wrap preferences.

  • Typed rendering

- Markdown: headings, lists, task lists, quotes, aligned tables, fenced code with syntax highlighting and a copy button, auto TOC, blue links (URL scheme whitelisted). - Images: zoom 0.2–8×, rotate, 1:1 reset, download, pixel dimensions. - JSON (pretty + highlighted), CSV/TSV tables, diff/log coloring. - 30+ languages syntax-highlighted with line numbers and cross-line block comment handling. - Binary files get a hex view (offset + hex + ASCII).

  • Large files — 256 KB head preview with incremental "load more" (the Host

continues the same stream — no re-read from the start), virtual scrolling beyond 800 lines.

  • Search — recursive filename search (depth 8 / 3000 dirs / 300 results),

content grep (≤256 KB text files, 5 hits per file, click to jump to line), Ctrl+P quick-open palette. Searches are cancelable per family, so keystrokes never pile up heavy scans on the shared host.

  • Conversation links — clicking a file mention in a conversation switches

the tree to that file's own folder and highlights the file row.

  • Workspace awareness — the panel is a session-scoped details seat: it

resolves the current session's workspace on open, so switching between sessions with different workspaces re-roots the panel automatically.

  • Inline editing — text files edit in place; saves write through the host

fs service with a version guard (see Security).

  • Right-click menu — copy path / open in system / reveal in folder / open

in new tab.

  • State persistence — expanded dirs and open tabs survive reloads via

localStorage (key dsh-filex-state); the root always follows the current workspace, never a stale stored one.

Install

Prerequisites

  • A running DeepSeek Harness installation (the dsh CLI).
  • A profile to install into — the default deployment boots the web profile

(dsh web is its alias). The examples below use web; any name works and the first add initializes it.

Option A — from the GitHub repository

dsh plugin --profile web add github:Han-Yao94/dsh-filelens

Option B — from the release tarball (no build step)

Download dsh-filelens-1.0.0.tgz from the releases page, then:

dsh plugin --profile web add ./dsh-filelens-1.0.0.tgz

Option C — from npm (once published)

dsh plugin --profile web add dsh-filelens

Web GUI bundle

If the profile does not exist yet, the first add initializes it with @deepseek-ai/dsh-base; the browser GUI additionally needs the web-app bundle:

dsh plugin --profile web add @deepseek-ai/dsh-web-app

Then boot with dsh --profile web (or dsh web).

Git installs and build scripts

The package ships a prepare script that builds lib/ from source, and the lib/ artifacts are committed as well, so a clone works either way. pnpm ≥10 refuses to run a git dependency's prepare script until it is explicitly allowed — if the first add fails, copy the exact package key pnpm printed into the profile's pnpm-workspace.yaml and re-run:

allowBuilds:
  dsh-filelens: true

That allowance executes the package's build code on your machine at install time; only allow packages whose source you trust, and prefer pinning a commit: github:Han-Yao94/dsh-filelens#<sha>.

Verify the install

dsh --profile web --dump-config   # look for a "# == dsh-filelens" layer

Usage

Open the panel with the folder icon in the conversation header (or the details column), then:

ActionHow
Navigate the treeclick, or / / / / Enter
Open a fileclick its row (preview tab opens)
Open a file's folderclick a file mention in a conversation
Close back to the treeEsc
Search names / contentssearch box; toggle 文件名/内容 (name/content) mode
Quick openCtrl+P, type to filter, Enter to open
Find in fileCtrl+F, Enter / Shift+Enter next / previous, Esc to close
Switch tabsclick, Ctrl+Tab, Ctrl+Shift+Tab, Ctrl+W closes
Edit a text filethe pencil button (disabled until the file is fully loaded)
Save / cancelCtrl+S or the 保存 button / 取消
Zoom an image0.2–8× buttons, rotate, 1:1, download
Copy codecopy button on fenced code blocks

Security model

LayerEnforcement
Explorer rootevery read/write is containment-guarded against an explicit root; the guard is fail-closed (a root that cannot resolve, or a target outside it, rejects the call)
Writesfile.write requires an explicit root — link-opened or restored tabs may read without one by explicit user intent, but never write
Version guardsaves carry the FsVersion observed at read time; a file changed elsewhere rejects the save with stale instead of silently overwriting
Truncation guardfiles not fully loaded (>256 KB) cannot be edited, so a save can never truncate the rest of the file
Host sandboxthe underlying fs sandbox (e.g. workspace-write) remains the outermost boundary
Markdownlink/image URLs are scheme-whitelisted (javascript:/data: render inert)

Failures are never silent: save / load-more / root-pick errors surface in an in-panel notice.

Architecture

  • One package, two halves. The Loader row (id: filelens) loads the Host

service; the browser half is picked up automatically from the dsh.client declaration.

  • No generated artifacts. The Host registers its nine invocation

definitions into typert.local at service construction (src-json codecs, zero extra dependencies), so the gateway resolves them in any install shape.

  • Direct transport. The browser half POSTs the same client-request

envelope to /api that the built-in connection uses — no ctx.remote namespace injection, no mount-order pitfalls.

  • Host-side engineering. Incremental reads continue a cached stream

(O(n) per session instead of O(n²)); search/grep walks abort on a new request via AbortController; errors map to structured FsError codes.

  • Zero runtime npm dependencies beyond the @deepseek-ai/cordis /

@deepseek-ai/dsh-typert-protocol peers the harness already provides.

Notes

  • The column width drag range inherits the host's details-column constants

(stock hosts allow a narrower range than the development layout; FileLens works with both).

  • Editing writes to disk — review the content before saving; the version

guard protects against concurrent external changes.

  • The details seat is session-scoped: each session gets its own panel

state, and switching sessions re-roots to that session's workspace.

Development

npm install
npm run build                       # tsc (host half) + esbuild (browser bundle)
node scripts/make-client.mjs        # regenerate src/client from ../client.js

The UI logic source of truth is ../client.js (the dynamic-plugin edition); make-client.mjs transforms it into the static client half.

License

MIT. The SVG icon paths in the UI are derived from the Lucide icon set (ISC) — see LICENSE for the full notices.