@konbakuyomu/smart-search-linux-x64 0.1.30-beta.1 → 0.1.31

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 (19) 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/assets/i18n/messages.json +4 -0
  4. package/runtime/smart-search/_internal/smart_search/assets/skills/smart-search-cli/references/deep-research-mode.md +1 -1
  5. package/runtime/smart-search/_internal/smart_search/assets/skills/smart-search-cli/references/provider-routing.md +1 -1
  6. package/runtime/smart-search/_internal/smart_search/intent_router.py +17 -2
  7. package/runtime/smart-search/_internal/smart_search/jev_search.py +11 -3
  8. package/runtime/smart-search/_internal/smart_search/ui_api.py +5 -5
  9. package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/METADATA +1 -1
  10. package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/RECORD +15 -15
  11. package/runtime/smart-search/package.json +7 -7
  12. package/runtime/smart-search/smart-search +0 -0
  13. /package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/INSTALLER +0 -0
  14. /package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/REQUESTED +0 -0
  15. /package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/WHEEL +0 -0
  16. /package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/direct_url.json +0 -0
  17. /package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/entry_points.txt +0 -0
  18. /package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/licenses/LICENSE +0 -0
  19. /package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.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.30-beta.1",
3
+ "version": "0.1.31",
4
4
  "description": "Self-contained Smart Search CLI for linux/x64",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -18022,5 +18022,9 @@
18022
18022
  "正在卸载 CLI…": [
18023
18023
  "正在卸载 CLI…",
18024
18024
  "Removing the CLI…"
18025
+ ],
18026
+ "检索渠道": [
18027
+ "检索渠道",
18028
+ "Retrieval channel"
18025
18029
  ]
18026
18030
  }
@@ -180,7 +180,7 @@ Research provider advantage routing:
180
180
  - AnySearch: explicit vertical intent only, such as CVE, finance, legal, academic, and repository/codebase search.
181
181
  - Sciverse: explicit-only academic provider in this release; use direct `sciverse-*` commands rather than `research` fallback.
182
182
 
183
- Safe research overrides are `SMART_SEARCH_RESEARCH_PREFERRED_PROVIDERS` and `SMART_SEARCH_RESEARCH_DISABLED_PROVIDERS`. They may reorder or disable providers only inside capabilities the provider already supports; they must not move a provider across capability boundaries.
183
+ Safe routing overrides are `SMART_SEARCH_RESEARCH_PREFERRED_PROVIDERS` and `SMART_SEARCH_RESEARCH_DISABLED_PROVIDERS`; despite the names they apply to automatic routing in both ordinary search and research. They may reorder or disable providers only inside capabilities the provider already supports; they must not move a provider across capability boundaries.
184
184
 
185
185
  ## Closeout Lessons
186
186
 
@@ -8,7 +8,7 @@
8
8
  - `research`: the shared loop selects complementary actions in parallel, reads discovered pages, assesses evidence gaps, and continues while useful and within budget. Jev or local rules choose from program-built original/subquestion/gap query candidates; Jev does not generate arbitrary queries or tool calls. Only fetched/read content enters `citations`. Optional filtering and `SMART_SEARCH_JEV_SYNTHESIZE=false|auto|true` apply only here.
9
9
  - `deep` remains an offline planner. Its `steps[].command` entries are suggestions for manual/AI orchestration; `research` records its actual actions separately in `routing_decision.rounds` and `stage_results`.
10
10
 
11
- The default is `SMART_SEARCH_INTENT_ROUTER=jev`. In Jev mode, ordinary search makes at most one routing judgment and, when Jev is configured, one additional judgment on a returned model answer; without a TypeSafe key or a valid judgment, `--fallback auto` uses local capability rules and reports degradation, while `--fallback off` fails clearly. Explicit `local` needs no TypeSafe key and never calls Jev. Legacy `hybrid` maps to `jev`; `rules` and `off` map to `local`. Old embedding/classifier keys remain stored but unused. `route-calibrate` is a retired, non-network compatibility command.
11
+ The default is `SMART_SEARCH_INTENT_ROUTER=jev`. In Jev mode, ordinary search makes at most one routing judgment and, when Jev is configured, one additional judgment on a returned model answer; without a TypeSafe key or a valid judgment, `--fallback auto` uses local capability rules and reports degradation, while `--fallback off` fails clearly. Without a TypeSafe key, `research` stops after the first round that reads page text (`judgment_unavailable`), is always reported as degraded, and with `deep` (strict) never returns `ok=true`; read `content` and `gap_check` instead of treating that as a failed search. `SMART_SEARCH_JEV_SYNTHESIZE=true` still summarizes read evidence; `auto` needs Jev. Explicit `local` needs no TypeSafe key and never calls Jev. Legacy `hybrid` maps to `jev`; `rules` and `off` map to `local`. Old embedding/classifier keys remain stored but unused. `route-calibrate` is a retired, non-network compatibility command.
12
12
 
