dsh-ai-nav:给 DSH 侧边栏加一面 AI 导航墙

前言

给模型装上工具链之后,一个常见损耗是链接质量。问”有没有能做知识库的”,模型多半凭记忆回一个域名,写得有模有样,点开是 404 或别人的站。浏览器书签栏里存着同一批 AI 站点,翻起来比问一次还慢。

naturalth2012/dsh-ai-nav 针对的是这个点:它维护一份经过验证的 AI 站点目录,把入口做成侧边栏里的一整面瓷砖墙,同时把索引交给模型当工具用。下面介绍它的定位、页面能力、给模型的工具、安装与自检方式。

这是什么

naturalth2012 维护的 DSH 插件,安装后在侧边栏多一个图标,点开是索引页:上方搜索框,下方八类共 95 个条目。目的写得很直白——别再把同一批 AI 站点存在浏览器书签栏里翻。

它同时解决两件事:一是给人一个分类入口,二是给模型一份真实 URL 的目录,让”查到的是能点的网址,不是凭记忆编的链接”。README 明确声明这是”入口索引”,不是”服务承诺”:能不能打开取决于本机网络,境外站点在中国大陆通常不可直连,这属于网络可达性问题,不是链接失效。

package.json 里的定位是 dsh-ai-nav,version 为 1.0.0,license 为 MIT,author 为 naturalth2012。

页面提供什么

README 用一张表列了页面区域,这里逐项说明。

搜索框边打字边给本地候选,名称、别名、拼音缩写、域名都能命中,回车走搜索引擎。候选项右侧有”站内搜”,用该站点自己的搜索参数查询;没有查询参数的站点只提供”打开”,搜索仍走选中的引擎。

“不知道用哪个”是场景化推荐:用一句话说需求(例如”给团队搭个内部文档问答的知识库”),按场景推荐一套互补组合,每条写清为什么。

置顶与最近访问:鼠标移到瓷砖上出现星标,点一下置顶或取消;最近访问自动记最近 8 个,重复点同一块瓷砖只留一条。

分类瓷砖墙覆盖八个类目:对话助手、AI 搜索与深研、知识库与笔记、编程与 Agent、图像与音视频、办公与文档、模型与社区、学习与资料,共 95 个条目。

添加站点与导入书签:手工加一条,或选浏览器导出的书签 HTML(也支持拖进去),已知站点自动归类。

站点图标走宿主的同源代理 /plugins/ai-nav/favicon,页面本身不直连第三方。图标解析分三步,任一步成功即停:先试站点自身的常规地址(/favicon.ico、/apple-touch-icon.png、/favicon.png),再试根域名(chat.deepseek.com 回退到 deepseek.com),最后读页面 <head> 里声明的 <link rel="icon">。回包按首字节判定是不是图片,因为现代站点常用 application/octet-stream 返回图标,缺图标时又常返回 200 text/html,只看响应头两头都会错。结果按域名缓存 24 小时,无图标的域名 20 分钟内不重试;取不到就画按域名取色的字母方块。

给模型的工具

插件向宿主暴露六个工具,README 列的用途如下:

工具 用途
ai_nav_search 按关键词、别名、域名查目录,返回真实 URL、类目、标签、是否可自部署
ai_nav_recommend 按一句需求推荐组合,可限定国内直连、只要可自部署、优先免费
ai_nav_browse 不带关键词地浏览类目与条目
ai_nav_sites 管理自定义站点与置顶(list / add / remove / pin)
ai_nav_import 导入书签文件(给内容或本机路径)
ai_nav_open 把一句话解析成该打开的地址:像网址就打开,命中目录就开站点,否则去搜

目录质量上的两条规矩

README 把这两条作为目录维护底线,写在这里因为它决定了这套索引是否值得依赖。

  1. 每个 url 都是验证过能打开的官方入口——导航站的链接 404 比少收录更糟。
  2. 只有站点真的支持查询参数时才给 q 站内搜模板。猜一个模板会得到一个坏掉的结果页,这正是老式导航站最烦人的毛病。

安装与启用

README 和 package.json 都没有给出独立的安装命令(例如 dsh plugin add ... 形式),本文不拼接命令。需要先读源码确认行为,再按宿主的方式加载插件。

插件的入口声明在 package.json 的 dsh 字段:

