@konbakuyomu/smart-search-linux-x64 0.1.25 → 0.1.26

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 (38) hide show
  1. package/package.json +1 -1
  2. package/runtime/smart-search/_internal/base_library.zip +0 -0
  3. package/runtime/smart-search/_internal/smart_search/activity.py +1 -1
  4. package/runtime/smart-search/_internal/smart_search/assets/i18n/messages.json +183 -19
  5. package/runtime/smart-search/_internal/smart_search/assets/skills/smart-search-cli/SKILL.md +6 -6
  6. package/runtime/smart-search/_internal/smart_search/assets/skills/smart-search-cli/references/cli-core.md +5 -5
  7. package/runtime/smart-search/_internal/smart_search/assets/skills/smart-search-cli/references/command-patterns.md +12 -22
  8. package/runtime/smart-search/_internal/smart_search/assets/skills/smart-search-cli/references/deep-research-mode.md +8 -8
  9. package/runtime/smart-search/_internal/smart_search/assets/skills/smart-search-cli/references/provider-routing.md +33 -62
  10. package/runtime/smart-search/_internal/smart_search/assets/skills/smart-search-cli/references/setup-config.md +21 -13
  11. package/runtime/smart-search/_internal/smart_search/assets/ui/index.html +41 -15
  12. package/runtime/smart-search/_internal/smart_search/cli.py +118 -401
  13. package/runtime/smart-search/_internal/smart_search/config.py +34 -69
  14. package/runtime/smart-search/_internal/smart_search/desktop_catalog.py +13 -13
  15. package/runtime/smart-search/_internal/smart_search/desktop_worker.py +2 -1
  16. package/runtime/smart-search/_internal/smart_search/intent_router.py +6 -550
  17. package/runtime/smart-search/_internal/smart_search/jev.py +37 -5
  18. package/runtime/smart-search/_internal/smart_search/jev_search.py +336 -192
  19. package/runtime/smart-search/_internal/smart_search/provider_descriptions.py +140 -0
  20. package/runtime/smart-search/_internal/smart_search/providers/context7.py +8 -1
  21. package/runtime/smart-search/_internal/smart_search/providers/openai_compatible.py +19 -2
  22. package/runtime/smart-search/_internal/smart_search/providers/xai_responses.py +30 -4
  23. package/runtime/smart-search/_internal/smart_search/service.py +241 -2030
  24. package/runtime/smart-search/_internal/smart_search/ui_metadata.py +61 -80
  25. package/runtime/smart-search/_internal/{smart_search-0.1.25.dist-info → smart_search-0.1.26.dist-info}/METADATA +2 -1
  26. package/runtime/smart-search/_internal/{smart_search-0.1.25.dist-info → smart_search-0.1.26.dist-info}/RECORD +32 -32
  27. package/runtime/smart-search/_internal/wcwidth/_wcwidth_c.abi3.so +0 -0
  28. package/runtime/smart-search/_internal/wcwidth/_wcwidth_c.pyi +77 -0
  29. package/runtime/smart-search/package.json +7 -7
  30. package/runtime/smart-search/smart-search +0 -0
  31. package/runtime/smart-search/_internal/smart_search/embedding_presets.py +0 -40
  32. /package/runtime/smart-search/_internal/{smart_search-0.1.25.dist-info → smart_search-0.1.26.dist-info}/INSTALLER +0 -0
  33. /package/runtime/smart-search/_internal/{smart_search-0.1.25.dist-info → smart_search-0.1.26.dist-info}/REQUESTED +0 -0
  34. /package/runtime/smart-search/_internal/{smart_search-0.1.25.dist-info → smart_search-0.1.26.dist-info}/WHEEL +0 -0
  35. /package/runtime/smart-search/_internal/{smart_search-0.1.25.dist-info → smart_search-0.1.26.dist-info}/direct_url.json +0 -0
  36. /package/runtime/smart-search/_internal/{smart_search-0.1.25.dist-info → smart_search-0.1.26.dist-info}/entry_points.txt +0 -0
  37. /package/runtime/smart-search/_internal/{smart_search-0.1.25.dist-info → smart_search-0.1.26.dist-info}/licenses/LICENSE +0 -0
  38. /package/runtime/smart-search/_internal/{smart_search-0.1.25.dist-info → smart_search-0.1.26.dist-info}/top_level.txt +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@konbakuyomu/smart-search-linux-x64",
3
- "version": "0.1.25",
3
+ "version": "0.1.26",
4
4
  "description": "Self-contained Smart Search CLI for linux/x64",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -230,7 +230,7 @@ class Invocation:
230
230
  return
231
231
  self._finished = True
232
232
  self._stop.set()
233
- status = status or ("finished" if exit_code == 0 else "failed")
233
+ status = status or ("cancelled" if self._error_type == "cancelled" else "finished" if exit_code == 0 else "failed")
234
234
  if self._enabled:
235
235
  self._try(self.store.finish, self.run_id, exit_code, status, error_type=self._error_type,
236
236
  sources_count=self._sources_count)
@@ -3243,9 +3243,9 @@
3243
3243
  "号池地址填服务商给你的域名或 URL,例如 https://pool.example.com 或 https://pool.example.com/mcp;setup 会保存为 https://pool.example.com/api/tavily。\n",
3244
3244
  "For pooled endpoints, paste the provider domain or URL, for example https://pool.example.com or https://pool.example.com/mcp; setup saves it as https://pool.example.com/api/tavily.\n"
3245
3245
  ],