13
13
  `route` previews local capabilities without calling a model or retrieval provider. Add `--remote` only for an explicit, potentially billable Jev diagnostic. Direct provider commands keep their explicit behavior.
14
14
 
@@ -166,6 +166,21 @@ def contains_any(query: str, keywords: set[str]) -> bool:
166
166
  return any(keyword.lower() in q for keyword in keywords)
167
167
 
168
168
 
169
+ def contains_term(query: str, keywords: set[str]) -> bool:
170
+ """Like contains_any, but Latin keywords match whole words (with a plural s or a version
171
+ number), so "api" is not found in "capital" nor "repo" in "report". CJK keywords have no
172
+ word boundaries and still match as substrings."""
173
+ q = query.lower()
174
+ for keyword in keywords:
175
+ term = keyword.lower()
176
+ if not term.isascii():
177
+ if term in q:
178
+ return True
179
+ elif re.search(rf"(?<![a-z0-9]){re.escape(term)}(?:e?s)?(?![a-z])", q):
180
+ return True
181
+ return False
182
+
183
+
169
184
  def extract_urls(query: str) -> list[str]:
170
185
  urls = []
171
186
  for match in re.findall(r"https?://[^\s<>\]\)\"',。;!?、:)】》」』]+", query):
@@ -189,7 +204,7 @@ def build_rules_route(
189
204
  ) -> IntentRouteResult:
190
205
  plan_intent_signals = plan_intent_signals or {}
191
206
  urls = extract_urls(query)
