deepseek-web-retrieval 0.2.0 → 0.4.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.
Files changed (54) hide show
  1. package/CHANGELOG.md +204 -1
  2. package/README.md +55 -28
  3. package/dist/cli.js +4224 -184
  4. package/docs/adr/0001-refuse-drift-between-plan-and-apply.md +29 -0
  5. package/docs/agents/codex.md +193 -0
  6. package/docs/agents/domain.md +51 -0
  7. package/docs/agents/issue-tracker.md +45 -0
  8. package/docs/{opencode-v2.md → agents/opencode-v2.md} +34 -11
  9. package/docs/{pi.md → agents/pi.md} +39 -11
  10. package/docs/agents/triage-labels.md +15 -0
  11. package/docs/design/installer-design.md +184 -0
  12. package/docs/hosts.jsonc +59 -33
  13. package/docs/integration.md +45 -52
  14. package/docs/research/control-matrix.md +257 -0
  15. package/docs/{mcp-compatibility.md → research/mcp-compatibility.md} +39 -108
  16. package/docs/research/search-api-defaults.md +309 -0
  17. package/package.json +5 -3
  18. package/src/core/auth.ts +1 -1
  19. package/src/core/client.ts +42 -249
  20. package/src/core/constants.ts +14 -3
  21. package/src/core/descriptions.ts +19 -0
  22. package/src/core/format.ts +31 -1
  23. package/src/core/jsonc.ts +16 -0
  24. package/src/core/options.ts +3 -4
  25. package/src/core/search.ts +5 -7
  26. package/src/core/transport.ts +253 -0
  27. package/src/core/types.ts +13 -11
  28. package/src/installer/apply.ts +176 -0
  29. package/src/installer/cli.ts +215 -0
  30. package/src/installer/detect.ts +85 -0
  31. package/src/installer/formats/index.ts +58 -0
  32. package/src/installer/formats/json.ts +151 -0
  33. package/src/installer/formats/rules.ts +62 -0
  34. package/src/installer/formats/toml.ts +163 -0
  35. package/src/installer/formats/value.ts +57 -0
  36. package/src/installer/hosts/codex.ts +128 -0
  37. package/src/installer/hosts/index.ts +134 -0
  38. package/src/installer/hosts/opencode.ts +118 -0
  39. package/src/installer/hosts/pi.ts +115 -0
  40. package/src/installer/hosts/shared.ts +31 -0
  41. package/src/installer/paths.ts +18 -0
  42. package/src/installer/render.ts +62 -0
  43. package/src/installer/revert.ts +61 -0
  44. package/src/installer/rulesContent.ts +32 -0
  45. package/src/installer/state.ts +63 -0
  46. package/src/installer/types.ts +126 -0
  47. package/src/installer/uninstall.ts +33 -0
  48. package/src/mcp/auth.ts +2 -1
  49. package/src/mcp/cli.ts +21 -5
  50. package/src/mcp/config.ts +63 -32
  51. package/src/mcp/server.ts +81 -65
  52. package/src/opencode/auth.ts +3 -2
  53. package/src/opencode/plugin.ts +93 -56
  54. package/src/mcp/format.ts +0 -31
package/CHANGELOG.md CHANGED
@@ -2,6 +2,208 @@
2
2
 
3
3
  All notable changes to this project are documented here.
4
4
 
