Codex-style `@file` mentions for the web GUI: search and reference workspace files of every format (.java, .vue, PDF, images, extension-less, hidden) with no index truncation. Replaces dsh-at-file.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:hatsuyuki0103/dsh-at-any
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
Workspace path references for the DeepSeek Harness web interface. Type @ in the composer to search the current workspace and insert a file or directory path.
Why dsh-at-any instead of dsh-at-file: the original plugin capped its index at 5000 entries by default, which silently dropped .java/.vue and other source files in workspaces with more files (the bug this fork fixes). dsh-at-any removes the practical cap (default 1,000,000) and indexes every source format — .java, .vue, .ts, XML, YAML, images, PDFs, extension-less and hidden files (.env, ...). Build-artifact directories (target/dist/node_modules/...) are still skipped by default.


Usage
Choose a result from the @ menu. The selected path remains visible in the draft and can be opened or removed from the reference bar.
Review @docs/spec.pdf
Before the agent starts a step, the plugin confirms that the path exists inside the active workspace. It then adds a short reference message:
<workspace-reference path="docs/spec.pdf" kind="file" />
The reference contains the workspace-relative path and its kind. The plugin does not open the referenced file or list the contents of a referenced directory. The agent can inspect the path with the tools available in the current session when the task requires it.
File format and file size do not change this behavior. A PDF follows the same path-reference flow as any other workspace file.
This mechanism applies to version 0.3.0 and later. Earlier releases read file content during submission and enforced file-size limits.
Path Picker
Plain queries match filenames. Exact names, prefixes, and compact matches rank ahead of looser results, without matching letters scattered across a long directory path.
A query containing / matches path segments in order. For example, src/view can find src/client/view.ts. A trailing slash such as src/ searches within that path.
When a directory is highlighted, press ArrowRight to enter it. The draft advances to @path/ without a trailing space, and the candidate menu stays open for the next selection. Enter and pointer selection keep the existing behavior and finish the directory reference.
Each result shows the filename first and its parent directory underneath. Duplicate filenames include the parent directory in the main label. Built-in SVG icons distinguish folders, source files, text, PDFs, images, data and configuration files, archives, and other files.
The default index skips common version-control directories, IDE metadata, dependency trees, caches, and build output. The list covers VS Code, Visual Studio, JetBrains IDEs, Fleet, Eclipse, Android and Gradle, Xcode, CMake, Flutter, .NET, Unity, Unreal, and common JavaScript and Python output directories. OS metadata files named desktop.ini, Thumbs.db, and .DS_Store are excluded by default.
Install or Update
dsh plugin --profile web add https://github.com/hatsuyuki0103/dsh-at-any/archive/refs/tags/v0.1.3.tar.gz
Use the same command to update an existing installation. Restart dsh web after installation so the Host and browser client load version 0.1.3.
Upgrading from 0.1.2 or earlier is required, not optional: those versions recorded
@pathreferences in asourceshape the Harness refuses when it migrates a Session log, which made every Session that used an@reference permanently unreadable ("cannot safely transform unclassified message source"). 0.1.3 writes the admitted{ kind: 'plugin', plugin: 'dsh-at-any' }source instead. Sessions already damaged by an earlier version must be repaired before they can load again — see Troubleshooting.
Replacing dsh-at-file: this plugin shares the
atFileservice namespace with dsh-at-file, so the two must not be enabled at the same time. Migration: remove the old plugin first (edit the profilepackage.jsonand delete the"dsh-at-file": "file:..."dependency line, or rundsh plugin --profile web remove dsh-at-file), then install this plugin and restartdsh web.
File Filters
Open Settings -> File mentions to manage file-name filters.

