dsh-at-file
FSMargoo/dsh-at-fileCodex 风格的 `@file` 文件引用,输入框里直接搜索并引用工作区文件。
Web 客户端悬浮文件预览窗:懒加载文件树、CodeMirror 预览与窗内编辑保存、Markdown 与图片预览、Quick Open 搜索,以及点击会话中的路径直接打开。
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.
| 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.
| Key | Default | Meaning |
|---|---|---|
maxFileBytes | 2097152 | Maximum UTF-8 byte length the preview will read or write |
maxImageBytes | 5242880 | Maximum byte length of an inline image the preview will read |
preview.config.json — indentSize, useTabs, pollInterval, fontSize
(with .prettierrc / package.json#prettier fallback for indent knobs)preview-theme.json — keyword, string, number, comment, tag,
function, type, variable, background, foreground.vscode/settings.json — editor.tokenColorCustomizations and
workbench.colorCustomizations are read as a fallback themepng/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.resolve is the host ctx.fs implementation's
responsibility; this plugin re-resolves search children against workspaceRoot but
cannot realpath on its own.pollInterval, clamped 500–60000 ms), not a real file watcher.