5
+ ## 0.4.0
6
+
7
+ - Ground the search defaults in surveyed industry factory defaults
8
+ ([research](docs/research/search-api-defaults.md)): every surveyed AI-native search API
9
+ returns ten results by default and none filters results client-side by score or
10
+ authority, so `maxResults` moves 5 → 10 (matching the API `count` default) and the
11
+ `minRerank`/`minAuthority` thresholds move to 0 with `allowUnknownAuthority` flipping
12
+ to `true` — the pass-through default returns what DeepSeek ranked, and the thresholds
13
+ remain available as opt-ins. `DEEPSEEK_SEARCH_ALLOW_UNKNOWN_AUTHORITY` becomes a
14
+ false-only switch (`false`/`0`/`no`/`off` disables) since the default is now on.
15
+ Unchanged and now evidence-backed: `maxRetries=0` (search-API SDK cohort: tavily-python
16
+ and Linkup ship no retries; the 2-retry defaults belong to chat-completion SDKs), the
17
+ 30 s timeout, and the 1,200/16,000-character truncations
18
+ - Drop the "Token- and cost-efficient" bullet from the README's Features section —
19
+ the default parameters are no longer endorsed as a selling point, and their behavior
20
+ is stated neutrally in General behavior
21
+
22
+ ## 0.3.0
23
+
24
+ - Close the lifecycle gaps in the keyless e2e coverage with a `reinit` scenario: tier
25
+ downgrades revert orphaned artifacts through the real CLI (the Codex kill switch
26
+ restored inside the still-claimed config with the registration kept and the plan's
27
+ reverts section visible; the Pi preferred → optional downgrade deletes the orphaned,
28
+ installer-created rules file whole), a second Codex scope claiming the same config
29
+ file is refused with uninstall guidance, `list` reports the recorded installs, and
30
+ `XDG_CONFIG_HOME` routes the global config home with uninstall finding the record
31
+ there. The Codex project scope and OpenCode global scope path mappings are exercised
32
+ for the first time
33
+ - Refuse drift between plan and apply (ADR-0001): apply now re-verifies that the value
34
+ at every set-op path still equals what the plan previewed, and refuses with re-run
35
+ guidance when the config changed since the plan was rendered — the preview, the secret
36
+ guard, and the install record describe one snapshot taken once at plan time, and an
37
+ interim user edit can never be silently overwritten. A file that stopped parsing in
38
+ that window refuses the same way
39
+ - Deepen the modules the installer and adapters are built on, behavior-preserving
40
+ except where noted: revert and the cross-scope collision invariant each get exactly
41
+ one owner (a whole-file orphan revert now deletes a created file it leaves empty,
42
+ matching uninstall's semantics; partial orphan reverts never delete a still-claimed
43
+ file); the three config formats — comment-preserving JSONC, comment-lossy TOML, and
44
+ the host-marked rules block — sit behind one codec registry, with a plan's file edits
45
+ as a discriminated union instead of optional-field smuggling; each host module owns
46
+ its per-scope paths, tool ids, and shared plan header, the CLI roster derives from
47
+ the planner registry, and `docs/hosts.jsonc` records which hosts have installer
48
+ modules with test guards holding both in sync; the DeepSeek HTTP transport moves
49
+ behind its own seam with an injectable fetch, the per-call timeout becomes part of
50
+ the request context (the shorter of it and the configured timeout wins, for search
51
+ as well as fetch), and the OpenCode adapter stops rebuilding resolved options; the
52
+ core returns a host-neutral search result, owns the capability-fact description
53
+ fragments both adapters compose from, and resolves OpenCode's registration knobs
54
+ inside the OpenCode adapter where they are consumed; the `DEEPSEEK_*` environment
55
+ variable names have a single source in the core constants
56
+ - Make the installer CLI edge testable and explicit: command output is injectable,
57
+ input validation returns a discriminated result instead of smuggling exit codes as
58
+ numbers, and the config home is an explicit input with the XDG comparison resolved
59
+ once at the entry (behavior unchanged)
60
+ - Track the project's domain documentation: `CONTEXT.md` (the glossary hosts, adapters,
61
+ tiers, plans, records, reverts, codecs are written in) and `docs/adr/` now live in
62
+ the repository, alongside the `docs/agents/` agent-skills configuration (GitHub
63
+ Issues as the tracker, default triage labels, single-context domain docs)
64
+ - Enforce the forced tier's exclusivity promise and complete the detect phase: other
65
+ registered MCP servers are now classified web-capable from their name plus
66
+ command/args/url (a heuristic the plan notes state openly). Under a forced tier, Pi
67
+ disables the web-capable ones via their per-server `enabled` key with the prior value
68
+ snapshotted for uninstall, while Codex — which has no per-server kill switch — refuses
69
+ the tier with guidance instead of promising non-exclusive routing (OpenCode's forced is
70
+ replacement, which no third-party server overrides). The target rules file is scanned
71
+ for steering toward other web tools (the installer's own marked block excluded) and the
72
+ conflict is reported, not resolved; every forced-tier plan names the README's "Privacy
73
+ and cost" section; the both-off error and the stay-registered/replacement notes become
74
+ shared strings instead of per-planner copies
75
+ - Refuse cross-scope installs that would claim one config file: Codex's project-scope
76
+ fallback writes the user-level `~/.codex/config.toml`, so a project install beside a
77
+ global one left both scopes' records claiming `mcp_servers.deepseek` in that file, and
78
+ whichever uninstalled first reverted the other's registration. The plan now refuses a
79
+ second scope whose edits overlap the other scope's recorded files (pointing at the
80
+ uninstall command to run instead), and uninstall runs the same check defensively for
81
+ records that predate the guard. Pi and OpenCode scope pairs map to disjoint files and
82
+ install side by side as before
83
+ - Split installer config editing into `configFile` (JSONC text editing) and
84
+ `configValue` (the parsed-object model), unifying the duplicated path walkers,
85
+ append-array dedupe, created-parents pruning, and the isPlainObject guard along the
86
+ way (no behavior change); add a guard test that every version literal in installer
87
+ prose appears in `docs/hosts.jsonc`, so a version bump without the re-verification
88
+ pass fails tests instead of shipping stale facts in user-facing plan notes
89
+ - Close the remaining high- and medium-value e2e coverage gaps with four new Docker
90
+ scenarios: `installer` (keyless — the installer CLI's own product: init/apply/uninstall
91
+ for all three hosts, verified through the real agents' config readers, including the
92
+ Codex kill-switch write and the OpenCode engine replacement), `pkg` (keyless — the
93
+ `npm pack` tarball installed with npm in the container, its bin executed directly,
94
+ then registered as the Pi server for a real handshake), `capability-off` (keyless —
95
+ `DEEPSEEK_ENABLE_FETCH=false` leaves exactly the search tool, both flags false refuses
96
+ to start, and a registration without `exposure` reports `codemode`), and `preferred`
97
+ (billed — installer product at Pi project scope with preferred tiers, then
98
+ natural-language prompts that name no tool, so only the AGENTS.md rules block can steer
99
+ the model). The harness now accepts multiple scenario names, packs the npm tarball
100
+ before running, gives each scenario an isolated HOME and project dir (cleaned up
101
+ afterwards) while sharing one npm download cache per run, and suggests the keyless
102
+ subset when `DEEPSEEK_API_KEY` is missing
103
+ - Fix the installer's secret guard refusing its own output: a re-init over an existing
104
+ entry whose `DEEPSEEK_API_KEY` is the `${DEEPSEEK_API_KEY}` indirection form was
105
+ rejected as a literal credential. Pure `${VAR}` expansions now pass the guard (found
106
+ by the new installer e2e scenario running after pi-billed in a shared HOME); literal
107
+ keys are still refused
108
+ - Fix the `codex` e2e scenario, which had never actually completed a turn: the slim
109
+ Node base image ships no system CA bundle, so Codex's static-musl TLS stack (rustls,
110
+ unlike Node's bundled store) failed every HTTPS request as an opaque
111
+ "Reconnecting... waiting for network" loop — the Dockerfile now installs
112
+ `ca-certificates`. The scenario config also follows DeepSeek's official Codex
113
+ integration: a vendored `test/e2e/codex-models.json` catalog is written to
114
+ `~/.codex/models.json` and referenced via `model_catalog_json` (without it Codex
115
+ cannot resolve DeepSeek model slugs), with `wire_api = "responses"` and the key
116
+ still forwarded through `env_key`/`env_vars` instead of the official script's
117
+ bearer-token-in-file. The scenario now exercises the `web_search = "disabled"`
118
+ kill switch for real. All four scenarios (pi, pi-billed, opencode, codex) pass in
119
+ Docker with real billed requests
120
+ - Add the billed `pi-billed` e2e scenario, bringing Pi to the same invocation-level
121
+ coverage as the opencode and codex scenarios: headless `pi --print` prompts whose
122
+ LLM is Pi's native DeepSeek provider (`deepseek/deepseek-flash`), so one key pays
123
+ for both legs and the model really calls `deepseek_fetch` / `deepseek_web_search`
124
+ through Pi's own MCP client. The keyless `pi` handshake scenario stays
125
+ - Drop Continue and Gemini from the host matrix — they will not be supported.
126
+ Both generated tables, the per-host reference, the protocol research, the
127
+ installer examples, and the host-count invariants shrink accordingly (the
128
+ MCP-capable host count is now seven)
129
+ - Fix the critical code-review findings on the installer: a tier-change re-init now
130
+ reverts the previous init's artifacts explicitly (shown in the plan, undone on
131
+ apply) instead of orphaning them; the plan renders old values for every set op and
132
+ existing counts for appends; TOML comment-loss detection covers trailing comments
133
+ (string-aware); rules-block markers are per host so pi and codex can share one
134
+ AGENTS.md; install records are written 0600 with `.deepseek-web-retrieval/`
135
+ gitignored; replacing an entry that contains a literal credential-looking key is
136
+ refused instead of snapshotted; the CLI resolves `--cwd`, falls back to
137
+ `os.homedir()`, rejects unknown flags/positionals with targeted messages, and
138
+ apply refuses to clobber non-array/non-object config values before writing
139
+ anything; the e2e runner rejects stale flags (including `--local`) and forwards
140
+ empty env values as empty instead of passing host values through
141
+ - Add the installer CLI (`deepseek-web-retrieval init` / `uninstall` / `list`) for
142
+ OpenCode, Pi, and Codex: plan-then-apply with per-capability tiers (optional /
143
+ preferred / forced / off) and a first-class project/global scope, JSON edits that
144
+ preserve comments (jsonc-parser), TOML support (smol-toml), snapshot-based surgical
145
+ rollback that never clobbers user edits, and detect notes for competitors, other
146
+ registered MCP servers, and Codex's `[tools] web_search` no-op trap
147
+ - Add `DEEPSEEK_ENABLE_SEARCH` / `DEEPSEEK_ENABLE_FETCH` (and the OpenCode
148
+ `searchEnabled` / `fetchEnabled` options) for per-capability control on every host;
149
+ the MCP server refuses to start when both tools are disabled
150
+ - Promote Codex to supported: MCP-server adapter, the `docs/agents/codex.md` guide,
151
+ tier table with the top-level `web_search = "disabled"` kill switch, and
152
+ `env_vars`-based key forwarding that respects Codex's stdio env allowlist
153
+ - Make the e2e suites Docker-only (remove `--local`) and add the billed `codex`
154
+ scenario: headless `codex exec` in an isolated HOME with DeepSeek as the Codex LLM
155
+ over the Responses wire (Codex 0.163.0 dropped `wire_api = "chat"`; DeepSeek serves
156
+ the Responses endpoint), one key paying for both legs
157
+ - Replace the hand-written JSONC stripper with jsonc-parser (now also
158
+ `src/core/jsonc.ts`); drop `scripts/jsonc.ts`
159
+
160
+ - Fix documentation review findings: resolve the Pi `structuredContent` contradiction
161
+ against the v1.3.0 source (content-first, structuredContent as a no-content
162
+ fallback), add the missing `extension` mechanism to the taxonomy and re-path
163
+ OpenCode to its native mechanisms, qualify the Forced tier in the Tiers table
164
+ itself, de-restate version locks and the baseline in CONTRIBUTING/integration,
165
+ replace "planned" with "shipped" for the MCP server, tighten installer rollback
166
+ and forced-unavailable/session-scoped semantics, and dedupe the provenance and
167
+ quirk summaries
168
+ - State the installer principles — never overwrite user configuration without the
169
+ user's knowledge, and post-install behavior and impact scope must be controllable
170
+ and knowable — and specify the detect/merge/verify flow, tier semantics against
171
+ stock configuration, snapshot-based rollback, and a first-class project/global
172
+ scope choice (honor or report, never silently downgrade) in
173
+ `docs/design/installer-design.md`; qualify the control matrix's exclusion flavor as
174
+ relative to built-in competitors only
175
+ - Categorize `docs/`: per-agent guides in `docs/agents/`, research notes in
176
+ `docs/research/`, and design notes in `docs/design/`; the integration hub and
177
+ `docs/hosts.jsonc` stay at the root
178
+ - Add `docs/research/control-matrix.md`: control-tier research (optional / preferred /
179
+ forced, per host and capability) with a consolidated per-host reference — built-in web
180
+ tools and their kill switches, MCP registration, and rules files. The control matrix is
181
+ generated from the new `control` field in `docs/hosts.jsonc` (`bun run docs:matrix`;
182
+ drift fails tests)
183
+ - Correct the Continue host note (the CLI has no built-in `search_web`; it is
184
+ IDE-extension-only) and state the built-in web tools in the Codex, Cursor, Devin, and
185
+ Copilot notes; extend the host-evaluation checklist with the rules and built-in
186
+ kill-switch questions
187
+ - Move install-time tier planning to `docs/design/installer-design.md`, and fold the
188
+ `docs/research/mcp-compatibility.md` per-host setup notes and quirk catalog into the
189
+ control-matrix per-host reference; `integration.md` host notes now link there instead
190
+ of restating details
191
+ - Fix the hosts.jsonc drift guard: the matrix renderer no longer rewrites
192
+ docs/integration.md when imported by tests, and CI and `bun run check` now fail
193
+ on drift (`docs:matrix --check`)
194
+ - Serve both MCP tools end to end at every pinned client revision, not only
195
+ `listTools`
196
+ - Build `dist/cli.js` on demand for the stdio smoke test instead of silently
197
+ skipping it on a fresh checkout
198
+ - Share the fetch pipeline (parse, host policy, fetch, format) between the
199
+ OpenCode and MCP adapters through `fetchDocument` in the core
200
+ - Stop restating host version locks in narrative docs; reference
201
+ `docs/hosts.jsonc` instead
202
+ - Pin the e2e Docker base image (`node:22.23.3-slim`) and correct the 0.2.0
203
+ changelog wording about where e2e versions are pinned
204
+ - Type the `DEEPSEEK_*` environment mapping so option keys and variable names
205
+ cannot drift apart
206
+
5
207
  ## 0.2.0
