面向 AI Coding Agent 的多引擎网络搜索与证据聚合工具箱
一个核心代码库,深度适配 MCP、Pi 与 DeepSeek Harness 三大生态
English · 中文文档
---
> [!NOTE]
> **版本与发布说明**:以往的 `pi-search-boost` 与 `dsh-search-boost` 已合并为单一代码库,统一维护在 `lib/` 核心层中。文档中包含 `@latest` 的命令指向 npm 正式发布的版本;如需验证尚未进入正式发布的代码,请检出你所需的分支或标签,并参考[源码安装与本地开发](#源码安装与本地开发)。
---
> **v0.2.4**:单次快照 Jev 筛选(Schema V5)、私有研究保存/恢复、有界 PDF 文本读取、Desktop 接入,以及软件更新与接入管理分离。详见[发布与迁移说明](./docs/v0.2.4-release.md):V3 Adaptive 输入/输出及 `upgrade` 命令已变化。源码版本不代表 npm 已发布;`@latest` 以实际 registry 为准。
## 目录
- [核心特性](#核心特性)
- [系统架构](#系统架构)
- [宿主支持矩阵](#宿主支持矩阵)
- [快速开始(30 秒上手)](#快速开始30-秒上手)
- [升级与迁移指南](#升级与迁移指南)
- [交互式控制台 (TUI)](#交互式控制台-tui)
- [工具箱与使用指南](#工具箱与使用指南)
- [工具职责与边界](#工具职责与边界)
- [1. `fused_search` 多引擎融合搜索](#1-fused_search-多引擎融合搜索)
- [2. `fetch_page` 智能网页提炼](#2-fetch_page-智能网页提炼)
- [3. `x_search` X (Twitter) 动态检索](#3-x_search-x-twitter-动态检索)
- [4. `adaptive_search` Jev 意图导向搜索(实验功能)](#4-adaptive_search-jev-意图导向搜索实验功能)
- [引擎池与评分预设](#引擎池与评分预设)
- [多智能体并行研究工作流](#多智能体并行研究工作流)
- [安全](#安全)
- [CLI 命令参考(自动化与进阶)](#cli-命令参考自动化与进阶)
- [源码安装与本地开发](#源码安装与本地开发)
- [友情链接](#友情链接)
- [开源协议](#开源协议)
---
## 核心特性
- **多引擎并行检索与去重 (`fused_search`)**
同时聚合多个搜索引擎的实时结果。内置**免密钥免费池**(Bing、DuckDuckGo、Yahoo、Exa-free、AnySearch)与**高质量 API 池**(Tavily、Brave、Exa、AnySearch),自动执行跨引擎 URL 规范化去重、域名过滤与权重重排。
- **高净度网页正文提取 (`fetch_page`)**
优先抓取原站降低等待;必要时使用同线路 curl 兼容兜底,Jina Reader 作为备用读取方式。自动剔除 CSS、JS 及广告噪音,支持 `focus` 关键词段落提炼,具备内存缓存与大体积熔断保护。
- **X / Twitter 社区情报检索 (`x_search`)**
支持通过官方 xAI API 或免登录回退通道获取推文、作者动态与讨论串。根据可核验的 Snowflake ID 推导 UTC 发布时间,仅在元数据可核验时执行作者与日期过滤。覆盖可能不完整、过时或为空;检索样本不能代表全平台舆论。
- **Jev 意图导向搜索 (`adaptive_search` · 实验功能)**
提供一个完整问题与必填研究方向。检索前一次 Jev 策略请求选择固定排序预设,并在省略 community 时决定是否追加既有社区支路;随后对有界 fused 快照(目标≤10 时最多 32 条,更大目标按原余量比例扩至最高 160 条)做固定选项筛选(安全、原型价值 3/4/5、来源折扣)。没有关键词规划、没有逐材料 constraints 门槛、没有语言校验、没有自动补读,也没有自设的累计预算停止;cursor 与 saved_result_id 只重放已保存结果。不宣称答案已核实或完整。
- **原生多智能体并行研究工作流**
随包提供 `search-boost` 与 `search-boost-parallel-research` Skills。在支持子代理的宿主(如 Cursor、Claude Code、Pi、DSH)中,可将复杂调研拆分为多路 Searcher(抓取证据)与 Summarizer(无工具综合),提供 Fast 与 Complex 两种研究波次。
- **统一架构,全宿主覆盖**
单一核心运行时(Host-neutral Core Runtime),向上提供通用的 Model Context Protocol (MCP) 标准服务,同时深度定制 Pi 原生扩展与 DeepSeek Harness (DSH) 原生插件包。
- **开箱即用与严苛安全策略**
**无需配置任何 API Key** 即可直接使用免费引擎池;敏感凭证以明文存储于本地受限权限配置文件(POSIX `0600`),不等于静态加密;网络访问交给本机网络和代理,保留请求边界与明确的失败兜底,严禁向模型上下文泄露凭证。
---
## 系统架构
SearchBoost 采用“**单核三适配**”设计,所有搜索算法、分词、抓取策略、去重逻辑与网络安全防护均统一收拢于核心层:
```text
SearchBoost TUI / CLI
安装 · 配置 · 刷新
│
Shared SearchBoost Core
lib/runtime.mjs 核心门面
搜索 · 抓取 · X · Jev 意图导向搜索
│
┌───────────────┼───────────────┐
│ │ │
MCP Adapter Pi Adapter DSH Adapter
stdio 服务 原生扩展 Cordis Bundle
│ │ │
┌────────┴────────┐ ▼ ▼
│ Cursor / Claude │ Pi DeepSeek Harness
│ Codex / Grok │
│ Antigravity │
└─────────────────┘
```
- **Core (`lib/`)**:宿主无关的算法与网络引擎,负责引擎调用、数据清洗、Jev 协议交互及安全策略。
- **Adapters (`adapters/`)**:负责将核心能力翻译为具体协议(MCP JSON-RPC、Pi Extension API、DSH Cordis 生命周期)。
- **Agents (`agents/`)**:受控提示词、工作流模板与原生 Skills 定义。面向 Agent 的工具选择与分层职责见[提示词职责契约](docs/prompt-contract.md)及 [beta.8 发布说明](docs/v0.2.4-beta.8-release.md)。
---
## 宿主支持矩阵
| 宿主 (Host) | 接入类型 | 核心集成文件与机制 | 特性支持与说明 |
| :--- | :--- | :--- | :--- |
| **Cursor / Cursor CLI** | MCP + Skills | `~/.cursor/mcp.json` / `skills/` | 支持 CLI 免审批 (`cli-config.json`)、会话启动注入、并行研究 Skill |
| **Claude Code** | MCP + Prompts | `claude` 官方 MCP 配置 | 注入原生提示词契约,提供端到端多引擎搜索工具 |
| **Codex** | MCP + Prompts | 对应的 MCP 配置文件 | 提供无缝的多引擎及网页抓取工具支持 |
| **Grok Build** | MCP + Plugin | 包含打包的 Grok 插件 | 当检测到 `grok` CLI 时自动同步安装配套插件 |
| **Google Antigravity** | MCP + Workspace | 项目工作区 MCP 配置 | 支持在工作区内配置专属指导与多引擎检索能力 |
| **Pi** | 原生扩展 (Extension) | `~/.pi/agent/extensions/` / `prompts/` | 挂载 `/fast-parallel`、`/complex-parallel`,内置 searcher/summarizer 子代理 |
| **DeepSeek Harness** | 原生 Bundle | `cordis.patch.yml` / `dsh plugin` | 深度集成 Cordis 框架,支持 `research_parallel` 原生子代理调度与状态卡片 |
---
## 快速开始(30 秒上手)
### 环境要求
- **Node.js**:`>= 22.13.0`
- **包管理器**:`npm`(或 `pnpm`)
### 1. 全局安装与启动控制台
```bash
# 全局安装统一包
npm install -g search-boost
# 启动交互式控制台向导 (TUI)
search-boost
```
> [!TIP]
> **零 Key 即可起步**:SearchBoost 默认提供免费引擎池(Bing、DuckDuckGo、Yahoo、Exa-free、AnySearch)。无需注册付费服务即可开始检索;实际可用性与结果覆盖取决于引擎及本机网络。
### 2. 三步完成配置
1. 在默认平铺 TUI 首页选择 **首次配置向导**(文件夹模式:安装与接入 → 首次配置向导),跟随向导配置搜索引擎(可选填 API Key,或直接跳过使用免费池)。
2. 勾选需要接入的 Agent(如 Cursor、Claude Code、Pi 等),确认是否自动设置免审批权限与替换原生搜索。
3. 重启或重新载入对应的 Agent,即可在对话中直接让模型进行网络检索!
---
## 升级与迁移指南
### 1. 日常更新:npm 更新软件包,再刷新接入
以下命令适用于 v0.2.4。在该版本发布前,`@latest` 可能仍安装不支持 `refresh` / `research` 的旧版;可先按下文从 v0.2.4 源码运行。软件包更新交给 npm;TUI 不再提供自更新功能。安装、刷新与卸载统一位于 **管理 Agent 接入**(文件夹模式:安装与接入 → 管理 Agent 接入)。
```bash
npm install -g search-boost@latest --prefer-online
search-boost
# → 管理 Agent 接入 → 刷新已有接入 → 选择实际范围
# 或刷新全部已有接入:
search-boost refresh -y
# 只预览:
search-boost refresh --dry-run
```
刷新只使用当前软件包,保留凭据、权限、禁用状态及无关配置,不安装未接入的宿主。取消勾选表示本次不处理,不表示卸载。旧 `upgrade` / `--sync-only` 已移除。
Grok 本地缓存若原生更新后仍陈旧,需要完全退出 Grok,再独立确认保留数据重建和对当前源的信任。`-y` 本身不授予重建同意;显式 CLI 同意为 `search-boost refresh -y --repair-grok-cache`。这会请求宿主 `uninstall --keep-data` 后 `install --trust`,不保证旧名称数据自动迁移。成功后重启宿主。详见 [接入刷新](docs/host-upgrades.md)。
---
### 2. 从旧全局包 `search-boost-mcp` 迁移
> [!IMPORTANT]
> 如果你的全局环境中仍安装着旧包名 `search-boost-mcp`,由于 npm 不允许不同名包互相覆盖全局同名 bin 命令,**必须使用一次性 npx 命令平滑交接**。下方的刷新步骤需要 v0.2.4 或更新版本:
```bash
# 一次性旧全局包更名迁移;不代替日常更新或接入刷新
npx --yes --package=search-boost@latest -- search-boost migrate -y
# v0.2.4 及后续版本:先更新软件包,再刷新接入
npm install -g search-boost@latest --prefer-online
search-boost
# -> 管理 Agent 接入 → 刷新已有接入(或 search-boost refresh -y)
```
---
## 交互式控制台 (TUI)
直接在终端执行 `search-boost` 即可进入基于 Clack 的交互式控制面板。可在此管理宿主接入、搜索配置与凭据;软件包本身仍通过 npm 更新:
默认**平铺首页**按以下顺序直接提供全部入口:
| 首页入口 | 行为 |
| :--- | :--- |
| 首次配置向导;管理 Agent 接入;查看当前状态 | 连续首次配置;安装 / 按范围刷新 / 确认卸载;只读状态 |
| 搜索引擎配置;默认搜索层;工具开关 | 任选引擎;`free` / `api`;MCP / Pi / DSH 共用开关 |
| X 凭据;Jev 配置(实验性) | 脱敏凭据管理 |
| 原生搜索替换;输出 MCP 配置片段 | 保留权限选择;只读片段 |
| TUI 设置;退出 | 菜单布局位于显示语言之前;关闭控制台 |
「TUI 设置 → 菜单布局」可选平铺 / 文件夹。文件夹模式保留安装与接入、搜索与工具、服务与凭据、状态分类。操作完成后,平铺模式返回首页原选中项,文件夹模式返回所属分类;Esc 取消 / 返回,Ctrl+C 退出。切换布局立即返回新首页。管理操作完成后返回管理子菜单;交互式卸载和 Grok 缓存重建默认取消,部分失败不会被显示成安装成功。
布局和显示语言切换立即生效,保存于 `~/.search-boost/config/tui.json`(或 `$SEARCH_BOOST_HOME/config/tui.json`)。未保存布局(包括仅有语言的旧设置)默认平铺;未保存语言时,中文系统环境使用简体中文,其他环境使用 English。偏好同样适用于独立启动的交互式 setup/config 向导,不影响非交互 CLI 输出、搜索结果或 Agent 回复。工具名、命令、路径、MCP 配置片段与底层原始错误保持原样。dry-run 只预览布局 / 语言,不保存;设置损坏时告警且不覆盖。详见 [TUI 导航与语言设置](docs/tui.md)。
### 工具开关
进入 **工具开关**(文件夹模式:搜索与工具 → 工具开关),空格勾选,回车查看变更并确认保存。Esc 或取消确认不写入配置;允许全部关闭。未配置 Jev 时,`adaptive_search` 在状态面板中显示删除线和锁定原因,不进入可选列表。配置 Jev 后默认可用,但此前明确关闭的偏好不会被覆盖。
开关统一保存于 `~/.search-boost/config/tools.json`(或 `$SEARCH_BOOST_HOME/config/tools.json`),采用文件锁和原子写入。加载新版适配器后无需重启、重装宿主:
- **MCP**:约 300ms 内刷新工具列表并发送 `tools/list_changed`;忽略通知的客户端可能需要重连。
- **Pi**:约 300ms 内更新活跃工具,保留其他插件工具和原本被宿主排除的工具;会话结束时清理监听。
- **DSH**:保留注册但立即拒绝关闭工具的新调用;原生搜索/抓取 provider 也遵守对应开关。
每次调用都会重新检查开关,旧工具句柄也不能绕过;正在执行的请求正常完成。移除 Jev 凭据会锁定 adaptive 调用(包括分页和保存结果恢复),恢复凭据不覆盖明确关闭的偏好。这里开关的是**工具入口**,不是底层引擎权限:已开启的 adaptive 只筛选一次内部融合快照,不自动抓取页面,融合搜索的 community 模式仍可内部检索 X。Pi/DSH 的 searcher 波次还要求共享 fused_search、fetch_page 入口及 DSH 范围内工具可用:初始依赖关闭时零派发,每个子进程启动前再次检查;已启动子任务正常完成,无工具 summarizer 不受这两个依赖限制。检查不自动启用工具、不扩大权限。Slash 命令保留用于恢复配置。正在运行旧适配器代码的进程需先更新/重载一次;各宿主需使用同一 SearchBoost 配置目录。
---
## 工具箱与使用指南
安装完成后,宿主中的 Agent 会自动获得以下标准化工具。Agent 会根据用户提问自主决定调用时机。
### 工具职责与边界
| 工具名称 | 适用场景 | 职责边界(不适用的场景) |
| :--- | :--- | :--- |
| `fused_search` | 多引擎多角度并行查询、结果合并与去重排序 | 仅完成单次搜索;后续是否需要继续检索由主 Agent 判断 |
| `fetch_page` | 读取已知公开 URL 的完整正文或特定关注段落 | 不是带登录态的浏览器;仍遵守本机网络与代理策略 |
| `x_search` | 检索 X 平台的公开推文、博主资料或单篇讨论串 | 不承诺完整抓取所有回复,无法代表全平台完整舆论倾向 |
| `adaptive_search` | **实验功能**:对单个问题与必填研究方向进行单次快照筛选 | 返回选中 URL、审查摘录与价值标签;targetMet 只表示数量,不代表答案已核实 |
| `search_stats` | 查看引擎就绪状态、内存缓存命中与近期活动诊断 | 本地配置就绪不代表此时此刻外部网络一定通畅 |
| `search_layer` | 在 MCP 环境中查看或切换兼容搜索层模式 | 查看为只读;修改会持久化写入磁盘并需要用户授权 |
---
### 1. `fused_search` 多引擎融合搜索
并行向多个引擎分发查询,自动规整 URL、清洗重定向、并根据综合评分模型进行多样性截断。
**调用参数范例 (Tool Call JSON)**:
```json
{
"query": "Node.js 22 built-in WebSocket API guide",
"include_domains": ["nodejs.org", "developer.mozilla.org"],
"engine_pool": "free",
"ranking": "balanced",
"complexity": "simple",
"max_results": 5
}
```
- **`engine_pool`**:`free`(免密钥免费池)、`api`(已配置的 API 引擎)、`hybrid`(两池合并)。不可用或已关闭的引擎会跳过。省略时按兼容层映射:`free` → 免费池,`api` → hybrid。
- **`ranking`**:最终引擎权重预设:`balanced`(默认)、`research`、`fresh`。不改变查询变体、检索深度或时间过滤,也不证明来源权威性或时效性。
- **`complexity`**:`simple`(1 组查询变体)、`medium`(最多 2 组变体)、`complex`(最多 3 组深度变体)。
- **`community`**:布尔值(默认 `false`)。设为 `true` 时会将 X 社区一手开发者的讨论混入结果限额中。
---
### 2. `fetch_page` 智能网页提炼
获取搜索结果中的链接正文。优先抓取原站并清理正文;PDF 会先在本地抽取正文,抽取不到时才回退到 Jina Reader;安装了 curl 时可用于传输兼容兜底。
**调用参数范例**:
```json
{
"url": "https://nodejs.org/api/globals.html",
"focus": "AbortSignal.any"
}
```
- **`focus`(可选)**:指定关键词或关注点,抓取器将重点保留匹配的相关上下文段落。
> [!TIP]
> 如果带有 `focus` 时未提取到内容,**并不代表原网页中不存在答案**;建议去掉 `focus` 重新抓取完整页面。
- **`offset`(可选)**:长正文按有界窗口返回(默认 60000 字符)。结果中的 `totalChars` 与 `nextOffset` 说明是否还有后续内容,把 `nextOffset` 传给 `offset` 即可继续读;续读命中 24 小时缓存,不会再次请求网络。
> [!TIP]
> 二进制响应(图片、压缩包、无法解析的 PDF)会明确报错,不会当作网页正文交给模型。
---
### 3. `x_search` X (Twitter) 动态检索
专为技术追踪与一手动态设计。支持关键字检索、用户时间线(User 模式)与推文讨论串(Thread 模式)。
**调用参数范例**:
```json
{
"query": "Claude 3.7 Sonnet hybrid reasoning from:AnthropicAI",
"type": "keyword",
"max_results": 5
}
```
- **时间戳推导**:平台元数据缺失或不一致时,可根据有效的 Snowflake 推文 ID 推导 UTC 创建时间;这不核实推文内容。
- **过滤条件**:keyword 模式接受 `from:username`、`since:YYYY-MM-DD`、`until:YYYY-MM-DD` 等 X 操作符;显式日期范围可用 `from_date` / `to_date`。应用作者或日期过滤时,无法核验相应元数据的候选会被省略。
---
### 4. `adaptive_search` Jev 意图导向搜索(实验功能)
**Vercel 接入**:在 TUI → Jev 配置(文件夹模式:服务与凭据 → Jev 配置)填写 `https://ai-gateway.vercel.sh/v1` 和 Vercel AI Gateway Key。系统自动选择官方 SDK 的 `typesafe-ai/jev` 评估接口;不要使用聊天补全端点。默认 TypeSafe `/systemone` 保持兼容。两条路径都只使用用户级配置中的 Jev Key,不读取环境变量;服务端限流等待不会被缩短。
调用方提供**一个问题**(`questions` 恰好一项)、**必填的研究方向 `intent`** 以及 0-8 条可选软偏好 `preferences`。工具描述要求用英文书写,但这是给调用方的提示,服务端不做语言校验、拒绝或翻译,任何语言都按原文检索。原文问题就是唯一查询:不再规划关键词、不做查询扩展。检索前的一次 Jev 策略请求选择固定 `balanced`/`research`/`fresh` 排序,并在省略 `community` 时决定是否启用既有社区(X)支路;显式 `community` true/false 覆盖该选择,且不重复提问。随后这次 fused 调用收集**有界快照:目标≤10 时最多 32 条,更大目标为 ceil(max_results×32/10),最高 160 条**(网页与社区行共用),每条声明候选都以固定选项判断:安全 clear/violation/unavailable、原型价值 0-5、来自真实正贡献引擎的来源折扣,以及每条偏好一次匹配。只有安全且价值已建立为 3/4/5 的材料会被交付,并按版本化筛选公式排序;置信度仅用于审计。不会在凑够前若干条可接受链接后提前停止,没有自动补读,也没有自设的累计成本、token、请求次数或整次时限停止——真实单请求超时、有限重试、认证/限流失败、安全拒绝与显式取消照常生效。
```json
{
"questions": ["ExampleDB 从 4.1 升级到 4.2 有哪些兼容风险?"],
"intent": "寻找实际迁移步骤、具体不兼容案例及反证,不需要营销介绍。",
"preferences": ["官方迁移指南"],
"max_results": 8,
"page_size": 3
}
```
- `intent` 为必填(不再由问题自动填补),`preferences` 是独立软加分并按键精确去重后取平均。
- `constraints` 已退役为逐材料硬门槛:省略或传 `[]`(返回 `deprecated_constraints_empty` 告警);非空数组在任何网络调用前以 `adaptive_constraints_removed` 拒绝。请把完整研究方向与条件写进 questions/intent;硬域名限制用 `site:`/`-site:` 或 fused_search 的 `include_domains`/`exclude_domains`,必须满足的文档属性由主 Agent 阅读核验。
- 多问题列表、`tasks/targets/facts/time_range`、`keywords` 与二维关键词都按旧字段拒绝;独立问题请分次调用。
- `max_results` 限制本次选中并保存的数量(默认 10,最大 50);`page_size` 只影响每页(默认 20,最大 50),不重排、不重新筛选。
- 返回选中材料的 URL、标题、审查摘录、`valueLevel`/`valueLabel`、rank、真实来源与分数组件,不生成答案。`selection.targetMet` 只表示数量,绝不代表研究完成或已核实;`selection.incomplete`、`diagnostics`、`stopReason`、`outsideReview`、`unreviewed` 如实披露未完成部分,而不是当作低价值。
- `run.community` 返回有限的社区决策与实际执行状态(`not_requested`/`domain_excluded`/`unavailable`/`blocked`/`succeeded`/`empty`/`failed`/`partial`/`not_run`),不输出模型推理;社区支路失败或部分失败时仍交付有效网页结果,并把本次标记为 incomplete。
- 用 `{"cursor":""}`(可附 `page_size`)读取已保存页:不发起新的检索、策略、Jev、社区或价值判断。每页默认 20、最大 50,并有字节预算;cursor 在当前进程内最多保留 30 分钟/32 份结果,翻页结束不等于穷尽检索。
- 显式 `save_results:true` 时,完整的最终选中集与类型化元数据会私有保存到 SearchBoost home(`search-boost-research-v2`,schema version 5),并返回 `savedResultId`。重启或清缓存后用 `{"saved_result_id":""}`(可附 `page_size`)读取,不再重新检索或询问 Jev。旧的 `search-boost-research-v1` 文件继续可读,进入带标记的只读 `h1:` 历史分支(`restoration.historical: true`,保留原 schema 版本,不伪造 v5 字段)。公开工具开关与 Jev 配置锁同样作用于读取;`search-boost research list` / `research export --output ` 无需 Jev、可离线使用。参见[接入与验收边界](docs/research-status-acceptance.md)。
- 阈值仍是未标定工程起点。完整契约、预算和迁移说明见 [Jev 单问题研究检索](docs/jev-adaptive-search.md)。
---
### 引擎池与评分预设
`engine_pool` 选择调用集合,`ranking` 选择跨池共享权重;`complexity` 控制查询广度与深度,不改变评分权重。AnySearch 是单一逻辑引擎:free 匿名、api 要求 key、hybrid 优先用已配置 key。使用 `ANYSEARCH_API_KEY` 或 `config keys --set anysearch=KEY` 配置。
| 引擎 | balanced | research | fresh |
| --- | ---: | ---: | ---: |
| bing | 0.957 | 0.927 | 1.020 |
| ddg | 0.981 | 0.903 | 0.927 |
| yahoo | 0.957 | 0.877 | 0.902 |
| exa-free | 1.004 | 1.085 | 0.951 |
| tavily | 1.049 | 1.105 | 1.084 |
| brave | 1.004 | 0.951 | 1.125 |
| exa | 1.049 | 1.146 | 1.063 |
| anysearch | 1.004 | 1.042 | 0.951 |
权重是未经实测标注校准的冷启动先验。`consensus-v2.1` 使用原始排名、相关来源组折扣和 max+log 共识,元数据修正最多 20%;质量分与列表选择分分离。零权重不投票,旧 `min_score` 阈值需重新校准。详见 [评分设计与迁移](docs/fusion-scoring.md) 和 [引擎池](docs/search-routing.md)。
---
## 多智能体并行研究工作流
同一套工作流,三种宿主接入方式。主 Agent 先把问题拆成互不依赖的调研线;每条线由一名 Searcher 子代理用 `fused_search` 与 `fetch_page` 收集证据,再由无工具的 Summarizer(或主 Agent 自己)收敛成一份答案。
```text
[ 主 Agent (Parent) ]
拆分调研线 · 持有最终结论
│
┌───────────────┴───────────────┐
▼ ▼
[ Searcher A ] [ Searcher B ]
fused_search · fetch_page fused_search · fetch_page
│ │
└───────────────┬───────────────┘
▼
[ Summarizer ]
无工具 · 只做证据综合
▼
[ 主 Agent 报告 ]
```
| 宿主 | 入口 | 子代理如何运行 |
| :--- | :--- | :--- |
| **Pi** | `/fast-parallel`、`/complex-parallel` 提示词;`search-parallel-subagent` 工具;`searcher` / `summarizer` 角色 | 每个 Searcher 是独立子进程,显式加载 SearchBoost Pi 扩展(`adapters/pi/index.js`),工具白名单只有 `fused_search` 与 `fetch_page`;Summarizer 以 `--no-tools` 启动。波次规模由调用方决定,该 runner 不设并发上限。 |
| **DeepSeek Harness** | 原生 `research_parallel` 工具 | 子代理经宿主 subagent 服务在同一 Cordis 上下文中创建。Searcher 获得 `toolFilter.allow = ['fused_search','fetch_page']`,Summarizer 为空白名单。发起波次前 `research_parallel` 会确认两个工具已注册,否则拒绝派发;句柄在成功或失败后都会释放,`maxDepth` 为 1,子代理不能再次嵌套调研。 |
| **MCP 宿主**(Cursor、Claude Code、Codex、Grok、Antigravity) | 随包安装的 `search-boost-parallel-research` Skill | Skill 内嵌同一套角色与流程,用宿主自身的子代理机制执行;宿主无法派生子代理时,退回主 Agent 串行调研。 |
安装到 MCP 宿主时还会同时安装配套的 **`search-boost`** 路由 Skill,用于可选工作流。普通工具选择直接依据已注册的描述与 schema,不需要先加载 Skill。
- **Fast 模式**:只跑一波 Searcher,随后由主 Agent 收敛,不启动 Summarizer,也不补第二波。
- **Complex 模式**:1~3 波,波次之间做证据缺口复核;只有存在实质性缺口时才追加下一波,证据足够就提前停止。需注意:波次上限是提示词层面的工作流约束,不是跨独立工具调用的全局配额。
- **派生能力缺失**:允许联网且用户不严格要求并行时,可由主 Agent 串行调研并披露该选择。权限拒绝或运行时失败应报告阻塞,不授权静默换机制。
> [!IMPORTANT]
> 子代理返回 `ok` 只代表执行完成且文本非空,**不代表结论已被证实**。失败或部分完成的报告仍会保留可见,但其 URL 不计入成功聚合;最终判断始终由主 Agent 负责。
Pi/DSH 子代理工具加载、旧 `pi-search-boost` 路径与已移除的 `deep_research` 排查,见[子代理工具配置与诊断](docs/subagent-tools.md)。
---
## 安全
### 自定义搜索 API 地址
TUI 默认首页进入 **搜索引擎配置**(文件夹模式:服务与凭据),每个引擎同时显示密钥掩码、当前 Base URL 和 default/custom 标记。选择 **Set / replace Base URL** 修改地址后,可继续保留或修改密钥;**Restore default Base URL** 只恢复地址。可任选单个引擎,无须依次经过所有凭据项;保留其他引擎的密钥与路由选择。状态页和 `config keys --show` 也会显示生效地址。独立 CLI `search-boost config keys` 和首次配置仍保留逐项引导。
```bash
search-boost config keys --base-url exa=https://gateway.example/exa
search-boost config keys --reset-base-url exa
```
| 引擎 | 默认 Base URL | 自动追加路径 |
|---|---|---|
| Tavily | `https://api.tavily.com` | `/search` |
| Exa | `https://api.exa.ai` | `/search` |
| Brave | `https://api.search.brave.com/res/v1` | `/web/search` |
| AnySearch | `https://api.anysearch.com/v1` | `/search` |
填写 API 基础地址,**不要填写完整搜索端点**;网关路径前缀会保留。地址存放在 keys 文件的 `engines..baseUrl`,兼容现有密钥字符串和路由开关。请仅使用可信、兼容对应引擎 API 的网关:搜索词与已配置密钥会发送到该地址(AnySearch 在 free 池仍不发送密钥)。推荐 HTTPS,也支持本地网关的 HTTP;拒绝包含用户名密码、查询参数或片段的地址。不影响 Exa-free;地址变更后不会复用旧地址的搜索缓存。
API Key 存放在由 SearchBoost 自己管理的凭据文件中,不写入提示词、工具结果或 shell 配置:
- **文件权限**:密钥存放在 `~/.search-boost/config/keys.json`(可用 `SEARCH_BOOST_HOME` 重定向根目录)。在 POSIX 系统上目录为 `0700`、文件为 `0600`;覆盖写入时先生成全新的 `0600` 临时文件再改名替换,已存在的文件不会被放宽权限。同一根目录下的备份与升级状态同样为 `0600`。环境变量指定的自定义目录会保留其原有权限,但凭据文件仍以 `0600` 创建。Windows 没有 POSIX 权限位,由 ACL 继承决定。
- **原子写入与加锁**:写入使用 `O_EXCL` 临时文件加改名替换,读取方只会看到旧文件或新文件,不会读到写了一半的内容;写入失败会自行清理临时文件并保留原文件。读改写流程持有独占锁,两个写入者不会静默互相覆盖,被拒绝的修改也不会触碰原文件。
- **不回显**:API Key 只在调用所属引擎时随请求发送(Tavily、Brave、Exa 的请求参数或请求头)。状态输出、`search-boost config keys --show` 与 doctor 报告只显示掩码(`abcd****wxyz`);错误信息经过测试不会包含凭据内容,Jev 评测请求中也不含 Key、掩码 Key 或指纹。AnySearch 已参与引擎路由:free 使用匿名额度,api 要求 key,hybrid 优先使用已配置 key;同次融合只计一票。
---
## CLI 命令参考(自动化与进阶)
以下 CLI 参考对应 v0.2.4;`refresh` 与 `research` 需要该版本或更新版本。源码合并不等于 npm 发布,在所需版本发布前请从源码运行。
**DeepSeek Harness Desktop**:交互安装选中 DSH 后,可选择 Desktop / CLI / All,再为 Desktop 选择 **自动安装(默认)** 或 **本地目录接入**。自动方式通过注册表(含自定义安装目录)、默认目录及 PATH 找到桌面版内置命令;先启动一次再完全退出(包括托盘)。本地方式在其他接入(包括 Grok)结束后,最后显示当前包的完整持久目录,由用户粘贴到运行中的 Desktop「插件 → 添加插件」;TUI 等待只读检测,稳定完成后结束,Esc / Ctrl+C 或超时则报告未完成并保留其他结果。检测到保存的安装不代表运行中的插件已加载;没有内置启动器时会明确提示运行时未验证。临时 `_npx` 缓存不能作为本地链接来源。也可直接在应用输入 `search-boost` 从 npm 安装。自动安装/更新仍验证宿主解析器,遮蔽副本不能报成功;禁用状态保留,`--enable-dsh-bundle` 明确要求启用(本地方式由用户在 Desktop 启用)。所有权与验证限制见 [Desktop 接入说明](docs/dsh-desktop.md)。
```bash
# ----------------- 启动与基础 -----------------
search-boost # 打开交互式控制面板 (TUI)
search-boost status # 只读磁盘/配置证据;运行中宿主版本仍未知
search-boost status --json # 结构化安装证据
search-boost research list # 列出显式保存的私有研究结果
search-boost research export --output # 显式导出,不覆盖
search-boost --help # 查看完整命令行帮助文档
search-boost refresh --dry-run # 预览已有接入刷新
search-boost refresh -y # 使用当前包刷新全部已有接入
search-boost migrate --dry-run # 预览旧全局包更名迁移
# ----------------- 非交互式安装 -----------------
search-boost install -t cursor -y # 为 Cursor 安装并自动同意权限
search-boost install -t claude,codex --keep-native # 安装并保留宿主原生搜索
search-boost install -t antigravity --workspace /path/to/project # 为指定工作区配置
search-boost install -t antigravity -y --antigravity-config legacy # 显式兼容旧宿主;modern 切回现代路径
search-boost install -t pi -y # 为 Pi 挂载原生扩展及提示词
search-boost install -t dsh --profile web # 为 DeepSeek Harness CLI 接入 web profile
search-boost install -t dsh --dsh-surface desktop -y # Desktop 原生命令 + 本地包接入
search-boost install -t dsh --dsh-surface all -y # Desktop 与 CLI 分别安装
# 无需全局安装 search-boost / dsh / pnpm(Windows、Linux、macOS):
npx --yes search-boost@latest install -t dsh --profile web -y
search-boost install -t cursor --dry-run # 仅演练安装过程,不写磁盘
# ----------------- 凭据与配置管理 -----------------
search-boost config keys # 命令行配置/查看搜索引擎 Keys
search-boost config keys --set anysearch=KEY # 配置 AnySearch 密钥(ANYSEARCH_API_KEY)
search-boost config layer # 切换默认搜索层 (free / api)
search-boost config x --import-grok # 从本机 Grok 客户端快速导入 X 凭据
search-boost config jev # 配置 Jev 认知引擎端点与 Token
# ----------------- 健康检查与诊断 -----------------
search-boost doctor # 离线健康检查
search-boost doctor --strict # 严格模式(有警告即返回非零退出码)
search-boost doctor --json # 输出 JSON 格式诊断报告
# ----------------- 卸载与清理 -----------------
search-boost uninstall -t cursor,claude -y # 移除指定宿主的集成与注册
```
---
## 源码安装与本地开发
适用于参与开发,或提前验证尚未进入 npm 正式发布的代码;文档其他位置的 `@latest` 命令指向 npm 已发布版本。
### 环境准备
- **Node.js** `>= 22.13.0`(与 `package.json` 声明一致)
- **git** 与 **npm**
- 可选:**`curl`**,用于 `fetch_page` 的同线路传输兼容兜底
- 可选:**`pdfjs-dist`**(optionalDependency),在本地把 PDF 抽取为正文;未安装时 PDF 读取回退到 Jina Reader
### 检出并初始化
```bash
# 1. 克隆仓库
git clone https://github.com/Mr-remon219/search-boost.git
cd search-boost
# 2. 按 CI 的方式安装依赖
npm ci
# 3. 重新生成随包 Grok 插件资产
npm run plugin:sync-grok
```
克隆后位于仓库的默认分支。若要验证其他分支或标签,请在安装依赖前先检出(`git checkout BRANCH_OR_TAG`)。
### 不装全局包直接运行
```bash
node cli.mjs # 直接从检出目录启动交互式控制台 (TUI)
node cli.mjs status # 查看当前状态摘要
node cli.mjs install -t pi -y # 从当前检出目录挂载 Pi 扩展
node cli.mjs install -t dsh --profile web
```
`node cli.mjs` 接受与全局安装后的 `search-boost` 完全相同的命令。若希望终端里直接使用 `search-boost`,用软链代替全局安装:
```bash
npm link # 或:npm install -g .
search-boost
```
修改适配器或 Agent 资产后,重新执行该宿主对应的安装命令(`node cli.mjs install -t HOST`)让宿主加载新文件,然后重启或重载该宿主。
### 提交 PR 前的验证门禁
| 命令 | 覆盖范围 |
| :--- | :--- |
| `npm run check` | CLI、核心层、适配器与脚本的语法检查 |
| `npm run prepublishOnly` | 语法与 CI 策略检查、精确依赖锁审计(需要 registry 联网),再运行全部隔离回归入口,含生成资产、安装 / 刷新 / 迁移、搜索、适配器与 MCP |
| `npm run test:network` | 代理重试、curl 兜底、请求边界与兼容性回归 |
| `npm run test:adapters` | MCP / Pi / DSH 适配器协议测试,以及 Pi 子代理配置迁移诊断 |
| `npm run test:parallel` | Searcher/Summarizer 契约、DSH 派发预检、取消与工具隔离 |
| `npm run test:adaptive` | 单次快照 V5 筛选、候选容量边界及 MCP / Pi / DSH 适配器夹具(非真实宿主会话) |
| `npm run smoke` | MCP JSON-RPC 协议冒烟测试 |
回归套件使用隔离状态、本地回环夹具与进程替身,不需要真实引擎 Key;依赖审计需要访问 registry。`npm run prepublishOnly` 全绿是本地 PR 门禁,不证明真实宿主加载、付费服务行为或证据质量。
---
## 友情链接
- [LINUX DO](https://linux.do/)
---
## 开源协议
本项目基于 [MIT License](./LICENSE) 协议开源。