dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
给 AI agent 一副「知道该看哪个文件」的眼睛。
Agent 改 bug 时最大的瓶颈不是模型,是「该看哪几个文件」——给整个仓库会撑爆上下文, 只看当前文件又漏掉关键依赖。这个插件把「读哪些文件」从 O(全仓库) 降到 O(top-k)。
一个 DSH 插件:注册成 agent 工具(它会自己调用),同时提供斜杠命令与 HTTP 接口。
repo_search("notify session 过滤")
→ src/host/notify-events.ts:53-60 shouldNotifySession (22.07) [bm25 + 符号名 + 路径]
→ src/host/notify-events.ts:91-123 reduceNotifyFrame (16.20) [bm25 + 符号名 + 依赖图]
代码检索没有现成 benchmark,所以用 commit 自带的结构自建了一套: commit message 当查询,「这次改了哪些文件」当标准答案——正好对应「问题 → 该改哪里」。
| k(读几个文件) | recall(全部真值) | recall(只算实现文件) |
|---|---|---|
| 4 | 0.357 | 0.633 |
| 8 | 0.431 | 0.724 |
| 16 | 0.542 | 0.834 |
| 32 | 0.644 | 0.899 |
hit@8 = 0.809 —— 给一句改动意图,top-8 里至少命中一个真实改动文件的概率是 81%。
这张表才是这个东西的全部意义。没有它,下面所有设计都只是「我觉得这样更好」。
dsh plugin --profile desktop add file:D:/path/to/code-ctx
重启 DSH 后自动生效。索引根目录按优先级解析:
?root=DSH_CODE_CTX_ROOT$DSH_HOME/code-ctx/config.json 的 {"root": "..."}一定要配第 3 条。 桌面版宿主的 cwd 通常不是你的项目目录,索引会是空的。
| 入口 | 说明 |
|---|---|
agent 工具 repo_search | agent 自己判断何时调用 |
/ctx <问题> | 手动查询 |
/ctx build | 强制重建索引 |
GET /dsh-code-ctx/search?q=... | HTTP 查询 |
POST /dsh-code-ctx/index | 强制重建 |
GET /dsh-code-ctx/stats | 索引状态 |
也可以完全脱离 DSH 用 CLI:
node bin/cli.js index <仓库路径> --out .code-ctx/demo.json
node bin/cli.js search "websocket hmr" --index .code-ctx/demo.json --top 8
遍历文件 ──► 按符号切块 ──► 词元统计 + 依赖图 ──► 索引
│
查询 ──► BM25 ──► 符号名/路径加权 ──► 依赖图扩散 ──► 排序去重
三个信号叠加:
parseConfig 时,函数就叫这名字的必须排最前用正则 + 括号配对做切块,不依赖 tree-sitter(免编译原生模块)。代价见「已知局限」。
all-MiniLM-L6-v2 融进来只涨 3.3 个百分点
(recall 0.431→0.465),代价是索引 0.5s→115s、依赖 5MB→463MB。而且权重越高越差:
α=1.0 时 recall 掉回 0.434 —— 向量在代码检索里只能当配角,权重一高就把精确标识符匹配冲掉了。
实验脚本保留在 tools/embed-eval.mjs。ws.d.ts 和 playground 测试会把
真正的 server/ws.ts 挤下去(它们「更爱提关键词」)。按路径降权后第 1 条就对了。lib/ 是打包后的单文件,和 src/ 内容不同,内容哈希去重抓不到,
同一个函数会占三个名额 → 存在 src/ 时直接排除 lib/ dist/ build/ out/。bundledDev.ts 这类),
这是纯词法检索的天花板MIT —— 见 LICENSE