paper-search-cli 0.3.1 → 0.3.2
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.
- package/README.md +1 -1
- package/README.zh.md +1 -1
- package/dist/capabilities/body-snippet-search/handler.d.ts +9 -0
- package/dist/capabilities/body-snippet-search/handler.d.ts.map +1 -0
- package/dist/capabilities/body-snippet-search/handler.js +17 -0
- package/dist/capabilities/body-snippet-search/handler.js.map +1 -0
- package/dist/capabilities/body-snippet-search/index.d.ts +7 -0
- package/dist/capabilities/body-snippet-search/index.d.ts.map +1 -0
- package/dist/capabilities/body-snippet-search/index.js +6 -0
- package/dist/capabilities/body-snippet-search/index.js.map +1 -0
- package/dist/capabilities/body-snippet-search/schemas.d.ts +36 -0
- package/dist/capabilities/body-snippet-search/schemas.d.ts.map +1 -0
- package/dist/capabilities/body-snippet-search/schemas.js +16 -0
- package/dist/capabilities/body-snippet-search/schemas.js.map +1 -0
- package/dist/capabilities/body-snippet-search/service.d.ts +4 -0
- package/dist/capabilities/body-snippet-search/service.d.ts.map +1 -0
- package/dist/capabilities/body-snippet-search/service.js +4 -0
- package/dist/capabilities/body-snippet-search/service.js.map +1 -0
- package/dist/capabilities/body-snippet-search/tools.d.ts +187 -0
- package/dist/capabilities/body-snippet-search/tools.d.ts.map +1 -0
- package/dist/capabilities/body-snippet-search/tools.js +49 -0
- package/dist/capabilities/body-snippet-search/tools.js.map +1 -0
- package/dist/capabilities/body-snippet-search/types.d.ts +14 -0
- package/dist/capabilities/body-snippet-search/types.d.ts.map +1 -0
- package/dist/capabilities/body-snippet-search/types.js +2 -0
- package/dist/capabilities/body-snippet-search/types.js.map +1 -0
- package/dist/capabilities/citation-expansion/CitationService.d.ts +47 -0
- package/dist/capabilities/citation-expansion/CitationService.d.ts.map +1 -0
- package/dist/capabilities/citation-expansion/CitationService.js +243 -0
- package/dist/capabilities/citation-expansion/CitationService.js.map +1 -0
- package/dist/capabilities/citation-expansion/handler.d.ts +36 -0
- package/dist/capabilities/citation-expansion/handler.d.ts.map +1 -0
- package/dist/capabilities/citation-expansion/handler.js +44 -0
- package/dist/capabilities/citation-expansion/handler.js.map +1 -0
- package/dist/capabilities/citation-expansion/index.d.ts +6 -0
- package/dist/capabilities/citation-expansion/index.d.ts.map +1 -0
- package/dist/capabilities/citation-expansion/index.js +5 -0
- package/dist/capabilities/citation-expansion/index.js.map +1 -0
- package/dist/capabilities/citation-expansion/schemas.d.ts +28 -0
- package/dist/capabilities/citation-expansion/schemas.d.ts.map +1 -0
- package/dist/capabilities/citation-expansion/schemas.js +13 -0
- package/dist/capabilities/citation-expansion/schemas.js.map +1 -0
- package/dist/capabilities/citation-expansion/tools.d.ts +82 -0
- package/dist/capabilities/citation-expansion/tools.d.ts.map +1 -0
- package/dist/capabilities/citation-expansion/tools.js +48 -0
- package/dist/capabilities/citation-expansion/tools.js.map +1 -0
- package/dist/capabilities/citation-expansion/types.d.ts +22 -0
- package/dist/capabilities/citation-expansion/types.d.ts.map +1 -0
- package/dist/capabilities/citation-expansion/types.js +2 -0
- package/dist/capabilities/citation-expansion/types.js.map +1 -0
- package/dist/capabilities/journal-metrics/JournalMetricsService.d.ts +3 -0
- package/dist/capabilities/journal-metrics/JournalMetricsService.d.ts.map +1 -0
- package/dist/capabilities/journal-metrics/JournalMetricsService.js +142 -0
- package/dist/capabilities/journal-metrics/JournalMetricsService.js.map +1 -0
- package/dist/capabilities/journal-metrics/handler.d.ts +12 -0
- package/dist/capabilities/journal-metrics/handler.d.ts.map +1 -0
- package/dist/capabilities/journal-metrics/handler.js +38 -0
- package/dist/capabilities/journal-metrics/handler.js.map +1 -0
- package/dist/capabilities/journal-metrics/index.d.ts +6 -0
- package/dist/capabilities/journal-metrics/index.d.ts.map +1 -0
- package/dist/capabilities/journal-metrics/index.js +5 -0
- package/dist/capabilities/journal-metrics/index.js.map +1 -0
- package/dist/capabilities/journal-metrics/schemas.d.ts +28 -0
- package/dist/capabilities/journal-metrics/schemas.d.ts.map +1 -0
- package/dist/capabilities/journal-metrics/schemas.js +13 -0
- package/dist/capabilities/journal-metrics/schemas.js.map +1 -0
- package/dist/capabilities/journal-metrics/tools.d.ts +67 -0
- package/dist/capabilities/journal-metrics/tools.d.ts.map +1 -0
- package/dist/capabilities/journal-metrics/tools.js +27 -0
- package/dist/capabilities/journal-metrics/tools.js.map +1 -0
- package/dist/capabilities/journal-metrics/types.d.ts +36 -0
- package/dist/capabilities/journal-metrics/types.d.ts.map +1 -0
- package/dist/capabilities/journal-metrics/types.js +2 -0
- package/dist/capabilities/journal-metrics/types.js.map +1 -0
- package/dist/capabilities/metadata-search/MultiSourceSearchService.d.ts +9 -0
- package/dist/capabilities/metadata-search/MultiSourceSearchService.d.ts.map +1 -0
- package/dist/capabilities/metadata-search/MultiSourceSearchService.js +78 -0
- package/dist/capabilities/metadata-search/MultiSourceSearchService.js.map +1 -0
- package/dist/capabilities/metadata-search/handler.d.ts +23 -0
- package/dist/capabilities/metadata-search/handler.d.ts.map +1 -0
- package/dist/capabilities/metadata-search/handler.js +163 -0
- package/dist/capabilities/metadata-search/handler.js.map +1 -0
- package/dist/capabilities/metadata-search/index.d.ts +6 -0
- package/dist/capabilities/metadata-search/index.d.ts.map +1 -0
- package/dist/capabilities/metadata-search/index.js +5 -0
- package/dist/capabilities/metadata-search/index.js.map +1 -0
- package/dist/capabilities/metadata-search/schemas.d.ts +83 -0
- package/dist/capabilities/metadata-search/schemas.d.ts.map +1 -0
- package/dist/capabilities/metadata-search/schemas.js +81 -0
- package/dist/capabilities/metadata-search/schemas.js.map +1 -0
- package/dist/capabilities/metadata-search/tools.d.ts +178 -0
- package/dist/capabilities/metadata-search/tools.d.ts.map +1 -0
- package/dist/capabilities/metadata-search/tools.js +75 -0
- package/dist/capabilities/metadata-search/tools.js.map +1 -0
- package/dist/capabilities/metadata-search/types.d.ts +13 -0
- package/dist/capabilities/metadata-search/types.d.ts.map +1 -0
- package/dist/capabilities/metadata-search/types.js +2 -0
- package/dist/capabilities/metadata-search/types.js.map +1 -0
- package/dist/capabilities/pdf-discovery/DownloadTier.d.ts +22 -0
- package/dist/capabilities/pdf-discovery/DownloadTier.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/DownloadTier.js +2 -0
- package/dist/capabilities/pdf-discovery/DownloadTier.js.map +1 -0
- package/dist/capabilities/pdf-discovery/OpenAccessFallbackService.d.ts +10 -0
- package/dist/capabilities/pdf-discovery/OpenAccessFallbackService.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/OpenAccessFallbackService.js +53 -0
- package/dist/capabilities/pdf-discovery/OpenAccessFallbackService.js.map +1 -0
- package/dist/capabilities/pdf-discovery/handler.d.ts +19 -0
- package/dist/capabilities/pdf-discovery/handler.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/handler.js +56 -0
- package/dist/capabilities/pdf-discovery/handler.js.map +1 -0
- package/dist/capabilities/pdf-discovery/index.d.ts +7 -0
- package/dist/capabilities/pdf-discovery/index.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/index.js +5 -0
- package/dist/capabilities/pdf-discovery/index.js.map +1 -0
- package/dist/capabilities/pdf-discovery/schemas.d.ts +37 -0
- package/dist/capabilities/pdf-discovery/schemas.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/schemas.js +22 -0
- package/dist/capabilities/pdf-discovery/schemas.js.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/directPdfUrl.d.ts +3 -0
- package/dist/capabilities/pdf-discovery/tiers/directPdfUrl.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/directPdfUrl.js +27 -0
- package/dist/capabilities/pdf-discovery/tiers/directPdfUrl.js.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/primary.d.ts +3 -0
- package/dist/capabilities/pdf-discovery/tiers/primary.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/primary.js +21 -0
- package/dist/capabilities/pdf-discovery/tiers/primary.js.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/repositories.d.ts +3 -0
- package/dist/capabilities/pdf-discovery/tiers/repositories.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/repositories.js +35 -0
- package/dist/capabilities/pdf-discovery/tiers/repositories.js.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/scihub.d.ts +3 -0
- package/dist/capabilities/pdf-discovery/tiers/scihub.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/scihub.js +21 -0
- package/dist/capabilities/pdf-discovery/tiers/scihub.js.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/unpaywall.d.ts +3 -0
- package/dist/capabilities/pdf-discovery/tiers/unpaywall.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/unpaywall.js +29 -0
- package/dist/capabilities/pdf-discovery/tiers/unpaywall.js.map +1 -0
- package/dist/capabilities/pdf-discovery/tools.d.ts +114 -0
- package/dist/capabilities/pdf-discovery/tools.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/tools.js +42 -0
- package/dist/capabilities/pdf-discovery/tools.js.map +1 -0
- package/dist/capabilities/pdf-discovery/types.d.ts +19 -0
- package/dist/capabilities/pdf-discovery/types.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/types.js +2 -0
- package/dist/capabilities/pdf-discovery/types.js.map +1 -0
- package/dist/cli.js +6 -6
- package/dist/cli.js.map +1 -1
- package/dist/core/capabilityProfile.d.ts +1 -17
- package/dist/core/capabilityProfile.d.ts.map +1 -1
- package/dist/core/capabilityProfile.js +1 -166
- package/dist/core/capabilityProfile.js.map +1 -1
- package/dist/core/diagnostics.d.ts +1 -42
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/diagnostics.js +1 -585
- package/dist/core/diagnostics.js.map +1 -1
- package/dist/core/handleToolCall.d.ts +1 -0
- package/dist/core/handleToolCall.d.ts.map +1 -1
- package/dist/core/handleToolCall.js +265 -509
- package/dist/core/handleToolCall.js.map +1 -1
- package/dist/core/httpPolicies.d.ts +2 -0
- package/dist/core/httpPolicies.d.ts.map +1 -0
- package/dist/core/httpPolicies.js +2 -0
- package/dist/core/httpPolicies.js.map +1 -0
- package/dist/core/liveSmoke.d.ts +1 -41
- package/dist/core/liveSmoke.d.ts.map +1 -1
- package/dist/core/liveSmoke.js +1 -225
- package/dist/core/liveSmoke.js.map +1 -1
- package/dist/core/platformFactories.d.ts +2 -0
- package/dist/core/platformFactories.d.ts.map +1 -0
- package/dist/core/platformFactories.js +2 -0
- package/dist/core/platformFactories.js.map +1 -0
- package/dist/core/platformMetadata.d.ts +1 -27
- package/dist/core/platformMetadata.d.ts.map +1 -1
- package/dist/core/platformMetadata.js +1 -257
- package/dist/core/platformMetadata.js.map +1 -1
- package/dist/core/schemas.d.ts +10 -202
- package/dist/core/schemas.d.ts.map +1 -1
- package/dist/core/schemas.js +11 -118
- package/dist/core/schemas.js.map +1 -1
- package/dist/core/searchers.d.ts +24 -24
- package/dist/core/searchers.d.ts.map +1 -1
- package/dist/core/searchers.js +14 -79
- package/dist/core/searchers.js.map +1 -1
- package/dist/core/textReports.d.ts +1 -20
- package/dist/core/textReports.d.ts.map +1 -1
- package/dist/core/textReports.js +1 -84
- package/dist/core/textReports.js.map +1 -1
- package/dist/core/tools.d.ts.map +1 -1
- package/dist/core/tools.js +15 -237
- package/dist/core/tools.js.map +1 -1
- package/dist/infrastructure/cache/RequestCache.d.ts +26 -0
- package/dist/infrastructure/cache/RequestCache.d.ts.map +1 -0
- package/dist/infrastructure/cache/RequestCache.js +66 -0
- package/dist/infrastructure/cache/RequestCache.js.map +1 -0
- package/dist/infrastructure/http/ErrorHandler.d.ts +99 -0
- package/dist/infrastructure/http/ErrorHandler.d.ts.map +1 -0
- package/dist/infrastructure/http/ErrorHandler.js +266 -0
- package/dist/infrastructure/http/ErrorHandler.js.map +1 -0
- package/dist/infrastructure/http/HttpClient.d.ts +31 -0
- package/dist/infrastructure/http/HttpClient.d.ts.map +1 -0
- package/dist/infrastructure/http/HttpClient.js +50 -0
- package/dist/infrastructure/http/HttpClient.js.map +1 -0
- package/dist/infrastructure/pdf/PDFExtractor.d.ts +34 -0
- package/dist/infrastructure/pdf/PDFExtractor.d.ts.map +1 -0
- package/dist/infrastructure/pdf/PDFExtractor.js +130 -0
- package/dist/infrastructure/pdf/PDFExtractor.js.map +1 -0
- package/dist/infrastructure/pdf/PdfDownload.d.ts +7 -0
- package/dist/infrastructure/pdf/PdfDownload.d.ts.map +1 -0
- package/dist/infrastructure/pdf/PdfDownload.js +175 -0
- package/dist/infrastructure/pdf/PdfDownload.js.map +1 -0
- package/dist/infrastructure/rate-limit/RateLimiter.d.ts +50 -0
- package/dist/infrastructure/rate-limit/RateLimiter.d.ts.map +1 -0
- package/dist/infrastructure/rate-limit/RateLimiter.js +128 -0
- package/dist/infrastructure/rate-limit/RateLimiter.js.map +1 -0
- package/dist/infrastructure/security/SecurityUtils.d.ts +80 -0
- package/dist/infrastructure/security/SecurityUtils.d.ts.map +1 -0
- package/dist/infrastructure/security/SecurityUtils.js +357 -0
- package/dist/infrastructure/security/SecurityUtils.js.map +1 -0
- package/dist/management/capability-profile/index.d.ts +18 -0
- package/dist/management/capability-profile/index.d.ts.map +1 -0
- package/dist/management/capability-profile/index.js +167 -0
- package/dist/management/capability-profile/index.js.map +1 -0
- package/dist/management/config/index.d.ts +2 -0
- package/dist/management/config/index.d.ts.map +1 -0
- package/dist/management/config/index.js +2 -0
- package/dist/management/config/index.js.map +1 -0
- package/dist/management/diagnostics/index.d.ts +43 -0
- package/dist/management/diagnostics/index.d.ts.map +1 -0
- package/dist/management/diagnostics/index.js +586 -0
- package/dist/management/diagnostics/index.js.map +1 -0
- package/dist/management/reports/index.d.ts +21 -0
- package/dist/management/reports/index.d.ts.map +1 -0
- package/dist/management/reports/index.js +85 -0
- package/dist/management/reports/index.js.map +1 -0
- package/dist/management/skills/index.d.ts +2 -0
- package/dist/management/skills/index.d.ts.map +1 -0
- package/dist/management/skills/index.js +2 -0
- package/dist/management/skills/index.js.map +1 -0
- package/dist/management/smoke/index.d.ts +42 -0
- package/dist/management/smoke/index.d.ts.map +1 -0
- package/dist/management/smoke/index.js +226 -0
- package/dist/management/smoke/index.js.map +1 -0
- package/dist/registry/aliases.d.ts +2 -0
- package/dist/registry/aliases.d.ts.map +1 -0
- package/dist/registry/aliases.js +2 -0
- package/dist/registry/aliases.js.map +1 -0
- package/dist/registry/httpPolicies.d.ts +3 -0
- package/dist/registry/httpPolicies.d.ts.map +1 -0
- package/dist/registry/httpPolicies.js +17 -0
- package/dist/registry/httpPolicies.js.map +1 -0
- package/dist/registry/platformFactories.d.ts +8 -0
- package/dist/registry/platformFactories.d.ts.map +1 -0
- package/dist/registry/platformFactories.js +55 -0
- package/dist/registry/platformFactories.js.map +1 -0
- package/dist/registry/platformMetadata.d.ts +39 -0
- package/dist/registry/platformMetadata.d.ts.map +1 -0
- package/dist/registry/platformMetadata.js +321 -0
- package/dist/registry/platformMetadata.js.map +1 -0
- package/dist/services/CitationService.d.ts +2 -65
- package/dist/services/CitationService.d.ts.map +1 -1
- package/dist/services/CitationService.js +1 -242
- package/dist/services/CitationService.js.map +1 -1
- package/dist/services/JournalMetricsService.d.ts +2 -37
- package/dist/services/JournalMetricsService.d.ts.map +1 -1
- package/dist/services/JournalMetricsService.js +1 -141
- package/dist/services/JournalMetricsService.js.map +1 -1
- package/dist/services/MultiSourceSearchService.d.ts +2 -18
- package/dist/services/MultiSourceSearchService.d.ts.map +1 -1
- package/dist/services/MultiSourceSearchService.js +1 -77
- package/dist/services/MultiSourceSearchService.js.map +1 -1
- package/dist/services/OpenAccessFallbackService.d.ts +3 -40
- package/dist/services/OpenAccessFallbackService.d.ts.map +1 -1
- package/dist/services/OpenAccessFallbackService.js +1 -146
- package/dist/services/OpenAccessFallbackService.js.map +1 -1
- package/dist/utils/ErrorHandler.d.ts +2 -98
- package/dist/utils/ErrorHandler.d.ts.map +1 -1
- package/dist/utils/ErrorHandler.js +2 -265
- package/dist/utils/ErrorHandler.js.map +1 -1
- package/dist/utils/HttpClient.d.ts +1 -5
- package/dist/utils/HttpClient.d.ts.map +1 -1
- package/dist/utils/HttpClient.js +1 -29
- package/dist/utils/HttpClient.js.map +1 -1
- package/dist/utils/PDFExtractor.d.ts +2 -33
- package/dist/utils/PDFExtractor.d.ts.map +1 -1
- package/dist/utils/PDFExtractor.js +2 -129
- package/dist/utils/PDFExtractor.js.map +1 -1
- package/dist/utils/PdfDownload.d.ts +1 -6
- package/dist/utils/PdfDownload.d.ts.map +1 -1
- package/dist/utils/PdfDownload.js +1 -141
- package/dist/utils/PdfDownload.js.map +1 -1
- package/dist/utils/RateLimiter.d.ts +1 -49
- package/dist/utils/RateLimiter.d.ts.map +1 -1
- package/dist/utils/RateLimiter.js +1 -127
- package/dist/utils/RateLimiter.js.map +1 -1
- package/dist/utils/RequestCache.d.ts +2 -25
- package/dist/utils/RequestCache.d.ts.map +1 -1
- package/dist/utils/RequestCache.js +2 -65
- package/dist/utils/RequestCache.js.map +1 -1
- package/dist/utils/SecurityUtils.d.ts +2 -79
- package/dist/utils/SecurityUtils.d.ts.map +1 -1
- package/dist/utils/SecurityUtils.js +2 -356
- package/dist/utils/SecurityUtils.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security utilities for sanitizing and validating data
|
|
3
|
+
* Provides comprehensive protection against security vulnerabilities
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Comprehensive request sanitization to remove sensitive data
|
|
7
|
+
* @param config - Axios request configuration
|
|
8
|
+
* @returns Sanitized configuration copy
|
|
9
|
+
*/
|
|
10
|
+
export function sanitizeRequest(config) {
|
|
11
|
+
if (!config)
|
|
12
|
+
return config;
|
|
13
|
+
// Deep clone to avoid mutating original
|
|
14
|
+
let sanitized;
|
|
15
|
+
try {
|
|
16
|
+
sanitized = JSON.parse(JSON.stringify(config));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// If JSON serialization fails, return redacted version
|
|
20
|
+
return { __redacted: 'Failed to sanitize - potentially circular reference' };
|
|
21
|
+
}
|
|
22
|
+
// Sanitize headers
|
|
23
|
+
if (sanitized.headers) {
|
|
24
|
+
sanitized.headers = sanitizeHeaders(sanitized.headers);
|
|
25
|
+
}
|
|
26
|
+
// Sanitize URL parameters
|
|
27
|
+
if (sanitized.params) {
|
|
28
|
+
sanitized.params = sanitizeParams(sanitized.params);
|
|
29
|
+
}
|
|
30
|
+
// Sanitize request body
|
|
31
|
+
if (sanitized.data) {
|
|
32
|
+
sanitized.data = sanitizeBody(sanitized.data);
|
|
33
|
+
}
|
|
34
|
+
// Sanitize URL
|
|
35
|
+
if (sanitized.url) {
|
|
36
|
+
sanitized.url = sanitizeUrl(sanitized.url);
|
|
37
|
+
}
|
|
38
|
+
return sanitized;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Sanitize headers to remove sensitive information
|
|
42
|
+
*/
|
|
43
|
+
export function sanitizeHeaders(headers) {
|
|
44
|
+
if (!headers)
|
|
45
|
+
return headers;
|
|
46
|
+
const sanitized = { ...headers };
|
|
47
|
+
// Patterns for sensitive headers (case-insensitive)
|
|
48
|
+
const sensitivePatterns = [
|
|
49
|
+
/^api[-_]?key$/i,
|
|
50
|
+
/^x[-_]api[-_]key$/i,
|
|
51
|
+
/^authorization$/i,
|
|
52
|
+
/^x[-_]apikey$/i,
|
|
53
|
+
/^access[-_]token$/i,
|
|
54
|
+
/^bearer$/i,
|
|
55
|
+
/^x[-_]auth[-_]token$/i,
|
|
56
|
+
/^cookie$/i,
|
|
57
|
+
/^set[-_]cookie$/i,
|
|
58
|
+
/^x[-_]csrf[-_]token$/i,
|
|
59
|
+
/^x[-_]forwarded[-_]for$/i, // May contain IP
|
|
60
|
+
/^referer$/i, // May contain sensitive URLs
|
|
61
|
+
/^user[-_]agent$/i // May contain system info
|
|
62
|
+
];
|
|
63
|
+
Object.keys(sanitized).forEach(key => {
|
|
64
|
+
const lowerKey = key.toLowerCase();
|
|
65
|
+
// Check against patterns
|
|
66
|
+
if (sensitivePatterns.some(pattern => pattern.test(key))) {
|
|
67
|
+
sanitized[key] = '***REDACTED***';
|
|
68
|
+
}
|
|
69
|
+
// Also check values that might contain tokens
|
|
70
|
+
if (typeof sanitized[key] === 'string') {
|
|
71
|
+
if (sanitized[key].match(/^(Bearer|Basic)\s+/i) ||
|
|
72
|
+
sanitized[key].match(/^[a-zA-Z0-9_-]{20,}$/) || // Likely token
|
|
73
|
+
sanitized[key].includes('session=') ||
|
|
74
|
+
sanitized[key].includes('token=')) {
|
|
75
|
+
sanitized[key] = '***REDACTED***';
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
return sanitized;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Sanitize URL parameters
|
|
83
|
+
*/
|
|
84
|
+
export function sanitizeParams(params) {
|
|
85
|
+
if (!params)
|
|
86
|
+
return params;
|
|
87
|
+
const sanitized = { ...params };
|
|
88
|
+
Object.keys(sanitized).forEach(key => {
|
|
89
|
+
const lowerKey = key.toLowerCase();
|
|
90
|
+
// Check for common sensitive parameter names
|
|
91
|
+
if (lowerKey.includes('api_key') ||
|
|
92
|
+
lowerKey.includes('apikey') ||
|
|
93
|
+
lowerKey.includes('token') ||
|
|
94
|
+
lowerKey.includes('secret') ||
|
|
95
|
+
lowerKey.includes('password') ||
|
|
96
|
+
lowerKey.includes('private') ||
|
|
97
|
+
lowerKey.includes('auth')) {
|
|
98
|
+
sanitized[key] = '***REDACTED***';
|
|
99
|
+
}
|
|
100
|
+
// Mask values that look like tokens
|
|
101
|
+
if (typeof sanitized[key] === 'string' &&
|
|
102
|
+
sanitized[key].match(/^[a-zA-Z0-9_-]{16,}$/)) {
|
|
103
|
+
sanitized[key] = sanitized[key].substring(0, 4) + '***';
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
return sanitized;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Sanitize request body
|
|
110
|
+
*/
|
|
111
|
+
export function sanitizeBody(body) {
|
|
112
|
+
if (!body)
|
|
113
|
+
return body;
|
|
114
|
+
// For objects, recursively sanitize
|
|
115
|
+
if (typeof body === 'object' && body !== null) {
|
|
116
|
+
// Handle arrays
|
|
117
|
+
if (Array.isArray(body)) {
|
|
118
|
+
return body.map(item => sanitizeBody(item));
|
|
119
|
+
}
|
|
120
|
+
// Handle objects
|
|
121
|
+
const sanitized = {};
|
|
122
|
+
for (const [key, value] of Object.entries(body)) {
|
|
123
|
+
const lowerKey = key.toLowerCase();
|
|
124
|
+
// Check for sensitive keys
|
|
125
|
+
if (lowerKey.includes('password') ||
|
|
126
|
+
lowerKey.includes('secret') ||
|
|
127
|
+
lowerKey.includes('token') ||
|
|
128
|
+
lowerKey.includes('api_key') ||
|
|
129
|
+
lowerKey.includes('private')) {
|
|
130
|
+
sanitized[key] = '***REDACTED***';
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
sanitized[key] = sanitizeBody(value);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return sanitized;
|
|
137
|
+
}
|
|
138
|
+
// For strings, check if it looks like a token
|
|
139
|
+
if (typeof body === 'string') {
|
|
140
|
+
if (body.match(/^(Bearer|Basic)\s+/i)) {
|
|
141
|
+
return body.replace(/\s+\S+/, ' ***REDACTED***');
|
|
142
|
+
}
|
|
143
|
+
if (body.match(/^[a-zA-Z0-9_-]{32,}$/)) {
|
|
144
|
+
return body.substring(0, 8) + '***';
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return body;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Sanitize URL to remove sensitive query parameters
|
|
151
|
+
*/
|
|
152
|
+
export function sanitizeUrl(url) {
|
|
153
|
+
if (!url)
|
|
154
|
+
return url;
|
|
155
|
+
try {
|
|
156
|
+
const urlObj = new URL(url);
|
|
157
|
+
// Remove sensitive query parameters
|
|
158
|
+
const sensitiveParams = ['api_key', 'apikey', 'token', 'secret', 'auth'];
|
|
159
|
+
let hasSensitiveParams = false;
|
|
160
|
+
sensitiveParams.forEach(param => {
|
|
161
|
+
if (urlObj.searchParams.has(param)) {
|
|
162
|
+
urlObj.searchParams.set(param, '***REDACTED***');
|
|
163
|
+
hasSensitiveParams = true;
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
// If we modified parameters, add indicator
|
|
167
|
+
if (hasSensitiveParams) {
|
|
168
|
+
return urlObj.toString() + '#sanitized';
|
|
169
|
+
}
|
|
170
|
+
return url;
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// If URL parsing fails, mask the entire URL
|
|
174
|
+
return '***REDACTED_URL***';
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Validate and sanitize a DOI string
|
|
179
|
+
*/
|
|
180
|
+
export function sanitizeDoi(doi) {
|
|
181
|
+
if (!doi || typeof doi !== 'string') {
|
|
182
|
+
return { valid: false, sanitized: '', error: 'DOI must be a non-empty string' };
|
|
183
|
+
}
|
|
184
|
+
// Remove whitespace and common prefixes
|
|
185
|
+
let sanitized = doi.trim();
|
|
186
|
+
// Remove common DOI URL prefixes
|
|
187
|
+
const prefixes = [
|
|
188
|
+
'https://doi.org/',
|
|
189
|
+
'http://doi.org/',
|
|
190
|
+
'https://dx.doi.org/',
|
|
191
|
+
'http://dx.doi.org/',
|
|
192
|
+
'doi:',
|
|
193
|
+
'DOI:'
|
|
194
|
+
];
|
|
195
|
+
for (const prefix of prefixes) {
|
|
196
|
+
if (sanitized.toLowerCase().startsWith(prefix.toLowerCase())) {
|
|
197
|
+
sanitized = sanitized.substring(prefix.length);
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Basic DOI format validation
|
|
202
|
+
// DOI should start with "10." followed by digits and then any characters
|
|
203
|
+
const doiPattern = /^10\.\d{4,}(\.\d+)*\/\S+$/;
|
|
204
|
+
if (!doiPattern.test(sanitized)) {
|
|
205
|
+
return { valid: false, sanitized: '', error: 'Invalid DOI format' };
|
|
206
|
+
}
|
|
207
|
+
// Additional safety checks
|
|
208
|
+
if (sanitized.length > 256) {
|
|
209
|
+
return { valid: false, sanitized: '', error: 'DOI too long (max 256 characters)' };
|
|
210
|
+
}
|
|
211
|
+
// Check for suspicious patterns
|
|
212
|
+
if (sanitized.includes('<') || sanitized.includes('>') ||
|
|
213
|
+
sanitized.includes('"') || sanitized.includes("'")) {
|
|
214
|
+
return { valid: false, sanitized: '', error: 'DOI contains invalid characters' };
|
|
215
|
+
}
|
|
216
|
+
return { valid: true, sanitized: sanitized };
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Escape query value for different contexts
|
|
220
|
+
*/
|
|
221
|
+
export function escapeQueryValue(value, context = 'general') {
|
|
222
|
+
if (!value)
|
|
223
|
+
return '';
|
|
224
|
+
// Remove null bytes and control characters
|
|
225
|
+
let escaped = value.replace(/[\x00-\x1F\x7F]/g, '');
|
|
226
|
+
switch (context) {
|
|
227
|
+
case 'springer':
|
|
228
|
+
escaped = escaped
|
|
229
|
+
.replace(/"/g, '\\"') // Escape quotes
|
|
230
|
+
.replace(/[()]/g, '') // Remove parentheses
|
|
231
|
+
.replace(/;/g, '') // Remove semicolons
|
|
232
|
+
.replace(/\/\*/g, '') // Remove SQL comment start
|
|
233
|
+
.replace(/\*\//g, ''); // Remove SQL comment end
|
|
234
|
+
break;
|
|
235
|
+
case 'wos':
|
|
236
|
+
// For WoS, only remove quotes and parentheses if not user-provided field query
|
|
237
|
+
if (!escaped.includes('TS=') && !escaped.includes('TI=') &&
|
|
238
|
+
!escaped.includes('AU=') && !escaped.includes('SO=')) {
|
|
239
|
+
escaped = escaped
|
|
240
|
+
.replace(/"/g, '') // Remove quotes
|
|
241
|
+
.replace(/[()]/g, '') // Remove parentheses
|
|
242
|
+
.trim();
|
|
243
|
+
}
|
|
244
|
+
break;
|
|
245
|
+
default:
|
|
246
|
+
escaped = escaped
|
|
247
|
+
.replace(/["<>]/g, '') // Remove quotes and angle brackets
|
|
248
|
+
.replace(/\/\/+/g, '') // Remove multiple slashes
|
|
249
|
+
.trim();
|
|
250
|
+
}
|
|
251
|
+
// Length limit to prevent DoS
|
|
252
|
+
if (escaped.length > 200) {
|
|
253
|
+
escaped = escaped.substring(0, 200);
|
|
254
|
+
}
|
|
255
|
+
return escaped.trim();
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Validate query complexity to prevent DoS
|
|
259
|
+
*/
|
|
260
|
+
export function validateQueryComplexity(query, options = {}) {
|
|
261
|
+
const maxLength = options.maxLength || 1000;
|
|
262
|
+
const maxBooleanOperators = options.maxBooleanOperators || 10;
|
|
263
|
+
if (!query)
|
|
264
|
+
return { valid: true };
|
|
265
|
+
// Check length
|
|
266
|
+
if (query.length > maxLength) {
|
|
267
|
+
return {
|
|
268
|
+
valid: false,
|
|
269
|
+
error: `Query too long (max ${maxLength} characters)`
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
// Count boolean operators
|
|
273
|
+
const booleanOperators = query.match(/\b(AND|OR|NOT)\b/gi) || [];
|
|
274
|
+
if (booleanOperators.length > maxBooleanOperators) {
|
|
275
|
+
return {
|
|
276
|
+
valid: false,
|
|
277
|
+
error: `Query too complex (max ${maxBooleanOperators} boolean operators)`
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
// Check for potential injection patterns
|
|
281
|
+
const injectionPatterns = [
|
|
282
|
+
/;\s*(drop|delete|update|insert|exec|union)/i,
|
|
283
|
+
/\/\*.*\*\//s, // SQL comments
|
|
284
|
+
/\/\/.*/, // Line comments
|
|
285
|
+
/\b(select|insert|update|delete|drop|create|alter|exec|execute|union)\b.*\b(from|where|and|or)\b/i,
|
|
286
|
+
/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/ // Control characters
|
|
287
|
+
];
|
|
288
|
+
for (const pattern of injectionPatterns) {
|
|
289
|
+
if (pattern.test(query)) {
|
|
290
|
+
return {
|
|
291
|
+
valid: false,
|
|
292
|
+
error: 'Query contains potentially dangerous patterns'
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return { valid: true };
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Create a timeout wrapper for promises
|
|
300
|
+
*/
|
|
301
|
+
export function withTimeout(promise, ms, message) {
|
|
302
|
+
let timer;
|
|
303
|
+
const timeout = new Promise((_, reject) => {
|
|
304
|
+
timer = setTimeout(() => {
|
|
305
|
+
reject(new Error(message || `Operation timed out after ${ms}ms`));
|
|
306
|
+
}, ms);
|
|
307
|
+
});
|
|
308
|
+
return Promise.race([promise, timeout]).finally(() => clearTimeout(timer));
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Generate a correlation ID for request tracking
|
|
312
|
+
*/
|
|
313
|
+
export function generateCorrelationId() {
|
|
314
|
+
return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Mask sensitive data in strings
|
|
318
|
+
*/
|
|
319
|
+
export function maskSensitiveData(str) {
|
|
320
|
+
if (!str || str.length < 8)
|
|
321
|
+
return '***';
|
|
322
|
+
const visibleChars = Math.min(4, Math.floor(str.length / 4));
|
|
323
|
+
return str.substring(0, visibleChars) +
|
|
324
|
+
'*'.repeat(str.length - visibleChars * 2) +
|
|
325
|
+
str.substring(str.length - visibleChars);
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Check if a string looks like an API key or token
|
|
329
|
+
*/
|
|
330
|
+
export function looksLikeToken(str) {
|
|
331
|
+
if (!str || typeof str !== 'string')
|
|
332
|
+
return false;
|
|
333
|
+
// Common token patterns
|
|
334
|
+
const tokenPatterns = [
|
|
335
|
+
/^[a-zA-Z0-9_-]{20,}$/, // Long alphanumeric
|
|
336
|
+
/^Bearer\s+[a-zA-Z0-9_-]+$/, // Bearer token
|
|
337
|
+
/^Basic\s+[A-Za-z0-9+/=]+$/, // Basic auth
|
|
338
|
+
/^[0-9a-f]{32,}$/i, // Hex token
|
|
339
|
+
/^[A-Za-z0-9+/]{20,}={0,2}$/ // Base64-like
|
|
340
|
+
];
|
|
341
|
+
return tokenPatterns.some(pattern => pattern.test(str));
|
|
342
|
+
}
|
|
343
|
+
export default {
|
|
344
|
+
sanitizeRequest,
|
|
345
|
+
sanitizeHeaders,
|
|
346
|
+
sanitizeParams,
|
|
347
|
+
sanitizeBody,
|
|
348
|
+
sanitizeUrl,
|
|
349
|
+
sanitizeDoi,
|
|
350
|
+
escapeQueryValue,
|
|
351
|
+
validateQueryComplexity,
|
|
352
|
+
withTimeout,
|
|
353
|
+
generateCorrelationId,
|
|
354
|
+
maskSensitiveData,
|
|
355
|
+
looksLikeToken
|
|
356
|
+
};
|
|
357
|
+
//# sourceMappingURL=SecurityUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityUtils.js","sourceRoot":"","sources":["../../../src/infrastructure/security/SecurityUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type CapabilityStatus = 'available' | 'degraded' | 'unavailable';
|
|
2
|
+
export interface CapabilityEntry {
|
|
3
|
+
id: 'metadata_search' | 'citation_expansion' | 'body_snippet_search' | 'journal_metrics' | 'pdf_discovery' | 'entitled_access';
|
|
4
|
+
status: CapabilityStatus;
|
|
5
|
+
reason: string;
|
|
6
|
+
configured: string[];
|
|
7
|
+
missing: string[];
|
|
8
|
+
sourceGroups?: Record<string, string[]>;
|
|
9
|
+
requiredKeys?: string[];
|
|
10
|
+
optionalKeys?: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface CapabilityProfile {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
entries: CapabilityEntry[];
|
|
15
|
+
summary: Record<string, CapabilityStatus>;
|
|
16
|
+
}
|
|
17
|
+
export declare function buildCapabilityProfile(): CapabilityProfile;
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/management/capability-profile/index.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,EAAE,EACE,iBAAiB,GACjB,oBAAoB,GACpB,qBAAqB,GACrB,iBAAiB,GACjB,eAAe,GACf,iBAAiB,CAAC;IACtB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC3C;AAmDD,wBAAgB,sBAAsB,IAAI,iBAAiB,CAe1D"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { CONFIG_KEYS, listConfigEntries } from '../config/index.js';
|
|
2
|
+
const METADATA_FREE_SOURCES = [
|
|
3
|
+
'crossref',
|
|
4
|
+
'openalex',
|
|
5
|
+
'pubmed',
|
|
6
|
+
'pmc',
|
|
7
|
+
'europepmc',
|
|
8
|
+
'arxiv',
|
|
9
|
+
'biorxiv',
|
|
10
|
+
'medrxiv',
|
|
11
|
+
'semantic',
|
|
12
|
+
'iacr',
|
|
13
|
+
'core',
|
|
14
|
+
'openaire',
|
|
15
|
+
'googlescholar',
|
|
16
|
+
'dblp',
|
|
17
|
+
'acm',
|
|
18
|
+
'usenix',
|
|
19
|
+
'openreview'
|
|
20
|
+
];
|
|
21
|
+
const METADATA_ENTITLED_SOURCES = ['webofscience', 'sciencedirect', 'springer', 'scopus', 'ieee'];
|
|
22
|
+
const OPEN_ACCESS_SOURCES = [
|
|
23
|
+
'arxiv',
|
|
24
|
+
'biorxiv',
|
|
25
|
+
'medrxiv',
|
|
26
|
+
'pmc',
|
|
27
|
+
'europepmc',
|
|
28
|
+
'core',
|
|
29
|
+
'openaire',
|
|
30
|
+
'unpaywall',
|
|
31
|
+
'openalex_oa_metadata',
|
|
32
|
+
'semantic_open_access_pdf',
|
|
33
|
+
'springer_open_access',
|
|
34
|
+
'sciencedirect_open_access',
|
|
35
|
+
'scopus_open_access_metadata',
|
|
36
|
+
'iacr'
|
|
37
|
+
];
|
|
38
|
+
const ENTITLED_ACCESS_SOURCES = ['webofscience', 'sciencedirect', 'scopus', 'springer', 'ieee', 'wiley_tdm'];
|
|
39
|
+
const SCIHUB_SOURCES = ['scihub'];
|
|
40
|
+
const ENTITLED_KEY_BY_SOURCE = {
|
|
41
|
+
webofscience: ['WOS_API_KEY'],
|
|
42
|
+
sciencedirect: ['ELSEVIER_API_KEY'],
|
|
43
|
+
scopus: ['ELSEVIER_API_KEY'],
|
|
44
|
+
springer: ['SPRINGER_API_KEY'],
|
|
45
|
+
ieee: ['IEEE_API_KEY'],
|
|
46
|
+
wiley_tdm: ['WILEY_TDM_TOKEN']
|
|
47
|
+
};
|
|
48
|
+
export function buildCapabilityProfile() {
|
|
49
|
+
const configuredKeys = configuredConfigKeys();
|
|
50
|
+
const entries = [
|
|
51
|
+
metadataSearchEntry(configuredKeys),
|
|
52
|
+
citationExpansionEntry(),
|
|
53
|
+
bodySnippetSearchEntry(configuredKeys),
|
|
54
|
+
journalMetricsEntry(configuredKeys),
|
|
55
|
+
pdfDiscoveryEntry(configuredKeys),
|
|
56
|
+
entitledAccessEntry(configuredKeys)
|
|
57
|
+
];
|
|
58
|
+
return {
|
|
59
|
+
ok: entries.some(entry => entry.status === 'available' || entry.status === 'degraded'),
|
|
60
|
+
entries,
|
|
61
|
+
summary: Object.fromEntries(entries.map(entry => [entry.id, entry.status]))
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function metadataSearchEntry(configuredKeys) {
|
|
65
|
+
const configuredEntitled = METADATA_ENTITLED_SOURCES.filter(source => keysConfigured(configuredKeys, ENTITLED_KEY_BY_SOURCE[source] || []));
|
|
66
|
+
const missingEntitled = METADATA_ENTITLED_SOURCES.filter(source => !configuredEntitled.includes(source));
|
|
67
|
+
return {
|
|
68
|
+
id: 'metadata_search',
|
|
69
|
+
status: 'available',
|
|
70
|
+
reason: `Free metadata sources are available (${METADATA_FREE_SOURCES.join(', ')}). Sci-Hub is excluded from metadata_search; entitled metadata sources are ${configuredEntitled.length ? `configured for ${configuredEntitled.join(', ')}` : 'not configured'}.`,
|
|
71
|
+
configured: [...METADATA_FREE_SOURCES, ...configuredEntitled],
|
|
72
|
+
missing: missingEntitled,
|
|
73
|
+
sourceGroups: {
|
|
74
|
+
free_sources: METADATA_FREE_SOURCES,
|
|
75
|
+
entitled_sources: configuredEntitled,
|
|
76
|
+
missing_entitled_sources: missingEntitled
|
|
77
|
+
},
|
|
78
|
+
optionalKeys: unique(Object.values(ENTITLED_KEY_BY_SOURCE).flat())
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function citationExpansionEntry() {
|
|
82
|
+
return {
|
|
83
|
+
id: 'citation_expansion',
|
|
84
|
+
status: 'available',
|
|
85
|
+
reason: 'Semantic Scholar Graph API citation expansion is available; SEMANTIC_SCHOLAR_API_KEY is optional for higher quota.',
|
|
86
|
+
configured: ['semantic_scholar_graph'],
|
|
87
|
+
missing: [],
|
|
88
|
+
sourceGroups: {
|
|
89
|
+
citation_sources: ['semantic_scholar_graph']
|
|
90
|
+
},
|
|
91
|
+
optionalKeys: ['SEMANTIC_SCHOLAR_API_KEY']
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function bodySnippetSearchEntry(configuredKeys) {
|
|
95
|
+
const hasKey = configuredKeys.has('SEMANTIC_SCHOLAR_API_KEY');
|
|
96
|
+
return {
|
|
97
|
+
id: 'body_snippet_search',
|
|
98
|
+
status: hasKey ? 'available' : 'unavailable',
|
|
99
|
+
reason: hasKey
|
|
100
|
+
? 'SEMANTIC_SCHOLAR_API_KEY is configured, so Semantic Scholar Open Access body snippet search can run.'
|
|
101
|
+
: 'SEMANTIC_SCHOLAR_API_KEY is missing; metadata search still works, but body snippet search cannot run.',
|
|
102
|
+
configured: hasKey ? ['semantic_snippet_index'] : [],
|
|
103
|
+
missing: hasKey ? [] : ['SEMANTIC_SCHOLAR_API_KEY'],
|
|
104
|
+
requiredKeys: ['SEMANTIC_SCHOLAR_API_KEY']
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function journalMetricsEntry(configuredKeys) {
|
|
108
|
+
const hasKey = configuredKeys.has('EASYSCHOLAR_KEY');
|
|
109
|
+
return {
|
|
110
|
+
id: 'journal_metrics',
|
|
111
|
+
status: hasKey ? 'available' : 'unavailable',
|
|
112
|
+
reason: hasKey
|
|
113
|
+
? 'EASYSCHOLAR_KEY is configured, so EasyScholar journal metrics can run.'
|
|
114
|
+
: 'EASYSCHOLAR_KEY is missing; journal metrics are unavailable until the EasyScholar SecretKey is configured.',
|
|
115
|
+
configured: hasKey ? ['easyscholar'] : [],
|
|
116
|
+
missing: hasKey ? [] : ['EASYSCHOLAR_KEY'],
|
|
117
|
+
requiredKeys: ['EASYSCHOLAR_KEY']
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function pdfDiscoveryEntry(configuredKeys) {
|
|
121
|
+
const configuredEntitled = ENTITLED_ACCESS_SOURCES.filter(source => keysConfigured(configuredKeys, ENTITLED_KEY_BY_SOURCE[source] || []));
|
|
122
|
+
const missingEntitled = ENTITLED_ACCESS_SOURCES.filter(source => !configuredEntitled.includes(source));
|
|
123
|
+
return {
|
|
124
|
+
id: 'pdf_discovery',
|
|
125
|
+
status: configuredEntitled.length > 0 ? 'available' : 'degraded',
|
|
126
|
+
reason: configuredEntitled.length > 0
|
|
127
|
+
? `Open-access PDF discovery, entitled access sources (${configuredEntitled.join(', ')}), and Sci-Hub final fallback are available.`
|
|
128
|
+
: 'Open-access PDF discovery and Sci-Hub final fallback are available; entitled access sources are not configured.',
|
|
129
|
+
configured: [...OPEN_ACCESS_SOURCES, ...configuredEntitled, ...SCIHUB_SOURCES],
|
|
130
|
+
missing: missingEntitled,
|
|
131
|
+
sourceGroups: {
|
|
132
|
+
open_access_sources: OPEN_ACCESS_SOURCES,
|
|
133
|
+
entitled_access_sources: configuredEntitled,
|
|
134
|
+
missing_entitled_access_sources: missingEntitled,
|
|
135
|
+
scihub_sources: SCIHUB_SOURCES
|
|
136
|
+
},
|
|
137
|
+
optionalKeys: unique(Object.values(ENTITLED_KEY_BY_SOURCE).flat())
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function entitledAccessEntry(configuredKeys) {
|
|
141
|
+
const configured = ENTITLED_ACCESS_SOURCES.filter(source => keysConfigured(configuredKeys, ENTITLED_KEY_BY_SOURCE[source] || []));
|
|
142
|
+
const missing = ENTITLED_ACCESS_SOURCES.filter(source => !configured.includes(source));
|
|
143
|
+
return {
|
|
144
|
+
id: 'entitled_access',
|
|
145
|
+
status: configured.length > 0 ? 'available' : 'unavailable',
|
|
146
|
+
reason: configured.length > 0
|
|
147
|
+
? `User-specific access is configured for ${configured.join(', ')}.`
|
|
148
|
+
: 'No publisher, database, TDM, or institutional access keys are configured.',
|
|
149
|
+
configured,
|
|
150
|
+
missing,
|
|
151
|
+
sourceGroups: {
|
|
152
|
+
configured_sources: configured,
|
|
153
|
+
missing_sources: missing
|
|
154
|
+
},
|
|
155
|
+
requiredKeys: unique(Object.values(ENTITLED_KEY_BY_SOURCE).flat())
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
function configuredConfigKeys() {
|
|
159
|
+
return new Set(listConfigEntries(false).filter(entry => entry.configured).map(entry => entry.key));
|
|
160
|
+
}
|
|
161
|
+
function keysConfigured(configuredKeys, keys) {
|
|
162
|
+
return keys.length > 0 && keys.some(key => configuredKeys.has(key));
|
|
163
|
+
}
|
|
164
|
+
function unique(values) {
|
|
165
|
+
return [...new Set(values.filter(key => CONFIG_KEYS.includes(key)))];
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/management/capability-profile/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/management/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/management/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface ApiRequirement {
|
|
2
|
+
id: string;
|
|
3
|
+
platform: string;
|
|
4
|
+
capability: string;
|
|
5
|
+
tools: string[];
|
|
6
|
+
keyGroups: string[][];
|
|
7
|
+
optionalKeyGroups?: string[][];
|
|
8
|
+
productAccess?: string;
|
|
9
|
+
commonFailures: string[];
|
|
10
|
+
actions: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface RequirementStatus extends ApiRequirement {
|
|
13
|
+
configured: boolean;
|
|
14
|
+
configuredGroups: string[][];
|
|
15
|
+
missingGroups: string[][];
|
|
16
|
+
}
|
|
17
|
+
export interface Diagnostic {
|
|
18
|
+
severity: 'info' | 'warning' | 'error';
|
|
19
|
+
category: 'missing_config' | 'invalid_key' | 'permission' | 'query_or_filter' | 'rate_limit' | 'timeout' | 'zero_results' | 'partial_failure' | 'unsupported';
|
|
20
|
+
platform?: string;
|
|
21
|
+
tool?: string;
|
|
22
|
+
summary: string;
|
|
23
|
+
likelyCauses: string[];
|
|
24
|
+
actions: string[];
|
|
25
|
+
relatedConfigKeys: string[];
|
|
26
|
+
}
|
|
27
|
+
interface DiagnosticContext {
|
|
28
|
+
tool?: string;
|
|
29
|
+
platform?: string;
|
|
30
|
+
sources?: string;
|
|
31
|
+
}
|
|
32
|
+
interface ToolResultContext extends DiagnosticContext {
|
|
33
|
+
args?: Record<string, unknown>;
|
|
34
|
+
data?: unknown;
|
|
35
|
+
message?: string;
|
|
36
|
+
}
|
|
37
|
+
export declare const API_REQUIREMENTS: ApiRequirement[];
|
|
38
|
+
export declare function getRequirementStatus(): RequirementStatus[];
|
|
39
|
+
export declare function diagnoseToolResult(context: ToolResultContext): Diagnostic | undefined;
|
|
40
|
+
export declare function diagnoseError(error: any, context?: DiagnosticContext): Diagnostic | undefined;
|
|
41
|
+
export declare function diagnosticContextFromCli(command: string, positionals: string[], flags: Record<string, unknown>): DiagnosticContext;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/management/diagnostics/index.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,EAAE,CAAC;IAC7B,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,QAAQ,EACJ,gBAAgB,GAChB,aAAa,GACb,YAAY,GACZ,iBAAiB,GACjB,YAAY,GACZ,SAAS,GACT,cAAc,GACd,iBAAiB,GACjB,aAAa,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,iBAAkB,SAAQ,iBAAiB;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,gBAAgB,EAAE,cAAc,EA+O5C,CAAC;AAmBF,wBAAgB,oBAAoB,IAAI,iBAAiB,EAAE,CAW1D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,GAAG,SAAS,CAmBrF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,GAAE,iBAAsB,GAAG,UAAU,GAAG,SAAS,CA2JjG;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB,CAsBlI"}
|