6
208
 
7
209
  - Make `docs/hosts.jsonc` the single source of truth for host facts: the
@@ -11,7 +213,8 @@ All notable changes to this project are documented here.
11
213
  - Add a local-only end-to-end script (`bun run test:e2e`): a keyless real
12
214
  `pi mcp list` handshake against the built server, and a headless `opencode run`
13
215
  scenario that makes real billed requests; never run in CI. Agents run inside
14
- Docker with versions pinned by `test/e2e/Dockerfile` (`--local` opts out)
216
+ Docker with versions injected from `docs/hosts.jsonc` as Docker build args
217
+ (`--local` opts out)
15
218
  - Add an MCP server adapter (`src/mcp/`) exposing `deepseek_web_search` and `deepseek_fetch`
16
219
  over stdio, serving MCP clients from revision 2024-11-05 through 2026-07-28
17
220
  - Support `DEEPSEEK_*` environment variable configuration in the MCP server, mapped onto the
package/README.md CHANGED
@@ -9,46 +9,74 @@ coding agents are in progress.
9
9
 
10
10
  This is an unofficial community project. It is not affiliated with OpenCode or DeepSeek.
11
11
 
12
+ ## Features
13
+
14
+ - **One core, every host** — a native OpenCode v2 plugin plus a stdio MCP
15
+ server for everything else; identical retrieval behavior on each
16
+ - **Tiered routing** — optional, preferred, forced, or off, per capability;
17
+ forced refuses when exclusivity is impossible
18
+ - **Plan-then-apply installer** — every write previewed as old → new before
19
+ touching disk; arrays merge instead of replacing; uninstall reverses
20
+ exactly what was applied
21
+ - **Trap-aware detection** — catches what the agents' own docs don't warn
22
+ about: Codex's silent `[tools] web_search` no-op, Pi's codemode hiding MCP
23
+ tools; conflicting rules and web-capable servers surface in the plan
24
+ - **Git-safe installs** — the key never enters config files
25
+ (`${DEEPSEEK_API_KEY}` indirection or `env_vars`), so a project-scope
26
+ install commits clean
27
+ - **Fails loudly, never falls back** — no silent provider switches;
28
+ localhost and private URLs blocked before they leave the machine
29
+
12
30
  ## Usage