- Global contains rules shared by every workspace.
- Workspace contains additional rules for the selected workspace path. Each workspace keeps its own list, and the panel shows the global rules it inherits.
Each rule has its own matching mode and case setting:
- Exact matches one complete basename. Path separators are not accepted.
- Regex runs a JavaScript regular expression against the complete basename. It does not receive the parent directory or workspace path.
- Case-sensitive can be enabled independently for any Exact or Regex rule. It is off by default.
Rules are added and removed individually. An invalid regular expression is shown before saving and is also rejected by the Host. Restore defaults resets the global list to the built-in file names. Clear workspace rules removes only the selected workspace's additions.
Settings are saved in the DSH web profile through the plugin's own Host connection. Existing string values in ignoreFiles and workspace lists continue to work as case-insensitive Exact rules. A change clears the affected index cache, so the next @ search uses the saved rules.
Configuration
The available options apply to the path picker index:
maxIndexedFilesis a soft cap on indexed workspace entries, default 1,000,000 (no practical truncation). It only bites for pathological workspaces with over a million entries.ignoreDirsreplaces the built-in list of directory names excluded from the picker. Set it to[]to index every directory.
Add the complete configuration to the selected profile's cordis.patch.yml. The usual path is ~/.dsh/profiles/web/cordis.patch.yml.
- id: dsh-at-any
config:
maxIndexedFiles: 100000
Omitting ignoreDirs keeps the built-in list. When you provide it, include every directory name you want excluded.
Path Handling
- The picker indexes regular files and directories in the active workspace. Configured directory names and symbolic links are skipped.
- Global and workspace file-name filters are combined during the Host index walk, before entries count toward
maxIndexedFilesor reach the browser. - The Host accepts workspace-relative paths. Absolute paths and paths that escape the workspace are ignored.
- Reference markers are created only from user-authored text.
- Clicking a referenced path uses the Harness
host.openPathendpoint. - The picker index is cached per session for 30 seconds.
- An
@pathtoken cannot contain whitespace or another@character. maxIndexedFileslimits picker results. A manually entered path can still be referenced when it exists inside the workspace.
The active agent may lack a tool for a particular file format. DSH provides read for UTF-8 text and read_image for supported images. PDF support depends on the tools available in the session.
Troubleshooting
Files missing from the
@picker: the picker index is cached per session for 30 seconds and re-walks on first search after a restart. If files are still missing after a restart, check Settings -> File mentions for anExact/Regexfilter that matches their names, and confirm the files are not inside an artifact directory (target/dist/node_modules/...) skipped by the default ignore list.Old plugin still active: dsh-at-any shares the
atFileservice namespace with dsh-at-file — remove dsh-at-file from the profile (package.jsondependency +dsh.profile.bundleslist) before or together with installing dsh-at-any, then restartdsh web.Changes to
src/require a rebuiltlib/:lib/is committed (profile installs run without a build). Runnode build.mjsafter editingsrc/and commit both. If you only patch the built bundle, keepsrc/in sync.Session history will not load:
cannot safely transform unclassified message source(0.1.2 and earlier): those versions recorded@pathreferences in asourceshape the Harness refuses, and the format migration is all-or-nothing, so the whole Session artifact is unreadable. Confirm the damage and repair it with the bundled tool:node tools/repair-session-sources.mjs --self-test node tools/repair-session-sources.mjs --check C:/Users/you/.dsh/sessions node tools/repair-session-sources.mjs --dry-run C:/Users/you/.dsh/sessions node tools/repair-session-sources.mjs --apply C:/Users/you/.dsh/sessions--checkand--dry-runnever write anything, and--applybacks each artifact up (byte-identical, digest-verified) before rebuilding it and validating the result through the real Harness migration. Repair rewrites only the offendingsourceobjects to{ kind: 'plugin', plugin: 'dsh-at-any' }; the referenced path is untouched because it lives in the message content.The tool scans every Session generation (
session.jsonlandsession.v<N>.jsonl, compressed or not) and reports which generation the backend actually loads, because a stale lower generation can sit beside the artifact in use. It resolves the Harness migration catalog from--harness <dir>(defaults to the global install); if no catalog is found,--applyrefuses to run rather than writing an unvalidated result — pass--no-validateonly if you deliberately want that. Run--self-testfirst if you want to see the safety contract exercised on a throwaway session. Restartdsh webafterwards. Newly written Sessions are unaffected once you are on 0.1.3.
Development
pnpm install
pnpm run check
pnpm run test
pnpm run build
The development setup expects the official deepseek-ai/deepseek-harness repository at ../deepseek-harness, its default clone directory. Built files under lib/ are committed so profile installation does not require package build scripts.
License
MIT
Links
More in this category
zhu1090093659/dsh-web#packages/dsh-task-board★ 8296
Task board for the dsh web GUI: a sidebar multi-column kanban whose cards run in real DSH agent sessions and can also be scheduled with cron expressions, executed host-side even with the browser closed.
zhu1090093659/dsh-web#packages/dsh-web-all★ 8296
Plugin and skin collection for the DSH Web UI: task board, Git graph, right-side panel, remote mobile UI, pet, live token stats, and a skin center.
omdsh-dev/DSH-better-sidebar★ 3968
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
ccch1mneyyy/dsh-TUI★ 3948
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 3877
A fixed-corner whale widget for the DSH web GUI — balance, today's usage and per-turn cost with peak/off-peak pricing, editable balance-alert and daily-budget bubbles, a module-based custom bubble queue with A/B weighted choices and random lines or images, 30+ vendor templates (OpenAI, OpenRouter, Kimi, SiliconFlow, Ark, Zhipu, MiniMax and more) with per-model balance and subscription quota, plus task-end sound, imported audio, custom roles and a resource manager. Local-only, no telemetry.
Devin-AXIS/deepseek-design#deepseek-idesign★ 1413
Visual design studio for websites, app prototypes, posters, cards, reports, and magazines, with templates, direct element editing, selection-aware AI draft handoff, and export.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.