192
- docs_intent = bool(plan_intent_signals.get("docs_api_intent")) or contains_any(query, DOCS_INTENT_KEYWORDS)
207
+ docs_intent = bool(plan_intent_signals.get("docs_api_intent")) or contains_term(query, DOCS_INTENT_KEYWORDS)
193
208
  zh_current_intent = (
194
209
  plan_intent_signals.get("locale_domain_scope") == "china"
195
210
  or contains_any(query, ZH_CURRENT_INTENT_KEYWORDS)
@@ -200,7 +215,7 @@ def build_rules_route(
200
215
  or contains_any(query, CURRENT_INTENT_KEYWORDS)
201
216
  )
202
217
  fetch_intent = bool(plan_intent_signals.get("known_url")) or bool(urls) or contains_any(query, FETCH_INTENT_KEYWORDS)
203
- vertical_intent = contains_any(query, VERTICAL_INTENT_KEYWORDS)
218
+ vertical_intent = contains_term(query, VERTICAL_INTENT_KEYWORDS)
204
219
 
205
220
  capabilities: set[str] = set()
206
221
  supplemental_paths: list[str] = []
@@ -509,8 +509,8 @@ async def search(
509
509
  before = len(evidence)
510
510
  round_attempt_start = len(attempts)
511
511
  if is_research:
512
- tasks = {asyncio.create_task(execute_one(item, retrieval_timeout)) for item in selected}
513
- pending = tasks
512
+ tasks = {asyncio.create_task(execute_one(item, retrieval_timeout)): item for item in selected}
513
+ pending = set(tasks)
514
514
  try:
515
515
  while pending:
516
516
  done, pending = await asyncio.wait(pending, return_when=asyncio.FIRST_COMPLETED)
@@ -519,6 +519,12 @@ async def search(
519
519
  _, pending = await asyncio.wait(
520
520
  pending, timeout=max(STRAGGLER_GRACE_SECONDS, time.monotonic() - phase_start)
521
521
  )
522
+ # A search model runs its own web search and is far slower than an index
523
+ # lookup; it keeps its retrieval timeout instead of the straggler grace.
524
+ models = {task for task in pending if tasks[task]["capability"] == "main_search"}
525
+ if models:
526
+ await asyncio.wait(models)
527
+ pending -= models
522
528
  break
523
529
  finally:
524
530
  for task in pending:
@@ -613,7 +619,9 @@ async def search(
613
619
  "status": "disabled" if settings.synthesis_mode == "false" else "skipped",
614
620
  "decision_source": "config",
615
621
  }
616
- useful_evidence = bool(answer_evidence and assessment["useful"])
622
+ # Without Jev, usefulness is unknown (None); an explicit "true" still summarizes what was read.
623
+ useful_evidence = bool(answer_evidence and (assessment["useful"] or
624
+ (assessment["useful"] is None and settings.synthesis_mode == "true")))
617
625
  if settings.synthesis_mode != "false" and not useful_evidence:
618
626
  synthesis["reason"] = "no_confirmed_useful_evidence"
619
627
  if settings.synthesis_mode == "auto" and not judge_available:
@@ -158,16 +158,16 @@ def preview(payload: dict[str, Any]) -> dict[str, Any]:
158
158
  merged = {str(key).strip().upper(): "" if value is None else str(value) for key, value in values.items()}
159
159
  with config.snapshot(merged):
160
160
  capability_status = service.get_capability_status()
161
- required = [] if config.minimum_profile == "off" else ["main_search", "docs_search", "web_fetch"]
162
- missing = [name for name in required if not capability_status.get(name, {}).get("ok")]
161
+ # The same minimum profile the overview reports, so a draft never "passes" differently.
162
+ minimum = service._minimum_profile_result(config.minimum_profile, capability_status)
163
163
  return {
164
164
  "ok": True,
165
165
  "error_type": "",
166
166
  "error": "",
167
167
  "capability_status": capability_status,
168
- "required": required,
169
- "missing": missing,
170
- "minimum_profile_ok": not missing,
168
+ "required": minimum["required"],
169
+ "missing": minimum["missing"],
170
+ "minimum_profile_ok": minimum["ok"],
171
171
  }
172
172
 
173
173
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smart-search
3
- Version: 0.1.30b1
3
+ Version: 0.1.31
4
4
  Summary: CLI-first multi-source web research with xAI/OpenAI-compatible search, Exa, Context7, Zhipu, Tavily, Firecrawl, and Deep Research planning.
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -1,13 +1,13 @@
1
1
  ../../../bin/smart-search,sha256=3Si0-mMx4MCMjCfKNF0xeBuTy8aXkDufWgG0psj8uJs,205
2
- smart_search-0.1.30b1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
3
- smart_search-0.1.30b1.dist-info/METADATA,sha256=IKDDKMv9M8tO5uNwBRbX-5fOSldmvIrIU1trjU0EnO4,19628
4
- smart_search-0.1.30b1.dist-info/RECORD,,
5
- smart_search-0.1.30b1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- smart_search-0.1.30b1.dist-info/WHEEL,sha256=a-udL2m4V_6Yn8b-uKzWb12RjRxwwMo6ohYFM24tpaY,91
7
- smart_search-0.1.30b1.dist-info/direct_url.json,sha256=lFRY6ow2tINE_t60B1wCO0WZXfSjjC9GUsp1Y2OjrAY,75
8
- smart_search-0.1.30b1.dist-info/entry_points.txt,sha256=fiHguhz7hQ6ybeepO0OPpZm19XCi2J-Bkigf8DGBuKM,55
9
- smart_search-0.1.30b1.dist-info/licenses/LICENSE,sha256=o_zbH827gkTiZfsNLJGQn1z8Z4eLAvb8heFaSqSGVv8,1067
10
- smart_search-0.1.30b1.dist-info/top_level.txt,sha256=mBPprcb_b3tBApeRa2nlLaGj3UVNxXCdyz6QQvDzJpc,13
2
+ smart_search-0.1.31.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
3
+ smart_search-0.1.31.dist-info/METADATA,sha256=D6orY0Z46H1tNCkaDxUFKhYjlRN9wE3tI9EwyUej7RI,19626
4
+ smart_search-0.1.31.dist-info/RECORD,,
5
+ smart_search-0.1.31.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ smart_search-0.1.31.dist-info/WHEEL,sha256=a-udL2m4V_6Yn8b-uKzWb12RjRxwwMo6ohYFM24tpaY,91
7
+ smart_search-0.1.31.dist-info/direct_url.json,sha256=lFRY6ow2tINE_t60B1wCO0WZXfSjjC9GUsp1Y2OjrAY,75
8
+ smart_search-0.1.31.dist-info/entry_points.txt,sha256=fiHguhz7hQ6ybeepO0OPpZm19XCi2J-Bkigf8DGBuKM,55
9
+ smart_search-0.1.31.dist-info/licenses/LICENSE,sha256=o_zbH827gkTiZfsNLJGQn1z8Z4eLAvb8heFaSqSGVv8,1067
10
+ smart_search-0.1.31.dist-info/top_level.txt,sha256=mBPprcb_b3tBApeRa2nlLaGj3UVNxXCdyz6QQvDzJpc,13
11
11
  smart_search/__init__.py,sha256=da1PTClDMl-IBkrSvq6JC1lnS-K_BASzCvxVhNxN5Ls,13
12
12
  smart_search/__pycache__/__init__.cpython-313.pyc,,
13
13
  smart_search/__pycache__/activity.cpython-313.pyc,,
@@ -40,14 +40,14 @@ smart_search/__pycache__/ui_metadata.cpython-313.pyc,,
40
40
  smart_search/__pycache__/ui_server.cpython-313.pyc,,
41
41
  smart_search/__pycache__/utils.cpython-313.pyc,,
42
42
  smart_search/activity.py,sha256=66yPPAfuaDSF4UTEuRRDefp2m1-l8eVnr8K5_ShoQCU,13368
43
- smart_search/assets/i18n/messages.json,sha256=2cEW-_sOWuQbqb3va9CixuxROAdZNgPujOy5HygLVSc,638801
43
+ smart_search/assets/i18n/messages.json,sha256=RumiIIb_AqRPRyNR0SXVVDQA5WmcJl_qp4y6WCO0WZw,638870
44
44
  smart_search/assets/skills/smart-search-cli/SKILL.md,sha256=465CCVKGCHfiJLDD9LlYbIhlbxWucwLiNVVAcRRlEf8,8561
45
45
  smart_search/assets/skills/smart-search-cli/agents/openai.yaml,sha256=4S1VuEER7Puw9JvxDsyI__Tdrr1j2h6aF26yHho_x8E,162
46
46
  smart_search/assets/skills/smart-search-cli/references/cli-contract.md,sha256=mZyQRioJ4_ySkxcl9WQBMGXk5fcWOEMBMnXXUGnRoEA,1843
47
47
  smart_search/assets/skills/smart-search-cli/references/cli-core.md,sha256=7Wf9csFgjRfQmk7EyssAZBn7BWbw6yNQcu_1-T9LJXA,15029
48
48
  smart_search/assets/skills/smart-search-cli/references/command-patterns.md,sha256=PvMBXjDg0acGf-9uZAyK3p_Ox_kI5aQuhae12WsqRj0,12534
49
- smart_search/assets/skills/smart-search-cli/references/deep-research-mode.md,sha256=i1ZK5yo7ni5LIs79WrNOY75BmTS9G4IIuxxgQ6b6jSM,14398
50
- smart_search/assets/skills/smart-search-cli/references/provider-routing.md,sha256=XQXOI6xZUcCzg1UtDXBpggKVQAC7cNDZwYOU5tOrG8Q,27195
49
+ smart_search/assets/skills/smart-search-cli/references/deep-research-mode.md,sha256=Yt1qHQnbpKgA6P5PTXwv4qFDZTJn7MqarZvCqlmCg-0,14485
50
+ smart_search/assets/skills/smart-search-cli/references/provider-routing.md,sha256=BsjrSVLNtG5h77lUXUTPdnR35GJZU79keIzOeuYclSI,27548
51
51
  smart_search/assets/skills/smart-search-cli/references/regression-release.md,sha256=SkOUwxpPm_HeBGlpUil5ybTBiwa-wAzt-765zw9kYqk,5673
52
52
  smart_search/assets/skills/smart-search-cli/references/setup-config.md,sha256=Bi-yqcoGb0T1SV5tzJLwW9gW_ygx00LPTKXHAHM2t7c,18213
53
53
  smart_search/assets/ui/index.html,sha256=i3se6JX5iHnGXIEXhHvLKZgPzNh8JMJAeRqfIlqac3U,63800
@@ -62,9 +62,9 @@ smart_search/desktop_skills.py,sha256=IAJyn83Zops05XD2MyYAHP93JYzBz9ze1wGqvWEUB4
62
62
  smart_search/desktop_updates.py,sha256=Kn4Q5ZO_axpqPhDvlZ4dnilhVhzDXxq0ONEePAsemR4,7587
63
63
  smart_search/desktop_worker.py,sha256=Nkw_FMNNejrt8oJ6aNUmziSd7vVu_Xy9ijvfgstdawQ,5489
64
64
  smart_search/i18n.py,sha256=-mDfpi-P4AQPCUpnuI--W9c1AFurN5QPhAGYMXB02kU,4869
65
- smart_search/intent_router.py,sha256=bj4DnveNEFj9oIpndOZKRDlyAJwuT5q4dam_dY4cG60,7340
65
+ smart_search/intent_router.py,sha256=UkFnv4R2xC6bF6QEn_lqSYqYOoWgoT_mXeG4CNcSJ3M,7931
66
66
  smart_search/jev.py,sha256=C80OBG2RMOJCMtogltVDHUg0xoCHO_8uIT69736myq8,27169
67
- smart_search/jev_search.py,sha256=BWBpLVDLcOl2DhRAp3iKJXeeo2twDp3csnUoAcNIkhE,48555
67
+ smart_search/jev_search.py,sha256=oW_hvKVBAd10V3e-Hbhd1i133feAQ4_x64NwgO2W3w4,49256
68
68
  smart_search/logger.py,sha256=pwfjP50ywoTRirH4H7qYTNgt4TgoMhZlX2pb8dNvO9k,1203
69
69
  smart_search/provider_descriptions.py,sha256=Y5I1vOz-trKoVfXZ3bQLVfA1aHIRAJ4maN42ya-Zqds,10234
70
70
  smart_search/provider_errors.py,sha256=IXyLo6Kc4WSP7faH5mMTQyAIVKR0BR0680qd0ZApKUo,5384
@@ -101,7 +101,7 @@ smart_search/skill_installer.py,sha256=CvM9GQShaTR8ttNhilx8Up0vVsHZfsnYD5uM7wZrz
101
101
  smart_search/skill_maintenance.py,sha256=2s2-1ZEEjRg2MfRKlaw6Y51OO86kOf9axl7fW6KMv0g,8818
102
102
  smart_search/sources.py,sha256=WvyRXqX_IdbDPpsqcSbulipxNtZvQbWv1MsZ2Ud5bTY,14376
103
103
  smart_search/state_files.py,sha256=K02dlR3Xuj2vIkRiEdrFr3OSiEsPxN5_HSo4NTmz0sc,2063
104
- smart_search/ui_api.py,sha256=x3ULS415MPjZ96iZSOeNK4npzOLJ6GK_DymYi6_tPgA,10027
104
+ smart_search/ui_api.py,sha256=p73zozirtzu7u8AQS4uWTCbsbomkbkxCExs_mE1_HW4,10043
105
105
  smart_search/ui_metadata.py,sha256=6WO8WT-P9bwkmgi2i4XXXUqSL4xUijd4gJnImS_cka8,51028
106
106
  smart_search/ui_server.py,sha256=pcAPiYWmJXTmX1Xpy12v97JhkbRx-nJ3zRYefGW1Tc0,20508
107
107
  smart_search/utils.py,sha256=HVpxtyveEHcpGSkIObf97GbCJVRd68f1X6ecQeH14Ks,8992
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@konbakuyomu/smart-search",
3
- "version": "0.1.30-beta.1",
3
+ "version": "0.1.31",
4
4
  "description": "CLI-first multi-source web research with xAI/OpenAI-compatible search, Exa, Context7, Zhipu, Tavily, Firecrawl, and Deep Research planning.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/konbakuyomu/smartsearch#readme",
@@ -39,11 +39,11 @@
39
39
  },
40
40
  "smartSearchBinary": true,
41
41
  "optionalDependencies": {
42
- "@konbakuyomu/smart-search-darwin-x64": "0.1.30-beta.1",
43
- "@konbakuyomu/smart-search-darwin-arm64": "0.1.30-beta.1",
44
- "@konbakuyomu/smart-search-win32-x64": "0.1.30-beta.1",
45
- "@konbakuyomu/smart-search-win32-arm64": "0.1.30-beta.1",
46
- "@konbakuyomu/smart-search-linux-x64": "0.1.30-beta.1",
47
- "@konbakuyomu/smart-search-linux-arm64": "0.1.30-beta.1"
42
+ "@konbakuyomu/smart-search-darwin-x64": "0.1.31",
43
+ "@konbakuyomu/smart-search-darwin-arm64": "0.1.31",
44
+ "@konbakuyomu/smart-search-win32-x64": "0.1.31",
45
+ "@konbakuyomu/smart-search-win32-arm64": "0.1.31",
46
+ "@konbakuyomu/smart-search-linux-x64": "0.1.31",
47
+ "@konbakuyomu/smart-search-linux-arm64": "0.1.31"
48
48
  }
49
49
  }
Binary file