deepseek-web-retrieval 0.7.0 → 0.9.0
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 +20 -0
- package/README.md +100 -101
- package/dist/cli.js +526 -175
- package/docs/agents/claude-code.md +279 -0
- package/docs/agents/codex.md +9 -1
- package/docs/agents/opencode-v2.md +13 -3
- package/docs/agents/pi.md +8 -1
- package/docs/configuration.md +116 -0
- package/docs/design/installer-design.md +20 -17
- package/docs/hosts.jsonc +5 -1
- package/docs/integration.md +9 -6
- package/docs/research/control-matrix.md +34 -9
- package/docs/research/mcp-compatibility.md +2 -2
- package/docs/research/ori-question-sourcing.md +12 -1
- package/package.json +3 -2
- package/src/core/auth.ts +7 -0
- package/src/core/client.ts +89 -25
- package/src/core/config-summary.ts +1 -0
- package/src/core/constants.ts +17 -2
- package/src/core/descriptions.ts +10 -1
- package/src/core/env.ts +12 -7
- package/src/core/format.ts +25 -4
- package/src/core/options.ts +47 -0
- package/src/core/search.ts +97 -14
- package/src/core/types.ts +17 -0
- package/src/installer/apply.ts +4 -4
- package/src/installer/cli.ts +2 -2
- package/src/installer/config-command.ts +4 -3
- package/src/installer/hosts/claude-code.ts +311 -0
- package/src/installer/hosts/codex.ts +3 -14
- package/src/installer/hosts/index.ts +5 -2
- package/src/installer/hosts/opencode.ts +1 -1
- package/src/installer/hosts/pi.ts +38 -18
- package/src/installer/hosts/shared.ts +23 -0
- package/src/installer/ownership.ts +2 -2
- package/src/installer/paths.ts +2 -2
- package/src/installer/{state.ts → record.ts} +16 -16
- package/src/installer/types.ts +2 -2
- package/src/installer/uninstall.ts +8 -5
- package/src/mcp/serve.ts +1 -2
- package/src/mcp/server.ts +16 -19
- package/src/opencode/plugin.ts +15 -10
- package/src/pi/extension.ts +23 -17
- package/src/mcp/auth.ts +0 -11
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project are documented here, one sentence per item.
|
|
4
4
|
|
|
5
|
+
## 0.9.0
|
|
6
|
+
|
|
7
|
+
- Accept an optional per-call `count` (1–50) on the MCP and Pi search tools and an optional per-call `maxChars` (0–1,000,000) on every adapter's fetch, each overriding the configured value for that one call.
|
|
8
|
+
- Open the search result text with `Searched for: <effective query>` whenever domain or language operators — or fitting the query-length limit — changed what was actually searched, so the model can attribute what it sees.
|
|
9
|
+
- Degrade gracefully instead of failing when search operators push a combined query past the API's 128-character limit: the query body truncates first, the language filter drops next, the include list last, and blocked domains never drop.
|
|
10
|
+
- Align user-facing installer wording with the domain glossary: the secrets refusal and record-repair guidance now say "install record" instead of "state file" or "undo state".
|
|
11
|
+
- Add the `baseUrl` knob (`DEEPSEEK_BASE_URL` environment variable or shared-file key) so every retrieval request can be routed through a proxy, enterprise gateway, or mock upstream; only an http(s) URL is accepted and anything else drops back to `https://api.deepseek.com`.
|
|
12
|
+
- Add keyless `pi-mock` and `opencode-mock` Docker e2e scenarios that run real host session loops (pi via a custom `models.json` provider, OpenCode via a custom provider) against an in-container mock upstream, invoking both retrieval tools and asserting the tool results reached the model — closing CI's tool-execution blind spot without a billed key — and document the keyless (CI) versus billed (local, real API) e2e responsibilities with a `test:e2e:billed` script.
|
|
13
|
+
|
|
14
|
+
## 0.8.0
|
|
15
|
+
|
|
16
|
+
- Add Claude Code as a supported host: an MCP-only integration registered in `.mcp.json` (project scope) or `~/.claude.json` (user scope), with a full installer host module (plan/apply/uninstall, both scopes), a `docs/agents/claude-code.md` guide, a version probe with drift note, and managed-policy detection that reports a `managed-settings.json` layer outranking the install.
|
|
17
|
+
- Route Claude Code tiers through its own settings files: forced capabilities deny the built-in `WebSearch`/`WebFetch` via `permissions.deny` in `.claude/settings.json` or `~/.claude/settings.json` (merged with the user's entries), off capabilities deny the full `mcp__deepseek__*` tool ids, and preferred writes a rules block into `CLAUDE.md`; web-capable competitor servers are excluded under forced via server-level `mcp__<server>` deny rules instead of refusing the tier.
|
|
18
|
+
- Add a billed `claude-code` Docker e2e scenario that runs headless `claude -p` prompts with DeepSeek as the LLM over its Anthropic-compatible endpoint (single key for both legs) and asserts the deny-based kill switch keeps the built-in tools out of the session, plus installer/reinit coverage of the new host in the keyless scenarios.
|
|
19
|
+
- Guard Pi's global config files with the shared-file ownership sidecar, and release claims before deleting the install record on uninstall, so two installs under different config homes can no longer claim the same `~/.pi/agent` file.
|
|
20
|
+
- Run the Codex and Claude Code version probes through a shell so Windows npm `.cmd` shims launch and the drift check no longer silently skips on Windows.
|
|
21
|
+
- Correct the research attribution for Claude Code's MCP `2026-07-28` default negotiation (v2 runtime from 2.1.274+, changelog bullet at 2.1.299 — not 2.1.296).
|
|
22
|
+
- Restructure the README around a quickstart and a defaults table, moving the full configuration reference (knob classes, the complete file-key ↔ `DEEPSEEK_*` mapping, special semantics) to a new docs/configuration.md guide.
|
|
23
|
+
- Generate the configuration guide's knob table from the config vocabulary itself (`bun run docs:matrix` regenerates it, `--check` fails CI on drift), so the documented key ↔ variable ↔ default mapping can no longer hand-drift from the code.
|
|
24
|
+
|
|
5
25
|
## 0.7.0
|
|
6
26
|
|
|
7
27
|
- Layer a shared config file (`$XDG_CONFIG_HOME/deepseek-web-retrieval/config.json`, camelCase keys) under the environment on every host, with the precedence `built-in defaults < shared file < DEEPSEEK_* environment < host-native config`; unknown and host-integration keys are warned about and ignored, and the API key stays out of the file.
|
package/README.md
CHANGED
|
@@ -1,33 +1,52 @@
|
|
|
1
1
|
# DeepSeek Web Retrieval
|
|
2
2
|
|
|
3
|
-
**DeepSeek Search and Fetch for OpenCode, Pi, and
|
|
3
|
+
**DeepSeek Search and Fetch for OpenCode, Pi, Codex, and Claude Code.**
|
|
4
4
|
|
|
5
5
|
Search the web and fetch pages as Markdown through
|
|
6
6
|
[DeepSeek's APIs](https://api-docs.deepseek.com/guides/search), using a **native OpenCode
|
|
7
|
-
plugin**, a **native Pi extension**, or **MCP for Codex**. All
|
|
8
|
-
core, with results formatted for each host.
|
|
7
|
+
plugin**, a **native Pi extension**, or **MCP for Codex and Claude Code**. All four share
|
|
8
|
+
the same retrieval core, with results formatted for each host.
|
|
9
9
|
|
|
10
10
|
This is an unofficial community project, not affiliated with DeepSeek or the supported
|
|
11
11
|
host projects.
|
|
12
12
|
|
|
13
|
+
Jump to: [Features](#features) · [Quickstart](#quickstart) · [Usage](#usage) ·
|
|
14
|
+
[General behavior](#general-behavior) · [Configuration](#configuration) ·
|
|
15
|
+
[Development](#development)
|
|
16
|
+
|
|
13
17
|
## Features
|
|
14
18
|
|
|
15
|
-
- **One package,
|
|
16
|
-
and a stdio MCP server for Codex, all sharing one retrieval core
|
|
19
|
+
- **One package, four hosts** — a native OpenCode v2 plugin, a native Pi extension,
|
|
20
|
+
and a stdio MCP server for Codex and Claude Code, all sharing one retrieval core
|
|
17
21
|
- **Routing control per tool** — search and fetch are set independently to optional,
|
|
18
22
|
preferred, forced, or off; the tier table in Usage explains each
|
|
19
23
|
- **Review before anything is written** — `init` prints the full plan and writes only
|
|
20
24
|
with `--apply`; uninstall restores from snapshots while preserving edits you made
|
|
21
25
|
afterwards
|
|
22
26
|
- **Knows the host's web landscape** — detects conflicting web tools and rules,
|
|
23
|
-
configures Pi's MCP fallback for direct tool exposure, and reports Codex
|
|
24
|
-
drift
|
|
27
|
+
configures Pi's MCP fallback for direct tool exposure, and reports Codex and
|
|
28
|
+
Claude Code version drift
|
|
25
29
|
- **Your key never enters a config file** — installs reference the environment
|
|
26
30
|
(`${DEEPSEEK_API_KEY}` indirection or `env_vars`), so a project-scope install
|
|
27
31
|
commits clean
|
|
28
32
|
- **Fails loudly, never switches silently** — no fallback to another provider, and
|
|
29
33
|
localhost/private URLs are blocked before a request leaves the machine
|
|
30
34
|
|
|
35
|
+
## Quickstart
|
|
36
|
+
|
|
37
|
+
Requires Node.js 20+ and npm, plus a DeepSeek API key with Search and Fetch access
|
|
38
|
+
(retrieval is billed per successful request; the account needs balance).
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
export DEEPSEEK_API_KEY=sk-...
|
|
42
|
+
# Preview the plan for your host — nothing is written yet:
|
|
43
|
+
npx deepseek-web-retrieval init --host opencode --scope project --search forced --fetch preferred
|
|
44
|
+
# Re-run with --apply to write it:
|
|
45
|
+
npx deepseek-web-retrieval init --host opencode --scope project --search forced --fetch preferred --apply
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
For Pi, Codex, or Claude Code, other scopes, or finer routing control, see [Usage](#usage).
|
|
49
|
+
|
|
31
50
|
## Usage
|
|
32
51
|
|
|
33
52
|
Choose your host:
|
|
@@ -37,23 +56,11 @@ Choose your host:
|
|
|
37
56
|
| OpenCode v2 | Native plugin: search provider and Fetch tools | [OpenCode guide](docs/agents/opencode-v2.md) |
|
|
38
57
|
| Pi | Native extension: Search and Fetch tools; MCP also available | [Pi guide](docs/agents/pi.md) |
|
|
39
58
|
| Codex | MCP server over stdio, with readable text results | [Codex guide](docs/agents/codex.md) |
|
|
59
|
+
| Claude Code | MCP server over stdio in `.mcp.json` or `~/.claude.json` | [Claude Code guide](docs/agents/claude-code.md) |
|
|
40
60
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
Run the command for your host to preview a configuration:
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
# OpenCode: select DeepSeek as the search provider and prefer its Fetch tool.
|
|
49
|
-
npx deepseek-web-retrieval init --host opencode --scope project --search forced --fetch preferred
|
|
50
|
-
|
|
51
|
-
# Pi: use the native extension and prefer both tools.
|
|
52
|
-
npx deepseek-web-retrieval init --host pi --scope project --search preferred --fetch preferred
|
|
53
|
-
|
|
54
|
-
# Codex: register the MCP server and prefer both tools.
|
|
55
|
-
npx deepseek-web-retrieval init --host codex --scope global --search preferred --fetch preferred
|
|
56
|
-
```
|
|
61
|
+
Set `DEEPSEEK_API_KEY` in the environment that launches your host; OpenCode can also
|
|
62
|
+
use its stored DeepSeek key. Run `init` for your host to preview a configuration — the
|
|
63
|
+
command shape is the quickstart's; each host guide shows its recommended tiers.
|
|
57
64
|
|
|
58
65
|
`--search` and `--fetch` each pick a tier — how strongly the host steers toward the
|
|
59
66
|
DeepSeek tool, chosen independently per capability:
|
|
@@ -89,19 +96,19 @@ Plan only — re-run with --apply to write these changes.
|
|
|
89
96
|
|
|
90
97
|
Repeat your chosen command with `--apply` to write the plan. The host guides explain
|
|
91
98
|
activation steps and per-host tier limits. Pi defaults to the extension path; add
|
|
92
|
-
`--path mcp` to use its MCP fallback.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
99
|
+
`--path mcp` to use its MCP fallback.
|
|
100
|
+
|
|
101
|
+
Add `--pin` to register the exact version of the CLI you are running
|
|
102
|
+
(`deepseek-web-retrieval@<version>`) instead of the unpinned name, so hosts keep
|
|
103
|
+
resolving that release rather than every latest publish. The trade-off is no
|
|
104
|
+
auto-updates: re-run `init --pin` from a newer CLI to move the pin.
|
|
96
105
|
|
|
97
106
|
Other stdio MCP hosts may use the server, but the supported setup guides and installer
|
|
98
|
-
currently cover the
|
|
99
|
-
for tested versions and the [control tiers](docs/research/control-matrix.md) for
|
|
100
|
-
limits. For an existing installation, follow the
|
|
107
|
+
currently cover the four hosts above. See the [integration model](docs/integration.md)
|
|
108
|
+
for tested versions and the [control tiers](docs/research/control-matrix.md) for
|
|
109
|
+
routing limits. For an existing installation, follow the
|
|
101
110
|
[upgrade instructions](docs/integration.md#upgrading-existing-installs).
|
|
102
111
|
|
|
103
|
-
For shared search, fetch, retry, and privacy behavior, see below.
|
|
104
|
-
|
|
105
112
|
## General behavior
|
|
106
113
|
|
|
107
114
|
What this adapter layer adds on top of the
|
|
@@ -109,50 +116,63 @@ What this adapter layer adds on top of the
|
|
|
109
116
|
own capabilities (Markdown-only output, no JavaScript rendering, no private networks or
|
|
110
117
|
binary files, per-request billing) are documented there.
|
|
111
118
|
|
|
119
|
+
| Default | Value | Knob |
|
|
120
|
+
| --- | --- | --- |
|
|
121
|
+
| Results per search | 10 | `count` |
|
|
122
|
+
| Fetch output cap | 16,000 characters | `fetchMaxChars` |
|
|
123
|
+
| Search summary cap | 1,200 characters | `maxSummaryChars` |
|
|
124
|
+
| Request timeout, body read included | 30 s | `searchTimeoutMs` / `fetchTimeoutMs` |
|
|
125
|
+
| Transient retries | 2 (range 0–5) | `maxRetries` |
|
|
126
|
+
|
|
112
127
|
### Search
|
|
113
128
|
|
|
114
|
-
- Requests summaries only (`need_content: false`,
|
|
115
|
-
full page content never enters the results.
|
|
116
|
-
|
|
117
|
-
|
|
129
|
+
- Requests summaries only (`need_content: false`, falling back from `summary` to
|
|
130
|
+
`snippet`); full page content never enters the results. A summary the cap shortens ends
|
|
131
|
+
with an ellipsis.
|
|
132
|
+
- Deduplicates URLs; an empty result set is normal, not an error.
|
|
133
|
+
- Builds `blockedDomains`, `includeDomains`, and `language` into query operators (part of
|
|
134
|
+
DeepSeek's documented search syntax). A combined query over the API's 128-character limit
|
|
135
|
+
degrades instead of failing — the query body truncates first, the language filter drops
|
|
136
|
+
next, the include list last, and blocked domains never drop — and whenever operators or
|
|
137
|
+
degradation changed the query, the result text opens with `Searched for: <effective query>`
|
|
138
|
+
so the model can attribute what it sees.
|
|
118
139
|
- Optional `rerank_score` and `authority` thresholds are off by default — the default
|
|
119
|
-
returns exactly what DeepSeek ranked
|
|
120
|
-
`rerank_score`
|
|
121
|
-
`
|
|
122
|
-
authority stay unless `allowUnknownAuthority` is set to false.
|
|
123
|
-
- Builds `blockedDomains`, `includeDomains`, and `language` into query operators and
|
|
124
|
-
rejects the final query locally when it exceeds the API's 128-character limit.
|
|
140
|
+
returns exactly what DeepSeek ranked. A positive threshold drops results below it.
|
|
141
|
+
A missing `rerank_score` is dropped too; an unknown `authority` stays unless
|
|
142
|
+
`allowUnknownAuthority` is set to false.
|
|
125
143
|
- On the paths where this package defines the search tool's inputs (the MCP server and
|
|
126
|
-
the Pi extension), the tool accepts an optional `original_question
|
|
127
|
-
question in their own words
|
|
128
|
-
truncated to
|
|
129
|
-
|
|
130
|
-
|
|
144
|
+
the Pi extension), the tool accepts an optional `original_question`: the user's
|
|
145
|
+
question in their own words. It is forwarded as DeepSeek's `ori_question`, trimmed
|
|
146
|
+
and truncated to 128 characters; on the Pi extension, a blank input falls back to the
|
|
147
|
+
most recent user message in the session. Those paths also take an optional per-call
|
|
148
|
+
`count` (1–50) overriding the configured result count for that call.
|
|
131
149
|
|
|
132
150
|
### Fetch
|
|
133
151
|
|
|
134
|
-
- Output is capped
|
|
135
|
-
|
|
152
|
+
- Output is capped per the table above, title included; a `[content truncated]` marker
|
|
153
|
+
is added when the limit leaves room for it. An optional per-call `maxChars` parameter
|
|
154
|
+
(0–1,000,000) on every adapter overrides the configured cap for one call — a model that
|
|
155
|
+
sees the marker can widen the budget and re-fetch.
|
|
136
156
|
- A page that already opens with its title as a top-level heading does not get a
|
|
137
157
|
duplicate title.
|
|
138
|
-
-
|
|
139
|
-
|
|
158
|
+
- URLs must be absolute `http://` or `https://`, credential-free, and at most 8,192
|
|
159
|
+
characters; responses larger than 5 MiB are rejected before parsing.
|
|
140
160
|
- `format: "text"` and `format: "html"` are rejected rather than misrepresented.
|
|
141
161
|
- Allowed/blocked domain lists and private-host blocking are enforced on the client,
|
|
142
162
|
before a request leaves the machine.
|
|
143
163
|
|
|
144
164
|
### Timeouts and retries
|
|
145
165
|
|
|
146
|
-
Request timeouts include reading the response body. Transient failures are retried
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
166
|
+
Request timeouts include reading the response body. Transient failures are retried per
|
|
167
|
+
the table; retryable responses are 408, 425, 429, and 5xx, and `Retry-After` is honored
|
|
168
|
+
up to 10 seconds. Other failures — including 401, timeouts, and network errors — fail
|
|
169
|
+
without retrying.
|
|
150
170
|
|
|
151
171
|
### No automatic fallback
|
|
152
172
|
|
|
153
|
-
If no API key is available, Search and Fetch fail. If DeepSeek is unavailable, returns
|
|
154
|
-
error, or times out, the request fails. The tool does not silently switch to another
|
|
155
|
-
provider or fetch implementation.
|
|
173
|
+
If no API key is available, Search and Fetch fail. If DeepSeek is unavailable, returns
|
|
174
|
+
an error, or times out, the request fails. The tool does not silently switch to another
|
|
175
|
+
search provider or fetch implementation.
|
|
156
176
|
|
|
157
177
|
### Privacy and cost
|
|
158
178
|
|
|
@@ -163,14 +183,15 @@ see the official docs for pricing and rate limits before enabling a team deploym
|
|
|
163
183
|
## Configuration
|
|
164
184
|
|
|
165
185
|
Every knob resolves through one chain, low → high, identically on every host:
|
|
186
|
+
|
|
166
187
|
`built-in defaults < shared config file < DEEPSEEK_* environment < host-native config`
|
|
167
|
-
— a higher layer always wins, so nothing already configured loses effect.
|
|
168
188
|
|
|
169
|
-
|
|
189
|
+
A higher layer always wins, so nothing already configured loses effect.
|
|
190
|
+
|
|
191
|
+
The shared file works on every host and takes camelCase keys:
|
|
192
|
+
`$XDG_CONFIG_HOME/deepseek-web-retrieval/config.json` — by default
|
|
170
193
|
`~/.config/deepseek-web-retrieval/config.json` on Linux and macOS and
|
|
171
|
-
`%APPDATA%\deepseek-web-retrieval\config.json` on Windows
|
|
172
|
-
`XDG_CONFIG_HOME` still wins there) — works on every host and uses the
|
|
173
|
-
camelCase option keys:
|
|
194
|
+
`%APPDATA%\deepseek-web-retrieval\config.json` on Windows.
|
|
174
195
|
|
|
175
196
|
```json
|
|
176
197
|
{
|
|
@@ -181,44 +202,23 @@ camelCase option keys:
|
|
|
181
202
|
}
|
|
182
203
|
```
|
|
183
204
|
|
|
184
|
-
Unknown keys and host-integration keys are warned about on stderr and ignored. The
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
Knobs fall into three classes; the shared file carries the first two:
|
|
189
|
-
|
|
190
|
-
| Knob class | Shared file | Examples |
|
|
191
|
-
| --- | --- | --- |
|
|
192
|
-
| API behavior — the user↔DeepSeek relationship | yes — that is the point of the file | `count`, `blockedDomains`, `language`, `maxRetries` |
|
|
193
|
-
| Host-sensitive — interacts with host output caps and deadlines | carries the safe defaults; a host layer is the recommended override point | `searchTimeoutMs`, `fetchTimeoutMs`, `fetchMaxChars`, `maxSummaryChars` |
|
|
194
|
-
| Host integration — the host's tool landscape | rejected — warned about and ignored | `searchEnabled`, `setDefaultWebsearch`, `apiKeySource` |
|
|
195
|
-
|
|
196
|
-
The same knob has two names — the camelCase key for the shared file and OpenCode's
|
|
197
|
-
options, the `DEEPSEEK_*` variable for the environment:
|
|
205
|
+
Unknown keys and host-integration keys are warned about on stderr and ignored. The API
|
|
206
|
+
key does not go in the file — it keeps its existing channels (`DEEPSEEK_API_KEY` in the
|
|
207
|
+
environment, or OpenCode's stored credential).
|
|
198
208
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
| `fetchMaxChars` | `DEEPSEEK_FETCH_MAX_CHARS` |
|
|
206
|
-
| `maxRetries` | `DEEPSEEK_MAX_RETRIES` |
|
|
207
|
-
|
|
208
|
-
The full per-knob mapping is documented side by side in each guide's option table;
|
|
209
|
-
per-host mechanics — how the environment reaches a stdio server, each host's output
|
|
210
|
-
caps and deadlines — live there too: [Codex](docs/agents/codex.md),
|
|
211
|
-
[Pi](docs/agents/pi.md), [OpenCode](docs/agents/opencode-v2.md). Keep
|
|
212
|
-
host-independent intent in the shared file; prefer a host layer when a
|
|
213
|
-
host-sensitive knob would cross its host's cap or deadline.
|
|
209
|
+
Which layer to set for a knob, the full file-key ↔ `DEEPSEEK_*` mapping, per-knob
|
|
210
|
+
defaults, and special semantics live in the [configuration guide](docs/configuration.md).
|
|
211
|
+
Per-host mechanics — how the environment reaches a stdio server, each host's output caps
|
|
212
|
+
and deadlines — live in the host guides: [Codex](docs/agents/codex.md),
|
|
213
|
+
[Claude Code](docs/agents/claude-code.md),
|
|
214
|
+
[Pi](docs/agents/pi.md), [OpenCode](docs/agents/opencode-v2.md).
|
|
214
215
|
|
|
215
216
|
To see what actually resolves, run `npx deepseek-web-retrieval config`: every knob
|
|
216
|
-
printed with its value and its source (`default`, `file`, or `env`)
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
and network end to end.
|
|
217
|
+
printed with its value and its source (`default`, `file`, or `env`). Problems in the
|
|
218
|
+
file or in `DEEPSEEK_*` variables are replayed as visible warnings, and it exits 1 when
|
|
219
|
+
there are any — so it doubles as a dotfile CI check. `npx deepseek-web-retrieval config
|
|
220
|
+
--search "<query>"` runs one billed search through the effective configuration to verify
|
|
221
|
+
the key, config, and network end to end.
|
|
222
222
|
|
|
223
223
|
## Development
|
|
224
224
|
|
|
@@ -231,10 +231,9 @@ Use `bun run lint:fix` to apply Biome's safe lint fixes and formatting. See
|
|
|
231
231
|
[CONTRIBUTING.md](CONTRIBUTING.md) for development checks, e2e scenarios, and
|
|
232
232
|
[automated tag releases](CONTRIBUTING.md#automated-releases).
|
|
233
233
|
|
|
234
|
-
The test suite mocks the DeepSeek
|
|
235
|
-
MCP server with SDK clients pinned to each supported protocol revision. Real API calls
|
|
234
|
+
The test suite mocks the DeepSeek API and the OpenCode and Pi host APIs; real API calls
|
|
236
235
|
require a funded DeepSeek account. Shared retrieval logic lives in `src/core/`; adapters
|
|
237
|
-
live in `src/<agent>/` (the cross-host MCP server lives in `src/mcp/`)
|
|
236
|
+
live in `src/<agent>/` (the cross-host MCP server lives in `src/mcp/`), with adapter docs
|
|
238
237
|
in `docs/agents/<agent>.md`.
|
|
239
238
|
|
|
240
239
|
## Prior art
|