13
31
 
14
32
  Shipped adapters:
15
33
 
16
- - [OpenCode v2 setup and usage](docs/opencode-v2.md) — native plugin API
17
- - [Pi setup and usage](docs/pi.md) — MCP server over stdio
18
-
19
- The MCP server works with any host that supports MCP tools over stdio; Pi is the first
20
- host with a shipped guide. For how other coding agents integrate—native websearch
21
- providers, native fetch tools, MCP, or wrappers—see the
22
- [integration model](docs/integration.md) with its version-locked host support matrix, and
23
- the [MCP compatibility research](docs/mcp-compatibility.md). A host is listed as supported
34
+ - [OpenCode v2 setup and usage](docs/agents/opencode-v2.md) — native plugin API
35
+ - [Pi setup and usage](docs/agents/pi.md) — MCP server over stdio
36
+ - [Codex setup and usage](docs/agents/codex.md) — MCP server over stdio
37
+
38
+ The MCP server works with any host that supports MCP tools over stdio. The
39
+ `deepseek-web-retrieval init` CLI installs it with plan-then-apply semantics — search and
40
+ fetch tiers chosen per capability, project or global scope, snapshots for rollback. For
41
+ how coding agents integrate—native websearch providers, native fetch tools, MCP, or
42
+ wrappers—see the
43
+ [integration model](docs/integration.md) with its version-locked host support matrix, the
44
+ [control-level research](docs/research/control-matrix.md), and the
45
+ [MCP compatibility research](docs/research/mcp-compatibility.md). A host is listed as supported
24
46
  only after an adapter and guide exist.
