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,440 @@
1
+ import { parseToolArgs } from './schemas.js';
2
+ import { PaperFactory } from '../models/Paper.js';
3
+ import { TIMEOUTS } from '../config/constants.js';
4
+ import { logDebug } from '../utils/Logger.js';
5
+ import { searchMultipleSources } from '../services/MultiSourceSearchService.js';
6
+ import { downloadWithFallback } from '../services/OpenAccessFallbackService.js';
7
+ import { withTimeout } from '../utils/SecurityUtils.js';
8
+ function jsonTextResponse(text) {
9
+ return {
10
+ content: [
11
+ {
12
+ type: 'text',
13
+ text
14
+ }
15
+ ]
16
+ };
17
+ }
18
+ const DOI_LOOKUP_SOURCES = [
19
+ 'crossref',
20
+ 'openalex',
21
+ 'unpaywall',
22
+ 'pubmed',
23
+ 'pmc',
24
+ 'europepmc',
25
+ 'core',
26
+ 'webofscience',
27
+ 'arxiv'
28
+ ];
29
+ function normalizeDoi(value) {
30
+ return value
31
+ .trim()
32
+ .replace(/^https?:\/\/(?:dx\.)?doi\.org\//i, '')
33
+ .toLowerCase();
34
+ }
35
+ function paperMatchesDoi(paper, doi) {
36
+ return normalizeDoi(paper.doi || '') === normalizeDoi(doi);
37
+ }
38
+ export async function handleToolCall(toolNameRaw, rawArgs, searchers) {
39
+ const toolName = toolNameRaw;
40
+ const args = parseToolArgs(toolName, rawArgs);
41
+ switch (toolName) {
42
+ case 'search_papers': {
43
+ const { query, platform, sources, maxResults, year, author, journal, category, days, fetchDetails, fieldsOfStudy, sortBy, sortOrder } = args;
44
+ const results = [];
45
+ const searchOptions = {
46
+ maxResults,
47
+ year,
48
+ author,
49
+ journal,
50
+ category,
51
+ days,
52
+ fetchDetails,
53
+ fieldsOfStudy,
54
+ sortBy,
55
+ sortOrder
56
+ };
57
+ if (platform === 'all') {
58
+ const result = await searchMultipleSources(searchers, query, sources || 'all', searchOptions);
59
+ return jsonTextResponse(`Found ${result.total} papers across ${result.sources_used.length} source(s).\n\n${JSON.stringify(result, null, 2)}`);
60
+ }
61
+ else if (sources) {
62
+ const result = await searchMultipleSources(searchers, query, sources, searchOptions);
63
+ return jsonTextResponse(`Found ${result.total} papers across ${result.sources_used.length} source(s).\n\n${JSON.stringify(result, null, 2)}`);
64
+ }
65
+ else {
66
+ const searcher = searchers[platform];
67
+ if (!searcher) {
68
+ throw new Error(`Unsupported platform: ${platform}`);
69
+ }
70
+ const platformResults = await searcher.search(query, searchOptions);
71
+ results.push(...platformResults.map((paper) => PaperFactory.toDict(paper)));
72
+ }
73
+ return jsonTextResponse(`Found ${results.length} papers.\n\n${JSON.stringify(results, null, 2)}`);
74
+ }
75
+ case 'search_arxiv': {
76
+ const { query, maxResults, category, author, year, sortBy, sortOrder } = args;
77
+ const results = await searchers.arxiv.search(query, {
78
+ maxResults,
79
+ category,
80
+ author,
81
+ year,
82
+ sortBy,
83
+ sortOrder
84
+ });
85
+ return jsonTextResponse(`Found ${results.length} arXiv papers.\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
86
+ }
87
+ case 'search_webofscience': {
88
+ const { query, maxResults, year, author, journal, sortBy, sortOrder } = args;
89
+ if (!process.env.WOS_API_KEY) {
90
+ throw new Error('Web of Science API key not configured. Please set WOS_API_KEY environment variable.');
91
+ }
92
+ const results = await searchers.webofscience.search(query, {
93
+ maxResults,
94
+ year,
95
+ author,
96
+ journal,
97
+ sortBy,
98
+ sortOrder
99
+ });
100
+ return jsonTextResponse(`Found ${results.length} Web of Science papers.\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
101
+ }
102
+ case 'search_pubmed': {
103
+ const { query, maxResults, year, author, journal, publicationType, sortBy } = args;
104
+ const results = await searchers.pubmed.search(query, {
105
+ maxResults,
106
+ year,
107
+ author,
108
+ journal,
109
+ publicationType,
110
+ sortBy
111
+ });
112
+ const rateStatus = searchers.pubmed.getRateLimiterStatus();
113
+ const apiKeyStatus = searchers.pubmed.hasApiKey() ? 'configured' : 'not configured';
114
+ const rateLimit = searchers.pubmed.hasApiKey() ? '10 requests/second' : '3 requests/second';
115
+ return jsonTextResponse(`Found ${results.length} PubMed papers.\n\nAPI Status: ${apiKeyStatus} (${rateLimit})\nRate Limiter: ${rateStatus.availableTokens}/${rateStatus.maxTokens} tokens available\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
116
+ }
117
+ case 'search_biorxiv': {
118
+ const { query, maxResults, days, category } = args;
119
+ const results = await searchers.biorxiv.search(query, {
120
+ maxResults,
121
+ days,
122
+ category
123
+ });
124
+ return jsonTextResponse(`Found ${results.length} bioRxiv papers.\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
125
+ }
126
+ case 'search_medrxiv': {
127
+ const { query, maxResults, days, category } = args;
128
+ const results = await searchers.medrxiv.search(query, {
129
+ maxResults,
130
+ days,
131
+ category
132
+ });
133
+ return jsonTextResponse(`Found ${results.length} medRxiv papers.\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
134
+ }
135
+ case 'search_semantic_scholar': {
136
+ const { query, maxResults, year, fieldsOfStudy } = args;
137
+ const results = await searchers.semantic.search(query, {
138
+ maxResults,
139
+ year,
140
+ fieldsOfStudy
141
+ });
142
+ const rateStatus = searchers.semantic.getRateLimiterStatus();
143
+ const apiKeyStatus = searchers.semantic.hasApiKey()
144
+ ? 'configured'
145
+ : 'not configured (using free tier)';
146
+ const rateLimit = searchers.semantic.hasApiKey() ? '200 requests/minute' : '20 requests/minute';
147
+ return jsonTextResponse(`Found ${results.length} Semantic Scholar papers.\n\nAPI Status: ${apiKeyStatus} (${rateLimit})\nRate Limiter: ${rateStatus.availableTokens}/${rateStatus.maxTokens} tokens available\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
148
+ }
149
+ case 'search_semantic_snippets': {
150
+ const results = await searchers.semantic.searchSnippets(args);
151
+ const bodyCount = results.filter(result => result.snippet.snippetKind === 'body').length;
152
+ return jsonTextResponse(`Found ${results.length} Semantic Scholar snippet(s), including ${bodyCount} body snippet(s).\n\n${JSON.stringify(results, null, 2)}`);
153
+ }
154
+ case 'search_iacr': {
155
+ const { query, maxResults, fetchDetails } = args;
156
+ const results = await searchers.iacr.search(query, { maxResults, fetchDetails });
157
+ return jsonTextResponse(`Found ${results.length} IACR ePrint papers.\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
158
+ }
159
+ case 'download_paper': {
160
+ const { paperId, platform, savePath } = args;
161
+ const resolvedSavePath = savePath || './downloads';
162
+ const searcher = searchers[platform];
163
+ if (!searcher) {
164
+ throw new Error(`Unsupported platform for download: ${platform}`);
165
+ }
166
+ if (!searcher.getCapabilities().download) {
167
+ throw new Error(`Platform ${platform} does not support PDF download`);
168
+ }
169
+ const filePath = await searcher.downloadPdf(paperId, { savePath: resolvedSavePath });
170
+ return jsonTextResponse(`PDF downloaded successfully to: ${filePath}`);
171
+ }
172
+ case 'download_with_fallback': {
173
+ const result = await downloadWithFallback(searchers, args);
174
+ return jsonTextResponse(`Download with fallback ${result.status}.\n\n${JSON.stringify(result, null, 2)}`);
175
+ }
176
+ case 'search_google_scholar': {
177
+ const { query, maxResults, yearLow, yearHigh, author } = args;
178
+ const results = await searchers.googlescholar.search(query, {
179
+ maxResults,
180
+ yearLow,
181
+ yearHigh,
182
+ author
183
+ });
184
+ return jsonTextResponse(`Found ${results.length} Google Scholar papers.\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
185
+ }
186
+ case 'get_paper_by_doi': {
187
+ const { doi, platform } = args;
188
+ const results = [];
189
+ const sourceResults = {};
190
+ const errors = {};
191
+ const failedSources = [];
192
+ if (platform === 'all') {
193
+ const selected = DOI_LOOKUP_SOURCES.filter(source => source in searchers);
194
+ const settled = await Promise.allSettled(selected.map(async (source) => {
195
+ const searcher = searchers[source];
196
+ const paper = await withTimeout(searcher.getPaperByDoi(doi), TIMEOUTS.SOURCE_TASK, `${source} DOI lookup timed out after ${TIMEOUTS.SOURCE_TASK}ms`);
197
+ return { source, paper };
198
+ }));
199
+ for (let i = 0; i < settled.length; i += 1) {
200
+ const source = selected[i];
201
+ const result = settled[i];
202
+ if (result.status === 'rejected') {
203
+ sourceResults[source] = 0;
204
+ errors[source] = result.reason?.message || String(result.reason);
205
+ failedSources.push(source);
206
+ logDebug(`Error getting paper by DOI from ${source}:`, result.reason);
207
+ continue;
208
+ }
209
+ const paper = result.value.paper;
210
+ if (!paper) {
211
+ sourceResults[source] = 0;
212
+ continue;
213
+ }
214
+ if (!paperMatchesDoi(paper, doi)) {
215
+ sourceResults[source] = 0;
216
+ errors[source] = `Returned DOI ${paper.doi || '(missing)'} did not match requested DOI ${doi}`;
217
+ failedSources.push(source);
218
+ continue;
219
+ }
220
+ sourceResults[source] = 1;
221
+ results.push(PaperFactory.toDict(paper));
222
+ }
223
+ }
224
+ else {
225
+ const searcher = searchers[platform];
226
+ if (!searcher) {
227
+ throw new Error(`Unsupported platform: ${platform}`);
228
+ }
229
+ const paper = await searcher.getPaperByDoi(doi);
230
+ if (paper) {
231
+ results.push(PaperFactory.toDict(paper));
232
+ }
233
+ }
234
+ if (results.length === 0) {
235
+ if (platform === 'all') {
236
+ const result = {
237
+ doi,
238
+ sources_requested: 'all',
239
+ sources_used: DOI_LOOKUP_SOURCES.filter(source => source in searchers),
240
+ source_results: sourceResults,
241
+ errors,
242
+ failed_sources: failedSources,
243
+ warnings: failedSources.map(source => `${source}: ${errors[source]}`),
244
+ total: 0,
245
+ papers: []
246
+ };
247
+ return jsonTextResponse(`No paper found with DOI: ${doi}\n\n${JSON.stringify(result, null, 2)}`);
248
+ }
249
+ return jsonTextResponse(`No paper found with DOI: ${doi}`);
250
+ }
251
+ if (platform === 'all') {
252
+ const result = {
253
+ doi,
254
+ sources_requested: 'all',
255
+ sources_used: DOI_LOOKUP_SOURCES.filter(source => source in searchers),
256
+ source_results: sourceResults,
257
+ errors,
258
+ failed_sources: failedSources,
259
+ warnings: failedSources.map(source => `${source}: ${errors[source]}`),
260
+ total: results.length,
261
+ papers: results
262
+ };
263
+ return jsonTextResponse(`Found ${results.length} paper(s) with DOI ${doi} across ${result.sources_used.length} source(s).\n\n${JSON.stringify(result, null, 2)}`);
264
+ }
265
+ return jsonTextResponse(`Found ${results.length} paper(s) with DOI ${doi}:\n\n${JSON.stringify(results, null, 2)}`);
266
+ }
267
+ case 'search_scihub': {
268
+ const { doiOrUrl, downloadPdf, savePath } = args;
269
+ const resolvedSavePath = savePath || './downloads';
270
+ const results = await searchers.scihub.search(doiOrUrl);
271
+ if (results.length === 0) {
272
+ return jsonTextResponse(`No paper found on Sci-Hub for: ${doiOrUrl}`);
273
+ }
274
+ const paper = results[0];
275
+ let responseText = `Found paper on Sci-Hub:\n\n${JSON.stringify(PaperFactory.toDict(paper), null, 2)}`;
276
+ if (downloadPdf && paper.pdfUrl) {
277
+ try {
278
+ const filePath = await searchers.scihub.downloadPdf(doiOrUrl, { savePath: resolvedSavePath });
279
+ responseText += `\n\nPDF downloaded successfully to: ${filePath}`;
280
+ }
281
+ catch (downloadError) {
282
+ responseText += `\n\nFailed to download PDF: ${downloadError.message}`;
283
+ }
284
+ }
285
+ return jsonTextResponse(responseText);
286
+ }
287
+ case 'check_scihub_mirrors': {
288
+ const { forceCheck } = args;
289
+ if (forceCheck) {
290
+ await searchers.scihub.forceHealthCheck();
291
+ }
292
+ const mirrorStatus = searchers.scihub.getMirrorStatus();
293
+ return jsonTextResponse(`Sci-Hub Mirror Status:\n\n${JSON.stringify(mirrorStatus, null, 2)}`);
294
+ }
295
+ case 'search_sciencedirect': {
296
+ const { query, maxResults, year, author, journal, openAccess } = args;
297
+ if (!process.env.ELSEVIER_API_KEY) {
298
+ throw new Error('Elsevier API key not configured. Please set ELSEVIER_API_KEY environment variable.');
299
+ }
300
+ const results = await searchers.sciencedirect.search(query, {
301
+ maxResults,
302
+ year,
303
+ author,
304
+ journal,
305
+ openAccess
306
+ });
307
+ return jsonTextResponse(`Found ${results.length} ScienceDirect papers.\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
308
+ }
309
+ case 'search_springer': {
310
+ const { query, maxResults, year, author, journal, subject, openAccess, type } = args;
311
+ if (!process.env.SPRINGER_API_KEY) {
312
+ throw new Error('Springer API key not configured. Please set SPRINGER_API_KEY environment variable.');
313
+ }
314
+ const results = await searchers.springer.search(query, {
315
+ maxResults,
316
+ year,
317
+ author,
318
+ journal,
319
+ subject,
320
+ openAccess,
321
+ type
322
+ });
323
+ return jsonTextResponse(`Found ${results.length} Springer papers.\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
324
+ }
325
+ case 'search_wiley': {
326
+ return jsonTextResponse(`DEPRECATED: Wiley TDM API does not support keyword search.\n\n` +
327
+ `To access Wiley content:\n` +
328
+ `1. Use search_crossref to find Wiley articles (filter by publisher if needed)\n` +
329
+ `2. Use download_paper with platform="wiley" and the DOI to download the PDF\n\n` +
330
+ `Example: download_paper(paperId="10.1111/jtsb.12390", platform="wiley")`);
331
+ }
332
+ case 'search_scopus': {
333
+ const { query, maxResults, year, author, journal, affiliation, subject, openAccess, documentType } = args;
334
+ if (!process.env.ELSEVIER_API_KEY) {
335
+ throw new Error('Elsevier API key not configured. Please set ELSEVIER_API_KEY environment variable.');
336
+ }
337
+ const results = await searchers.scopus.search(query, {
338
+ maxResults,
339
+ year,
340
+ author,
341
+ journal,
342
+ affiliation,
343
+ subject,
344
+ openAccess,
345
+ documentType
346
+ });
347
+ return jsonTextResponse(`Found ${results.length} Scopus papers.\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
348
+ }
349
+ case 'search_crossref': {
350
+ const { query, maxResults, year, author, sortBy, sortOrder } = args;
351
+ const results = await searchers.crossref.search(query, {
352
+ maxResults,
353
+ year,
354
+ author,
355
+ sortBy,
356
+ sortOrder
357
+ });
358
+ return jsonTextResponse(`Found ${results.length} Crossref papers.\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
359
+ }
360
+ case 'search_openalex': {
361
+ const { query, maxResults, year } = args;
362
+ const results = await searchers.openalex.search(query, { maxResults, year });
363
+ return jsonTextResponse(`Found ${results.length} OpenAlex papers.\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
364
+ }
365
+ case 'search_unpaywall': {
366
+ const { query, maxResults } = args;
367
+ const results = await searchers.unpaywall.search(query, { maxResults });
368
+ return jsonTextResponse(`Found ${results.length} Unpaywall record(s).\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
369
+ }
370
+ case 'search_pmc': {
371
+ const { query, maxResults, year } = args;
372
+ const results = await searchers.pmc.search(query, { maxResults, year });
373
+ return jsonTextResponse(`Found ${results.length} PMC papers.\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
374
+ }
375
+ case 'search_europepmc': {
376
+ const { query, maxResults, year } = args;
377
+ const results = await searchers.europepmc.search(query, { maxResults, year });
378
+ return jsonTextResponse(`Found ${results.length} Europe PMC papers.\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
379
+ }
380
+ case 'search_core': {
381
+ const { query, maxResults, year } = args;
382
+ const results = await searchers.core.search(query, { maxResults, year });
383
+ return jsonTextResponse(`Found ${results.length} CORE papers.\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
384
+ }
385
+ case 'search_openaire': {
386
+ const { query, maxResults, year } = args;
387
+ const results = await searchers.openaire.search(query, { maxResults, year });
388
+ return jsonTextResponse(`Found ${results.length} OpenAIRE papers.\n\n${JSON.stringify(results.map((paper) => PaperFactory.toDict(paper)), null, 2)}`);
389
+ }
390
+ case 'get_platform_status': {
391
+ const { validate } = args;
392
+ const statusInfo = [];
393
+ for (const [platformName, searcher] of Object.entries(searchers)) {
394
+ if (platformName === 'wos' || platformName === 'scholar')
395
+ continue;
396
+ const capabilities = searcher.getCapabilities();
397
+ const hasApiKey = searcher.hasApiKey();
398
+ let apiKeyStatus = 'not_required';
399
+ if (capabilities.requiresApiKey) {
400
+ if (hasApiKey) {
401
+ if (validate) {
402
+ try {
403
+ const isValid = await searcher.validateApiKey();
404
+ apiKeyStatus = isValid ? 'valid' : 'invalid';
405
+ }
406
+ catch {
407
+ apiKeyStatus = 'unknown';
408
+ }
409
+ }
410
+ else {
411
+ apiKeyStatus = 'configured';
412
+ }
413
+ }
414
+ else {
415
+ apiKeyStatus = 'missing';
416
+ }
417
+ }
418
+ let additionalInfo = {};
419
+ if (platformName === 'scihub') {
420
+ const mirrorStatus = searchers.scihub.getMirrorStatus();
421
+ additionalInfo = {
422
+ mirrorCount: mirrorStatus.length,
423
+ workingMirrors: mirrorStatus.filter(m => m.status === 'Working').length
424
+ };
425
+ }
426
+ statusInfo.push({
427
+ platform: platformName,
428
+ baseUrl: searcher.getBaseUrl(),
429
+ capabilities,
430
+ apiKeyStatus,
431
+ ...additionalInfo
432
+ });
433
+ }
434
+ return jsonTextResponse(`Platform Status:\n\n${JSON.stringify(statusInfo, null, 2)}`);
435
+ }
436
+ default:
437
+ throw new Error(`Unknown tool: ${toolNameRaw}`);
438
+ }
439
+ }
440
+ //# sourceMappingURL=handleToolCall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleToolCall.js","sourceRoot":"","sources":["../../src/core/handleToolCall.ts"],"names":[],"mappings":"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"}