Overview
dsh-custom-search
README / EN
Package documentation
Registry summary
dsh.pub verifies the pinned bundle contract, runtime facts, and distribution semantics. The complete README remains in the source repository.
Read the full README on GitHubLIMITATIONS
Known limitations
- **「测试连接」的探测层可能缺席**。本地检查(字段合法性、凭证状态,不联网)永远可用; 「真实请求」要经 Remote 调用到宿主,靠 Typert 的源模式发现,宿主没挂载那套包时只剩本地检查。 两条路都**不影响搜索本身**——最坏情况是少一个按钮。面板会说明是哪一种缺席(见上文 「测一下配好没有」),清单层面的原因见「依赖:为什么 `peerDependencies` 是必需的」。 - 探针走的是 Typert 的**源模式兜底**(手写 descriptor + 原型标记),因为本包没有构建步骤、 产不出 `dsh-typert-generator` 的那两份文件。这是 DSH 的内部机制,大版本升级后可能要跟着调; 调不动时的表现是面板点名说明,而不是搜索坏掉。 - 明细里的端点是**去掉查询串**的 `scheme://host/path`:Google CSE 把 `key=` 拼在 URL 上, 时限报错也会把整条 URL 写进消息,所以报告生成前统一脱敏(`engines.js` 的 `publicEndpoint` / `redactUrls`,`smoke.mjs` 有对应断言)。 - **换引擎不会迁移密钥**。`apiKeyEnv` 留空时引用名跟着主引擎走(`brave` → `BRAVE_API_KEY`), 所以从 Brave 换到 Tavily 要在表单里另填一个 key;旧的那个仍留在凭证服务里。 - `engine` 在 schema 里是 `union`,表单上是文本框 + 一排胶囊。填了 union 之外的值**保存会失败**, 表单会保留草稿让你改(`SettingsForm` 的既定行为)。 - 仍可以把密钥明文写进 profile patch 的 `apiKey` 字段(只在本机),但推荐走表单/凭证服务。 - `ctx.web` 的搜索请求只有 `query` 和 `maxResults` 两个参数,所以**没有**时间范围、域名过滤、 站点限定这类 provider 级控制(这是服务层的既定边界,不是本插件的取舍)。 - `search()` 是每次查询一次请求。`fallback` 里多个引擎串行尝试,最坏情况耗时是各超时之和。 - `available()` 必须是同步、离线的——服务层在选中 `custom-search` 时就是这么调它的——所以它只能 回答「有没有声明一个凭证**引用**」,回答不了「引用背后有没有值」:那个答案只有异步的凭证服务有。 **声明了引用就算可用**,判的是「有没有解析器」而不是「解析器当前有没有值」;官方 DeepSeek 搜索提供方用的也是这个判据(它检查自己的 resolver 闭包是否存在)。代价是缺 key 会推迟到 **搜索时**才报错——报的是引擎名与引用名,比在请求发出前被拦下更有用。`process.env` 里有值 不是必要条件,因为 key 的正常落点在凭证服务;未知引擎与不合理的 `timeoutMs` 仍判为不可用, SearXNG 实例挂了同样体现为搜索报错。