"dsh": {
  "bundle": { "patch": "./cordis.patch.yml" },
  "client": {
    "platform": "web",
    "immediately": true,
    "inject": ["@deepseek-ai/dsh-client-ui-conversation"]
  }
}

bundle.patch 指向 ./cordis.patch.yml,是宿主半边的补丁入口。配置项写在这个文件里:

- insert:
    - id: ai-nav
      name: 'dsh-ai-nav'
      config:
        engine: metaso      # 默认搜索引擎 id(metaso / baidu / bing / google / perplexity …)
        showSelfHost: true  # 是否显示"可自部署"的条目
        favicons: true      # 是否启用图标代理(关掉就全用字母方块)

页面里选的引擎会存进用户数据,优先于这里的默认值。

需要留意的是插件以当前 DSH 进程的权限运行,安装前应检查源码与许可证。许可证为 MIT,仓库地址是 https://github.com/naturalth2012/dsh-ai-nav。

数据位置与写入安全

自定义站点、置顶、最近访问、引擎选择存在 $DSH_PROFILE_DIR/ai-nav/data.json,回退到 $DSH_HOME/ai-nav,再回退到 ~/.dsh/ai-nav。写入走”临时文件 + rename”,坏文件按”没有数据”处理,不会让页面打不开。

所有存储的链接在写入和读出时都过一遍 safeUrl():只接受 http(s):,javascript:、data:、file: 一律拒绝。

离线自检

node scripts/selfcheck.mjs

覆盖 138 项纯函数检查(目录完整性、别名词汇、排序、URL 猜测、书签解析、推荐、存储 URL 闸门、图标候选顺序与首字节嗅探),不联网、不开浏览器。改动 catalog.js 后值得跑一遍。

代码结构

README 的文件表如下:

文件 内容
index.js 宿主半边:目录组装、同源路由、六个工具、图标代理的网络部分
icon.js 图标策略(纯函数):候选顺序、首字节嗅探、<link rel="icon"> 解析、缓存与并发闸门
catalog.js 八类目、十二个搜索引擎、全部内置条目(纯数据)
search.js 归一化、分词、排序、URL 猜测、书签解析、归类
recommend.js 场景规则与推荐(长词优先的特异性权重)
store.js 可写状态:自定义站点、置顶、最近、设置
client.js 浏览器半边:sidebar.panellist 图标 + main 面板
scripts/selfcheck.mjs 离线自检

已知边界

这些边界直接来自 README,它写得很具体,值得照录。

目录是人工维护的真实入口,不是抓取来的;站点改版后个别链接可能需要更新,改 catalog.js 即可。站内搜只覆盖少数确实支持查询参数的站点,其余站点回车走搜索引擎。

推荐是规则引擎,不是模型调用:可解释、可离线测试,但不会理解超出关键词表的表达。推荐里”同一类最多两条”是降权而非过滤,第三名之后的同类条目按与首名的差距打折,所以”写文档、做 PPT、整理会议纪要”能给出 WPS AI、WorkBuddy、飞书、腾讯文档、通义听悟,而不是让 17 分的对话助手挤掉 83 分的办公工具。

图标代理每个域名最多 4 秒、96 KiB,最多跟一次跳转,并拒绝内网地址;并发取 5 个域名,同域名合并成一次请求。取不到就回退到字母方块,能取到的比例取决于本机网络,被墙的站点一律是方块。

适用场景

适合两类人。做 DSH 应用的人,需要一个分类清晰、链接经过验证的 AI 站点索引,比自建书签列表维护成本低,也给模型一份可靠的查询对象。做模型交互的人,可以把”推荐组合”和”一句话打开地址”当成熟能力直接用,不必自己写规则。

不适合当作访问境外站点的手段:被墙的站点图标和链接都会失败,索引本身不解决网络可达性。

结尾

dsh-ai-nav 的价值不在收录数量,而在”每条链接都验证过”和”给模型的是真实 URL”这两点。如果已经在用 DSH 并且常用多个 AI 站点,值得装一个试试。

目录页:https://www.skillhub.cn/plugins/naturalth2012/dsh-ai-nav
GitHub:https://github.com/naturalth2012/dsh-ai-nav

插件以当前 DSH 进程权限运行,安装前请检查源码与 MIT 许可证。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