argo-search 1.0.1 → 2.9.7

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 (463) hide show
  1. package/LICENSE +201 -21
  2. package/README.en.md +822 -0
  3. package/README.es.md +864 -0
  4. package/README.ja.md +864 -0
  5. package/README.ko.md +864 -0
  6. package/README.md +867 -320
  7. package/SKILL.md +135 -0
  8. package/assets/readme/hero.svg +121 -0
  9. package/assets/readme/made-with-beautify.svg +10 -0
  10. package/assets/readme/proof-routes.svg +73 -0
  11. package/assets/readme/settings-keys.png +0 -0
  12. package/assets/readme/settings-tools.png +0 -0
  13. package/assets/readme/why-better.svg +104 -0
  14. package/assets/readme/workflow.svg +83 -0
  15. package/backends/domain_profiles.json +2308 -96
  16. package/backends/engine_registry.yaml +3314 -503
  17. package/backends/query_synonyms_cn.json +35 -0
  18. package/backends/quota_profiles.json +2409 -161
  19. package/backends/source_types_cn.json +83 -0
  20. package/backends/text_lexicon.json +44 -0
  21. package/bin/argo +703 -0
  22. package/bin/argo.js +71 -39
  23. package/config.yaml +4976 -363
  24. package/cordis.patch.yml +21 -0
  25. package/data/countries.json +40 -0
  26. package/data/lang_matrix/lang_capability.json +842 -0
  27. package/data/lang_matrix/matrix_2026-09-10.json +11921 -0
  28. package/data/regions_cn.json +1 -0
  29. package/docs/ADDING_NEW_ENGINE.md +184 -0
  30. package/docs/ARGO_INTRO.md +124 -0
  31. package/docs/DATA_SOURCE_GAPS.md +81 -0
  32. package/docs/DESIGN_LOCAL_DATA_FUSION.md +90 -0
  33. package/docs/ENGINE_CATALOG.md +564 -0
  34. package/docs/MCP_SETUP.md +106 -0
  35. package/docs/PLATFORM_PATHS.md +111 -0
  36. package/docs/RELEASE_NOTES_v2.8.0.md +71 -0
  37. package/docs/RELEASE_NOTES_v2.8.2.md +63 -0
  38. package/docs/RELEASE_NOTES_v2.8.3.md +55 -0
  39. package/docs/RELEASE_NOTES_v2.8.4.md +79 -0
  40. package/docs/RELEASE_NOTES_v2.8.5.md +102 -0
  41. package/docs/RELEASE_NOTES_v2.8.6.md +66 -0
  42. package/docs/RELEASE_NOTES_v2.8.7.md +65 -0
  43. package/docs/RELEASE_NOTES_v2.8.8.md +67 -0
  44. package/docs/RELEASE_NOTES_v2.8.9.md +67 -0
  45. package/docs/RELEASE_NOTES_v2.9.0.md +64 -0
  46. package/docs/SEARCH_ARCHIVE.md +115 -0
  47. package/docs/assets/architecture.svg +104 -0
  48. package/docs/assets/hero.svg +98 -0
  49. package/docs/engines/bangumi.md +27 -0
  50. package/docs/engines/biorxiv.md +27 -0
  51. package/docs/engines/clawhub.md +27 -0
  52. package/docs/engines/crt_sh.md +27 -0
  53. package/docs/engines/datacite.md +27 -0
  54. package/docs/engines/deps_dev.md +27 -0
  55. package/docs/engines/douban_movie.md +27 -0
  56. package/docs/engines/endoflife.md +27 -0
  57. package/docs/engines/flk_law.md +27 -0
  58. package/docs/engines/fxtwitter.md +27 -0
  59. package/docs/engines/google_news.md +27 -0
  60. package/docs/engines/gov_regulations.md +27 -0
  61. package/docs/engines/guqian.md +27 -0
  62. package/docs/engines/hackernews.md +27 -0
  63. package/docs/engines/iplant.md +27 -0
  64. package/docs/engines/keenable.md +27 -0
  65. package/docs/engines/met_museum.md +27 -0
  66. package/docs/engines/nasa_images.md +27 -0
  67. package/docs/engines/netease_music.md +27 -0
  68. package/docs/engines/npm.md +27 -0
  69. package/docs/engines/nvd.md +27 -0
  70. package/docs/engines/openreview.md +27 -0
  71. package/docs/engines/openstd.md +27 -0
  72. package/docs/engines/parallel_free.md +27 -0
  73. package/docs/engines/people_daily.md +27 -0
  74. package/docs/engines/realtime_index.md +27 -0
  75. package/docs/engines/sec_edgar.md +27 -0
  76. package/docs/engines/seltz.md +27 -0
  77. package/docs/engines/skillsmp.md +27 -0
  78. package/docs/engines/sspai.md +27 -0
  79. package/docs/engines/std_samr.md +27 -0
  80. package/docs/engines/train.md +27 -0
  81. package/docs/engines/un_comtrade.md +27 -0
  82. package/docs/engines/wikisource.md +27 -0
  83. package/docs/engines/zdic.md +27 -0
  84. package/docs/engines/zenodo.md +27 -0
  85. package/docs/engines/zhihu_hot_app.md +27 -0
  86. package/docs//344/270/272/344/273/200/344/271/210/351/200/211/346/213/251argo.md +176 -0
  87. package/engines/README.md +10 -0
  88. package/engines/_template_cli.yaml +39 -0
  89. package/engines/_template_http.yaml +37 -0
  90. package/engines/plugins/_template_plugin.py +50 -0
  91. package/engines/specs/_cisa_kev.yaml +54 -0
  92. package/engines/specs/_osv.yaml +63 -0
  93. package/engines/specs/aljazeera.yaml +43 -0
  94. package/engines/specs/antara.yaml +43 -0
  95. package/engines/specs/artic.yaml +20 -0
  96. package/engines/specs/aviation_weather.yaml +39 -0
  97. package/engines/specs/bangumi.yaml +21 -0
  98. package/engines/specs/biorxiv.yaml +24 -0
  99. package/engines/specs/carbon_intensity.yaml +32 -0
  100. package/engines/specs/cinii.yaml +44 -0
  101. package/engines/specs/clawhub.yaml +49 -0
  102. package/engines/specs/cleveland.yaml +19 -0
  103. package/engines/specs/cn_ai_news.yaml +43 -0
  104. package/engines/specs/core.yaml +35 -0
  105. package/engines/specs/crt_sh.yaml +38 -0
  106. package/engines/specs/ct24.yaml +43 -0
  107. package/engines/specs/datacite.yaml +27 -0
  108. package/engines/specs/datagov_uk.yaml +41 -0
  109. package/engines/specs/ddgs_images.yaml +45 -0
  110. package/engines/specs/deepseek_search.yaml +74 -0
  111. package/engines/specs/deezer.yaml +20 -0
  112. package/engines/specs/deps_dev.yaml +21 -0
  113. package/engines/specs/digup.yaml +36 -0
  114. package/engines/specs/doi.yaml +39 -0
  115. package/engines/specs/douban_movie.yaml +22 -0
  116. package/engines/specs/dw_news.yaml +47 -0
  117. package/engines/specs/egov_law.yaml +21 -0
  118. package/engines/specs/elpais.yaml +43 -0
  119. package/engines/specs/endoflife.yaml +21 -0
  120. package/engines/specs/energy_charts.yaml +21 -0
  121. package/engines/specs/factcheck_org.yaml +52 -0
  122. package/engines/specs/faz.yaml +43 -0
  123. package/engines/specs/federal_register.yaml +57 -0
  124. package/engines/specs/firecrawl.yaml +53 -0
  125. package/engines/specs/flk_law.yaml +24 -0
  126. package/engines/specs/folha.yaml +43 -0
  127. package/engines/specs/france24.yaml +44 -0
  128. package/engines/specs/full_fact.yaml +47 -0
  129. package/engines/specs/fxtwitter.yaml +31 -0
  130. package/engines/specs/gbfs_nyc.yaml +32 -0
  131. package/engines/specs/gdacs.yaml +21 -0
  132. package/engines/specs/gdelt.yaml +64 -0
  133. package/engines/specs/google_news.yaml +22 -0
  134. package/engines/specs/gov_regulations.yaml +38 -0
  135. package/engines/specs/guardian_rss.yaml +59 -0
  136. package/engines/specs/hurriyet.yaml +43 -0
  137. package/engines/specs/iplant.yaml +25 -0
  138. package/engines/specs/jikan.yaml +24 -0
  139. package/engines/specs/jolpica.yaml +20 -0
  140. package/engines/specs/k10plus.yaml +20 -0
  141. package/engines/specs/keenable.yaml +44 -0
  142. package/engines/specs/lefigaro.yaml +43 -0
  143. package/engines/specs/listenbrainz.yaml +19 -0
  144. package/engines/specs/matichon.yaml +43 -0
  145. package/engines/specs/met_museum.yaml +21 -0
  146. package/engines/specs/nasa_images.yaml +45 -0
  147. package/engines/specs/netease_music.yaml +38 -0
  148. package/engines/specs/nhk.yaml +43 -0
  149. package/engines/specs/nhtsa_vpic.yaml +20 -0
  150. package/engines/specs/noaa_swpc.yaml +20 -0
  151. package/engines/specs/nvd.yaml +38 -0
  152. package/engines/specs/obis.yaml +20 -0
  153. package/engines/specs/opencitations.yaml +52 -0
  154. package/engines/specs/openf1.yaml +21 -0
  155. package/engines/specs/openfoodfacts.yaml +45 -0
  156. package/engines/specs/openligadb.yaml +20 -0
  157. package/engines/specs/openreview.yaml +37 -0
  158. package/engines/specs/openstd.yaml +21 -0
  159. package/engines/specs/people_daily.yaml +22 -0
  160. package/engines/specs/realtime_index.yaml +34 -0
  161. package/engines/specs/ror.yaml +20 -0
  162. package/engines/specs/satnogs.yaml +20 -0
  163. package/engines/specs/sec_edgar.yaml +46 -0
  164. package/engines/specs/skillsmp.yaml +50 -0
  165. package/engines/specs/sogou_weixin_browser.yaml +30 -0
  166. package/engines/specs/soilgrids.yaml +25 -0
  167. package/engines/specs/sspai.yaml +36 -0
  168. package/engines/specs/stackexchange.yaml +46 -0
  169. package/engines/specs/std_samr.yaml +21 -0
  170. package/engines/specs/tass.yaml +43 -0
  171. package/engines/specs/tle_mirror.yaml +21 -0
  172. package/engines/specs/train.yaml +37 -0
  173. package/engines/specs/tvmaze.yaml +20 -0
  174. package/engines/specs/twitter_syndication.yaml +31 -0
  175. package/engines/specs/un_comtrade.yaml +23 -0
  176. package/engines/specs/unpaywall.yaml +54 -0
  177. package/engines/specs/vnpress.yaml +43 -0
  178. package/engines/specs/weather.yaml +32 -0
  179. package/engines/specs/who_don.yaml +21 -0
  180. package/engines/specs/who_gho.yaml +20 -0
  181. package/engines/specs/wikimedia_commons.yaml +34 -0
  182. package/engines/specs/wikisource.yaml +22 -0
  183. package/engines/specs/worms.yaml +19 -0
  184. package/engines/specs/x_trending.yaml +34 -0
  185. package/engines/specs/yna.yaml +43 -0
  186. package/engines/specs/ynet.yaml +43 -0
  187. package/engines/specs/zbmath.yaml +40 -0
  188. package/engines/specs/zdic.yaml +22 -0
  189. package/engines/specs/zenodo.yaml +27 -0
  190. package/engines/specs/zhihu_hot_app.yaml +35 -0
  191. package/mcp/clients.yaml +74 -0
  192. package/package.json +51 -12
  193. package/packages/dsh-plugin/README.md +134 -0
  194. package/packages/dsh-plugin/cordis.patch.yml +48 -0
  195. package/packages/dsh-plugin/dsh/client.js +1244 -0
  196. package/packages/dsh-plugin/dsh/index.js +2290 -0
  197. package/packages/dsh-plugin/dsh/native-tools.mjs +743 -0
  198. package/packages/dsh-plugin/package.json +38 -0
  199. package/packages/dsh-plugin/test/client.test.js +232 -0
  200. package/packages/dsh-plugin/test/config.test.js +30 -0
  201. package/packages/dsh-plugin/test/index.test.js +1338 -0
  202. package/references/query-templates.md +96 -0
  203. package/references/query-templates.yaml +118 -0
  204. package/scripts/ab_eval.py +219 -0
  205. package/scripts/ab_eval_p0p1.py +266 -0
  206. package/scripts/adaptive.py +271 -70
  207. package/scripts/answer.py +154 -0
  208. package/scripts/archive_run.py +591 -0
  209. package/scripts/argo_engine_registry.py +172 -0
  210. package/scripts/argo_paths.py +728 -0
  211. package/scripts/article.py +136 -0
  212. package/scripts/arxiv_source.py +201 -0
  213. package/scripts/badcase_ledger.py +252 -0
  214. package/scripts/batch_probe.py +241 -0
  215. package/scripts/benchmark.py +19 -0
  216. package/scripts/bounded_run.py +144 -0
  217. package/scripts/browser_auth.py +323 -0
  218. package/scripts/burstiness_detector.py +147 -0
  219. package/scripts/cache.py +1078 -67
  220. package/scripts/cache_guard.py +271 -0
  221. package/scripts/cache_key_vdom.py +56 -0
  222. package/scripts/cache_similarity.py +170 -0
  223. package/scripts/caliber_isolation.py +195 -0
  224. package/scripts/calibrate_lowquality.py +210 -0
  225. package/scripts/candidate_envelope.py +366 -0
  226. package/scripts/chrome_cdp.py +871 -0
  227. package/scripts/circuit_breaker.py +389 -0
  228. package/scripts/citations.py +334 -0
  229. package/scripts/cite_cli.py +59 -0
  230. package/scripts/cjk_tokens.py +95 -0
  231. package/scripts/clarify.py +47 -24
  232. package/scripts/cli_io.py +240 -0
  233. package/scripts/config.py +683 -45
  234. package/scripts/config_cache.py +402 -0
  235. package/scripts/conn_pool.py +220 -0
  236. package/scripts/content_security.py +685 -0
  237. package/scripts/content_signals.py +730 -0
  238. package/scripts/crawl.py +74 -35
  239. package/scripts/daemon.py +866 -0
  240. package/scripts/digup_bridge.py +214 -0
  241. package/scripts/engine_admission.py +366 -0
  242. package/scripts/engine_dispatch.py +1019 -0
  243. package/scripts/engine_env.py +534 -0
  244. package/scripts/engine_failure.py +411 -0
  245. package/scripts/engine_families.py +732 -0
  246. package/scripts/engine_policy.py +218 -0
  247. package/scripts/engine_requires.py +190 -0
  248. package/scripts/engine_status.py +322 -0
  249. package/scripts/engine_validate.py +638 -0
  250. package/scripts/engines.py +778 -294
  251. package/scripts/engines_base.py +1521 -0
  252. package/scripts/engines_builders.py +298 -0
  253. package/scripts/engines_builders_batch10.py +159 -0
  254. package/scripts/engines_builders_batch11.py +174 -0
  255. package/scripts/engines_builders_batch12.py +103 -0
  256. package/scripts/engines_builders_batch13.py +340 -0
  257. package/scripts/engines_builders_batch9.py +1468 -0
  258. package/scripts/engines_builders_cn.py +2283 -0
  259. package/scripts/engines_builders_data.py +2923 -0
  260. package/scripts/engines_builders_data_macro.py +775 -0
  261. package/scripts/engines_builders_feeds.py +255 -0
  262. package/scripts/engines_builders_intl.py +1239 -0
  263. package/scripts/engines_builders_search.py +440 -0
  264. package/scripts/engines_builders_tech.py +1360 -0
  265. package/scripts/evidence.py +588 -162
  266. package/scripts/evidence_loop.py +592 -0
  267. package/scripts/evidence_tier.py +298 -0
  268. package/scripts/except_sets.py +25 -0
  269. package/scripts/extract.py +55 -16
  270. package/scripts/fact_align.py +207 -0
  271. package/scripts/fact_crosscheck.py +230 -0
  272. package/scripts/fetch.py +25 -12
  273. package/scripts/fetch_browser.py +87 -0
  274. package/scripts/fetch_jsrun.py +122 -0
  275. package/scripts/fetch_quality.py +225 -0
  276. package/scripts/fetch_render_tinyfish.py +117 -0
  277. package/scripts/fetch_v3.py +1779 -0
  278. package/scripts/focus_extract.py +350 -0
  279. package/scripts/fulltext_store.py +169 -0
  280. package/scripts/fxtwitter_api.py +325 -0
  281. package/scripts/gen_engine_catalog.py +364 -0
  282. package/scripts/gen_native_tools.py +91 -0
  283. package/scripts/gen_routing_snapshot.py +184 -0
  284. package/scripts/health_check.py +140 -402
  285. package/scripts/health_probe.py +23 -8
  286. package/scripts/hot_state.py +134 -0
  287. package/scripts/http_client.py +1053 -0
  288. package/scripts/image_ops.py +430 -0
  289. package/scripts/image_vision/vision_probe +0 -0
  290. package/scripts/image_vision/vision_probe.swift +126 -0
  291. package/scripts/install.ps1 +148 -0
  292. package/scripts/install.sh +206 -0
  293. package/scripts/job.py +1186 -0
  294. package/scripts/jump_resolver.py +235 -0
  295. package/scripts/lang_capability.py +150 -0
  296. package/scripts/lang_detect.py +289 -0
  297. package/scripts/lang_matrix_probe.py +329 -0
  298. package/scripts/lang_pref.py +311 -0
  299. package/scripts/link_source.py +340 -0
  300. package/scripts/local_engines.py +321 -0
  301. package/scripts/local_image.py +970 -0
  302. package/scripts/local_seek.py +366 -0
  303. package/scripts/macro_countries.py +82 -0
  304. package/scripts/matrix_search_eval.py +1105 -0
  305. package/scripts/mcp_diag.py +8 -3
  306. package/scripts/mcp_handlers.py +1074 -0
  307. package/scripts/mcp_handlers_surface.py +157 -0
  308. package/scripts/mcp_launch.sh +122 -0
  309. package/scripts/mcp_server.py +118 -417
  310. package/scripts/mcp_setup.py +407 -0
  311. package/scripts/mcp_tools.py +330 -0
  312. package/scripts/mcp_transport.py +191 -0
  313. package/scripts/min_version_scan.py +335 -0
  314. package/scripts/net_proxy.py +258 -0
  315. package/scripts/network_aware.py +152 -0
  316. package/scripts/paper.py +274 -0
  317. package/scripts/pdf_extract.py +518 -0
  318. package/scripts/phrase_filter.py +66 -0
  319. package/scripts/plan.py +422 -0
  320. package/scripts/postprocess_signals.py +150 -0
  321. package/scripts/pre-commit +48 -0
  322. package/scripts/query_enhance.py +157 -0
  323. package/scripts/query_operators.py +196 -0
  324. package/scripts/query_rewriter.py +116 -7
  325. package/scripts/query_signals.py +300 -0
  326. package/scripts/query_templates.py +167 -0
  327. package/scripts/query_understanding.py +411 -0
  328. package/scripts/query_variants.py +298 -0
  329. package/scripts/quota.py +488 -76
  330. package/scripts/rank_signals.py +775 -0
  331. package/scripts/ranking_eval.py +319 -0
  332. package/scripts/readability_extract.py +433 -0
  333. package/scripts/recompute.py +415 -0
  334. package/scripts/recovery.py +616 -0
  335. package/scripts/recovery_l0.py +160 -0
  336. package/scripts/redskill/redskill_engine.py +332 -0
  337. package/scripts/regression_p0p1.py +318 -0
  338. package/scripts/replay_eval.py +640 -0
  339. package/scripts/rerank_tfidf.py +225 -0
  340. package/scripts/research.py +591 -403
  341. package/scripts/research_cli.py +361 -0
  342. package/scripts/research_dossier.py +492 -0
  343. package/scripts/research_expand.py +146 -0
  344. package/scripts/research_gates.py +272 -0
  345. package/scripts/research_report.py +209 -0
  346. package/scripts/research_strategy.py +37 -0
  347. package/scripts/research_work_packages.py +195 -0
  348. package/scripts/result_lang.py +311 -0
  349. package/scripts/robots_guard.py +259 -0
  350. package/scripts/route.py +921 -254
  351. package/scripts/route_bangs.py +40 -0
  352. package/scripts/route_cache.py +225 -0
  353. package/scripts/route_combo.py +910 -0
  354. package/scripts/route_domains.py +328 -0
  355. package/scripts/route_lang.py +605 -0
  356. package/scripts/route_log.py +63 -0
  357. package/scripts/route_policy.py +250 -0
  358. package/scripts/rrf_classic.py +66 -0
  359. package/scripts/screenshot.py +73 -0
  360. package/scripts/search.py +897 -405
  361. package/scripts/search_attribution.py +88 -0
  362. package/scripts/search_benchmark.py +407 -0
  363. package/scripts/search_cli.py +627 -0
  364. package/scripts/search_entry.py +389 -0
  365. package/scripts/search_output.py +606 -0
  366. package/scripts/search_pipeline.py +1077 -0
  367. package/scripts/search_rank.py +991 -0
  368. package/scripts/search_types.py +27 -12
  369. package/scripts/seek_locator.py +68 -0
  370. package/scripts/semantic_evidence.py +215 -0
  371. package/scripts/serp_guard.py +228 -0
  372. package/scripts/serp_kill_log.py +51 -0
  373. package/scripts/single_flight.py +120 -0
  374. package/scripts/social_engines/__init__.py +10 -0
  375. package/scripts/social_engines/bilibili_engine.py +131 -0
  376. package/scripts/social_engines/hackernews_engine.py +113 -0
  377. package/scripts/social_engines/reddit_engine.py +172 -0
  378. package/scripts/social_engines/twitter_engine.py +397 -0
  379. package/scripts/social_engines/v2ex_engine.py +101 -0
  380. package/scripts/social_engines/weibo_engine.py +128 -0
  381. package/scripts/social_engines/xiaohongshu_engine.py +137 -0
  382. package/scripts/social_engines/zhihu_engine.py +139 -0
  383. package/scripts/social_research.py +201 -0
  384. package/scripts/sogou_weixin_browser.py +318 -0
  385. package/scripts/source_ledger.py +249 -0
  386. package/scripts/stage_timing.py +58 -0
  387. package/scripts/stats_cli.py +95 -0
  388. package/scripts/straggler_policy.py +60 -0
  389. package/scripts/stylometry_detector.py +231 -0
  390. package/scripts/sync_backends.py +353 -0
  391. package/scripts/sync_installs.py +29 -0
  392. package/scripts/template_cli.py +127 -0
  393. package/scripts/text_lexicon.py +72 -0
  394. package/scripts/tfidf_router.py +109 -37
  395. package/scripts/time_utils.py +233 -0
  396. package/scripts/topic_research_profiles.py +643 -0
  397. package/scripts/train.py +737 -0
  398. package/scripts/tweet.py +596 -0
  399. package/scripts/url_canon.py +217 -0
  400. package/scripts/url_optimize.py +56 -0
  401. package/scripts/url_safety.py +236 -0
  402. package/scripts/usage_log.py +116 -0
  403. package/scripts/usage_log_clean.py +113 -0
  404. package/scripts/v2ex_nodes.py +311 -0
  405. package/scripts/variant_recall.py +188 -0
  406. package/scripts/watch.py +205 -0
  407. package/scripts/wechat_article.py +258 -0
  408. package/scripts/wide_research.py +402 -0
  409. package/scripts/wx.py +349 -0
  410. package/scripts/x_article_fetch.py +141 -0
  411. package/scripts/x_search.py +234 -0
  412. package/scripts/x_trending.py +189 -0
  413. package/scripts/yaml_load.py +67 -0
  414. package/sub-skills/ego-search/SKILL.md +253 -0
  415. package/sub-skills/ego-search/references/browser-runtime.md +43 -0
  416. package/sub-skills/ego-search/references/install.md +67 -0
  417. package/sub-skills/ego-search/references/original-ego-upgrade.md +51 -0
  418. package/sub-skills/ego-search/scripts/ego_search.py +800 -0
  419. package/sub-skills/ego-search/scripts/merge.py +226 -0
  420. package/sub-skills/ego-search/scripts/quality.py +64 -0
  421. package/sub-skills/ego-search/scripts/runtime.py +172 -0
  422. package/sub-skills/ego-search/scripts/safety.py +109 -0
  423. package/sub-skills/ego-search/scripts/serp_spec.py +109 -0
  424. package/sub-skills/ego-search/scripts/webbridge_adapter.py +374 -0
  425. package/sub-skills/ego-search/tests/test_query_normalize.py +68 -0
  426. package/sub-skills/js-run/SKILL.md +67 -0
  427. package/sub-skills/js-run/scripts/jsrun.py +112 -0
  428. package/sub-skills/js-run/scripts/shim.js +188 -0
  429. package/sub-skills/js-run/tests/fixtures/challenge_like.js +27 -0
  430. package/sub-skills/js-run/tests/test_jsrun.py +165 -0
  431. package/sub-skills/local-search/SKILL.md +50 -53
  432. package/sub-skills/local-search/bm25.py +162 -0
  433. package/sub-skills/local-search/config.yaml +152 -55
  434. package/sub-skills/local-search/engine_registry.py +91 -26
  435. package/sub-skills/local-search/{health_check.py → local_health_check.py} +140 -10
  436. package/sub-skills/local-search/local_search_adapter.py +13 -2
  437. package/sub-skills/local-search/parse_maps.yaml +40 -42
  438. package/sub-skills/local-search/search_v3.py +1182 -65
  439. package/sub-skills/local-search/smart_router.py +47 -7
  440. package/sub-skills/local-seek/SKILL.md +110 -0
  441. package/sub-skills/local-seek/config/domains.yaml +20 -0
  442. package/sub-skills/local-seek/references/auto-behaviors.md +24 -0
  443. package/sub-skills/local-seek/references/fd-mdfind-recipes.md +62 -0
  444. package/sub-skills/local-seek/references/git-integration.md +54 -0
  445. package/sub-skills/local-seek/references/remote-handoff.md +46 -0
  446. package/sub-skills/local-seek/references/rg-recipes.md +96 -0
  447. package/sub-skills/local-seek/references/strategies.md +52 -0
  448. package/sub-skills/local-seek/references/structural-search.md +59 -0
  449. package/sub-skills/local-seek/scripts/eval_rank.py +216 -0
  450. package/sub-skills/local-seek/scripts/eval_seek.py +224 -0
  451. package/sub-skills/local-seek/scripts/seek.py +1465 -0
  452. package/sub-skills/local-seek/scripts/seek_frecency.py +126 -0
  453. package/sub-skills/local-seek/scripts/seek_fts.py +430 -0
  454. package/sub-skills/local-seek/scripts/seek_rank.py +193 -0
  455. package/sub-skills/local-seek/tests/test_content_rank.py +222 -0
  456. package/sub-skills/local-seek/tests/test_determinism_20261006.py +145 -0
  457. package/sub-skills/local-seek/tests/test_noise_tier.py +101 -0
  458. package/sub-skills/local-seek/tests/test_pcre2_probe.py +136 -0
  459. package/sub-skills/local-seek/tests/test_rank_pinyin.py +77 -0
  460. package/sub-skills/local-seek/tests/test_regression_20261003.py +169 -0
  461. package/sub-skills/local-seek/tests/test_regression_20261006.py +146 -0
  462. package/sub-skills/local-seek/tests/test_seek_degradation.py +111 -0
  463. package/sub-skills/local-seek/tests/test_seek_fts.py +313 -0
