READMESource: main@6f4d9756
dsh-file-index(文件)
侧边栏「自动化任务」下面多一行 文件:把所有对话里出现过的文件汇总到一页,按 Word / 其他 分两组。
- 数据来源:
~/.dsh/sessions/*/session-*/session.v4.jsonl.zstd(所有会话,不只当前这个)。 - 统计哪些文件:
present交付的文件、write/edit写出的文件、用户消息里的附件,以及日志里出现过的绝对路径(限~/.dsh/workspaces与~/.dsh/attachments内)。 - 底部居中一个半透明小胶囊,只显示「读了多少」的百分比数字;滚动时亮一下,停手 1.2 秒淡到 34%,读到 100% 变绿;一屏就到底的短文档不显示。
- 每篇阅读页最下面都有「完」+「读完了,标记一下」:点一下把这篇标成已读完(再点一下撤销),列表里该文件名字前面会出现绿色的「已读完」。标记存在
~/.dsh/file-index-state.json,删掉这个文件就全部清零。 - 阅读页会记住读到哪儿:关闭标签页或切走时把滚动位置存进
localStorage(键dsh-file-index:pos:<绝对路径>),下次点开同一个文件自动跳回去。 - 点一行 → 新标签页直接读:
.docx与.md现场转成网页(/file-index/view),pdf/图片内联,其他类型走下载。 - 刷新按钮重新扫描;宿主侧有 20 秒缓存,
?refresh=1跳过。
路由
| 路由 | 作用 |
|---|---|
GET /file-index/list |
JSON:{ok, scannedAt, sessionCount, counts:{word,other}, files:[…]} |
GET /file-index/view?path=<abs> |
docx / md → 排版好的 HTML 页面;其余 302 到 /open |
GET /file-index/open?path=<abs> |
返回文件字节;只允许 ~/.dsh 下 workspaces / attachments / cache |
实现要点
docx不装依赖:lib/docx.js自己读 zip 中央目录(inflateRawSync解 deflate),再按块解析word/document.xml—— 标题样式、粗斜体、换行、表格都保留,页眉页脚/批注不显示。- 会话日志是 zstd 多帧追加(每条记录一帧,魔数
28 b5 2f fd):zlib.zstdDecompressSync一次只解一帧,所以按魔数切帧后逐帧解压,再按行 JSON 解析,尾部半帧跳过。 - 路径比较前统一
realpathSync:这台机器/data/user/0/<pkg>与/data/data/<pkg>是同一目录的两种写法。 - 去重按
文件名:字节数;已删除的文件只在它是present交付物或附件时保留,并标红显示。
安装(本机试用)
ln -sfn ~/.dsh/plugins/dsh-file-index ~/.dsh/profiles/web/node_modules/dsh-file-index
# 然后在 profile 的 cordis.patch.yml 末尾追加:
# - insert:
# - id: file-index
# name: dsh-file-index
新加插件条目只在 DSH 启动时生效:装完要重启一次 DSH。之后改代码可以按界面上的刷新按钮热换。
安装(本地)
三处就够了,不用打包、不用 registry:
- 源码放
~/.dsh/plugins/dsh-file-index/; ~/.dsh/profiles/web/package.json的dependencies里声明"dsh-file-index": "file:../../plugins/dsh-file-index"(本地链接,不走网络);~/.dsh/profiles/web/cordis.patch.yml末尾- insert: [{id: file-index, name: dsh-file-index}],把它插进插件图。
node 侧解析验证:req.resolve('dsh-file-index') → ~/.dsh/plugins/dsh-file-index/lib/index.js;
dsh --profile web --dump-config | grep file-index 有且只有一条。
装完要重启一次 DSH(这个 profile 只在启动时应用插件图);之后改代码按刷新按钮热换即可。
No comments yet. Be the first to write one.