25
47
 
26
48
  For shared search, fetch, retry, and privacy behavior, see below.
27
49
 
28
50
  ## General behavior
29
51
 
52
+ What this adapter layer adds on top of the
53
+ [DeepSeek Search and Fetch APIs](https://api-docs.deepseek.com/guides/search) — the APIs'
54
+ own capabilities (Markdown-only output, no JavaScript rendering, no private networks or
55
+ binary files, per-request billing) are documented there.
56
+
30
57
  ### Search
31
58
 
32
- - Sends `need_content: false` and returns DeepSeek's `summary`, falling back to `snippet`.
33
- - Filters by `rerank_score` and `authority`, deduplicates URLs, and returns at most five
34
- results by default.
35
- - The final query, including `blockedDomains`, `includeDomains`, and `language` operators,
36
- must be 128 characters or fewer. Longer queries are rejected locally.
59
+ - Requests summaries only (`need_content: false`, `summary` falling back to `snippet`);
60
+ full page content never enters the results.
61
+ - Returns at most ten results by default (matching the API's `count` default and the
62
+ industry norm for AI-native search APIs), deduplicating URLs. Optional
63
+ `rerank_score` and `authority` thresholds are off by default; when enabled they
64
+ drop results below the configured score or tier.
65
+ - Builds `blockedDomains`, `includeDomains`, and `language` into query operators and
66
+ rejects the final query locally when it exceeds the API's 128-character limit.
37
67
  - An empty result set is normal and is not an error.
38
68
 
39
69
  ### Fetch
40
70
 
41
- - DeepSeek Fetch returns Markdown only. `format: "text"` and `format: "html"` are rejected.
42
- - Output is capped at 16,000 characters by default, including the title. A
71
+ - Output is capped at 16,000 characters by default, including the title; a
43
72
  `[content truncated]` marker is added when the limit leaves room for it.
44
- - If the page already starts with the same title as a top-level heading, no duplicate title
45
- is added.
46
- - Responses larger than 5 MiB are rejected before parsing.
47
- - URLs must be absolute `http://` or `https://` URLs with a host, no embedded credentials,
48
- and at most 8,192 characters.
49
- - The core supports allowed/blocked domain lists and private-host blocking. DeepSeek does
50
- not render JavaScript and cannot reach private networks; PDFs, images, and other binary
51
- files are unsupported.
73
+ - A page that already opens with its title as a top-level heading does not get a
74
+ duplicate title.
75
+ - Responses larger than 5 MiB are rejected before parsing; URLs must be absolute
76
+ `http://` or `https://`, credential-free, and at most 8,192 characters.
77
+ - `format: "text"` and `format: "html"` are rejected rather than misrepresented.
78
+ - Allowed/blocked domain lists and private-host blocking are enforced on the client,
79
+ before a request leaves the machine.
52
80
 
53
81
  ### Timeouts and retries
54
82
 
@@ -64,10 +92,9 @@ provider or fetch implementation.
64
92
 
65
93
  ### Privacy and cost
66
94
 
67
- Queries and URLs are sent to `https://api.deepseek.com`. The API key is sent only as a
68
- Bearer token to DeepSeek. Search and Fetch are billed per successful request; check current
69
- DeepSeek pricing and rate limits before enabling a team deployment. A 429 means you should
70
- wait, reduce concurrency, or increase retries.
95
+ Queries and URLs are sent to `https://api.deepseek.com`; the API key is sent only as a
96
+ Bearer token to DeepSeek and to nothing else. Retrieval is billed per successful request —
97
+ see the official docs for pricing and rate limits before enabling a team deployment.
71
98
 
72
99
  ## Development
73
100
 
@@ -81,7 +108,7 @@ The test suite mocks the DeepSeek HTTP API and the OpenCode plugin host, and dri
81
108
  MCP server with SDK clients pinned to each supported protocol revision. Real API calls
82
109
  require a funded DeepSeek account. Shared retrieval logic lives in `src/core/`; adapters
83
110
  live in `src/<agent>/` (the cross-host MCP server lives in `src/mcp/`). Adapter docs live
84
- in `docs/<agent>.md`.
111
+ in `docs/agents/<agent>.md`.
85
112
 
86
113
  ## Prior art
87
114