dsh-web-search-plugin 0.1.2 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/README.md +70 -26
- package/cordis.patch.yml +8 -2
- package/lib/brave.js +1 -0
- package/lib/client.js +632 -90
- package/lib/deepseek.js +148 -0
- package/lib/index.js +138 -18
- package/lib/shared.js +1 -1
- package/lib/tavily.js +10 -2
- package/lib/usage.js +352 -0
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,43 @@
|
|
|
2
2
|
|
|
3
3
|
本项目的重要变更都记录在此。格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循 [Semantic Versioning](https://semver.org/lang/zh-CN/)。
|
|
4
4
|
|
|
5
|
+
## [0.2.1] - 2026-08-18
|
|
6
|
+
|
|
7
|
+
相对 0.2.0 的补丁:设置卡补上额度进度条、两列布局和输入校验,并收紧空态文案。
|
|
8
|
+
|
|
9
|
+
### 新增
|
|
10
|
+
|
|
11
|
+
- 设置导航「网页搜索」补上地球 logo(与 dsh-credits 相同的 nav mask 做法)。
|
|
12
|
+
- **Tavily keyed 额度**:搜索请求带 `include_usage`,把本次 credits 累加到本地高水位;每 10 分钟拉一次 `GET /usage`(计划名 / `plan_limit`),显示 `max(本地, 远端)`。换计划或远端用量回落视为新周期。
|
|
13
|
+
- **Brave 额度**:从搜索响应的 `X-RateLimit-*` 解析月配额、剩余量和重置时间,写入本地缓存。
|
|
14
|
+
- 设置卡在搜索引擎切换下方展示进度条(已用/剩余、重置时间、绿/黄/红提醒)。DeepSeek 官方与 Tavily keyless 不展示。
|
|
15
|
+
|
|
16
|
+
### 变更
|
|
17
|
+
|
|
18
|
+
- 设置卡同一区域的短配置改为两列(搜索引擎/认证、API key/凭据名、深度/主题、国家/语言、模型/版本等);Base URL、代理仍单行。
|
|
19
|
+
- 去掉卡片顶部说明文案;**结果数量**改为 1–20 下拉。
|
|
20
|
+
- 国家/语言、代理的「留空…」改到输入框 placeholder,字段下方不再重复。Brave 额度卡把「月请求不限额 / 重置时间」收进卡片内。
|
|
21
|
+
|
|
22
|
+
### 修复
|
|
23
|
+
|
|
24
|
+
- 保存按钮在「看起来可点、实际 disabled」时没有反馈。现在始终可点(只读或保存中除外),成功/无变更/失败都会弹出 toast,对齐 dsh-credits。
|
|
25
|
+
- 未保存草稿对齐官方插件卡:卡片右上角「未保存」角标、字段「已覆盖 / 恢复默认」,离开设置页再回来仍保留草稿,可继续保存或放弃。
|
|
26
|
+
- Tavily keyed 额度卡在 `plan_limit` 尚未拉到时会把已用量藏成「未公布限额 / —」。本地扣费现在会直接显示「已用 N」;首次填入套餐名不再把本地计数清零。
|
|
27
|
+
- Brave 月限额 `0` 的套餐按控制台 **Capacity** 展示每秒窗口(例如 50 次/秒),不再把月配额渲染成「已用 0 / 0」。Brave 没有花费/credits 接口。
|
|
28
|
+
- 数字框只接受不小于 1 的整数;非法输入用红色错误文案替换灰色 hint,保存会被拦住。超出 20 的结果数量会夹到上限。
|
|
29
|
+
|
|
30
|
+
## [0.2.0] - 2026-08-19
|
|
31
|
+
|
|
32
|
+
### 新增
|
|
33
|
+
|
|
34
|
+
- **DeepSeek(官方)后端**(`lib/deepseek.js`)。设置项 `provider: deepseek-official` 走 DeepSeek 的 Anthropic 兼容 Messages API(原生 `web_search_20250305` 工具,凭据名 `DEEPSEEK_API_KEY`)。bundle 层顺带禁用内置 `web-search-deepseek` Host 插件,从而移除旧的「插件 → 网页搜索」卡片、避免重复注册 provider。
|
|
35
|
+
- **顶层「设置 → 网页搜索」分区**。配置入口从「设置 → 插件 → 插件配置」里的 keyed 卡片改为 `settings.section`(id `web-search`)——与「插件」分区同级,一张卡内切换 DeepSeek / Tavily / Brave,并各自展开对应配置项(模型、API 版本、max tokens / max uses 等)。
|
|
36
|
+
|
|
37
|
+
### 变更
|
|
38
|
+
|
|
39
|
+
- `provider` 取值扩展为 `deepseek-official` / `tavily`(默认)/ `brave`;接缝 id 仍为 `dsh-web-search`。
|
|
40
|
+
- 新增 `lib/deepseek.js`;`package.json` 版本号 bump 到 `0.2.0`,`check` 脚本纳入新文件。
|
|
41
|
+
|
|
5
42
|
## [0.1.2] - 2026-08-18
|
|
6
43
|
|
|
7
44
|
### 新增
|
|
@@ -44,6 +81,8 @@
|
|
|
44
81
|
- Keyless 模式(`X-Tavily-Access-Mode: keyless`)与 keyed 模式(通过 `TAVILY_API_KEY` 凭据引用发送 Bearer token)。
|
|
45
82
|
- DSH 插件配置页上的浏览器设置卡片。
|
|
46
83
|
|
|
84
|
+
[0.2.1]: https://github.com/X-C1811/dsh-web-search-plugin/compare/v0.2.0...v0.2.1
|
|
85
|
+
[0.2.0]: https://github.com/X-C1811/dsh-web-search-plugin/compare/v0.1.2...v0.2.0
|
|
47
86
|
[0.1.2]: https://github.com/X-C1811/dsh-web-search-plugin/compare/v0.1.1...v0.1.2
|
|
48
87
|
[0.1.1]: https://github.com/X-C1811/dsh-web-search-plugin/compare/v0.1.0...v0.1.1
|
|
49
88
|
[0.1.0]: https://github.com/X-C1811/dsh-web-search-plugin/releases/tag/v0.1.0
|
package/README.md
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
# dsh-web-search-plugin
|
|
2
2
|
|
|
3
|
-
面向 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) web 能力接缝(`ctx.web
|
|
3
|
+
面向 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) web 能力接缝(`ctx.web`)的统一网页搜索插件,内置 **DeepSeek(官方)/ Tavily / [Brave Search](https://brave.com/search/api/) 三个后端**。本包只向接缝注册 **一个** `WebSearchProvider`,稳定 id 为 `dsh-web-search`。在 **设置 → 网页搜索** 里切换引擎即可,不必再改 `web.searchProvider`。
|
|
4
4
|
|
|
5
|
-
- **
|
|
6
|
-
- **
|
|
7
|
-
-
|
|
5
|
+
- **DeepSeek(官方)** — 走 DeepSeek 的 Anthropic 兼容 Messages API(原生 `web_search_20250305` 工具,凭据名 `DEEPSEEK_API_KEY`),一次搜索消耗一个模型轮次。
|
|
6
|
+
- **Tavily(默认)** — `keyless`(免费、限流、无需账号)或 `keyed`(`TAVILY_API_KEY`,Bearer token)。keyed 会在设置卡显示额度进度条。
|
|
7
|
+
- **Brave Search** — `GET https://api.search.brave.com/res/v1/web/search`,请求头 `X-Subscription-Token`(凭据名 `BRAVE_API_KEY`)。一次搜索就是一次 HTTP 请求,不走模型轮次;设置卡按响应头展示 Capacity / 月配额。
|
|
8
|
+
- **不写自定义 session 事件** — 工具结果已经走接缝自己的事件,无需多余信封。
|
|
8
9
|
|
|
9
10
|
## 特性
|
|
10
11
|
|
|
11
12
|
- 与官方 `@deepseek-ai/dsh-web-search-deepseek` 相同的提供方约定:`inject: ['web']` + `installSettingsSection` + `ctx.web.registerSearchProvider`。
|
|
13
|
+
- 顶层 **设置 → 网页搜索** 分区:两列布局、未保存草稿、保存 toast;结果数量为 1–20 下拉。
|
|
12
14
|
- Tavily keyless 无需密钥即可用;Brave 需要订阅 token(若本机已有 `BRAVE_API_KEY` 凭据,可直接复用)。
|
|
15
|
+
- Tavily keyed / Brave 在设置卡展示额度进度条(DeepSeek 官方与 Tavily keyless 不展示)。
|
|
13
16
|
- 各引擎结果都规范化为接缝的 `WebSearchResult`(可选 `content` + `sources[]`),按 URL 去重。
|
|
14
17
|
- 设置段 `dsh-web-search-plugin` 通过 rc.7 的 `settings.describe()` 动态暴露,不需要宿主白名单补丁,也不需要自建回环 settings 桥。
|
|
15
18
|
- 错误映射为 `WEB_PROVIDER_ERROR` / `WEB_ABORTED` / `WEB_PROVIDER_CREDENTIAL_MISSING`。
|
|
@@ -21,7 +24,7 @@
|
|
|
21
24
|
|
|
22
25
|
## 安装
|
|
23
26
|
|
|
24
|
-
本包是 **bundle**:`dsh.bundle.patch` + `cordis.patch.yml` 会插入 Host
|
|
27
|
+
本包是 **bundle**:`dsh.bundle.patch` + `cordis.patch.yml` 会插入 Host 行、把 `web.searchProvider` 设为 `dsh-web-search`,并**禁用内置 `web-search-deepseek` Host 插件**(本插件已自行托管 DeepSeek 后端,禁用它能移除旧的「插件 → 网页搜索」卡片、避免重复注册 provider)。没有这一声明时,`dsh plugin add` 只写入依赖,插件不会挂载。
|
|
25
28
|
|
|
26
29
|
### 从 npm 安装
|
|
27
30
|
|
|
@@ -31,11 +34,35 @@ dsh plugin --profile web add dsh-web-search-plugin
|
|
|
31
34
|
|
|
32
35
|
### 从本地目录安装
|
|
33
36
|
|
|
37
|
+
同盘可以用相对路径:
|
|
38
|
+
|
|
39
|
+
```powershell
|
|
40
|
+
dsh plugin --profile web add ".\dsh-web-search-plugin"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Windows 跨盘不要 `dsh plugin add` 绝对路径。** Profile 在 `C:`、仓库在 `D:` 时,它会写成 `link:d:/...`;pnpm 把盘符当成相对路径,junction 会指到 `profiles\web\D:\...` 并链坏。也不要写 `file:D:/...`:pnpm 10 同样会把跨盘绝对路径拼进 profile 目录。
|
|
44
|
+
|
|
45
|
+
正确做法是快照到与 profile **同盘**,再用 `file:`:
|
|
46
|
+
|
|
34
47
|
```powershell
|
|
35
|
-
|
|
48
|
+
$dst = "$env:USERPROFILE\.dsh\profiles\web\.local\dsh-web-search-plugin"
|
|
49
|
+
New-Item -ItemType Directory -Force -Path $dst | Out-Null
|
|
50
|
+
robocopy "D:\gddi\dsh-web-search-plugin" $dst /E /XD node_modules .git .github /NFL /NDL /NJH /NJS
|
|
36
51
|
```
|
|
37
52
|
|
|
38
|
-
|
|
53
|
+
在 profile 的 `package.json` 里:
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
"dsh-web-search-plugin": "file:.local/dsh-web-search-plugin"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
并保证 `dsh.profile.bundles` 含本包,然后:
|
|
60
|
+
|
|
61
|
+
```powershell
|
|
62
|
+
dsh plugin --profile web install
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
`file:` 是快照:改完仓库后要再 robocopy + `install` 并重启 DSH。
|
|
39
66
|
|
|
40
67
|
用 `dsh --profile web --dump-config` 确认:组成树里应有 `dsh-web-search-plugin` 行,且 `web.searchProvider` 为 `dsh-web-search`。
|
|
41
68
|
|
|
@@ -52,9 +79,9 @@ dsh plugin --profile web add "path/to/dsh-web-search-plugin"
|
|
|
52
79
|
dsh plugin --profile web remove @dsh-ltctfer/dsh-web-search-brave
|
|
53
80
|
```
|
|
54
81
|
|
|
55
|
-
|
|
82
|
+
然后在 **设置 → 网页搜索** 里把引擎切到想要的提供方,即可继续使用对应的 API key。
|
|
56
83
|
|
|
57
|
-
> **关于 `file:`(本地)安装** — pnpm 会把 `file
|
|
84
|
+
> **关于 `file:`(本地)安装** — pnpm 会把 `file:` 依赖做成快照。改完本仓库后,需要再同步快照并 `dsh plugin --profile web install`,然后重启。Windows 上 profile 与仓库不在同一盘时,用同盘 `file:.local/...`,不要 `link:` / `file:` 指向另一块盘。
|
|
58
85
|
|
|
59
86
|
## 配置
|
|
60
87
|
|
|
@@ -62,31 +89,46 @@ dsh plugin --profile web remove @dsh-ltctfer/dsh-web-search-brave
|
|
|
62
89
|
|
|
63
90
|
| 键 | 默认值 | 含义 |
|
|
64
91
|
|---|---|---|
|
|
65
|
-
| `provider` | `tavily` | `tavily` 或 `
|
|
92
|
+
| `provider` | `tavily` | `tavily`、`brave` 或 `deepseek-official` |
|
|
66
93
|
| `mode` | `keyless` | 仅 Tavily:`keyless` 或 `keyed` |
|
|
67
94
|
| `apiKey` | — | Tavily API key 字面量(走凭据域,不会回显) |
|
|
68
95
|
| `apiKeyEnv` | `TAVILY_API_KEY` | keyed Tavily 使用的凭据/环境变量名 |
|
|
69
96
|
| `baseURL` | `https://api.tavily.com` | Tavily REST 基址;会再拼 `/search` |
|
|
70
|
-
| `maxResults` | `8` |
|
|
97
|
+
| `maxResults` | `8` | 每次搜索返回的源数量,三个后端共用。设置卡为 1–20 下拉,超出上限会夹到 20 |
|
|
71
98
|
| `searchDepth` | `basic` | 仅 Tavily:`basic` 或 `advanced` |
|
|
72
99
|
| `includeAnswer` | `true` | 仅 Tavily:请求生成摘要,写入结果 `content` |
|
|
73
100
|
| `topic` | `general` | 仅 Tavily:`general` 或 `news` |
|
|
101
|
+
| `deepseekApiKey` | — | DeepSeek API key 字面量(走凭据域) |
|
|
102
|
+
| `deepseekApiKeyEnv` | `DEEPSEEK_API_KEY` | DeepSeek 使用的凭据/环境变量名 |
|
|
103
|
+
| `deepseekBaseURL` | `https://api.deepseek.com/anthropic/v1` | DeepSeek Anthropic 兼容 Messages 基址;再拼 `/messages` |
|
|
104
|
+
| `model` | `deepseek-v4-flash` | Anthropic 格式模型名 |
|
|
105
|
+
| `apiVersion` | `2023-06-01` | `anthropic-version` 请求头 |
|
|
106
|
+
| `maxTokens` | `4096` | Messages 请求生成 token 上限 |
|
|
107
|
+
| `maxUses` | `5` | 每次请求 `web_search` 工具的最大调用次数 |
|
|
74
108
|
| `braveApiKey` | — | Brave 订阅 token 字面量(走凭据域) |
|
|
75
109
|
| `braveApiKeyEnv` | `BRAVE_API_KEY` | Brave 使用的凭据/环境变量名 |
|
|
76
110
|
| `braveBaseURL` | `https://api.search.brave.com/res/v1/web/search` | Brave 网页搜索接口 |
|
|
77
|
-
| `country` | — | Brave 的 `country`(ISO 两位码,如 `cn
|
|
78
|
-
| `searchLang` | — | Brave 的 `search_lang`(如 `zh-hans
|
|
111
|
+
| `country` | — | Brave 的 `country`(ISO 两位码,如 `cn`);留空使用 Brave 默认 |
|
|
112
|
+
| `searchLang` | — | Brave 的 `search_lang`(如 `zh-hans`);留空使用 Brave 默认 |
|
|
79
113
|
| `freshness` | — | Brave 的 `freshness`:`pd` / `pw` / `pm` / `py` |
|
|
80
|
-
| `proxy` | — | Brave 使用的 HTTP(S)
|
|
114
|
+
| `proxy` | — | Brave 使用的 HTTP(S) 代理;留空回退 `HTTPS_PROXY` / `HTTP_PROXY` |
|
|
81
115
|
|
|
82
116
|
环境变量:启动时 `DSH_WEB_SEARCH_PROVIDER=dsh-web-search` 会选中本接缝 id。未设置 `baseURL` 时,Tavily 基址回退 `$TAVILY_BASE_URL`。
|
|
83
117
|
|
|
84
|
-
##
|
|
118
|
+
## 额度
|
|
119
|
+
|
|
120
|
+
- **Tavily keyless / DeepSeek 官方**:不展示额度条。前者是免费限流、没有账户配额;后者按次扣费、没有月度限额。
|
|
121
|
+
- **Tavily keyed**:搜索时请求 `include_usage`,把本次 credits 累加到 `%DSH_HOME%\storages\dsh-web-search-usage.json`。Host 每 10 分钟(以及设置卡点刷新)调用 `GET /usage`,用 `account.current_plan` / `plan_limit` 做限额,用量取本地累计与远端的较大值。换套餐或远端用量回落会重置本地计数。
|
|
122
|
+
- **Brave**:没有 usage / 花费接口。控制台 **Capacity** 就是响应头里的每秒窗口(例如 50 次/秒)。月限额 `0` 表示不限请求次数,不是额度用完。计费 credits 只能看 [Brave API 控制台](https://api-dashboard.search.brave.com/)。
|
|
123
|
+
- 浏览器只读 `GET /dsh-web-search/usage`(不直打上游)。进度条:剩余超过 20% 为绿色,不超过 20% 为黄色,不超过 10% 为红色。
|
|
124
|
+
|
|
125
|
+
## 切回内置 DeepSeek
|
|
85
126
|
|
|
86
|
-
|
|
127
|
+
DeepSeek 已并入本插件(`provider: deepseek-official`),无需切回。若确要恢复 DSH 内置的 DeepSeek host 插件,请在 profile patch 里去掉对 `web-search-deepseek` 的 `disabled` 并把 `searchProvider` 设回 `deepseek-official`;本插件可以继续挂着,只是不会被选中。
|
|
87
128
|
|
|
88
129
|
## 工作方式
|
|
89
130
|
|
|
131
|
+
- **DeepSeek** — `POST {deepseekBaseURL}/messages`,请求头 `x-api-key` / `authorization: Bearer`,工具 `web_search_20250305`。
|
|
90
132
|
- **Tavily** — `POST {baseURL}/search`。keyless 发送 `x-tavily-access-mode: keyless`;keyed 发送 `authorization: Bearer <key>`。
|
|
91
133
|
- **Brave** — `GET {braveBaseURL}?q=&count=`,请求头 `x-subscription-token`。不向 session 追加自定义事件。
|
|
92
134
|
- 非 2xx 映射为 `WEB_PROVIDER_ERROR`;调用方取消映射为 `WEB_ABORTED`。
|
|
@@ -94,12 +136,14 @@ dsh plugin --profile web remove @dsh-ltctfer/dsh-web-search-brave
|
|
|
94
136
|
## 仓库布局
|
|
95
137
|
|
|
96
138
|
```
|
|
97
|
-
lib/index.js Host 插件:Config
|
|
98
|
-
lib/
|
|
99
|
-
lib/
|
|
139
|
+
lib/index.js Host 插件:Config、分发提供方、设置段、额度路由
|
|
140
|
+
lib/deepseek.js DeepSeek 后端(Anthropic Messages + web_search_20250305)
|
|
141
|
+
lib/tavily.js Tavily 后端(keyed 时带 include_usage)
|
|
142
|
+
lib/brave.js Brave 后端(解析 X-RateLimit-*,不写自定义 session 事件)
|
|
143
|
+
lib/usage.js Tavily/Brave 用量本地缓存与 /usage 对账
|
|
100
144
|
lib/shared.js 中止 / 凭据解析辅助
|
|
101
|
-
lib/client.js 浏览器 bundle
|
|
102
|
-
cordis.patch.yml Bundle patch:插入 Host
|
|
145
|
+
lib/client.js 浏览器 bundle:顶层「网页搜索」分区 + 引擎切换 + 额度条
|
|
146
|
+
cordis.patch.yml Bundle patch:插入 Host 行、设 searchProvider、禁用内置 deepseek
|
|
103
147
|
```
|
|
104
148
|
|
|
105
149
|
## 开发
|
|
@@ -108,19 +152,19 @@ cordis.patch.yml Bundle patch:插入 Host 行,并把 searchProvider 设为
|
|
|
108
152
|
npm run check
|
|
109
153
|
```
|
|
110
154
|
|
|
111
|
-
客户端 bundle 必须保持 `window.__ModuleLoader__.load({ id, factory })` 线格式 — 由 `dsh-client-modules` 加载,不是打包器。必须同时导出 `apply` 和 `inject`(`slots`、`locale`、`connection`、`remote`、`settingsScope
|
|
155
|
+
客户端 bundle 必须保持 `window.__ModuleLoader__.load({ id, factory })` 线格式 — 由 `dsh-client-modules` 加载,不是打包器。必须同时导出 `apply` 和 `inject`(`slots`、`locale`、`connection`、`remote`、`settingsScope`),并把分区注册进 `settings.section`(`id: "web-search"`)。
|
|
112
156
|
|
|
113
157
|
## 发布
|
|
114
158
|
|
|
115
|
-
发布由 GitHub Actions(`.github/workflows/publish.yml`)自动完成:**推送 `v*` 标签**(例如 `v0.1
|
|
159
|
+
发布由 GitHub Actions(`.github/workflows/publish.yml`)自动完成:**推送 `v*` 标签**(例如 `v0.2.1`)会带 provenance 发到 npm。向 `main` 的普通推送不会发布。
|
|
116
160
|
|
|
117
|
-
1. 确认 `package.json` 的 `version` 与即将推送的标签一致(例如 `0.1
|
|
161
|
+
1. 确认 `package.json` 的 `version` 与即将推送的标签一致(例如 `0.2.1` → `v0.2.1`)。
|
|
118
162
|
2. 在 GitHub **Settings → Secrets and variables → Actions** 里配置有 publish 权限的 npm automation token(仓库密钥 `NPM_TOKEN`),并允许 Actions 运行。
|
|
119
163
|
3. 打标签并推送:
|
|
120
164
|
|
|
121
165
|
```powershell
|
|
122
|
-
git tag v0.1
|
|
123
|
-
git push origin v0.1
|
|
166
|
+
git tag v0.2.1
|
|
167
|
+
git push origin v0.2.1
|
|
124
168
|
```
|
|
125
169
|
|
|
126
170
|
工作流会先核对标签与 `package.json` 的 `version`,再执行 `npm publish --provenance --access public`。
|
package/cordis.patch.yml
CHANGED
|
@@ -5,13 +5,19 @@
|
|
|
5
5
|
#
|
|
6
6
|
# `searchProvider` is restated in full because a Cordis patch replaces the
|
|
7
7
|
# targeted row's whole `config`. The profile's own cordis.patch.yml still
|
|
8
|
-
# wins if it later overrides `web`. The seam id is `dsh-web-search`;
|
|
9
|
-
#
|
|
8
|
+
# wins if it later overrides `web`. The seam id is `dsh-web-search`; the
|
|
9
|
+
# backend (DeepSeek / Tavily / Brave) is the plugin's own `provider` setting.
|
|
10
10
|
- id: web
|
|
11
11
|
name: '@deepseek-ai/dsh-web'
|
|
12
12
|
config:
|
|
13
13
|
searchProvider: dsh-web-search
|
|
14
14
|
|
|
15
|
+
# This plugin re-hosts the DeepSeek backend, so the in-box DeepSeek host
|
|
16
|
+
# plugin is redundant: disabling it removes its `deepseek-official` provider
|
|
17
|
+
# (no duplicate) and hides the legacy "Plugins → web search" card.
|
|
18
|
+
- id: web-search-deepseek
|
|
19
|
+
disabled: true
|
|
20
|
+
|
|
15
21
|
- insert:
|
|
16
22
|
- id: dsh-web-search-plugin
|
|
17
23
|
name: dsh-web-search-plugin
|
package/lib/brave.js
CHANGED
|
@@ -101,6 +101,7 @@ export class BraveSearchProvider {
|
|
|
101
101
|
if (signal?.aborted === true || isAbortError(error)) throw searchAborted(signal, error);
|
|
102
102
|
throw new WebError(`Brave search request failed: ${String(error)}`, "WEB_PROVIDER_ERROR", { cause: error });
|
|
103
103
|
}
|
|
104
|
+
options.onRateLimit?.(response.headers);
|
|
104
105
|
if (!response.ok) {
|
|
105
106
|
let message = `Brave Search API error (HTTP ${response.status})`;
|
|
106
107
|
try {
|