dsh-wigolo
Full wigolo integration for dsh: WebSearch/WebFetch providers with configurable takeover, 7 wigolo_* agent tools (search/crawl/extract/research/find_similar/cache/watch), a sidebar config panel, and cordis-managed provider routing.
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:tianjiqx/dsh-wigolo说明文档
阅读完整 README ↗Configuration
Via GUI (recommended)
All settings can be configured through the Wigolo sidebar panel (click the Wigolo icon in the sidebar):
- Connection tab: Host, port, token, hostHeader, test connection
- Takeover & Tools tab: Takeover switch, tool enable/disable, cache tab toggle
- About tab: Version info, documentation links
Changes take effect immediately (hot-reload), except for the takeover switch which requires a restart.
Manual configuration file
For advanced settings not exposed in the UI (e.g., per-tool defaults, timeout overrides), edit ~/.dsh/wigolo.json directly:
{
"version": 2,
"connection": {
"host": "127.0.0.1", // daemon address
"port": 3333,
"hostHeader": "auto", // auto | none | ""
"tokenFile": "" // "" = ~/.dsh/wigolo-token
},
"takeover": false, // true = wigolo drives web_search + web_fetch; false = official providers
"tools": {
"wigolo_search": { "enabled": true, "defaults": { "max_results": 10, "search_depth": "balanced" } },
"wigolo_crawl": { "enabled": true, "defaults": { "max_pages": 50 }, "timeoutMs": 300000 },
"wigolo_extract": { "enabled": true },
"wigolo_research":{ "enabled": true, "timeoutMs": 600000 },
"wigolo_find_similar": { "enabled": false },
"wigolo_cache": { "enabled": true },
"wigolo_watch": { "enabled": true }
},
"cacheTab": { "enabled": false }, // "Wigolo Cache" read-only GUI tab (default off; hot-apply)
"announceToAgent": true
}
Per-tool defaults merge under the model's explicit arguments (the model always wins); timeoutMs overrides the built-in per-tool budget.
Takeover switch
takeover is a simple boolean:
| Value | web_search | web_fetch | Notes |
|---|---|---|---|
true | wigolo | wigolo | full replacement |
false | official | official | wigolo_* tools only (default) |
Why a switch at all: when several providers register into the web seam and none is explicitly routed, web_search fails with WEB_PROVIDER_AMBIGUOUS. Takeover on (true) therefore also writes a self-managed block into ~/.dsh/cordis.patch.yml (searchProvider: wigolo, dsh-skin-style managed markers); takeover off (false) removes it and registers nothing, so it coexists safely with the official provider. Routing changes need a dsh restart — the panel tells you when.
The Host header, explained
wigolo guards against DNS-rebinding by allowlisting Host values: localhost, the loopback literals, and its own bind host. Two consequences:
- A daemon bound to
0.0.0.0on a LAN machine accepts requests whoseHostheader is0.0.0.0. fetch()refuses to setHost(Fetch spec), so the plugin usesnode:http, which allows it.
hostHeader: "auto" (default) sends no custom header for local daemons and the bind-host trick for remote ones. Set a literal only if your deployment needs it.
Manual configuration file
For advanced settings not exposed in the UI (e.g., per-tool defaults, timeout overrides), edit ~/.dsh/wigolo.json directly:
{
"version": 2,
"connection": {
"host": "127.0.0.1", // daemon address
"port": 3333,
"hostHeader": "auto", // auto | none | ""
"tokenFile": "" // "" = ~/.dsh/wigolo-token
},
"takeover": false, // true = wigolo drives web_search + web_fetch; false = official providers
"tools": {
"wigolo_search": { "enabled": true, "defaults": { "max_results": 10, "search_depth": "balanced" } },
"wigolo_crawl": { "enabled": true, "defaults": { "max_pages": 50 }, "timeoutMs": 300000 },
"wigolo_extract": { "enabled": true },
"wigolo_research":{ "enabled": true, "timeoutMs": 600000 },
"wigolo_find_similar": { "enabled": false },
"wigolo_cache": { "enabled": true },
"wigolo_watch": { "enabled": true }
},
"cacheTab": { "enabled": false }, // "Wigolo Cache" read-only GUI tab (default off; hot-apply)
"announceToAgent": true
}
Per-tool defaults merge under the model's explicit arguments (the model always wins); timeoutMs overrides the built-in per-tool budget.