把联网搜索接到自建引擎,数据不出域
31.5/100
综合分
2
GitHub 星标
38
npm 周下载
—/5
用户评分
数据截至 2026/9/24 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @tianjiqx/dsh-wigolonpm 源 · @tianjiqx/dsh-wigolo 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · search
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 40 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包@tianjiqx/dsh-wigolo @ 1.3.0
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/14 04:15:06
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 46 处,展示前 43 条)
- 读取本地文件lib/index.mjs:185
return readFileSync(path, "utf8").split("\n")[0].trim(); - 读取本地文件lib/index.mjs:249
if (!existsSync(this.path)) { - 写入本地文件lib/index.mjs:283
mkdirSync(dirname(target), { recursive: true }); - 写入本地文件lib/index.mjs:284
writeFileSync(target, token.trim() + "\n", { mode: 384 }); - 读取密钥环境变量lib/index.mjs:295
if (process.env.WIGOLO_TOKEN !== void 0 && process.env.WIGOLO_TOKEN !== "") return process.env.WIGOLO_TOKEN; - 读取本地文件lib/index.mjs:300
const text = readFileSync(this.path, "utf8"); - 写入本地文件lib/index.mjs:347
mkdirSync(dir, { recursive: true }); - 写入本地文件lib/index.mjs:349
writeFileSync(tmp, JSON.stringify(file, null, 2) + "\n", { mode: 384 }); - 写入本地文件lib/index.mjs:350
renameSync(tmp, this.path); - 发起网络请求lib/index.mjs:405
const req = http.request({ - 读取本地文件lib/index.mjs:636
const before = existsSync(path) ? readFileSync(path, "utf8") : ""; - 读取本地文件lib/index.mjs:636
const before = existsSync(path) ? readFileSync(path, "utf8") : ""; - 写入本地文件lib/index.mjs:640
writeFileSync(tmp, after); - 发起网络请求lib/index.mjs:1378
async fetch(request) { - 发起网络请求lib/index.mjs:7193
const outcome = await approval.request({ - 发起网络请求src/client/api.ts:67
return readJson(await fetch(API.config, { method: 'GET' })) - 发起网络请求src/client/api.ts:70
return readJson(await fetch(API.token, { - 发起网络请求src/client/api.ts:77
return readJson(await fetch(API.config, { - 发起网络请求src/client/api.ts:84
return readJson(await fetch(API.tools, { - 发起网络请求src/client/api.ts:91
return readJson(await fetch(API.test, { - 发起网络请求src/client/api.ts:98
return readJson(await fetch(API.takeover, { - 发起网络请求src/client/cache-tab-slot.ts:67
void fetch('/api/dsh-wigolo/config') - 发起网络请求src/client/index.ts:78
list: async (limit?: number) => readJson(await fetch(WIGOLO_API.cacheTabList + (limit !== undefined ? '?limit=' + limit : ''))), - 发起网络请求src/client/index.ts:79
stats: async () => readJson(await fetch(WIGOLO_API.cacheTabStats)), - 发起网络请求src/client/index.ts:80
entry: async (url: string) => readJson(await fetch(WIGOLO_API.cacheTabEntry + '?url=' + encodeURIComponent(url))), - 发起网络请求src/client/index.ts:81
watchList: async () => readJson(await fetch(WIGOLO_API.cacheTabWatch)), - 发起网络请求src/client/index.ts:82
watchAction: async (action: 'check' | 'pause' | 'resume', jobId: string) => readJson(await fetch(WIGOLO_API.cacheTabWatch, { - 发起网络请求src/client/index.ts:87
sessionInfo: async (sessionId: string) => readJson(await fetch(WIGOLO_API.cacheTabSession + '?sessionId=' + encodeURIComponent(sessionId))), - 读取本地文件src/cordis-managed.ts:64
const before = existsSync(path) ? readFileSync(path, 'utf8') : '' - 读取本地文件src/cordis-managed.ts:64
const before = existsSync(path) ? readFileSync(path, 'utf8') : '' - 写入本地文件src/cordis-managed.ts:69
writeFileSync(tmp, after) - 写入本地文件src/cordis-managed.ts:70
renameSync(tmp, path) - 发起网络请求src/mcp-client.ts:40
const req = http.request({ host, port, path: MCP_PATH, method: 'POST', headers }, (res) => { - 发起网络请求src/providers.ts:70
async fetch(request: { url: string }): Promise<ReturnType<typeof toFetchResult>> { - 读取本地文件src/store.ts:25
return readFileSync(path, 'utf8').split('\n')[0].trim() - 读取本地文件src/store.ts:91
if (!existsSync(this.path)) { - 写入本地文件src/store.ts:130
mkdirSync(dirname(target), { recursive: true }) - 写入本地文件src/store.ts:131
writeFileSync(target, token.trim() + '\n', { mode: 0o600 }) - 读取密钥环境变量src/store.ts:144
if (process.env.WIGOLO_TOKEN !== undefined && process.env.WIGOLO_TOKEN !== '') return process.env.WIGOLO_TOKEN - 读取本地文件src/store.ts:153
const text = readFileSync(this.path, 'utf8') - 写入本地文件src/store.ts:212
mkdirSync(dir, { recursive: true }) - 写入本地文件src/store.ts:214
writeFileSync(tmp, JSON.stringify(file, null, 2) + '\n', { mode: 0o600 }) - 写入本地文件src/store.ts:215
renameSync(tmp, this.path)
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools@deepseek-ai/dsh-web给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 代理联网搜索与抓取
- 覆盖搜索抓取提取链路
- 数据不出域
展开完整介绍(171 字)↓
DSH 联网搜索私有化方案,把 web_search/web_fetch 代理到 Wigolo,覆盖搜索、抓取、提取、深度研究、缓存、监控全链路,数据不出域,零查询成本。由 Wigolo 驱动的 DSH 搜索插件,自托管搜索、抓取、提取、研究、缓存、监控流水线,完全替代内置的 web_search/web_fetch,零成本,数据完全私有。
README
由 DeepSeek 最新模型翻译生成dsh-wigolo
DSH(DeepSeek Harness)的私有部署联网搜索方案。 本插件将自建的 wigolo 元搜索 daemon 集成到 DSH,用你自己的搜索基础设施替代内置的联网搜索——完全掌控搜索引擎、缓存策略和数据隐私。
核心定位: 代理并替代 DSH 内置的 web_search / web_fetch,将 agent 的所有联网搜索请求转发到私有部署的 wigolo daemon。一个开关即可切换——无云依赖、无 API Key、零查询成本。
dsh web GUI ── 侧边栏面板 ── /api/dsh-wigolo/* ──┐
│
agent 工具 (wigolo_search, …) ── MCP streamable-http ──► wigolo daemon web seam (web_search / web_fetch) ────────────────┘ 18+ 引擎 · RRF 融合 · 本地缓存
功能
- 七个 agent 工具 —— wigolo_search、wigolo_crawl、wigolo_extract、wigolo_research、wigolo_find_similar、wigolo_cache、wigolo_watch,每个都基于 daemon 真实 schema 裁剪出模型高频参数面。
展开完整文档(README 剩余 1 节)
dsh-wigolo
DSH(DeepSeek Harness)的私有部署联网搜索方案。 本插件将自建的 wigolo 元搜索 daemon 集成到 DSH,用你自己的搜索基础设施替代内置的联网搜索——完全掌控搜索引擎、缓存策略和数据隐私。
核心定位: 代理并替代 DSH 内置的 web_search / web_fetch,将 agent 的所有联网搜索请求转发到私有部署的 wigolo daemon。一个开关即可切换——无云依赖、无 API Key、零查询成本。
dsh web GUI ── 侧边栏面板 ── /api/dsh-wigolo/* ──┐
│
agent 工具 (wigolo_search, …) ── MCP streamable-http ──► wigolo daemon web seam (web_search / web_fetch) ────────────────┘ 18+ 引擎 · RRF 融合 · 本地缓存
功能
- 七个 agent 工具 —— wigolo_search、wigolo_crawl、wigolo_extract、wigolo_research、wigolo_find_similar、wigolo_cache、wigolo_watch,每个都基于 daemon 真实 schema 裁剪出模型高频参数面。写操作归 agent,只读缓存/监控浏览由默认关闭的「Wigolo 缓存」tab 承载。
- 接管可配置 —— 官方 web_search / web_fetch 是否走 wigolo,单开关切换(开 = 两者都由 wigolo 驱动,关 = 官方提供商),GUI 一键切换并自动管理 cordis 路由。
- 官方设置集成 —— enabled、announceToAgent、guidance 覆盖项位于官方 DSH 设置 UI(dsh-ssh 模式)。热更新:改设置无需重启。
- 侧边栏面板(React,中英文双语)—— 四个 Tab:连接配置(实时测试 + 延迟)、接管与工具、关于、使用指南(面板内渲染 GUIDE.zh.md)。连接/token/工具开关/缓存 tab 开关,全部回环栅栏保护。token 可直接在面板粘贴写入(无需终端)。
- 热重配 —— 连接/token 修改即时生效(MCP 客户端热重配),仅接管开关和工具暴露变更需重启。
- Fail-loud 配置校验 —— 未知配置键触发警告并附带「你是不是想说……」提示(编辑距离匹配),不会默默忽略。
- 密钥安全 —— token 独立存于 0600 文件,永不进配置 JSON,永不回传浏览器。
- 缓存时间时区转换 —— wigolo daemon 以无时区 UTC 存储时间戳,插件自动按配置的时区(local、数字偏移如 +8、或 IANA 名称如 Asia/Shanghai)转换,wigolo_cache 结果直接显示本地时间。
前置条件
一个运行中的 wigolo daemon(v0.2+),HTTP + Bearer token 可达。本机(127.0.0.1:3333)是默认值,零额外配置。
安装
从 npm 安装
dsh plugin --profile web add @tianjiqx/dsh-wigolo
从 GitHub 安装
dsh plugin --profile web add github:tianjiqx/dsh-wigolo
两种方式都会安装插件并自动注册到 profile 的 bundle 列表(通过插件自带的 cordis.patch.yml),无需手动编辑。
本地开发(link 模式)
git clone https://github.com/tianjiqx/dsh-wigolo.git
cd dsh-wigolo
pnpm install
pnpm build
dsh plugin --profile web add link:$PWD
这会克隆仓库、构建插件,并通过 link: 方式自动注册到 profile 的 bundle 列表(无需手动编辑 cordis.patch.yml)。
安装后配置
把 daemon token 写入 ~/.dsh/wigolo-token(首行,权限 0600):
echo "YOUR_TOKEN" > ~/.dsh/wigolo-token && chmod 600 ~/.dsh/wigolo-token
重启 dsh,打开侧边栏 Wigolo 入口,点 Test connection 验证。
卸载
dsh plugin --profile web remove @tianjiqx/dsh-wigolo
这会移除插件及其 bundle 注册。token 文件 ~/.dsh/wigolo-token 和配置 ~/.dsh/wigolo.json 会保留(如需要可手动删除)。
详细使用场景和示例见 使用指南。
配置
界面配置(推荐)
所有设置都可以通过 Wigolo 侧边栏面板 完成(点击侧边栏的 Wigolo 图标):
- 连接配置 Tab:Host、端口、token、hostHeader、测试连接
- 接管与工具 Tab:接管开关、工具启用/禁用、缓存 Tab 开关
- 关于 Tab:版本信息、文档链接
修改即时生效(热重载),仅接管开关需要重启。
手动配置文件
对于界面未暴露的高级设置(如工具默认参数、超时覆盖),直接编辑 ~/.dsh/wigolo.json:
{
"version": 2,
"connection": {
"host": "127.0.0.1", // daemon 地址 "port": 3333, "hostHeader": "auto", // auto | none | "" "tokenFile": "" // "" = ~/.dsh/wigolo-token }, "takeover": false, // true = wigolo 驱动 web_search + web_fetch;false = 官方提供商(默认)
"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 缓存」只读 GUI tab(默认关;即时生效)
"announceToAgent": true,
"timezone": "local" // 缓存时间戳时区:"local" | "+8" | "-5" | "+5.5" | "Asia/Shanghai" }
各工具的 defaults 合并在模型显式参数之下(模型始终优先);timeoutMs 覆盖内置超时预算。
接管开关
takeover 是一个布尔开关:
| 值 | web_search | web_fetch | 说明 |
| true | wigolo | wigolo | 完全替代 |
| false | 官方 | 官方 | 仅 wigolo_* 工具(默认) |
为什么要开关:当多个 provider 同时注册进 web seam 且无显式路由时,web_search 会以 WEB_PROVIDER_AMBIGUOUS 失败。开启(true)时会向 ~/.dsh/cordis.patch.yml 写入自管理块(searchProvider: wigolo,dsh-skin 式托管标记);关闭(false)移除该块且不注册 provider,与官方 provider 安全共存。路由变更需重启 dsh——面板会提示。
时区配置
wigolo daemon 以无时区 UTC 格式("YYYY-MM-DD HH:MM:SS")持久化缓存时间戳。插件在返回给 agent 或渲染到 UI 之前,会按配置的时区进行转换。
| 值 | 示例 | 说明 |
| "local" | "local" | 使用 DSH 主机的系统时区(默认) |
| 数字偏移 | "+8"、"-5"、"+5.5" | 固定 UTC 偏移量;支持半小时时区(如印度 +5:30) |
| IANA 名称 | "Asia/Shanghai"、"America/New_York" | 完整时区规则,自动处理夏令时 |
修改 timezone 后需重启 dsh 生效。
Host 头技术说明
wigolo 的 DNS-rebinding 防护会对 Host 值做白名单:localhost、回环字面量、以及自身 bind host。两个推论:
- 绑定 0.0.0.0 的局域网 daemon 接受 Host: 0.0.0.0 的请求。
- fetch() 按规范禁止设置 Host,插件因此使用 node:http(允许自定义)。
hostHeader: "auto"(默认)对本地 daemon 不发送自定义头,对远程 daemon 使用 bind-host 技巧。仅当你的部署确有需要时才设字面值。
Agent 工具
| 工具 | wigolo 能力 | 亮点 | 超时 |
| wigolo_search | search | 分类 / 时间范围 / 域名过滤 / 深度档 / "a \| b" 多变体查询 | 60s |
| wigolo_crawl | crawl | 站点爬取(patterns / 策略 / 页数上限),每页入本地缓存 | 300s |
| wigolo_extract | extract | CSS 选择器或字段 schema 的结构化提取 | 60s |
| wigolo_research | research | 分解子查询、并行搜索、合成带引用的报告 | 600s |
| wigolo_find_similar | find_similar | 从 URL 或概念找相关内容(默认关) | 120s |
| wigolo_cache | cache | 触网之前先查本地缓存;stats / clear | 30s |
| wigolo_watch | watch | 持久 URL 变化监控;配合定时 agent 任务实现通知 | 120s |
所有超时均可通过配置中的 timeoutMs 按工具调整。
安全说明
- 面板路由仅限回环(远端地址 + Host + sec-fetch-site + origin 四重校验)——它们读写私有配置,绝不能暴露给 LAN 部署。
- token 存于 ~/.dsh/wigolo-token(0600);API 响应永不包含它。
- wigolo_cache clear 是破坏性操作;工具描述要求模型先确认。
开发
pnpm install
pnpm test # vitest(61 个测试)
pnpm typecheck # tsc --noEmit
pnpm build # lib/index.mjs + lib/client.js(CSS 已内联)
node test/smoke-real-daemon.mjs # 对真实 daemon 手动冒烟
许可
Apache-2.0预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
tianjiqx/dsh-wigolo
把联网搜索接到自建引擎,数据不出域
相关插件 · 搜索 / 抓取
LLM 知识平台Tencent/WeKnora
概览 ·快速开始 ·新特性 ·功能 ·客户端 ·文档 ·开发
★ 36,266已汉化DSH
72
智能体记忆系统MemTensor/MemOS
MemOS 2.0 Stardust星尘
★ 12,228已汉化DSH
71.3
跨代理记忆库zilliztech/memsearch
跨平台语义记忆,专为 AI 编程智能体打造。
★ 2,799已汉化DSH
70.9
跨智能体会话记忆vshulcz/deja-vu
你的编码智能体不再重复调试你已经修好的问题。
★ 1,367已汉化MCP
70.4
技能语料库EverMind-AI/SkillCorpus
SkillCorpus 能给你什么
★ 694已汉化DSH
69.7
动画花园资源检索yjl9903/AnimeGarden
按番剧、字幕组和类型搜索动画 BT 资源
★ 1,391已汉化DSH
69.2
这是你的仓库?认领条目