dsh-web-search-ddg
aooyoo
Zero-token DuckDuckGo search provider for the DeepSeek Harness (DSH) web seam — local headless browser, no API key, no m…
PROJECT TOPICS
PROJECT README
Install: dsh plugin --profile web add github:omdsh-dev/dsh-drag-and-drop
A DeepSeek Harness Web UI plugin: drag local files or folders onto any part of the page and their original absolute filesystem paths are inserted into the current conversation input — without uploading, moving, or copying anything.
A browser never hands a web page the real filesystem path of a dropped file — it exposes only a local file URI when it feels like it, and often nothing at all, for security. DSH, though, operates on real files: its tools read, run, and patch actual paths on the machine. Drop a file into an ordinary web input and you get either an upload (a copy that silently breaks the file's relationship with its neighboring dependencies) or a hand-typed path that is easy to get wrong.
This plugin closes that gap on the machine running DSH. It converts the browser's local file URI into the native absolute path, and when the browser hides the path entirely it resolves the file back to its real location — through the current Workspace, registered Workspaces, the OS file index, and a bounded directory search — then writes that path into the current conversation input. The file never leaves its directory.
Drag files or folders from Finder, a Linux file manager, or Windows Explorer onto any part of the DSH Web UI.
Release the mouse when the full-page drag hint appears; the plugin writes the resolved original absolute path into the current conversation input.
Dropping multiple items at once inserts one path per line.
The plugin is a DSH bundle (package.json declares dsh.bundle + dsh.client). Install it into the web profile with the standard dsh plugin mechanism — no DSH source changes and no config.yaml needed:
dsh plugin --profile web add github:omdsh-dev/dsh-drag-and-drop
# or from a local checkout:
dsh plugin --profile web add /path/to/dsh-drag-and-drop
The repository ships its build output (lib/ is committed) — no build step needed after installing.
The old README's
pnpm --filter @deepseek-ai/dsh add ...+config.yamlflow is obsolete: under the official profile/bundle modelconfig.yamlis no longer read.
After installing, restart the Web UI the way you normally start DSH, then refresh the browser page — the plugin appears in the browser boot manifest (__DSH_BOOT__) and its client bundle loads automatically.
dsh plugin --profile web update github:omdsh-dev/dsh-drag-and-drop
For a local-path installation, run add again against the replacement checkout.
dsh plugin --profile web remove @omdsh-dev/dsh-drag-and-drop
The command removes the package from the profile and from dsh.profile.bundles. After uninstalling, restart the Web UI and hard-refresh the browser.
| Symptom | Resolution |
|---|---|
| Dropping a file inserts nothing | Drag again and confirm the full-page hint appears. Verify the bundle is in the profile (dsh --profile web --dump-config | grep drag-and-drop) and that the Web UI was restarted + hard-refreshed after installing |
| Wrong path inserted when several copies share a name | Candidates are filtered by full file name and size, then content-sampled only among the survivors. If byte-identical copies remain, the plugin shows a chooser — pick the correct path there |
| Path resolution is slow on a large disk | Install the platform index (Linux: plocate; Windows: Everything CLI) and keep files inside a Workspace or a common directory. Every search is bounded: 3s per index command, at most 100 candidates, at most 20,000 directory entries per root |
| macOS/Linux: dropping a folder resolves nothing | Folders are matched by name against Workspaces and common directories; a folder outside every searchable root cannot be located when the browser hides the path — move it into a Workspace or install the OS index |
| Plugin does not load after install | Restart the Web UI and hard-refresh the browser — the client bundle only loads on a fresh page load with the plugin in __DSH_BOOT__ |
If the browser exposes a local file URI, the plugin converts it directly into the operating system's native path.
If the browser hides the original path for security reasons, the plugin locates the file in this order:
~/Downloads/dump2 11/iotclaw.ndjson) without walking the whole treeSystem indexes used per platform:
plocate first, then locateOn Linux, when the system index returns no candidates, the plugin also searches the user home directory and mount points under /mnt and /media.
On Windows, when the system index returns no candidates, the plugin also searches the user directory and available fixed disks.
To keep searches bounded:
Candidates are first filtered by:
Modification time is used only for ranking candidates, never as identity.
每一层搜索都先做浅层快速定位:先检查搜索根的直接子项,再检查直接子目录与孙目录内的直接子项(共三层以内的文件,绝大多数拖拽都在这一范围内),随后才查询该范围内的操作系统索引,最后才递归目录。当前 Workspace、其他 Workspace 和常用目录的优先级保持不变。
4bab506 (feat: resolve dropped-file paths up to three levels deep)
If multiple candidates remain, the plugin compares sampled fingerprints from the beginning, middle, and end of the files. Only when sampled fingerprints of large files still collide does it compute a full SHA-256.
If several paths correspond to byte-identical files, the plugin shows the list of paths and lets the user choose which one to insert.
Folders are first searched by name only. A unique candidate is returned directly without traversing the browser directory; multiple same-name candidates are compared by sorted relative path, project type, and file size. For directories that are structurally identical, content samples of up to 24 deterministically chosen files are computed; if still identical, the user picks the path. Directory traversal processes at most 10,000 entries and 32 levels deep, and never follows symlinks or Windows junctions.
Each search level first checks the direct children of the search root, then queries the OS index within that scope, and only then recurses into directories. The priority of the current Workspace, other Workspaces, and common directories is preserved.
The plugin never:
In most cases the plugin only reads file metadata.
Only when multiple candidates share the same name and size does it read a small amount of content to compute sampled fingerprints, and only when large files cannot be told apart by sampling does it read the full content to compute SHA-256.
All resolution and fingerprinting happens locally on the machine running DSH.
Finder drag-and-drop and the Spotlight index are supported. Verified in Chrome on macOS.
File managers that provide text/uri-list are supported. When the browser hides the path, the plugin searches Workspaces, common directories, plocate, locate, and bounded mount directories.
Installing plocate is recommended for faster global path resolution.
Drive-letter paths and UNC network paths are supported. When the browser hides the path, the plugin prefers the Everything CLI; without Everything it uses PowerShell to search the user directory and fixed disks.
Installing Everything and its command-line tools significantly speeds up path resolution on large disks.
The build script needs a DSH checkout. By default it locates one through the dsh command; you can also point it explicitly:
DSH_CHECKOUT=/path/to/dsh pnpm run build
Run tests:
pnpm test
Type-check:
pnpm run check
Build:
pnpm run build
Repository layout:
src/ — host (node) half: path resolution, directory walk, fingerprinting, platform search, and the file-locate HTTP routesrc/client/ — browser half: drag handling, drop items, path locator, candidate chooser, toast UItests/ — vitest suites for the host and client logiclib/ — committed build output (host + client bundles)BSD-3-Clause
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。