paper-search-cli 0.1.0

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 (166) hide show
  1. package/.env.example +165 -0
  2. package/LICENSE +21 -0
  3. package/README-sc.md +642 -0
  4. package/README.md +642 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +637 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/config/ConfigService.d.ts +26 -0
  10. package/dist/config/ConfigService.d.ts.map +1 -0
  11. package/dist/config/ConfigService.js +145 -0
  12. package/dist/config/ConfigService.js.map +1 -0
  13. package/dist/config/constants.d.ts +140 -0
  14. package/dist/config/constants.d.ts.map +1 -0
  15. package/dist/config/constants.js +93 -0
  16. package/dist/config/constants.js.map +1 -0
  17. package/dist/core/diagnostics.d.ts +43 -0
  18. package/dist/core/diagnostics.d.ts.map +1 -0
  19. package/dist/core/diagnostics.js +544 -0
  20. package/dist/core/diagnostics.js.map +1 -0
  21. package/dist/core/handleToolCall.d.ts +8 -0
  22. package/dist/core/handleToolCall.d.ts.map +1 -0
  23. package/dist/core/handleToolCall.js +440 -0
  24. package/dist/core/handleToolCall.js.map +1 -0
  25. package/dist/core/schemas.d.ts +454 -0
  26. package/dist/core/schemas.d.ts.map +1 -0
  27. package/dist/core/schemas.js +322 -0
  28. package/dist/core/schemas.js.map +1 -0
  29. package/dist/core/searchers.d.ts +45 -0
  30. package/dist/core/searchers.d.ts.map +1 -0
  31. package/dist/core/searchers.js +73 -0
  32. package/dist/core/searchers.js.map +1 -0
  33. package/dist/core/tools.d.ts +7 -0
  34. package/dist/core/tools.d.ts.map +1 -0
  35. package/dist/core/tools.js +640 -0
  36. package/dist/core/tools.js.map +1 -0
  37. package/dist/models/Paper.d.ts +64 -0
  38. package/dist/models/Paper.d.ts.map +1 -0
  39. package/dist/models/Paper.js +70 -0
  40. package/dist/models/Paper.js.map +1 -0
  41. package/dist/platforms/ArxivSearcher.d.ts +64 -0
  42. package/dist/platforms/ArxivSearcher.d.ts.map +1 -0
  43. package/dist/platforms/ArxivSearcher.js +531 -0
  44. package/dist/platforms/ArxivSearcher.js.map +1 -0
  45. package/dist/platforms/BioRxivSearcher.d.ts +47 -0
  46. package/dist/platforms/BioRxivSearcher.d.ts.map +1 -0
  47. package/dist/platforms/BioRxivSearcher.js +196 -0
  48. package/dist/platforms/BioRxivSearcher.js.map +1 -0
  49. package/dist/platforms/CORESearcher.d.ts +16 -0
  50. package/dist/platforms/CORESearcher.d.ts.map +1 -0
  51. package/dist/platforms/CORESearcher.js +148 -0
  52. package/dist/platforms/CORESearcher.js.map +1 -0
  53. package/dist/platforms/CrossrefSearcher.d.ts +34 -0
  54. package/dist/platforms/CrossrefSearcher.d.ts.map +1 -0
  55. package/dist/platforms/CrossrefSearcher.js +339 -0
  56. package/dist/platforms/CrossrefSearcher.js.map +1 -0
  57. package/dist/platforms/EuropePMCSearcher.d.ts +20 -0
  58. package/dist/platforms/EuropePMCSearcher.d.ts.map +1 -0
  59. package/dist/platforms/EuropePMCSearcher.js +173 -0
  60. package/dist/platforms/EuropePMCSearcher.js.map +1 -0
  61. package/dist/platforms/GoogleScholarSearcher.d.ts +77 -0
  62. package/dist/platforms/GoogleScholarSearcher.d.ts.map +1 -0
  63. package/dist/platforms/GoogleScholarSearcher.js +262 -0
  64. package/dist/platforms/GoogleScholarSearcher.js.map +1 -0
  65. package/dist/platforms/IACRSearcher.d.ts +51 -0
  66. package/dist/platforms/IACRSearcher.d.ts.map +1 -0
  67. package/dist/platforms/IACRSearcher.js +339 -0
  68. package/dist/platforms/IACRSearcher.js.map +1 -0
  69. package/dist/platforms/OpenAIRESearcher.d.ts +22 -0
  70. package/dist/platforms/OpenAIRESearcher.d.ts.map +1 -0
  71. package/dist/platforms/OpenAIRESearcher.js +223 -0
  72. package/dist/platforms/OpenAIRESearcher.js.map +1 -0
  73. package/dist/platforms/OpenAlexSearcher.d.ts +14 -0
  74. package/dist/platforms/OpenAlexSearcher.d.ts.map +1 -0
  75. package/dist/platforms/OpenAlexSearcher.js +114 -0
  76. package/dist/platforms/OpenAlexSearcher.js.map +1 -0
  77. package/dist/platforms/PMCSearcher.d.ts +20 -0
  78. package/dist/platforms/PMCSearcher.d.ts.map +1 -0
  79. package/dist/platforms/PMCSearcher.js +177 -0
  80. package/dist/platforms/PMCSearcher.js.map +1 -0
  81. package/dist/platforms/PaperSource.d.ts +143 -0
  82. package/dist/platforms/PaperSource.d.ts.map +1 -0
  83. package/dist/platforms/PaperSource.js +125 -0
  84. package/dist/platforms/PaperSource.js.map +1 -0
  85. package/dist/platforms/PubMedSearcher.d.ts +104 -0
  86. package/dist/platforms/PubMedSearcher.d.ts.map +1 -0
  87. package/dist/platforms/PubMedSearcher.js +422 -0
  88. package/dist/platforms/PubMedSearcher.js.map +1 -0
  89. package/dist/platforms/SciHubSearcher.d.ts +66 -0
  90. package/dist/platforms/SciHubSearcher.d.ts.map +1 -0
  91. package/dist/platforms/SciHubSearcher.js +398 -0
  92. package/dist/platforms/SciHubSearcher.js.map +1 -0
  93. package/dist/platforms/ScienceDirectSearcher.d.ts +42 -0
  94. package/dist/platforms/ScienceDirectSearcher.d.ts.map +1 -0
  95. package/dist/platforms/ScienceDirectSearcher.js +326 -0
  96. package/dist/platforms/ScienceDirectSearcher.js.map +1 -0
  97. package/dist/platforms/ScopusSearcher.d.ts +43 -0
  98. package/dist/platforms/ScopusSearcher.d.ts.map +1 -0
  99. package/dist/platforms/ScopusSearcher.js +364 -0
  100. package/dist/platforms/ScopusSearcher.js.map +1 -0
  101. package/dist/platforms/SemanticScholarSearcher.d.ts +96 -0
  102. package/dist/platforms/SemanticScholarSearcher.d.ts.map +1 -0
  103. package/dist/platforms/SemanticScholarSearcher.js +419 -0
  104. package/dist/platforms/SemanticScholarSearcher.js.map +1 -0
  105. package/dist/platforms/SpringerSearcher.d.ts +54 -0
  106. package/dist/platforms/SpringerSearcher.d.ts.map +1 -0
  107. package/dist/platforms/SpringerSearcher.js +407 -0
  108. package/dist/platforms/SpringerSearcher.js.map +1 -0
  109. package/dist/platforms/UnpaywallSearcher.d.ts +18 -0
  110. package/dist/platforms/UnpaywallSearcher.d.ts.map +1 -0
  111. package/dist/platforms/UnpaywallSearcher.js +115 -0
  112. package/dist/platforms/UnpaywallSearcher.js.map +1 -0
  113. package/dist/platforms/WebOfScienceSearcher.d.ts +111 -0
  114. package/dist/platforms/WebOfScienceSearcher.d.ts.map +1 -0
  115. package/dist/platforms/WebOfScienceSearcher.js +500 -0
  116. package/dist/platforms/WebOfScienceSearcher.js.map +1 -0
  117. package/dist/platforms/WileySearcher.d.ts +44 -0
  118. package/dist/platforms/WileySearcher.d.ts.map +1 -0
  119. package/dist/platforms/WileySearcher.js +148 -0
  120. package/dist/platforms/WileySearcher.js.map +1 -0
  121. package/dist/services/CitationService.d.ts +66 -0
  122. package/dist/services/CitationService.d.ts.map +1 -0
  123. package/dist/services/CitationService.js +237 -0
  124. package/dist/services/CitationService.js.map +1 -0
  125. package/dist/services/MultiSourceSearchService.d.ts +19 -0
  126. package/dist/services/MultiSourceSearchService.d.ts.map +1 -0
  127. package/dist/services/MultiSourceSearchService.js +96 -0
  128. package/dist/services/MultiSourceSearchService.js.map +1 -0
  129. package/dist/services/OpenAccessFallbackService.d.ts +20 -0
  130. package/dist/services/OpenAccessFallbackService.d.ts.map +1 -0
  131. package/dist/services/OpenAccessFallbackService.js +124 -0
  132. package/dist/services/OpenAccessFallbackService.js.map +1 -0
  133. package/dist/utils/ErrorHandler.d.ts +99 -0
  134. package/dist/utils/ErrorHandler.d.ts.map +1 -0
  135. package/dist/utils/ErrorHandler.js +266 -0
  136. package/dist/utils/ErrorHandler.js.map +1 -0
  137. package/dist/utils/Logger.d.ts +6 -0
  138. package/dist/utils/Logger.d.ts.map +1 -0
  139. package/dist/utils/Logger.js +26 -0
  140. package/dist/utils/Logger.js.map +1 -0
  141. package/dist/utils/PDFExtractor.d.ts +34 -0
  142. package/dist/utils/PDFExtractor.d.ts.map +1 -0
  143. package/dist/utils/PDFExtractor.js +130 -0
  144. package/dist/utils/PDFExtractor.js.map +1 -0
  145. package/dist/utils/PdfDownload.d.ts +7 -0
  146. package/dist/utils/PdfDownload.d.ts.map +1 -0
  147. package/dist/utils/PdfDownload.js +52 -0
  148. package/dist/utils/PdfDownload.js.map +1 -0
  149. package/dist/utils/QuotaManager.d.ts +32 -0
  150. package/dist/utils/QuotaManager.d.ts.map +1 -0
  151. package/dist/utils/QuotaManager.js +95 -0
  152. package/dist/utils/QuotaManager.js.map +1 -0
  153. package/dist/utils/RateLimiter.d.ts +50 -0
  154. package/dist/utils/RateLimiter.d.ts.map +1 -0
  155. package/dist/utils/RateLimiter.js +121 -0
  156. package/dist/utils/RateLimiter.js.map +1 -0
  157. package/dist/utils/RequestCache.d.ts +26 -0
  158. package/dist/utils/RequestCache.d.ts.map +1 -0
  159. package/dist/utils/RequestCache.js +66 -0
  160. package/dist/utils/RequestCache.js.map +1 -0
  161. package/dist/utils/SecurityUtils.d.ts +80 -0
  162. package/dist/utils/SecurityUtils.d.ts.map +1 -0
  163. package/dist/utils/SecurityUtils.js +357 -0
  164. package/dist/utils/SecurityUtils.js.map +1 -0
  165. package/package.json +111 -0
  166. package/skills/paper-search/SKILL.md +192 -0
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Web of Science API集成模块
3
+ * 支持 Web of Science Starter API 和 Web of Science Researcher API
4
+ */
5
+ import { Paper } from '../models/Paper.js';
6
+ import { PaperSource, SearchOptions, DownloadOptions, PlatformCapabilities } from './PaperSource.js';
7
+ interface WoSSearchOptions extends SearchOptions {
8
+ /** 数据库选择 */
9
+ databases?: string[];
10
+ /** 文档类型过滤 (Article, Review, etc.) */
11
+ documentTypes?: string[];
12
+ /** 语言过滤 */
13
+ languages?: string[];
14
+ /** ISSN/ISBN过滤 */
15
+ issn?: string;
16
+ /** 卷号过滤 */
17
+ volume?: string;
18
+ /** 页码过滤 */
19
+ page?: string;
20
+ /** 期号过滤 */
21
+ issue?: string;
22
+ /** PubMed ID过滤 */
23
+ pmid?: string;
24
+ /** DOI过滤 */
25
+ doi?: string;
26
+ }
27
+ export declare class WebOfScienceSearcher extends PaperSource {
28
+ private apiUrl;
29
+ private apiVersion;
30
+ private fallbackAttempted;
31
+ private readonly preferredVersion;
32
+ private readonly rateLimiter;
33
+ private readonly quotaManager;
34
+ constructor(apiKey?: string, apiVersion?: string);
35
+ /**
36
+ * Switch to fallback API version (v2 -> v1 or v1 -> v2)
37
+ */
38
+ private switchToFallbackVersion;
39
+ /**
40
+ * Reset fallback state (call after successful request)
41
+ * This allows the next request to try the preferred version first
42
+ */
43
+ private resetFallbackState;
44
+ getCapabilities(): PlatformCapabilities;
45
+ /**
46
+ * 获取论文的参考文献ID列表
47
+ */
48
+ getReferenceIds(uid: string): Promise<string[]>;
49
+ /**
50
+ * 获取引用此论文的文献ID列表
51
+ */
52
+ getCitationIds(uid: string): Promise<string[]>;
53
+ /**
54
+ * 获取论文详情(包含references和citations ID列表)
55
+ */
56
+ getPaperWithCitations(uid: string): Promise<Paper | null>;
57
+ /**
58
+ * 搜索Web of Science论文
59
+ */
60
+ search(query: string, options?: WoSSearchOptions): Promise<Paper[]>;
61
+ /**
62
+ * Web of Science 通常不支持直接PDF下载
63
+ */
64
+ downloadPdf(paperId: string, options?: DownloadOptions): Promise<string>;
65
+ /**
66
+ * Web of Science 通常不提供全文内容
67
+ */
68
+ readPaper(paperId: string, options?: DownloadOptions): Promise<string>;
69
+ /**
70
+ * 根据DOI获取论文详细信息
71
+ */
72
+ getPaperByDoi(doi: string): Promise<Paper | null>;
73
+ /**
74
+ * 获取论文被引统计
75
+ */
76
+ getCitationCount(paperId: string): Promise<number>;
77
+ /**
78
+ * 构建搜索查询参数
79
+ */
80
+ private buildSearchQuery;
81
+ /**
82
+ * 构建WOS格式的查询字符串
83
+ */
84
+ private buildWosQuery;
85
+ /**
86
+ * 转义WOS查询中的特殊字符
87
+ */
88
+ private escapeWosQuery;
89
+ /**
90
+ * 映射排序字段到WOS API格式
91
+ */
92
+ private mapSortField;
93
+ /**
94
+ * 解析搜索响应
95
+ */
96
+ private parseSearchResponse;
97
+ /**
98
+ * 解析单个WoS记录
99
+ */
100
+ private parseWoSRecord;
101
+ /**
102
+ * 发起API请求 - 支持自动版本降级
103
+ */
104
+ private makeApiRequest;
105
+ /**
106
+ * 验证API密钥
107
+ */
108
+ validateApiKey(): Promise<boolean>;
109
+ }
110
+ export {};
111
+ //# sourceMappingURL=WebOfScienceSearcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebOfScienceSearcher.d.ts","sourceRoot":"","sources":["../../src/platforms/WebOfScienceSearcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,EAAgB,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAQrG,UAAU,gBAAiB,SAAQ,aAAa;IAC9C,YAAY;IACZ,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW;IACX,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAoDD,qBAAa,oBAAqB,SAAQ,WAAW;IACnD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;gBAEhC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IA0BhD;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAe/B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAU1B,eAAe,IAAI,oBAAoB;IAWvC;;OAEG;IACG,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBrD;;OAEG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBpD;;OAEG;IACG,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IA8B/D;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAkB7E;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAI9E;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5E;;OAEG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAWvD;;OAEG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBxD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;IACH,OAAO,CAAC,aAAa;IA8FrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAUtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAa3B;;OAEG;IACH,OAAO,CAAC,cAAc;IA0DtB;;OAEG;YACW,cAAc;IAuE5B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAezC"}
@@ -0,0 +1,500 @@
1
+ /**
2
+ * Web of Science API集成模块
3
+ * 支持 Web of Science Starter API 和 Web of Science Researcher API
4
+ */
5
+ import axios from 'axios';
6
+ import { PaperFactory } from '../models/Paper.js';
7
+ import { PaperSource } from './PaperSource.js';
8
+ import { escapeQueryValue, validateQueryComplexity } from '../utils/SecurityUtils.js';
9
+ import { RateLimiter } from '../utils/RateLimiter.js';
10
+ import { ErrorHandler } from '../utils/ErrorHandler.js';
11
+ import { QuotaManager } from '../utils/QuotaManager.js';
12
+ import { TIMEOUTS, USER_AGENT } from '../config/constants.js';
13
+ import { logDebug, logWarn } from '../utils/Logger.js';
14
+ export class WebOfScienceSearcher extends PaperSource {
15
+ apiUrl;
16
+ apiVersion;
17
+ fallbackAttempted = false;
18
+ preferredVersion;
19
+ rateLimiter;
20
+ quotaManager;
21
+ constructor(apiKey, apiVersion) {
22
+ super('webofscience', 'https://api.clarivate.com/apis', apiKey);
23
+ // Priority: constructor param > env var > default 'v2'
24
+ this.preferredVersion = apiVersion || process.env.WOS_API_VERSION || 'v2';
25
+ this.apiVersion = this.preferredVersion;
26
+ this.apiUrl = `${this.baseUrl}/wos-starter/${this.apiVersion}`;
27
+ const rpsEnv = Number(process.env.WOS_RPS);
28
+ const requestsPerSecond = Number.isFinite(rpsEnv) && rpsEnv > 0 ? rpsEnv : 5;
29
+ const burstEnv = Number(process.env.WOS_BURST);
30
+ const burstCapacity = Number.isFinite(burstEnv) && burstEnv > 0 ? burstEnv : requestsPerSecond;
31
+ this.rateLimiter = new RateLimiter({
32
+ requestsPerSecond,
33
+ burstCapacity,
34
+ debug: process.env.NODE_ENV === 'development'
35
+ });
36
+ this.quotaManager = QuotaManager.getInstance();
37
+ this.quotaManager.registerPlatform('webofscience', {
38
+ dailyLimit: 5000,
39
+ envPrefix: 'WOS'
40
+ });
41
+ logDebug(`WoS API URL: ${this.apiUrl} (preferred: ${this.preferredVersion})`);
42
+ }
43
+ /**
44
+ * Switch to fallback API version (v2 -> v1 or v1 -> v2)
45
+ */
46
+ switchToFallbackVersion() {
47
+ if (this.fallbackAttempted) {
48
+ return false; // Already tried fallback
49
+ }
50
+ const fallbackVersion = this.apiVersion === 'v2' ? 'v1' : 'v2';
51
+ logWarn(`WoS API ${this.apiVersion} failed, switching to ${fallbackVersion}`);
52
+ this.apiVersion = fallbackVersion;
53
+ this.apiUrl = `${this.baseUrl}/wos-starter/${this.apiVersion}`;
54
+ this.fallbackAttempted = true;
55
+ return true;
56
+ }
57
+ /**
58
+ * Reset fallback state (call after successful request)
59
+ * This allows the next request to try the preferred version first
60
+ */
61
+ resetFallbackState() {
62
+ // Always reset on success, so next request can try preferred version
63
+ if (this.fallbackAttempted && this.apiVersion !== this.preferredVersion) {
64
+ // We're on fallback version, schedule return to preferred on next request
65
+ this.fallbackAttempted = false;
66
+ this.apiVersion = this.preferredVersion;
67
+ this.apiUrl = `${this.baseUrl}/wos-starter/${this.apiVersion}`;
68
+ }
69
+ }
70
+ getCapabilities() {
71
+ return {
72
+ search: true,
73
+ download: false,
74
+ fullText: false,
75
+ citations: true,
76
+ requiresApiKey: true,
77
+ supportedOptions: ['maxResults', 'year', 'author', 'journal', 'sortBy', 'sortOrder']
78
+ };
79
+ }
80
+ /**
81
+ * 获取论文的参考文献ID列表
82
+ */
83
+ async getReferenceIds(uid) {
84
+ if (!this.apiKey)
85
+ return [];
86
+ try {
87
+ const response = await this.makeApiRequest(`/documents/${uid}/references`, {
88
+ method: 'GET',
89
+ params: {
90
+ db: 'WOS',
91
+ limit: 50
92
+ }
93
+ });
94
+ const hits = response.data?.hits || [];
95
+ return hits.map((hit) => hit.uid).filter(Boolean);
96
+ }
97
+ catch (error) {
98
+ logDebug(`Error getting reference IDs for UT ${uid}:`, error);
99
+ return [];
100
+ }
101
+ }
102
+ /**
103
+ * 获取引用此论文的文献ID列表
104
+ */
105
+ async getCitationIds(uid) {
106
+ if (!this.apiKey)
107
+ return [];
108
+ try {
109
+ const response = await this.makeApiRequest(`/documents/${uid}/citing`, {
110
+ method: 'GET',
111
+ params: {
112
+ db: 'WOS',
113
+ limit: 100
114
+ }
115
+ });
116
+ const hits = response.data?.hits || [];
117
+ return hits.map((hit) => hit.uid).filter(Boolean);
118
+ }
119
+ catch (error) {
120
+ logDebug(`Error getting citation IDs for UT ${uid}:`, error);
121
+ return [];
122
+ }
123
+ }
124
+ /**
125
+ * 获取论文详情(包含references和citations ID列表)
126
+ */
127
+ async getPaperWithCitations(uid) {
128
+ try {
129
+ const query = uid.includes('/') ? `DO="${uid}"` : `UT="${uid}"`;
130
+ const results = await this.search(query, { maxResults: 1 });
131
+ if (results.length === 0)
132
+ return null;
133
+ const paper = results[0];
134
+ const paperUid = paper.extra?.uid;
135
+ if (paperUid) {
136
+ const [refIds, citIds] = await Promise.all([
137
+ this.getReferenceIds(paperUid),
138
+ this.getCitationIds(paperUid)
139
+ ]);
140
+ paper.references = refIds;
141
+ paper.extra = {
142
+ ...paper.extra,
143
+ citationIds: citIds
144
+ };
145
+ }
146
+ return paper;
147
+ }
148
+ catch (error) {
149
+ logDebug('Error getting paper with citations:', error);
150
+ return null;
151
+ }
152
+ }
153
+ /**
154
+ * 搜索Web of Science论文
155
+ */
156
+ async search(query, options = {}) {
157
+ if (!this.apiKey) {
158
+ throw new Error('Web of Science API key is required');
159
+ }
160
+ try {
161
+ const searchParams = this.buildSearchQuery(query, options);
162
+ const response = await this.makeApiRequest('/documents', {
163
+ method: 'GET',
164
+ params: searchParams
165
+ });
166
+ return this.parseSearchResponse(response.data);
167
+ }
168
+ catch (error) {
169
+ this.handleHttpError(error, 'search');
170
+ }
171
+ }
172
+ /**
173
+ * Web of Science 通常不支持直接PDF下载
174
+ */
175
+ async downloadPdf(paperId, options) {
176
+ throw new Error('Web of Science does not support direct PDF download. Please use the DOI or URL to access the paper through the publisher.');
177
+ }
178
+ /**
179
+ * Web of Science 通常不提供全文内容
180
+ */
181
+ async readPaper(paperId, options) {
182
+ throw new Error('Web of Science does not provide full-text content. Only bibliographic metadata and abstracts are available.');
183
+ }
184
+ /**
185
+ * 根据DOI获取论文详细信息
186
+ */
187
+ async getPaperByDoi(doi) {
188
+ try {
189
+ const query = `DO="${doi}"`;
190
+ const results = await this.search(query, { maxResults: 1 });
191
+ return results.length > 0 ? results[0] : null;
192
+ }
193
+ catch (error) {
194
+ logDebug('Error getting paper by DOI from Web of Science:', error);
195
+ return null;
196
+ }
197
+ }
198
+ /**
199
+ * 获取论文被引统计
200
+ */
201
+ async getCitationCount(paperId) {
202
+ if (!this.apiKey) {
203
+ throw new Error('Web of Science API key is required');
204
+ }
205
+ try {
206
+ const response = await this.makeApiRequest(`/documents/${paperId}`, {
207
+ method: 'GET'
208
+ });
209
+ const record = response.data?.Data?.[0];
210
+ const citationData = record?.dynamic_data?.citation_related?.tc_list?.silo_tc;
211
+ return citationData ? parseInt(citationData.local_count, 10) : 0;
212
+ }
213
+ catch (error) {
214
+ logDebug('Error getting citation count:', error);
215
+ return 0;
216
+ }
217
+ }
218
+ /**
219
+ * 构建搜索查询参数
220
+ */
221
+ buildSearchQuery(query, options) {
222
+ // 构建WOS查询字符串 - 支持多主题和复杂查询
223
+ let formattedQuery = this.buildWosQuery(query, options);
224
+ const params = {
225
+ q: formattedQuery,
226
+ db: options.databases?.join(',') || 'WOS',
227
+ limit: Math.min(options.maxResults || 10, 100), // WOS API限制最大100条
228
+ page: 1
229
+ };
230
+ // 添加排序参数 - 使用正确的API参数名
231
+ if (options.sortBy) {
232
+ const sortField = this.mapSortField(options.sortBy);
233
+ if (sortField) {
234
+ const direction = (options.sortOrder || 'desc').toLowerCase() === 'asc' ? 'ASC' : 'DESC';
235
+ params.sortField = `${sortField} ${direction}`;
236
+ }
237
+ }
238
+ return params;
239
+ }
240
+ /**
241
+ * 构建WOS格式的查询字符串
242
+ */
243
+ buildWosQuery(query, options) {
244
+ const queryParts = [];
245
+ // Validate query complexity first
246
+ const complexityCheck = validateQueryComplexity(query, {
247
+ maxLength: 1000,
248
+ maxBooleanOperators: 10
249
+ });
250
+ if (!complexityCheck.valid) {
251
+ throw new Error(complexityCheck.error);
252
+ }
253
+ // 处理主题搜索 - 支持多个关键词
254
+ if (query && query.trim()) {
255
+ // 检查是否已经包含WOS字段标签
256
+ // Supported field tags: TI, IS, SO, VL, PG, CS, PY, FPY, DOP, AU, AI, UT, DO, DT, PMID, OG, TS, SUR
257
+ const wosFieldTags = ['TS=', 'TI=', 'AU=', 'SO=', 'PY=', 'DO=', 'IS=', 'VL=', 'PG=', 'CS=',
258
+ 'DT=', 'PMID=', 'FPY=', 'DOP=', 'AI=', 'UT=', 'OG=', 'SUR='];
259
+ const hasFieldTag = wosFieldTags.some(tag => query.toUpperCase().includes(tag));
260
+ if (hasFieldTag) {
261
+ // 用户提供了带字段标签的查询,直接使用(不进行转义)
262
+ queryParts.push(query);
263
+ }
264
+ else {
265
+ // 简单查询,使用TS(Topic)字段
266
+ const escapedQuery = escapeQueryValue(query, 'wos');
267
+ queryParts.push(`TS=(${escapedQuery})`);
268
+ }
269
+ }
270
+ // 添加年份过滤
271
+ if (options.year) {
272
+ if (options.year.includes('-')) {
273
+ // 年份范围 "2020-2023"
274
+ const [startYear, endYear] = options.year.split('-');
275
+ queryParts.push(`PY=(${startYear.trim()}-${endYear.trim()})`);
276
+ }
277
+ else {
278
+ // 单个年份
279
+ queryParts.push(`PY=${options.year}`);
280
+ }
281
+ }
282
+ // 添加作者过滤
283
+ if (options.author) {
284
+ const escapedAuthor = escapeQueryValue(options.author, 'wos');
285
+ queryParts.push(`AU=(${escapedAuthor})`);
286
+ }
287
+ // 添加期刊过滤
288
+ if (options.journal) {
289
+ const escapedJournal = escapeQueryValue(options.journal, 'wos');
290
+ queryParts.push(`SO=(${escapedJournal})`);
291
+ }
292
+ // 添加ISSN/ISBN过滤 (IS field tag)
293
+ if (options.issn) {
294
+ queryParts.push(`IS=${options.issn}`);
295
+ }
296
+ // 添加卷号过滤 (VL field tag)
297
+ if (options.volume) {
298
+ queryParts.push(`VL=${options.volume}`);
299
+ }
300
+ // 添加页码过滤 (PG field tag)
301
+ if (options.page) {
302
+ queryParts.push(`PG=${options.page}`);
303
+ }
304
+ // 添加期号过滤 (CS field tag - Issue)
305
+ if (options.issue) {
306
+ queryParts.push(`CS=${options.issue}`);
307
+ }
308
+ // 添加文档类型过滤 (DT field tag)
309
+ if (options.documentTypes && options.documentTypes.length > 0) {
310
+ const dtQuery = options.documentTypes.map(dt => `"${dt}"`).join(' OR ');
311
+ queryParts.push(`DT=(${dtQuery})`);
312
+ }
313
+ // 添加PubMed ID过滤 (PMID field tag)
314
+ if (options.pmid) {
315
+ queryParts.push(`PMID=${options.pmid}`);
316
+ }
317
+ // 添加DOI过滤 (DO field tag)
318
+ if (options.doi) {
319
+ queryParts.push(`DO="${options.doi}"`);
320
+ }
321
+ // 用AND连接所有查询部分
322
+ return queryParts.join(' AND ');
323
+ }
324
+ /**
325
+ * 转义WOS查询中的特殊字符
326
+ */
327
+ escapeWosQuery(query) {
328
+ if (!query)
329
+ return '';
330
+ // 移除多余的引号和转义特殊字符
331
+ return query
332
+ .replace(/"/g, '') // 移除引号
333
+ .replace(/[\(\)]/g, '') // 移除括号(API会自动添加)
334
+ .trim();
335
+ }
336
+ /**
337
+ * 映射排序字段到WOS API格式
338
+ */
339
+ mapSortField(sortBy) {
340
+ const fieldMap = {
341
+ 'relevance': 'RS',
342
+ 'date': 'PY',
343
+ 'citations': 'TC', // Times Cited
344
+ 'title': undefined,
345
+ 'author': undefined,
346
+ 'journal': undefined
347
+ };
348
+ return Object.prototype.hasOwnProperty.call(fieldMap, sortBy.toLowerCase())
349
+ ? fieldMap[sortBy.toLowerCase()]
350
+ : 'RS';
351
+ }
352
+ /**
353
+ * 解析搜索响应
354
+ */
355
+ parseSearchResponse(data) {
356
+ if (!data.hits || !Array.isArray(data.hits)) {
357
+ logDebug('WoS: No hits found in response or hits is not an array');
358
+ return [];
359
+ }
360
+ if (process.env.NODE_ENV === 'development') {
361
+ logDebug(`WoS: Found ${data.hits.length} hits out of ${data.metadata?.total || 0} total`);
362
+ }
363
+ return data.hits.map(record => this.parseWoSRecord(record))
364
+ .filter(paper => paper !== null);
365
+ }
366
+ /**
367
+ * 解析单个WoS记录
368
+ */
369
+ parseWoSRecord(record) {
370
+ try {
371
+ // 提取基本信息
372
+ const title = record.title || 'No title available';
373
+ const authors = record.names?.authors?.map(author => author.displayName) || [];
374
+ const abstractText = record.abstract || '';
375
+ // 提取出版信息
376
+ const year = record.source?.publishYear;
377
+ const publishedDate = year ? new Date(year, 0, 1) : null;
378
+ const journal = record.source?.sourceTitle || '';
379
+ // 提取DOI
380
+ const doi = record.identifiers?.doi || '';
381
+ // 提取被引次数
382
+ const citationCount = record.citations?.[0]?.citingArticlesCount ??
383
+ record.citations?.[0]?.count ??
384
+ 0;
385
+ // 提取关键词
386
+ const keywords = record.keywords?.authorKeywords || [];
387
+ // 构建URL
388
+ const wosUrl = `https://www.webofscience.com/wos/woscc/full-record/${record.uid}`;
389
+ return PaperFactory.create({
390
+ paperId: record.uid,
391
+ title: this.cleanText(title),
392
+ authors: authors,
393
+ abstract: this.cleanText(abstractText),
394
+ doi: doi,
395
+ publishedDate: publishedDate,
396
+ pdfUrl: '', // WoS通常不提供直接PDF链接
397
+ url: wosUrl,
398
+ source: 'webofscience',
399
+ categories: record.types || [],
400
+ keywords: keywords,
401
+ citationCount: citationCount,
402
+ journal: journal,
403
+ volume: record.source?.volume || undefined,
404
+ issue: record.source?.issue || undefined,
405
+ pages: record.source?.pages || undefined,
406
+ year: year,
407
+ extra: {
408
+ uid: record.uid,
409
+ doctype: record.types?.[0],
410
+ sourceTypes: record.sourceTypes
411
+ }
412
+ });
413
+ }
414
+ catch (error) {
415
+ logDebug('Error parsing WoS record:', error);
416
+ logDebug('Record data:', record);
417
+ return null;
418
+ }
419
+ }
420
+ /**
421
+ * 发起API请求 - 支持自动版本降级
422
+ */
423
+ async makeApiRequest(endpoint, config, isRetry = false) {
424
+ await this.rateLimiter.waitForPermission();
425
+ this.quotaManager.checkQuota('webofscience');
426
+ const url = `${this.apiUrl}${endpoint}`;
427
+ const requestConfig = {
428
+ ...config,
429
+ headers: {
430
+ 'X-ApiKey': this.apiKey,
431
+ 'Content-Type': 'application/json',
432
+ 'User-Agent': USER_AGENT,
433
+ ...config.headers
434
+ },
435
+ timeout: TIMEOUTS.DEFAULT
436
+ };
437
+ // Debug logs only in development to avoid noisy stderr in CI/production
438
+ if (process.env.NODE_ENV === 'development') {
439
+ logDebug(`WoS API Request: ${config.method} ${url} (version: ${this.apiVersion})`);
440
+ logDebug('WoS Request params:', config.params);
441
+ }
442
+ try {
443
+ const response = await ErrorHandler.retryWithBackoff(() => axios(url, requestConfig), { context: 'Web of Science API' });
444
+ this.quotaManager.incrementUsage('webofscience');
445
+ if (process.env.NODE_ENV === 'development') {
446
+ logDebug(`WoS API Response: ${response.status} ${response.statusText}`);
447
+ logDebug('WoS Response data preview:', JSON.stringify(response.data, null, 2).substring(0, 500));
448
+ }
449
+ // Reset fallback state on success
450
+ this.resetFallbackState();
451
+ return response;
452
+ }
453
+ catch (error) {
454
+ const status = error.response?.status;
455
+ if (process.env.NODE_ENV === 'development') {
456
+ logDebug(`WoS API Error (${this.apiVersion}):`, {
457
+ status,
458
+ statusText: error.response?.statusText,
459
+ data: error.response?.data,
460
+ config: {
461
+ url: error.config?.url,
462
+ method: error.config?.method,
463
+ params: error.config?.params
464
+ }
465
+ });
466
+ }
467
+ // Try fallback version for connection/server errors (not auth errors)
468
+ // 404, 500, 502, 503, 504, or network errors trigger fallback
469
+ const shouldFallback = !isRetry && (!status || // Network error
470
+ status === 404 || // Not found (version mismatch)
471
+ status >= 500 // Server errors
472
+ );
473
+ if (shouldFallback && this.switchToFallbackVersion()) {
474
+ logDebug(`Retrying with WoS API ${this.apiVersion}...`);
475
+ return this.makeApiRequest(endpoint, config, true);
476
+ }
477
+ throw error;
478
+ }
479
+ }
480
+ /**
481
+ * 验证API密钥
482
+ */
483
+ async validateApiKey() {
484
+ if (!this.apiKey)
485
+ return false;
486
+ try {
487
+ await this.search('test', { maxResults: 1 });
488
+ return true;
489
+ }
490
+ catch (error) {
491
+ // API密钥无效通常返回401或403
492
+ if (error.response?.status === 401 || error.response?.status === 403) {
493
+ return false;
494
+ }
495
+ // 其他错误可能是网络问题,认为密钥可能有效
496
+ return true;
497
+ }
498
+ }
499
+ }
500
+ //# sourceMappingURL=WebOfScienceSearcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebOfScienceSearcher.js","sourceRoot":"","sources":["../../src/platforms/WebOfScienceSearcher.ts"],"names":[],"mappings":"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"}