dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Keyless DuckDuckGo web search provider for DeepSeek Harness (ctx.web seam) — no API keys, no accounts, zero tokens per search. Strict-mode scraping, redirect unwrapping, dedupe, entity-safe parsing, committed builds, one-command profile install.
Keyless DuckDuckGo web search for DeepSeek Harness.
No API key. No account. No credit card. No tokens burned — the search runs as a
plain HTTP scrape of DuckDuckGo's lite results page, registered through the
harness's public ctx.web provider seam.
DeepSeek Harness is free software. The agent running inside it can be free. Everything a coding agent actually needs — files, shell, git, planning, subagents — is local and costs nothing. Web search was the one wall: every shipped provider requires a paid account (DeepSeek platform key, Exa, Perplexity), while closed tools like Claude Code and ChatGPT bundle live search into their subscriptions.
This plugin exists because "free" shouldn't mean "free, except the internet." Search should not be the feature that forces your first API signup and your first metered bill. It runs on the same public page your browser uses — no quota to exhaust, no key to rotate, nothing to cancel when the trial ends. And because it lives in your checkout rather than someone's endpoint, it is yours to audit, patch, and keep: free software deserves free search.
available() is a pure config-shape check; nothing to store in the credential vaultWEB_PROVIDER_ERROR, never a silent empty success/l/?uddg= wrappers unwrapped to real targets; internal duckduckgo.com links dropped; duplicate URLs deduplicated& last, so escaped text never double-decodesdsh plugin --profile my-profile add github:tatselkrik/dsh-web-search-ddg
Built artifacts are committed under lib/, so no build-script allowance is
needed. The bundle inserts itself into the ctx.web registry; when it is the
only usable search provider it is auto-selected. To pin it explicitly, add to
your profile's cordis.patch.yml:
- id: web
name: '@deepseek-ai/dsh-web'
config:
searchProvider: duckduckgo
Then start with your profile:
dsh --profile my-profile web
For a Harness development checkout that already contains the in-tree package,
replace packages/web/web-search-ddg/src/ with this repository's src/, then
rebuild from the Harness root:
pnpm exec tsc -b packages/web/web-search-ddg
pnpm exec vitest run packages/web/web-search-ddg
A fresh in-tree integration also needs the package added to the Harness workspace and build graph. For normal use, the profile installation above is the supported route and requires no source-tree changes.
| Key | Default | Meaning |
|---|---|---|
baseURL | https://lite.duckduckgo.com/lite/ | The lite results page. Extra params on the base (e.g. ?kl=us-en) are preserved. |
limit | 10 | Provider-level cap on sources per search; the seam still enforces the tool request's maxResults. |
method | get | Query verb. GET sends q in the URL; POST sends it only as a URL-encoded form body. |
timeoutMs | 15000 | Wall-clock cap per request, independent of caller cancellation; timeouts surface as WEB_PROVIDER_ERROR. |
Override any of them via a patch row:
- id: web-search-ddg
name: dsh-web-search-ddg
config:
limit: 5
method: post
Security
prepare/postinstall scripts; lib/ ships committed, so installs run zero build scripts (the supply-chain vector the harness docs warn about).*; align them with your running harness version if you prefer exactness.q URL parameter; POST queries travel only in the encoded form body. Results are parsed as inert text (never evaluated), and unmarked/internal/non-http targets are rejected before they can become citations.Performance
timeoutMs (default 15 s) even if a consumer forgets cancellation.limit before the seam applies its own maxResults, so context cost stays predictable.WebError instanceof) between a registry-installed copy and an in-box copy, pin dependencies to match your running harness version.pnpm install --frozen-lockfile
pnpm run typecheck
pnpm test # 24 tests
pnpm run build # regenerate committed lib/
git diff --exit-code -- lib
lib/ is committed so end users never need a build step.