@@ -0,0 +1,298 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ query_variants.py — 无 LLM 查询变体生成(深度研究多路召回)
4
+
5
+ 生成与原查询「真正不同」的多个检索变体,弥补单查询漏检。
6
+ 策略:
7
+ 1. 原查询(恒保留)
8
+ 2. 问句化(陈述 → 问题)
9
+ 3. 概念扩展(近义/上位概念替换)
10
+ 4. 反方观点(找反方/批评视角)
11
+ 5. 范围调整(短查询加限定 / 长查询去限定词)
12
+ 6. 缩写与全称互换
13
+
14
+ 纯规则实现,无外部依赖,中英双语。
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import re
20
+ from cli_io import dumps
21
+
22
+ # 概念扩展映射(不只同义词——相关表述框架)
23
+ CONCEPT_MAP = {
24
+ # 技术
25
+ "ai": ["artificial intelligence", "machine learning", "deep learning"],
26
+ "ml": ["machine learning", "statistical learning"],
27
+ "llm": ["large language model", "foundation model"],
28
+ "api": ["interface", "integration", "SDK", "endpoint"],
29
+ "saas": ["software as a service", "cloud software"],
30
+ "devops": ["deployment automation", "CI/CD", "infrastructure as code"],
31
+ "kubernetes": ["k8s", "container orchestration"],
32
+ "docker": ["containerization", "container runtime"],
33
+ "database": ["data store", "persistence layer"],
34
+ "microservices": ["service-oriented architecture", "distributed systems"],
35
+ # 商业
36
+ "roi": ["return on investment", "cost-benefit", "payback period"],
37
+ "kpi": ["key performance indicator", "metric", "benchmark"],
38
+ "b2b": ["business to business", "enterprise sales"],
39
+ "b2c": ["business to consumer", "consumer market"],
40
+ "revenue": ["income", "sales", "top line"],
41
+ "profit": ["margin", "bottom line", "earnings"],
42
+ "strategy": ["approach", "framework", "playbook"],
43
+ "market": ["industry", "sector", "vertical"],
44
+ # 制造
45
+ "manufacturing": ["production", "fabrication", "industrial"],
46
+ "supply chain": ["logistics", "procurement", "sourcing"],
47
+ # 金融
48
+ "stock": ["equity", "shares", "securities"],
49
+ "bond": ["fixed income", "debt instrument", "treasury"],
50
+ "crypto": ["cryptocurrency", "digital assets", "blockchain"],
51
+ "inflation": ["price increases", "purchasing power", "CPI"],
52
+ "interest rate": ["fed funds rate", "monetary policy", "yield"],
53
+ # 中文
54
+ "人工智能": ["AI", "机器学习", "深度学习", "大模型"],
55
+ "大模型": ["大语言模型", "LLM", "基础模型", "AI"],
56
+ "算法": ["模型", "方法", "框架"],
57
+ "机器人": ["自动化", "智能体", "Agent"],
58
+ "股票": ["股价", "行情", "证券", "equity"],
59
+ "基金": ["ETF", "公募", "理财"],
60
+ "区块链": ["加密货币", "分布式账本", "比特币"],
61
+ "云计算": ["云服务", "SaaS", "PaaS"],
62
+ "开源": ["开放源码", "open source"],
63
+ "软件": ["应用程序", "系统", "工具"],
64
+ "硬件": ["芯片", "处理器", "设备"],
65
+ }
66
+
67
+ QUESTION_PREFIXES = [
68
+ "what is", "how does", "why is", "what are the benefits of",
69
+ "what are the risks of", "how to", "what is the future of",
70
+ ]
71
+
72
+ OPPOSITION_TRIGGERS = {
73
+ "best": "worst problems with",
74
+ "benefits": "risks drawbacks of",
75
+ "advantages": "disadvantages limitations of",
76
+ "why": "why not criticism of",
77
+ "success": "failure case study",
78
+ "growing": "declining stagnating",
79
+ "popular": "overrated criticism",
80
+ "recommended": "alternatives to avoid",
81
+ "safe": "risks dangers of",
82
+ "cheap": "hidden costs of",
83
+ "easy": "challenges difficulties of",
84
+ "fast": "slow problems with",
85
+ "good": "problems criticism of",
86
+ "pros": "cons drawbacks",
87
+ # 中文反方触发词
88
+ "推荐": "吐槽 避坑 负面评价",
89
+ "优势": "劣势 缺点 局限",
90
+ "好处": "风险 坏处 缺点",
91
+ "为什么": "为什么不 反对 批评",
92
+ "最佳": "最差 问题 坑",
93
+ "安全": "风险 隐患 危险",
94
+ "值得": "不值得 翻车 后悔",
95
+ }
96
+
97
+ # 长查询限定词(范围调整时移除)
98
+ QUALIFIERS = {
99
+ "latest", "best", "top", "new", "recent", "current", "modern",
100
+ "2024", "2025", "2026", "today", "now", "ultimate", "complete",
101
+ "comprehensive", "definitive", "essential",
102
+ "最新", "最好", "最热", "当前", "现在", "近期", "最全",
103
+ }
104
+
105
+ # 缩写/全称互换
106
+ ACRONYM_MAP = {
107
+ "ai": "artificial intelligence",
108
+ "ml": "machine learning",
109
+ "nlp": "natural language processing",
110
+ "llm": "large language model",
111
+ "api": "application programming interface",
112
+ "sdk": "software development kit",
113
+ "ui": "user interface",
114
+ "ux": "user experience",
115
+ "db": "database",
116
+ "oss": "open source software",
117
+ "saas": "software as a service",
118
+ "crm": "customer relationship management",
119
+ "erp": "enterprise resource planning",
120
+ "kpi": "key performance indicator",
121
+ "ipo": "initial public offering",
122
+ "cto": "chief technology officer",
123
+ "ceo": "chief executive officer",
124
+ }
125
+
126
+
127
+ def generate_query_variations(original_query: str) -> list[str]:
128
+ """生成 3-5 个真正不同的查询变体(含原查询)。"""
129
+ if not original_query or not original_query.strip():
130
+ return []
131
+ original = original_query.strip()
132
+ variations = [original]
133
+ query_lower = original.lower()
134
+ words = query_lower.split()
135
+
136
+ # 策略 2:问句化
137
+ question = _to_question(query_lower, words)
138
+ if question and question.lower() != query_lower:
139
+ variations.append(question)
140
+
141
+ # 策略 3:概念扩展
142
+ expanded = _expand_concepts(original, words)
143
+ if expanded and expanded.lower() != query_lower:
144
+ variations.append(expanded)
145
+
146
+ # 策略 4:反方观点
147
+ opposing = _opposing_viewpoint(original, query_lower, words)
148
+ if opposing and opposing.lower() != query_lower:
149
+ variations.append(opposing)
150
+
151
+ # 策略 5:范围调整
152
+ scoped = _adjust_scope(original, query_lower, words)
153
+ if scoped and scoped.lower() != query_lower:
154
+ variations.append(scoped)
155
+
156
+ # 策略 6:缩写/全称互换
157
+ expanded_acronym = _expand_acronym(original, query_lower)
158
+ if expanded_acronym and expanded_acronym.lower() != query_lower:
159
+ variations.append(expanded_acronym)
160
+
161
+ # 去重(大小写不敏感)
162
+ seen = set()
163
+ unique = []
164
+ for v in variations:
165
+ key = v.strip().lower()
166
+ if key not in seen:
167
+ seen.add(key)
168
+ unique.append(v)
169
+
170
+ return unique[:6]
171
+
172
+
173
+ def _to_question(query: str, words: list[str]) -> str | None:
174
+ """陈述 → 问题形式。"""
175
+ if query.endswith("?") or words[0] in (
176
+ "how", "what", "why", "when", "where", "who", "which", "is", "are",
177
+ "can", "do", "does",
178
+ ):
179
+ return None
180
+
181
+ # 英文问句壳只对纯拉丁查询生成:套在中文实体上(「what is 贵州茅台
182
+ # 2024年 年报 and how does it work」)对英文引擎是噪声、对中文引擎是
183
+ # 无效壳,实测占掉 2/4 子查询槽位。中文语义(是什么/怎么用)由
184
+ # research_expand 的领域模板与工作包承担。
185
+ if any("\u4e00" <= c <= "\u9fff" for c in query):
186
+ return None
187
+
188
+ # 动作类 → "how to"
189
+ action_words = {"install", "setup", "configure", "build", "create", "deploy",
190
+ "fix", "solve", "debug", "optimize", "improve", "migrate"}
191
+ if words[0] in action_words or (len(words) > 1 and words[1] in action_words):
192
+ return f"how to {query}"
193
+
194
+ # 名词短语 → "what is ... and how does it work"
195
+ if len(words) <= 4:
196
+ return f"what is {query} and how does it work"
197
+
198
+ # 长查询 → "why"
199
+ return f"why {query}"
200
+
201
+
202
+ def _expand_concepts(original: str, words: list[str]) -> str | None:
203
+ """概念扩展:替换为上位/替代概念。"""
204
+ result = original
205
+ expanded = False
206
+
207
+ for word in words:
208
+ if word in CONCEPT_MAP:
209
+ alternatives = CONCEPT_MAP[word]
210
+ replacement = alternatives[0]
211
+ result = re.sub(r"\b" + re.escape(word) + r"\b", replacement,
212
+ result, count=1, flags=re.IGNORECASE)
213
+ expanded = True
214
+ break
215
+
216
+ if not expanded:
217
+ for phrase, alternatives in CONCEPT_MAP.items():
218
+ if " " in phrase and phrase.lower() in original.lower():
219
+ result = original.lower().replace(phrase, alternatives[0], 1)
220
+ expanded = True
221
+ break
222
+
223
+ return result if expanded else None
224
+
225
+
226
+ def _opposing_viewpoint(original: str, query_lower: str,
227
+ words: list[str]) -> str | None:
228
+ """反方观点生成。"""
229
+ for trigger, opposition in OPPOSITION_TRIGGERS.items():
230
+ if trigger in words:
231
+ return query_lower.replace(trigger, opposition, 1)
232
+
233
+ # 通用 criticism 壳与 _to_question 同理:不套中文实体(英文模板对
234
+ # 中文查询是无效壳)。触发词命中(词替换)保留——产出与查询同语言。
235
+ if any("\u4e00" <= c <= "\u9fff" for c in original):
236
+ return None
237
+ if len(words) >= 2:
238
+ return f"criticism problems with {original}"
239
+ return None
240
+
241
+
242
+ def _adjust_scope(original: str, query_lower: str, words: list[str]) -> str | None:
243
+ """范围调整:短查询加限定,长查询去限定词。"""
244
+ # 短查询 → 加时间限定;限定词与查询同语言(英文壳套中文实体是无效变体)
245
+ if len(words) <= 2:
246
+ if any("\u4e00" <= c <= "\u9fff" for c in original):
247
+ return f"{original} 最新进展"
248
+ return f"{original} in 2026 latest developments"
249
+
250
+ # 长查询 → 去掉限定词(最新/最热等)
251
+ narrowed_words = [w for w in words if w not in QUALIFIERS]
252
+ if len(narrowed_words) < len(words) and len(narrowed_words) >= 2:
253
+ return " ".join(narrowed_words)
254
+
255
+ # 深度补充
256
+ if not any(w in words for w in ("research", "study", "analysis", "paper",
257
+ "academic", "研究", "综述", "分析", "报告")):
258
+ return f"{original} research analysis"
259
+ return None
260
+
261
+
262
+ def _expand_acronym(original: str, query_lower: str) -> str | None:
263
+ """缩写 → 全称。"""
264
+ for word in query_lower.split():
265
+ clean = word.strip(".,;:()[]")
266
+ if clean in ACRONYM_MAP:
267
+ return re.sub(r"\b" + re.escape(clean) + r"\b",
268
+ ACRONYM_MAP[clean], original, count=1,
269
+ flags=re.IGNORECASE)
270
+ return None
271
+
272
+
273
+ # ── CLI ────────────────────────────────────────────────────────────────────
274
+
275
+ if __name__ == "__main__":
276
+ import argparse
277
+ import json
278
+ import sys
279
+
280
+ p = argparse.ArgumentParser(description="Argo 查询变体生成(无 LLM 多路召回)")
281
+ p.add_argument("query", nargs="?", default=None, help="原始查询")
282
+ p.add_argument("--stdin", action="store_true", help="从 stdin 读取")
283
+ p.add_argument("--json", action="store_true", help="JSON 输出")
284
+ args = p.parse_args()
285
+
286
+ q = args.query
287
+ if args.stdin:
288
+ q = sys.stdin.read().strip()
289
+ if not q:
290
+ p.error("需要查询或 --stdin")
291
+
292
+ variants = generate_query_variations(q)
293
+ if args.json:
294
+ print(dumps({"original": q, "variants": variants}))
295
+ else:
296
+ print(f"原查询:{q}")
297
+ for i, v in enumerate(variants, 1):
298
+ print(f" {i}. {v}")