3246
- "Force stream=false for OpenAI-compatible main search.": [
3247
- "强制 OpenAI 兼容主搜索使用 stream=false。",
3248
- "Force stream=false for OpenAI-compatible main search."
3246
+ "Force stream=false for xAI Responses or OpenAI-compatible main search.": [
3247
+ "强制 xAI Responses 或 OpenAI 兼容主搜索使用 stream=false。",
3248
+ "Force stream=false for xAI Responses or OpenAI-compatible main search."
3249
3249
  ],
3250
3250
  "Full page URL, including http:// or https://.": [
3251
3251
  "完整网页地址,需带 http:// 或 https://。",
@@ -7435,6 +7435,10 @@
7435
7435
  "最高项",
7436
7436
  "Top"
7437
7437
  ],
7438
+ "Total fetch budget in seconds; overrides SMART_SEARCH_TIMEOUT_SECONDS.": [
7439
+ "抓取总时间预算,单位秒;覆盖 SMART_SEARCH_TIMEOUT_SECONDS。",
7440
+ "Total fetch budget in seconds; overrides SMART_SEARCH_TIMEOUT_SECONDS."
7441
+ ],
7438
7442
  "Total search budget in seconds; overrides SMART_SEARCH_TIMEOUT_SECONDS.": [
7439
7443
  "搜索总时间预算,单位秒;覆盖 SMART_SEARCH_TIMEOUT_SECONDS。",
7440
7444
  "Total search budget in seconds; overrides SMART_SEARCH_TIMEOUT_SECONDS."
@@ -7659,9 +7663,9 @@
7659
7663
  "使用内置后端",
7660
7664
  "Use bundled backend"
7661
7665
  ],
7662
- "Use stream=true for OpenAI-compatible main search.": [
7663
- "为 OpenAI 兼容主搜索使用 stream=true。",
7664
- "Use stream=true for OpenAI-compatible main search."
7666
+ "Use stream=true for xAI Responses or OpenAI-compatible main search.": [
7667
+ "为 xAI Responses 或 OpenAI 兼容主搜索使用 stream=true。",
7668
+ "Use stream=true for xAI Responses or OpenAI-compatible main search."
7665
7669
  ],
7666
7670
  "Use the Smart Search skill to run the following command and report the actual version. Do not only inspect files, and do not search the web yet:\n": [
7667
7671
  "请使用 Smart Search 技能,先运行以下命令并告诉我实际版本,不要仅检查文件,也先不要发起联网搜索:\n",
@@ -8579,13 +8583,13 @@
8579
8583
  "source_types 的值必须为 {0} 之一",
8580
8584
  "source_types values must be one of {0}"
8581
8585
  ],
8582
- "standard refuses to run when any of the three required capabilities is missing.": [
8583
- "standard 会在三类必需能力缺一时直接报错。关掉之后出问题更难查。",
8584
- "standard refuses to run when any of the three required capabilities is missing."
8586
+ "standard requires at least one configured and enabled retrieval channel; Jev is optional.": [
8587
+ "standard 要求至少一个已配置并启用的检索渠道;Jev 可选。",
8588
+ "standard requires at least one configured and enabled retrieval channel; Jev is optional."
8585
8589
  ],
8586
- "standard 会在三类必需能力缺一时直接报错。关掉之后出问题更难查。": [
8587
- "standard 会在三类必需能力缺一时直接报错。关掉之后出问题更难查。",
8588
- "standard refuses to run when any of the three required capabilities is missing."
8590
+ "standard 要求至少一个已配置并启用的检索渠道;Jev 可选。": [
8591
+ "standard 要求至少一个已配置并启用的检索渠道;Jev 可选。",
8592
+ "standard requires at least one configured and enabled retrieval channel; Jev is optional."
8589
8593
  ],
8590
8594
  "strict checks harder and runs slower.": [
8591
8595
  "strict 查得更严也更慢。",
@@ -8683,6 +8687,22 @@
8683
8687
  "xAI 联网工具",
8684
8688
  "xAI Responses tools"
8685
8689
  ],
8690
+ "xAI reasoning effort": [
8691
+ "xAI 推理强度",
8692
+ "xAI reasoning effort"
8693
+ ],
8694
+ "xAI 推理强度": [
8695
+ "xAI 推理强度",
8696
+ "xAI reasoning effort"
8697
+ ],
8698
+ "Optional; when set, sends reasoning.effort in xAI Responses requests; omitted by default.": [
8699
+ "可选;设置后在 xAI Responses 请求中发送 reasoning.effort,默认不发送。",
8700
+ "Optional; when set, sends reasoning.effort in xAI Responses requests; omitted by default."
8701
+ ],
8702
+ "可选;设置后在 xAI Responses 请求中发送 reasoning.effort,默认不发送。": [
8703
+ "可选;设置后在 xAI Responses 请求中发送 reasoning.effort,默认不发送。",
8704
+ "Optional; when set, sends reasoning.effort in xAI Responses requests; omitted by default."
8705
+ ],
8686
8706
  "xAI Responses 模型": [
8687
8707
  "xAI Responses 模型",
8688
8708
  "xAI Responses model"
@@ -9179,9 +9199,9 @@
9179
9199
  "中文",
9180
9200
  "中文"
9181
9201
  ],
9182
- "为 OpenAI 兼容主搜索使用 stream=true。": [
9183
- "为 OpenAI 兼容主搜索使用 stream=true。",
9184
- "Use stream=true for OpenAI-compatible main search."
9202
+ "为 xAI Responses 或 OpenAI 兼容主搜索使用 stream=true。": [
9203
+ "为 xAI Responses 或 OpenAI 兼容主搜索使用 stream=true。",
9204
+ "Use stream=true for xAI Responses or OpenAI-compatible main search."
9185
9205
  ],
9186
9206
  "主搜索": [
9187
9207
  "主搜索",
@@ -11099,9 +11119,9 @@
11099
11119
  "引擎:`{0}`",
11100
11120
  "Engines: `{0}`"
11101
11121
  ],
11102
- "强制 OpenAI 兼容主搜索使用 stream=false。": [
11103
- "强制 OpenAI 兼容主搜索使用 stream=false。",
11104
- "Force stream=false for OpenAI-compatible main search."
11122
+ "强制 xAI Responses 或 OpenAI 兼容主搜索使用 stream=false。": [
11123
+ "强制 xAI Responses 或 OpenAI 兼容主搜索使用 stream=false。",
11124
+ "Force stream=false for xAI Responses or OpenAI-compatible main search."
11105
11125
  ],
11106
11126
  "归档包含特殊设备文件。": [
11107
11127
  "归档包含特殊设备文件。",
@@ -13597,7 +13617,7 @@
13597
13617
  ],
13598
13618
  "结果数量": [
13599
13619
  "结果数量",
13600
- "Number of results"
13620
+ "Result count"
13601
13621
  ],
13602
13622
  "结果核验的严格程度,越严越慢。": [
13603
13623
  "结果核验的严格程度,越严越慢。",
@@ -17690,5 +17710,149 @@
17690
17710
  "错误详情": [
17691
17711
  "错误详情",
17692
17712
  "Error details"
17713
+ ],
17714
+ "Configure at least one enabled retrieval channel.": [
17715
+ "至少配置一个已启用的检索渠道。",
17716
+ "Configure at least one enabled retrieval channel."
17717
+ ],
17718
+ "Embedding/classifier routing is retired. Use route for a local preview or route --remote for Jev diagnostics.": [
17719
+ "旧向量/分类路由已退役。使用 route 本地预览,或显式 route --remote 检查 Jev。",
17720
+ "Embedding/classifier routing is retired. Use route for a local preview or route --remote for Jev diagnostics."
17721
+ ],
17722
+ "Legacy embedding calibration is retired and calls no model.": [
17723
+ "旧向量路由校准已退役,不调用模型。",
17724
+ "Legacy embedding calibration is retired and calls no model."
17725
+ ],
17726
+ "Local routing": [
17727
+ "本地路由",
17728
+ "Local routing"
17729
+ ],
17730
+ "Result count": [
17731
+ "结果数量",
17732
+ "Result count"
17733
+ ],
17734
+ "Results requested from the selected channel in this round; does not add channels.": [
17735
+ "本轮向选中渠道请求的结果条数,不增加检索渠道。",
17736
+ "Results requested from the selected channel in this round; does not add channels."
17737
+ ],
17738
+ "Retired compatibility command; no remote calibration is performed.": [
17739
+ "已退役的兼容命令;不执行远程校准。",
17740
+ "Retired compatibility command; no remote calibration is performed."
17741
+ ],
17742
+ "Retrieve from one suitable channel and return results with sources. Ordinary search runs one round.": [
17743
+ "选择一个合适渠道检索,返回结果和来源;普通搜索只运行一轮。",
17744
+ "Retrieve from one suitable channel and return results with sources. Ordinary search runs one round."
17745
+ ],
17746
+ "Run single-pass retrieval through one selected channel.": [
17747
+ "通过一个选中的渠道执行单轮检索。",
17748
+ "Run single-pass retrieval through one selected channel."
17749
+ ],
17750
+ "Search can use a retrieval channel without a main model.": [
17751
+ "搜索可直接使用检索渠道,无需主模型。",
17752
+ "Search can use a retrieval channel without a main model."
17753
+ ],
17754
+ "Search selects once; research follows evidence gaps. Without Jev, routing stays local.": [
17755
+ "普通搜索只选路一次;深入搜索按证据缺口继续。未配置 Jev 时使用本地路由。",
17756
+ "Search selects once; research follows evidence gaps. Without Jev, routing stays local."
17757
+ ],
17758
+ "Source requirement": [
17759
+ "来源要求",
17760
+ "Source requirement"
17761
+ ],
17762
+ "Strict requires source evidence; ordinary search does not add follow-up or sufficiency judgments.": [
17763
+ "strict 要求来源证据;普通搜索不会因此自动补搜或判断充分性。",
17764
+ "Strict requires source evidence; ordinary search does not add follow-up or sufficiency judgments."
17765
+ ],
17766
+ "Using local routing; no Jev probe was sent.": [
17767
+ "使用本地路由,未发送 Jev 探测请求。",
17768
+ "Using local routing; no Jev probe was sent."
17769
+ ],
17770
+ "strict 要求来源证据;普通搜索不会因此自动补搜或判断充分性。": [
17771
+ "strict 要求来源证据;普通搜索不会因此自动补搜或判断充分性。",
17772
+ "Strict requires source evidence; ordinary search does not add follow-up or sufficiency judgments."
17773
+ ],
17774
+ "使用本地路由,未发送 Jev 探测请求。": [
17775
+ "使用本地路由,未发送 Jev 探测请求。",
17776
+ "Using local routing; no Jev probe was sent."
17777
+ ],
17778
+ "已退役的兼容命令;不执行远程校准。": [
17779
+ "已退役的兼容命令;不执行远程校准。",
17780
+ "Retired compatibility command; no remote calibration is performed."
17781
+ ],
17782
+ "搜索可直接使用检索渠道,无需主模型。": [
17783
+ "搜索可直接使用检索渠道,无需主模型。",
17784
+ "Search can use a retrieval channel without a main model."
17785
+ ],
17786
+ "旧向量/分类路由已退役。使用 route 本地预览,或显式 route --remote 检查 Jev。": [
17787
+ "旧向量/分类路由已退役。使用 route 本地预览,或显式 route --remote 检查 Jev。",
17788
+ "Embedding/classifier routing is retired. Use route for a local preview or route --remote for Jev diagnostics."
17789
+ ],
17790
+ "旧向量路由校准已退役,不调用模型。": [
17791
+ "旧向量路由校准已退役,不调用模型。",
17792
+ "Legacy embedding calibration is retired and calls no model."
17793
+ ],
17794
+ "普通搜索只选路一次;深入搜索按证据缺口继续。未配置 Jev 时使用本地路由。": [
17795
+ "普通搜索只选路一次;深入搜索按证据缺口继续。未配置 Jev 时使用本地路由。",
17796
+ "Search selects once; research follows evidence gaps. Without Jev, routing stays local."
17797
+ ],
17798
+ "本地路由": [
17799
+ "本地路由",
17800
+ "Local routing"
17801
+ ],
17802
+ "本轮向选中渠道请求的结果条数,不增加检索渠道。": [
17803
+ "本轮向选中渠道请求的结果条数,不增加检索渠道。",
17804
+ "Results requested from the selected channel in this round; does not add channels."
17805
+ ],
17806
+ "来源要求": [
17807
+ "来源要求",
17808
+ "Source requirement"
17809
+ ],
17810
+ "至少配置一个已启用的检索渠道。": [
17811
+ "至少配置一个已启用的检索渠道。",
17812
+ "Configure at least one enabled retrieval channel."
17813
+ ],
17814
+ "选择一个合适渠道检索,返回结果和来源;普通搜索只运行一轮。": [
17815
+ "选择一个合适渠道检索,返回结果和来源;普通搜索只运行一轮。",
17816
+ "Retrieve from one suitable channel and return results with sources. Ordinary search runs one round."
17817
+ ],
17818
+ "通过一个选中的渠道执行单轮检索。": [
17819
+ "通过一个选中的渠道执行单轮检索。",
17820
+ "Run single-pass retrieval through one selected channel."
17821
+ ],
17822
+ "研究预算上限;达到目标后会提前停止。": [
17823
+ "研究预算上限;达到目标后会提前停止。",
17824
+ "Research budget ceiling; stops early when the goal is reached."
17825
+ ],
17826
+ "离线计划的建议深度,不执行检索或消耗请求额度。": [
17827
+ "离线计划的建议深度,不执行检索或消耗请求额度。",
17828
+ "Suggested depth for the offline plan; it runs no retrieval and uses no request quota."
17829
+ ],
17830
+ "auto 允许故障兜底和后续检索;off 关闭这些行为,但保留已发现来源的必要正文读取。": [
17831
+ "auto 允许故障兜底和后续检索;off 关闭这些行为,但保留已发现来源的必要正文读取。",
17832
+ "auto allows failure fallback and follow-up searches; off disables both but permits necessary reading of discovered sources."
17833
+ ],
17834
+ "Invalid {0}: expected chat-completions or responses.": [
17835
+ "无效的 {0}:应为 chat-completions 或 responses。",
17836
+ "Invalid {0}: expected chat-completions or responses."
17837
+ ],
17838
+ "Invalid {0}: expected an HTTP(S) base URL without credentials or query parameters.": [
17839
+ "无效的 {0}:需要不含凭据和查询参数的 HTTP(S) 基础地址。",
17840
+ "Invalid {0}: expected an HTTP(S) base URL without credentials or query parameters."
17841
+ ],
17842
+ "Jev synthesis requires API URL, API key, and model when dedicated synthesis is configured.": [
17843
+ "配置独立 Jev 汇总时,必须同时填写 API 地址、Key 和模型名。",
17844
+ "Jev synthesis requires API URL, API key, and model when dedicated synthesis is configured."
17845
+ ],
17846
+ "Jev synthesis requires an allowed configured synthesis model": [
17847
+ "Jev 结果汇总需要配置允许使用的独立汇总模型",
17848
+ "Jev synthesis requires an allowed configured synthesis model"
17849
+ ],
17850
+ "Jev synthesis is disabled": [
17851
+ "Jev 结果汇总已关闭",
17852
+ "Jev synthesis is disabled"
17853
+ ],
17854
+ "Jev synthesis model is not configured": [
17855
+ "尚未配置 Jev 独立汇总模型",
17856
+ "Jev synthesis model is not configured"
17693
17857
  ]
17694
17858
  }
@@ -29,16 +29,16 @@ Use the local `smart-search` command as the default execution layer for web rese
29
29
  7. Use `smart-search smoke --mock --format json` after CLI/provider architecture changes. Use `--live` only when real keys are available and the user expects live checks.
30
30
  8. Treat `TAVILY_ENABLED=false` as an intentional no-network boundary: do not work around it with direct Tavily or `map` calls. Check `doctor` and live smoke for disabled/skipped Tavily state; Firecrawl remains independently configured.
31
31
  9. If a result reports a degraded provider in `provider_notices`, or a provider attempt is `skipped`, run `smart-search providers status --format json`. The channel is on a persisted failure cooldown; fix the credential or run `smart-search providers reset PROVIDER` instead of retrying the same failing provider.
32
- 10. Preserve command lines and source URLs in your answer. Prefer citing fetched pages or `primary_sources`; treat `extra_sources` as follow-up candidates until fetched.
32
+ 10. Preserve command lines and source URLs in your answer. Prefer citing fetched pages; treat model citations and unread search sources as discovery candidates.
33
33
 
34
34
  ## Routing
35
35
 
36
- - `search`: first hop for realtime, broad exploration, community signals, multi-source summaries, and routing metadata.
36
+ - `search`: single-pass retrieval: Jev or local rules select one suitable channel, which returns results and sources; no automatic assessment, follow-up, filtering, or synthesis.
37
37
  - `route`: explain capability routing locally without executing providers; `--router-mode jev --remote` explicitly opts into a potentially billable TypeSafe judgment.
38
- - `research`: live Deep Research executor for end-to-end plan, discovery, fetch/read, gap check, and evidence-only synthesis.
38
+ - `research`: shared bounded loop with Jev or local routing for complementary discovery, fetch/read, evidence gaps, and optional synthesis.
39
39
  - `deep`: offline Deep Research planner; it does not run providers, fetch pages, or replace default `search`.
40
40
  - `zhipu-search`: Chinese-language, domestic China, policy/regulatory, announcements, current news, or China-local source discovery.
41
- - `context7-library` / `context7-docs`: library, SDK, API, framework, or documentation intent. Automatic routes select Context7 only when a query subject overlaps a candidate title/id; otherwise use same-capability Exa fallback. Explicit commands retain the candidate list and supplied library id.
41
+ - `context7-library` / `context7-docs`: library, SDK, API, framework, or documentation intent. Ordinary search uses the first library in Context7's ranked candidates; research may ask Jev to choose a candidate, using the first candidate if Jev fails or no score reaches its threshold. Unresolved libraries allow same-capability fallback. Explicit commands retain the candidate list and supplied library id.
42
42
  - `exa-search`: official domains, papers, product pages, trusted pages, date/domain-filtered low-noise discovery, and adjacent source discovery through `exa-similar`.
43
43
  - `fetch`: user-provided URLs or any claim that depends on page content.
44
44
  - `map`: documentation site or domain structure before fetching many pages from one site.
@@ -52,8 +52,8 @@ Use the local `smart-search` command as the default execution layer for web rese
52
52
  - `smart-search` should resolve from the user's PATH.
53
53
  - Private API keys should be saved with `smart-search setup` or `smart-search config set`; environment variables remain supported for CI and advanced users.
54
54
  - In sandboxed runtimes, set `SMART_SEARCH_CONFIG_DIR` to an absolute writable path when the default config directory is unavailable or must be pinned.
55
- - The standard minimum profile requires one configured provider in each of `main_search`, `docs_search`, and fetch capability. Missing required capabilities are hard configuration failures.
56
- - Fallback must remain same-capability only. Do not use Context7 for broad news/web facts or page-extraction providers as documentation search replacements.
55
+ - The standard minimum profile requires at least one enabled retrieval channel. Jev and a main model are optional; the requested operation still needs a capable channel.
56
+ - Fallback stays within the same capability family; model answers and web search are mutual fallbacks in ordinary search. Do not use Context7 for broad news/web facts or page-extraction providers as documentation search replacements.
57
57
  - xAI Responses and OpenAI-compatible are peer `main_search` providers. Do not reuse one provider's URL/key to fabricate the other provider as fallback.
58
58
  - For current-news, policy, finance, health, and other high-risk facts, do not answer from broad `search.content` alone. Fetch key pages and summarize only what fetched text supports.
59
59
  - Native `web_search` is disabled in this CLI-first workflow unless the user explicitly configures another approved route; do not silently fall back to another web-search route.
@@ -21,7 +21,7 @@
21
21
  ## Commands
22
22
 
23
23
  - `smart-search search QUERY [--platform NAME] [--model ID] [--extra-sources N] [--validation fast|balanced|strict] [--fallback auto|off] [--providers auto|CSV] [--stream|--no-stream] [--timeout SECONDS] [--format json|markdown|content] [--output PATH]` (`--timeout` overrides the persisted `SMART_SEARCH_TIMEOUT_SECONDS` total budget)
24
- - `smart-search route QUERY [--validation fast|balanced|strict] [--router-mode hybrid|rules|off] [--format json|markdown|content] [--output PATH]`
24
+ - `smart-search route QUERY [--validation fast|balanced|strict] [--router-mode jev|local] [--remote] [--format json|markdown|content] [--output PATH]`
25
25
  - `smart-search fetch URL [--format json|markdown|content] [--output PATH]`
26
26
  - `smart-search exa-search QUERY [--num-results N] [--search-type neural|keyword|auto] [--include-text] [--include-highlights] [--start-published-date YYYY-MM-DD] [--include-domains DOMAIN...] [--exclude-domains DOMAIN...] [--category NAME] [--format json|markdown|content] [--output PATH]`
27
27
  - `smart-search exa-similar URL [--num-results N] [--format json|markdown|content] [--output PATH]`
@@ -48,7 +48,7 @@
48
48
  - `smart-search map URL [--instructions TEXT] [--max-depth N] [--max-breadth N] [--limit N] [--timeout SECONDS] [--format json|markdown|content] [--output PATH]`
49
49
  - `smart-search doctor [--format json|markdown|content] [--output PATH]`
50
50
  - `smart-search diagnose openai-compatible [--timeout SECONDS] [--format json|markdown] [--output PATH]`
51
- - `smart-search setup [--lang zh|en] [--advanced] [--non-interactive] [--skip-skills] [--install-skills CSV] [--skills-root PATH] [--xai-api-url URL] [--xai-api-key KEY] [--xai-model ID] [--xai-tools-explicit CSV] [--openai-compatible-api-url URL] [--openai-compatible-api-key KEY] [--openai-compatible-model ID] [--openai-compatible-fallback-models CSV] [--openai-compatible-api-mode chat-completions|responses] [--openai-compatible-stream true|false] [--validation-level fast|balanced|strict] [--fallback-mode auto|off] [--minimum-profile standard|off] [--intent-router hybrid|rules|off] [--search-timeout SECONDS] [--intent-embedding-api-url URL] [--intent-embedding-api-key KEY] [--intent-embedding-model ID] [--intent-embedding-threshold FLOAT] [--intent-embedding-margin FLOAT] [--intent-classifier-api-url URL] [--intent-classifier-api-key KEY] [--intent-classifier-model ID] [--intent-router-timeout SECONDS] [--provider-cooldown SECONDS] [--provider-failure-threshold N] [--exa-key KEY] [--context7-key KEY] [--zhipu-key KEY] [--zhipu-api-url URL] [--zhipu-search-engine ENGINE] [--zhipu-mcp-key KEY] [--zhipu-mcp-search-api-url URL] [--zhipu-mcp-reader-api-url URL] [--zhipu-mcp-zread-api-url URL] [--zhipu-mcp-timeout SECONDS] [--jina-key KEY] [--jina-reader-api-url URL] [--jina-respond-with MODE] [--jina-timeout SECONDS] [--tavily-api-url URL] [--tavily-key KEY] [--firecrawl-api-url URL] [--firecrawl-key KEY] [--tinyfish-key KEY] [--tinyfish-search-api-url URL] [--tinyfish-fetch-api-url URL] [--tinyfish-timeout SECONDS] [--anysearch-api-url URL] [--anysearch-key KEY] [--anysearch-timeout SECONDS] [--sciverse-api-url URL] [--sciverse-token TOKEN] [--sciverse-timeout SECONDS] [--format json|markdown|content] [--output PATH]`
51
+ - `smart-search setup [--lang zh|en] [--advanced] [--non-interactive] [--skip-skills] [--install-skills CSV] [--skills-root PATH] [--xai-api-url URL] [--xai-api-key KEY] [--xai-model ID] [--xai-tools-explicit CSV] [--openai-compatible-api-url URL] [--openai-compatible-api-key KEY] [--openai-compatible-model ID] [--openai-compatible-fallback-models CSV] [--openai-compatible-api-mode chat-completions|responses] [--openai-compatible-stream true|false] [--validation-level fast|balanced|strict] [--fallback-mode auto|off] [--minimum-profile standard|off] [--intent-router jev|local] [--search-timeout SECONDS] [--provider-cooldown SECONDS] [--provider-failure-threshold N] [--exa-key KEY] [--context7-key KEY] [--zhipu-key KEY] [--zhipu-api-url URL] [--zhipu-search-engine ENGINE] [--zhipu-mcp-key KEY] [--zhipu-mcp-search-api-url URL] [--zhipu-mcp-reader-api-url URL] [--zhipu-mcp-zread-api-url URL] [--zhipu-mcp-timeout SECONDS] [--jina-key KEY] [--jina-reader-api-url URL] [--jina-respond-with MODE] [--jina-timeout SECONDS] [--tavily-api-url URL] [--tavily-key KEY] [--firecrawl-api-url URL] [--firecrawl-key KEY] [--tinyfish-key KEY] [--tinyfish-search-api-url URL] [--tinyfish-fetch-api-url URL] [--tinyfish-timeout SECONDS] [--anysearch-api-url URL] [--anysearch-key KEY] [--anysearch-timeout SECONDS] [--sciverse-api-url URL] [--sciverse-token TOKEN] [--sciverse-timeout SECONDS] [--format json|markdown|content] [--output PATH]`
52
52
  - `smart-search config path|list|set|unset ... [--format json|markdown|content] [--output PATH]`
53
53
  - `smart-search model set MODEL [--format json|markdown|content] [--output PATH]`
54
54
  - `smart-search model current [--format json|markdown|content] [--output PATH]`
@@ -69,8 +69,8 @@ Nested aliases: `config path`/`cfg p`, `config list`/`cfg ls`/`cfg l`, `config s
69
69
  - `--format markdown` is the human-readable report format. `route --format markdown`, `route-calibrate --format markdown`, `doctor --format markdown`, and `diagnose openai-compatible --format markdown` must render useful reports rather than raw JSON dumps.
70
70
  - `--format content` prints only the `content` field for content-bearing commands such as `search`, `fetch`, `context7-docs`, and `research`. Commands without a `content` field, including `route`, `route-calibrate`, `doctor`, `smoke`, `config`, `model`, and `providers`, must print a compact non-empty text summary.
71
71
  - Successful search output includes `ok`, `query`, `primary_api_mode`, `content`, `sources`, `sources_count`, `primary_sources`, `primary_sources_count`, `extra_sources`, `extra_sources_count`, `source_warning`, `routing_decision`, `providers_used`, `provider_attempts`, `provider_notices`, `fallback_used`, `validation_level`, `timeout_seconds`, `timeout_phase`, `phase_attempts`, deadline elapsed/remaining milliseconds, `partial_success`, and `elapsed_ms`. Phase telemetry is scheduler-level and additive; provider attempts remain provider-level records.
72
- - Route diagnostic output includes `ok`, `query`, `executed_search=false`, `provider_selection=not_executed`, backward-compatible fields `docs_intent`, `zh_current_intent`, `web_current_intent`, `fetch_intent`, `supplemental_paths`, and unified intent-router fields `intent_router_mode`, `required_capabilities`, `intent_signals`, `confidence`, `router_engines_used`, `degraded`, `degraded_reason`, `reasons`, `embedding_model`, `embedding_threshold`, `embedding_margin`, `embedding_threshold_source`, and `embedding_margin_source`. `smart-search route` must not call search/docs/fetch providers.
73
- - Route calibration output includes `ok`, `metric`, `primary_metric=semantic_macro_f1`, `full_route_metric_role=validation`, `models`, `model_results`, `dataset_size`, `dataset_counts`, `capabilities`, `recommended_model`, `recommended_threshold`, `recommended_margin`, and `failed_models`.
72
+ - Route diagnostic output includes `ok`, `intent_router_mode`, `required_capabilities`, `available_channels`, `selected_channels`, and `executed_search=false`. Default preview is offline; `--remote` explicitly enables Jev judgment.
73
+ - `route-calibrate` returns `deprecated=true`, `executed_remote=false`, and `error_type=parameter_error`; no model calibration is performed.
74
74
  - Fetch output includes `ok`, `url`, `provider`, `content`, `provider_attempts`, `provider_notices`, `fallback_used`, and `elapsed_ms`.
75
75
  - Exa search output includes `ok`, `query`, `search_type`, `results`, `total`, and `elapsed_ms`. Exa similar output includes `ok`, `url`, `results`, `total`, and `elapsed_ms`.
76
76
  - Zhipu search output includes `ok`, `query`, `provider`, `search_engine`, `results`, `total`, and `elapsed_ms`.
@@ -84,7 +84,7 @@ Nested aliases: `config path`/`cfg p`, `config list`/`cfg ls`/`cfg l`, `config s
84
84
  - Diagnostic output masks keys and reports config paths, Windows legacy config metadata, provider timeout values, `capability_status`, `minimum_profile_ok`, `intent_router_status`, `provider_health`, `main_search_connection_tests`, and provider connectivity checks. A successful `doctor` probe also clears that provider's failure cooldown. OpenAI-compatible health must use the endpoint selected by `OPENAI_COMPATIBLE_API_MODE`; `/models` is supplementary metadata.
85
85
  - Provider health output includes `ok`, `enabled`, `cooldown_seconds`, `failure_threshold`, `store_path`, `providers`, and `cooldown_providers`; each provider entry carries `provider`, `configured`, `state` (`closed` or `cooldown`), `consecutive_failures`, `error_type`, `error`, `cooldown_remaining_seconds`, and `hard_failure`. `providers reset` output includes `ok`, `cleared`, and `known_providers`, and returns `parameter_error` for an unknown provider id.
86
86
  - `provider_notices` is one deduplicated entry per degraded optional provider with `provider`, `capability`, `status` (`failed` or `cooldown`), `error_type`, `error`, `cooldown_remaining_seconds`, and `hint`. Markdown output prints a steady `cooldown` notice only when the command itself failed; JSON always carries it.
87
- - Smoke output includes `ok`, `mode`, `status` (`healthy`, `degraded`, or `failed`), `failed_cases`, `degraded_cases`, `skipped_cases`, `cases`, `provider_attempts`, and `elapsed_ms`. Healthy and degraded smoke preserve `ok: true` and exit code `0`; failed smoke is non-zero. Live smoke uses skipped cases for unavailable optional checks instead of treating them as failed, but failure of every configured main-search route remains critical.
87
+ - Smoke output includes `ok`, `mode`, `status` (`healthy`, `degraded`, or `failed`), `failed_cases`, `degraded_cases`, `skipped_cases`, `cases`, `provider_attempts`, and `elapsed_ms`. Healthy and degraded smoke preserve `ok: true` and exit code `0`; failed smoke is non-zero. Live smoke skips unavailable optional checks; overall failure follows the reported critical cases, while optional failures with an available same-capability alternative are degraded.
88
88
 
89
89
  ## Exit Codes
90
90
 
@@ -16,7 +16,7 @@ For claim-level evidence, prefer this order:
16
16
 
17
17
  1. Discover candidate URLs with source-focused `search`, `zhipu-search` for Chinese/current/domestic topics, Context7 for docs/API/library topics, or `exa-search` for official/trusted domains and papers.
18
18
  2. Fetch the exact pages that matter.
19
- 3. Use broad `search` only as synthesis or discovery, and mark claims as unverified when only `extra_sources` are available.
19
+ 3. Build claim-level conclusions from fetched pages, or use `research` for automatic multi-source work. Ordinary `search` returns one selected channel and performs no post-retrieval synthesis. Unread sources remain unverified; `extra_sources` is an empty compatibility field.
20
20
 
21
21
  Deep Research planner output uses an explicit `--evidence-dir` when supplied, otherwise a generated `smart-search-evidence` directory under `tempfile.gettempdir()`. Preserve the CLI's planned `--output` path and `output_path` match; do not rewrite evidence contracts unless a separate docs/runtime fix is in scope. Hard-coded paths such as `C:\tmp\smart-search-evidence\...` should be treated as user-chosen explicit output locations.
22
22
 
@@ -70,6 +70,8 @@ smart-search config list --format markdown
70
70
  smart-search config set XAI_API_KEY "key" --format json
71
71
  smart-search config set XAI_MODEL "grok-4-fast" --format json
72
72
  smart-search config set XAI_TOOLS "web_search,x_search" --format json
73
+ smart-search config set XAI_REASONING_EFFORT "high" --format json
74
+ smart-search search "Latest Grok news" --providers xai-responses --stream --format json
73
75
  smart-search config set OPENAI_COMPATIBLE_API_URL "https://api.openai.com/v1" --format json
74
76
  smart-search config set OPENAI_COMPATIBLE_API_KEY "key" --format json
75
77
  smart-search config set OPENAI_COMPATIBLE_MODEL "model-id" --format json
@@ -81,17 +83,7 @@ smart-search config set ANYSEARCH_API_URL "https://api.anysearch.com/mcp" --form
81
83
  smart-search config set SCIVERSE_API_TOKEN "key" --format json
82
84
  smart-search config set ANYSEARCH_API_KEY "key" --format json
83
85
  smart-search config set ANYSEARCH_TIMEOUT_SECONDS "30" --format json
84
- smart-search config set SMART_SEARCH_INTENT_ROUTER "hybrid" --format json
85
- smart-search config set INTENT_EMBEDDING_API_URL "https://api.siliconflow.cn/v1/embeddings" --format json
86
- smart-search config set INTENT_EMBEDDING_API_KEY "key" --format json
87
- smart-search config set INTENT_EMBEDDING_MODEL "Qwen/Qwen3-Embedding-8B" --format json
88
- smart-search config set INTENT_EMBEDDING_THRESHOLD "0.475" --format json
89
- smart-search config set INTENT_EMBEDDING_MARGIN "0.053" --format json
90
- smart-search route-calibrate --models "Qwen/Qwen3-Embedding-8B" --format json
91
- smart-search config set INTENT_CLASSIFIER_API_URL "https://api.openai.com/v1/chat/completions" --format json
92
- smart-search config set INTENT_CLASSIFIER_API_KEY "key" --format json
93
- smart-search config set INTENT_CLASSIFIER_MODEL "gpt-4.1-mini" --format json
94
- smart-search config set INTENT_ROUTER_TIMEOUT_SECONDS "8" --format json
86
+ smart-search config set SMART_SEARCH_INTENT_ROUTER "jev" --format json
95
87
  smart-search config set EXA_API_KEY "key" --format json
96
88
  smart-search config set CONTEXT7_API_KEY "key" --format json
97
89
  smart-search config set ZHIPU_API_KEY "key" --format json
@@ -147,27 +139,25 @@ When a search succeeds but `provider_notices` reports a degraded optional provid
147
139
 
148
140
  ## Timeout Retry Policy
149
141
 
150
- When `smart-search search` returns `ok: false` with `error_type: "timeout"`, treat it as a retryable terminal main-search deadline, not as a terminal research failure. Inspect `timeout_phase` and `phase_attempts` first: optional-phase timeout with `partial_success=true` already retains usable primary content.
142
+ When `smart-search search` returns `ok: false` with `error_type: "timeout"`, inspect `timeout_phase` and `provider_attempts` first. Partial results can remain in `content`; ordinary search has no automatic optional source phase.
151
143
 
152
- 1. Retry up to 3 total attempts with `--timeout 300`, waiting about 5 seconds between attempts.
153
- 2. Use `--format json` and `--output PATH` for each attempt; after each attempt, inspect the saved JSON and stop on the first `"ok": true`.
154
- 3. Use `--extra-sources 1` during retry attempts to keep Tavily/Firecrawl overhead small.
155
- 4. `SMART_SEARCH_TIMEOUT_SECONDS` supplies the persistent 300-second default; use the CLI's `--timeout` only for an explicit one-call override. Do not wrap `smart-search` in a shell-level `timeout` command because shell termination can prevent structured failure JSON.
156
- 5. Do not rely on `SMART_SEARCH_RETRY_*` settings; search command timeouts are surfaced by the CLI result contract and should be handled by the agent workflow.
157
- 6. If all attempts time out, fall back to source-first evidence:
144
+ 1. Retry the same search at most once, adding `--extra-sources 1` to limit the selected channel result count.
145
+ 2. Use `--format json` and `--output PATH` for each attempt; inspect the saved JSON and stop on `"ok": true`.
146
+ 3. Set the agent's command execution timeout at least 30 seconds longer than the smart-search total budget, or run the command in the background. With the default 300-second budget, the agent timeout must be at least 330 seconds; otherwise the agent can kill smart-search before it returns structured results. `SMART_SEARCH_TIMEOUT_SECONDS` supplies the default; `--timeout` overrides one call.
147
+ 4. If the retry also times out, switch to source-first evidence:
158
148
  - Run `exa-search` with the original query.
159
149
  - Run `exa-search --include-domains` when likely official domains are known.
160
150
  - `fetch` the top 1-2 relevant URLs before making claim-level statements.
161
- - Mark the final answer as `source_mode: "fallback"` or clearly state that the answer was assembled from fetched sources rather than generated by `search`.
151
+ - Mark the final answer as `source_mode: "fallback"` or state that it was assembled from fetched sources after the original search failed.
162
152
 
163
- Agent timeout handling contract: `smart-search search ... --timeout 300 --extra-sources 1 --format json --output PATH` is the retry shape; it is not a shell-level `timeout` wrapper. `SMART_SEARCH_RETRY_*` settings are not the contract for this path. After repeated main-search timeout failures, switch to source-first fallback with `exa-search`, `exa-search --include-domains`, and fetched evidence. Final answers assembled through that fallback should explicitly label the evidence mode, for example `source_mode: "fallback"` or equivalent prose.
153
+ Agent timeout handling contract: on `error_type: "timeout"`, inspect `timeout_phase` and `provider_attempts`, then retry the same search at most once with `--extra-sources 1`, for example `smart-search search ... --timeout 300 --extra-sources 1 --format json --output PATH`. Set the agent's command execution timeout at least 30 seconds above the smart-search total budget (at least 330 seconds for the default 300 seconds), or run it in the background, so the agent does not kill it before structured results return. If the retry also times out, switch to source-first fallback with `exa-search`, `exa-search --include-domains`, and fetched evidence, and label the evidence mode as `source_mode: "fallback"` or equivalent prose.
164
154
 
165
155
  ## Guardrails
166
156
 
167
157
  - Prefer JSON for agent parsing and markdown for fetched page text intended for reading.
168
158
  - Use `--output` for multi-source work, long pages, or anything the answer may need to cite later.
169
159
  - Keep `--extra-sources` small (`1` to `3`) unless the user asks for broad coverage.
170
- - Do not cite `extra_sources` as proof for a sentence in `content`; fetch the URL first or cite it only as a candidate source.
160
+ - Do not cite unread `sources` or model `primary_sources` as proof for a sentence in `content`; fetch the URL first. `extra_sources` remains an empty compatibility list.
171
161
  - Prefer `exa-search --include-domains` for official documentation when likely domains are known.
172
162
  - Do not expose API keys. Treat `doctor` output as safe only because it is expected to mask secrets.
173
163
  - In this CLI-first workflow, native `web_search` is disabled unless the user explicitly configures another approved route.
@@ -28,16 +28,16 @@ Use Deep Research Mode when the user asks for `深度搜索`, `深度调研`, `
28
28
 
29
29
  Do not select a fixed topic recipe. Market, product, technical docs, news, policy, claim-checking, and URL-first prompts are examples of user language, not schema modes. Deep Research must not require fixed topic recipe ids such as `current_market_research`, `product_comparison_research`, `technical_docs_research`, `news_or_policy_research`, `claim_verification_research`, or `url_first_research`; fixed topic recipe ids are not required schema.
30
30
 
31
- Deep Research does not change default `smart-search search` behavior and does not depend on an MCP session. It must not change default `smart-search search` behavior.
31
+ Deep Research does not change default `smart-search search` behavior and does not depend on an MCP session.
32
32
 
33
33
  ## Offline Planner And Live Executor
34
34
 
35
35
  - `smart-search deep` is the public offline planner command and a public planner entrypoint, not an executor. It does not call providers, run `doctor`, or fetch pages by default.
36
- - `smart-search research` is the public live executor command and public live executor entrypoint. It executes plan -> discover -> fetch/read -> gap check -> evidence-only synthesis.
36
+ - `smart-search research` is the public live executor. It uses the plan's question candidates, then selects and executes actions in a bounded loop with Jev or local routing; it does not execute the offline `steps[].command` list. The default returns evidence; optional model synthesis is controlled separately.
37
37
  - Before manual execution, run `smart-search deep "question" --format json` and use the returned `research_plan` as your planning artifact.
38
38
  - Use `smart-search research "question" --format json` when the user wants the CLI to run live Deep Research end to end instead of only planning.
39
39
 
40
- Default orchestration:
40
+ Optional manual orchestration (use `research` directly for automatic execution):
41
41
 
42
42
  1. Run `smart-search doctor --format json` as preflight when configuration is uncertain.
43
43
  2. Call `smart-search deep "question" --format json` to create an offline `research_plan`.
@@ -47,7 +47,7 @@ Default orchestration:
47
47
  6. Use `fetch` on key URLs before making claim-level statements.
48
48
  7. Run `gap_check`: if an important claim lacks fetched evidence, fetch another source or mark the claim/source as unverified.
49
49
 
50
- Default evidence policy is `fetch_before_claim`: key claims in the final answer must be supported by fetched page text. Treat `primary_sources` and `extra_sources` as discovery candidates until the relevant URL has been fetched. Final answers should include fetched evidence, unverified candidate sources, and key commands used.
50
+ Default evidence policy is `fetch_before_claim`: key claims in the final answer must be supported by fetched page text. Treat unread `sources` and model `primary_sources` as discovery candidates until fetched; `extra_sources` is an empty compatibility list. Final answers should include fetched evidence, unverified candidate sources, and key commands used.
51
51
 
52
52
  ## Planner Shape
53
53
 
@@ -145,12 +145,12 @@ Prefer PowerShell-safe quoted commands in generated plans because Windows users
145
145
 
146
146
  ## Capability Boundaries
147
147
 
148
- - `search`: broad discovery and synthesis through `main_search`; use returned `routing_decision`, `provider_attempts`, `fallback_used`, and `source_warning` as orchestration signals, not as claim proof.
148
+ - `search`: one selected retrieval channel; use returned `routing_decision`, `provider_attempts`, `fallback_used`, and `source_warning` as orchestration signals, not as claim proof.
149
149
  - `zhipu-search`: Chinese, domestic, current, policy/regulatory, announcement, and China-local source discovery.
150
150
  - `context7-library` and `context7-docs`: library, SDK, API, framework, and documentation intent. Prefer Context7 before Exa for docs/API questions.
151
151
  - `exa-search`: low-noise source discovery for official domains, papers, product pages, known domains, and trusted pages. Do not treat Exa as the universal second hop for every high-risk or verification task.
152
152
  - `exa-similar`: adjacent-source discovery when a known reliable URL is available.
153
- - `search --extra-sources N`: Tavily/Firecrawl horizontal candidate collection for breadth. Treat those candidates as discovery until fetched.
153
+ - `search --extra-sources N`: result count for the single selected ordinary-search channel (maximum 20); it does not add channels.
154
154
  - `anysearch-domains` and `anysearch-search`: experimental vertical search. Inspect domains first, then search a selected domain; do not insert it into the default fallback chain.
155
155
  - `sciverse-catalog`, `sciverse-search`, `sciverse-semantic`, `sciverse-read`, and `sciverse-relations`: explicit experimental academic commands. Use them directly when the task needs Sciverse academic fields, semantic paper hits, document chunks, or citation/reference relations; do not insert Sciverse into default Deep Research fallback.
156
156
  - `fetch`: page-content evidence. Key claims require fetched page text under `fetch_before_claim`.
@@ -164,9 +164,9 @@ Use this form when the user wants the CLI to execute the live workflow directly:
164
164
  smart-search research "question" --budget deep --fallback auto --evidence-dir "<evidence-dir>" --format json --output "research.json"
165
165
  ```
166
166
 
167
- `research --fallback auto` permits same-capability fallback inside selected routes. `research --fallback off` tries only the first selected provider in each capability route and is for debugging or provider comparison. Dynamic routing may reorder providers only inside the same capability. Every attempt must record capability, provider, status, error type, latency, and result count.
167
+ `research --fallback auto` permits local outage fallback and follow-up searches. `research --fallback off` disables both, while allowing reads of initially discovered URLs. Jev may choose complementary capabilities, but each provider remains limited to its supported operations. Every attempt records capability, provider, status, error type, latency, and result count.
168
168
 
169
- Research output includes `final_answer`, `citations`, `evidence_items`, `gap_check`, `provider_attempts`, `fallback_used`, `degraded`, `route_policy_version`, and `evidence_dir`. The synthesis is evidence-only. It may cite fetched/read evidence, but it must not cite unfetched discovery candidates as proof. If providers are exhausted or evidence cannot close, return the degraded gaps rather than inventing missing claims.
169
+ Research output includes `final_answer`, `citations`, `evidence_items`, `gap_check`, `provider_attempts`, `fallback_used`, `degraded`, `route_policy_version`, and `evidence_dir`. The default report contains evidence excerpts; optional model synthesis uses that same read evidence. Unfetched discovery candidates cannot support citations. If providers are exhausted or evidence cannot close, return the gaps rather than inventing missing claims.
170
170
 
171
171
  Research provider advantage routing:
172
172