contradiction-mcp 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 (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +536 -0
  3. package/bin/cli.js +182 -0
  4. package/dist/analysis/claimMatcher.d.ts +48 -0
  5. package/dist/analysis/claimMatcher.js +131 -0
  6. package/dist/analysis/claimMatcher.js.map +1 -0
  7. package/dist/analysis/claimRelationship.d.ts +15 -0
  8. package/dist/analysis/claimRelationship.js +12 -0
  9. package/dist/analysis/claimRelationship.js.map +1 -0
  10. package/dist/analysis/confidenceScorer.d.ts +40 -0
  11. package/dist/analysis/confidenceScorer.js +59 -0
  12. package/dist/analysis/confidenceScorer.js.map +1 -0
  13. package/dist/analysis/contextAnalyzer.d.ts +13 -0
  14. package/dist/analysis/contextAnalyzer.js +187 -0
  15. package/dist/analysis/contextAnalyzer.js.map +1 -0
  16. package/dist/analysis/contradictionClassifier.d.ts +16 -0
  17. package/dist/analysis/contradictionClassifier.js +141 -0
  18. package/dist/analysis/contradictionClassifier.js.map +1 -0
  19. package/dist/analysis/contradictionEngine.d.ts +29 -0
  20. package/dist/analysis/contradictionEngine.js +284 -0
  21. package/dist/analysis/contradictionEngine.js.map +1 -0
  22. package/dist/analysis/explanationBuilder.d.ts +36 -0
  23. package/dist/analysis/explanationBuilder.js +77 -0
  24. package/dist/analysis/explanationBuilder.js.map +1 -0
  25. package/dist/analysis/valueComparator.d.ts +38 -0
  26. package/dist/analysis/valueComparator.js +418 -0
  27. package/dist/analysis/valueComparator.js.map +1 -0
  28. package/dist/config/env.d.ts +46 -0
  29. package/dist/config/env.js +34 -0
  30. package/dist/config/env.js.map +1 -0
  31. package/dist/connectors/base/connectorUtils.d.ts +26 -0
  32. package/dist/connectors/base/connectorUtils.js +63 -0
  33. package/dist/connectors/base/connectorUtils.js.map +1 -0
  34. package/dist/connectors/base/security.d.ts +11 -0
  35. package/dist/connectors/base/security.js +9 -0
  36. package/dist/connectors/base/security.js.map +1 -0
  37. package/dist/connectors/connectorRegistry.d.ts +43 -0
  38. package/dist/connectors/connectorRegistry.js +91 -0
  39. package/dist/connectors/connectorRegistry.js.map +1 -0
  40. package/dist/connectors/document/documentConnector.d.ts +45 -0
  41. package/dist/connectors/document/documentConnector.js +410 -0
  42. package/dist/connectors/document/documentConnector.js.map +1 -0
  43. package/dist/connectors/github/githubClient.d.ts +52 -0
  44. package/dist/connectors/github/githubClient.js +207 -0
  45. package/dist/connectors/github/githubClient.js.map +1 -0
  46. package/dist/connectors/github/githubConnector.d.ts +26 -0
  47. package/dist/connectors/github/githubConnector.js +169 -0
  48. package/dist/connectors/github/githubConnector.js.map +1 -0
  49. package/dist/connectors/github/githubExtractor.d.ts +26 -0
  50. package/dist/connectors/github/githubExtractor.js +469 -0
  51. package/dist/connectors/github/githubExtractor.js.map +1 -0
  52. package/dist/connectors/github/githubNormalizer.d.ts +11 -0
  53. package/dist/connectors/github/githubNormalizer.js +24 -0
  54. package/dist/connectors/github/githubNormalizer.js.map +1 -0
  55. package/dist/connectors/github/githubTypes.d.ts +55 -0
  56. package/dist/connectors/github/githubTypes.js +2 -0
  57. package/dist/connectors/github/githubTypes.js.map +1 -0
  58. package/dist/connectors/syncService.d.ts +60 -0
  59. package/dist/connectors/syncService.js +176 -0
  60. package/dist/connectors/syncService.js.map +1 -0
  61. package/dist/connectors/types/connector.d.ts +34 -0
  62. package/dist/connectors/types/connector.js +2 -0
  63. package/dist/connectors/types/connector.js.map +1 -0
  64. package/dist/connectors/types/fetchResult.d.ts +39 -0
  65. package/dist/connectors/types/fetchResult.js +2 -0
  66. package/dist/connectors/types/fetchResult.js.map +1 -0
  67. package/dist/connectors/website/ssrfGuard.d.ts +11 -0
  68. package/dist/connectors/website/ssrfGuard.js +122 -0
  69. package/dist/connectors/website/ssrfGuard.js.map +1 -0
  70. package/dist/connectors/website/websiteConnector.d.ts +30 -0
  71. package/dist/connectors/website/websiteConnector.js +231 -0
  72. package/dist/connectors/website/websiteConnector.js.map +1 -0
  73. package/dist/discovery/candidateGenerator.d.ts +12 -0
  74. package/dist/discovery/candidateGenerator.js +110 -0
  75. package/dist/discovery/candidateGenerator.js.map +1 -0
  76. package/dist/discovery/contradictionScanner.d.ts +30 -0
  77. package/dist/discovery/contradictionScanner.js +47 -0
  78. package/dist/discovery/contradictionScanner.js.map +1 -0
  79. package/dist/discovery/discoveryService.d.ts +37 -0
  80. package/dist/discovery/discoveryService.js +131 -0
  81. package/dist/discovery/discoveryService.js.map +1 -0
  82. package/dist/discovery/rankingService.d.ts +34 -0
  83. package/dist/discovery/rankingService.js +52 -0
  84. package/dist/discovery/rankingService.js.map +1 -0
  85. package/dist/discovery/similarityIndex.d.ts +20 -0
  86. package/dist/discovery/similarityIndex.js +89 -0
  87. package/dist/discovery/similarityIndex.js.map +1 -0
  88. package/dist/domain/entities/claim.d.ts +99 -0
  89. package/dist/domain/entities/claim.js +92 -0
  90. package/dist/domain/entities/claim.js.map +1 -0
  91. package/dist/domain/entities/contradiction.d.ts +110 -0
  92. package/dist/domain/entities/contradiction.js +74 -0
  93. package/dist/domain/entities/contradiction.js.map +1 -0
  94. package/dist/domain/entities/source.d.ts +43 -0
  95. package/dist/domain/entities/source.js +35 -0
  96. package/dist/domain/entities/source.js.map +1 -0
  97. package/dist/domain/types/common.d.ts +46 -0
  98. package/dist/domain/types/common.js +74 -0
  99. package/dist/domain/types/common.js.map +1 -0
  100. package/dist/httpServer.d.ts +25 -0
  101. package/dist/httpServer.js +164 -0
  102. package/dist/httpServer.js.map +1 -0
  103. package/dist/index.d.ts +1 -0
  104. package/dist/index.js +94 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/intelligence/authorityScorer.d.ts +20 -0
  107. package/dist/intelligence/authorityScorer.js +103 -0
  108. package/dist/intelligence/authorityScorer.js.map +1 -0
  109. package/dist/intelligence/entityResolver.d.ts +33 -0
  110. package/dist/intelligence/entityResolver.js +152 -0
  111. package/dist/intelligence/entityResolver.js.map +1 -0
  112. package/dist/intelligence/evidenceEvaluator.d.ts +15 -0
  113. package/dist/intelligence/evidenceEvaluator.js +63 -0
  114. package/dist/intelligence/evidenceEvaluator.js.map +1 -0
  115. package/dist/intelligence/freshnessScorer.d.ts +25 -0
  116. package/dist/intelligence/freshnessScorer.js +90 -0
  117. package/dist/intelligence/freshnessScorer.js.map +1 -0
  118. package/dist/intelligence/provenanceAnalyzer.d.ts +19 -0
  119. package/dist/intelligence/provenanceAnalyzer.js +33 -0
  120. package/dist/intelligence/provenanceAnalyzer.js.map +1 -0
  121. package/dist/intelligence/resolutionAdvisor.d.ts +40 -0
  122. package/dist/intelligence/resolutionAdvisor.js +118 -0
  123. package/dist/intelligence/resolutionAdvisor.js.map +1 -0
  124. package/dist/intelligence/semanticMatcher.d.ts +21 -0
  125. package/dist/intelligence/semanticMatcher.js +71 -0
  126. package/dist/intelligence/semanticMatcher.js.map +1 -0
  127. package/dist/scripts/comprehensiveVerification.d.ts +5 -0
  128. package/dist/scripts/comprehensiveVerification.js +961 -0
  129. package/dist/scripts/comprehensiveVerification.js.map +1 -0
  130. package/dist/scripts/finalLiveDemo.d.ts +5 -0
  131. package/dist/scripts/finalLiveDemo.js +226 -0
  132. package/dist/scripts/finalLiveDemo.js.map +1 -0
  133. package/dist/scripts/liveMcpSmoke.d.ts +1 -0
  134. package/dist/scripts/liveMcpSmoke.js +89 -0
  135. package/dist/scripts/liveMcpSmoke.js.map +1 -0
  136. package/dist/scripts/seedDemoData.d.ts +6 -0
  137. package/dist/scripts/seedDemoData.js +179 -0
  138. package/dist/scripts/seedDemoData.js.map +1 -0
  139. package/dist/server.d.ts +28 -0
  140. package/dist/server.js +1264 -0
  141. package/dist/server.js.map +1 -0
  142. package/dist/services/analysisService.d.ts +40 -0
  143. package/dist/services/analysisService.js +65 -0
  144. package/dist/services/analysisService.js.map +1 -0
  145. package/dist/services/healthService.d.ts +42 -0
  146. package/dist/services/healthService.js +50 -0
  147. package/dist/services/healthService.js.map +1 -0
  148. package/dist/services/metricsService.d.ts +35 -0
  149. package/dist/services/metricsService.js +57 -0
  150. package/dist/services/metricsService.js.map +1 -0
  151. package/dist/services/rateLimiter.d.ts +23 -0
  152. package/dist/services/rateLimiter.js +45 -0
  153. package/dist/services/rateLimiter.js.map +1 -0
  154. package/dist/services/reviewService.d.ts +32 -0
  155. package/dist/services/reviewService.js +94 -0
  156. package/dist/services/reviewService.js.map +1 -0
  157. package/dist/services/schedulerService.d.ts +30 -0
  158. package/dist/services/schedulerService.js +89 -0
  159. package/dist/services/schedulerService.js.map +1 -0
  160. package/dist/storage/backupService.d.ts +14 -0
  161. package/dist/storage/backupService.js +90 -0
  162. package/dist/storage/backupService.js.map +1 -0
  163. package/dist/storage/database.d.ts +119 -0
  164. package/dist/storage/database.js +935 -0
  165. package/dist/storage/database.js.map +1 -0
  166. package/dist/storage/migrations/001_initial.sql +63 -0
  167. package/dist/storage/migrations/002_discovery_uniqueness.sql +8 -0
  168. package/dist/storage/migrations/003_connector_identity.sql +7 -0
  169. package/dist/storage/migrations/004_claim_context.sql +15 -0
  170. package/dist/storage/migrations/005_claim_history.sql +26 -0
  171. package/dist/storage/migrations/006_contradiction_resolution.sql +27 -0
  172. package/dist/utils/logger.d.ts +20 -0
  173. package/dist/utils/logger.js +48 -0
  174. package/dist/utils/logger.js.map +1 -0
  175. package/package.json +73 -0
@@ -0,0 +1,176 @@
1
+ import { logger } from '../utils/logger.js';
2
+ export class SyncService {
3
+ dbManager;
4
+ registry;
5
+ discoveryService;
6
+ constructor(dbManager, registry, discoveryService) {
7
+ this.dbManager = dbManager;
8
+ this.registry = registry;
9
+ this.discoveryService = discoveryService;
10
+ }
11
+ /**
12
+ * Synchronizes an external source using its registered connector,
13
+ * extracts and normalizes claims, idempotently upserts them in SQLite,
14
+ * and optionally runs incremental contradiction discovery.
15
+ */
16
+ async syncSource(connectorType, input, options) {
17
+ const startTime = performance.now();
18
+ logger.info('Starting external source synchronization', {
19
+ connector: connectorType,
20
+ input,
21
+ });
22
+ const connector = this.registry.getOrThrow(connectorType);
23
+ // 1. Fetch raw data from external source
24
+ const fetchResult = await connector.fetch(input);
25
+ // 2. Extract and normalize claims
26
+ const extractedClaims = await connector.extractClaims(fetchResult);
27
+ // 3. Upsert Source entity
28
+ const { source } = this.dbManager.upsertSource({
29
+ externalId: fetchResult.sourceIdentifier,
30
+ type: connector.type,
31
+ name: fetchResult.sourceName,
32
+ uri: fetchResult.sourceUri,
33
+ lastFetchedAt: fetchResult.fetchedAt,
34
+ trustScore: 1.0,
35
+ metadata: fetchResult.metadata,
36
+ });
37
+ // 4. Idempotently upsert claims without creating duplicates
38
+ let claimsCreated = 0;
39
+ let claimsUpdated = 0;
40
+ const touchedClaimIds = [];
41
+ for (const claim of extractedClaims) {
42
+ const res = this.dbManager.upsertClaim({
43
+ externalId: claim.externalId,
44
+ sourceId: source.id,
45
+ subject: claim.subject,
46
+ predicate: claim.predicate,
47
+ value: claim.value,
48
+ valueType: claim.valueType,
49
+ normalizedValue: claim.normalizedValue,
50
+ confidence: claim.confidence ?? 1.0,
51
+ environment: claim.environment,
52
+ scope: claim.scope,
53
+ sourceRole: claim.sourceRole,
54
+ isHistorical: claim.isHistorical ?? false,
55
+ validFrom: claim.validFrom,
56
+ validUntil: claim.validUntil,
57
+ valueConstraint: claim.valueConstraint,
58
+ multiValueContext: claim.multiValueContext,
59
+ observedAt: claim.observedAt ?? new Date(),
60
+ metadata: {
61
+ ...claim.provenance,
62
+ },
63
+ });
64
+ if (res.isNew) {
65
+ claimsCreated++;
66
+ touchedClaimIds.push(res.claim.id);
67
+ }
68
+ else if (res.updated) {
69
+ claimsUpdated++;
70
+ touchedClaimIds.push(res.claim.id);
71
+ }
72
+ }
73
+ // 5. Run incremental contradiction discovery for touched claims
74
+ let contradictionsFound = 0;
75
+ let newContradictions = 0;
76
+ const runDiscovery = options?.runDiscoveryAfterSync ?? true;
77
+ if (runDiscovery && this.discoveryService && touchedClaimIds.length > 0) {
78
+ logger.info('Executing incremental contradiction discovery for synced claims', {
79
+ touchedCount: touchedClaimIds.length,
80
+ });
81
+ for (const claimId of touchedClaimIds) {
82
+ try {
83
+ const scanRes = this.discoveryService.scanClaim(claimId, {
84
+ minConfidence: options?.minConfidence ?? 0.5,
85
+ });
86
+ contradictionsFound += scanRes.contradictionsFound;
87
+ newContradictions += scanRes.newContradictions;
88
+ }
89
+ catch (err) {
90
+ logger.warn('Failed incremental scan for claim', { claimId, error: String(err) });
91
+ }
92
+ }
93
+ }
94
+ const durationMs = Math.round(performance.now() - startTime);
95
+ const summary = {
96
+ status: 'completed',
97
+ source: {
98
+ id: source.id,
99
+ type: source.type,
100
+ name: source.name,
101
+ externalId: source.externalId || fetchResult.sourceIdentifier,
102
+ },
103
+ repository: source.name,
104
+ filesInspected: Number(fetchResult.metadata.filesCount || 0),
105
+ claimsExtracted: extractedClaims.length,
106
+ claimsCreated,
107
+ claimsUpdated,
108
+ durationMs,
109
+ contradictionsFound,
110
+ newContradictions,
111
+ };
112
+ logger.info('External source synchronization complete', {
113
+ repository: summary.repository,
114
+ claimsCreated: summary.claimsCreated,
115
+ claimsUpdated: summary.claimsUpdated,
116
+ durationMs: summary.durationMs,
117
+ });
118
+ return summary;
119
+ }
120
+ /**
121
+ * Synchronizes multiple external sources with bounded concurrency and failure isolation.
122
+ */
123
+ async syncSources(requests, options) {
124
+ const startTime = performance.now();
125
+ const concurrency = Math.max(1, Math.min(10, options?.concurrency ?? 3));
126
+ const results = [];
127
+ let succeeded = 0;
128
+ let failed = 0;
129
+ let totalClaimsCreated = 0;
130
+ let totalClaimsUpdated = 0;
131
+ let totalContradictionsFound = 0;
132
+ // Execute with worker queue for bounded concurrency
133
+ let index = 0;
134
+ const executeWorker = async () => {
135
+ while (index < requests.length) {
136
+ const currentIdx = index++;
137
+ const req = requests[currentIdx];
138
+ try {
139
+ const summary = await this.syncSource(req.connector, req.input, options);
140
+ results[currentIdx] = {
141
+ connector: req.connector,
142
+ status: 'completed',
143
+ summary,
144
+ };
145
+ succeeded++;
146
+ totalClaimsCreated += summary.claimsCreated;
147
+ totalClaimsUpdated += summary.claimsUpdated;
148
+ totalContradictionsFound += summary.contradictionsFound ?? 0;
149
+ }
150
+ catch (err) {
151
+ const msg = err instanceof Error ? err.message : String(err);
152
+ logger.error('Failed to sync source in batch', { connector: req.connector, error: msg });
153
+ results[currentIdx] = {
154
+ connector: req.connector,
155
+ status: 'failed',
156
+ error: msg,
157
+ };
158
+ failed++;
159
+ }
160
+ }
161
+ };
162
+ const workers = Array.from({ length: Math.min(concurrency, requests.length) }, () => executeWorker());
163
+ await Promise.all(workers);
164
+ return {
165
+ sourcesRequested: requests.length,
166
+ sourcesSucceeded: succeeded,
167
+ sourcesFailed: failed,
168
+ claimsCreated: totalClaimsCreated,
169
+ claimsUpdated: totalClaimsUpdated,
170
+ contradictionsFound: totalContradictionsFound,
171
+ durationMs: Math.round(performance.now() - startTime),
172
+ results,
173
+ };
174
+ }
175
+ }
176
+ //# sourceMappingURL=syncService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncService.js","sourceRoot":"","sources":["../../src/connectors/syncService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { SourceType } from '../../domain/entities/source.js';
2
+ import type { FetchResult, ExtractedClaim } from './fetchResult.js';
3
+ export interface ConnectorCapabilities {
4
+ supportsIncrementalSync: boolean;
5
+ supportsFileInspection: boolean;
6
+ supportedFileTypes: string[];
7
+ }
8
+ export interface ConnectorMetadata {
9
+ type: SourceType;
10
+ displayName: string;
11
+ description: string;
12
+ authRequirement: 'none' | 'optional' | 'required';
13
+ enabled: boolean;
14
+ capabilities: ConnectorCapabilities;
15
+ }
16
+ export interface ConnectionTestResult {
17
+ accessible: boolean;
18
+ authenticated: boolean;
19
+ targetFound: boolean;
20
+ rateLimit?: {
21
+ limit: number;
22
+ remaining: number;
23
+ resetAt: Date;
24
+ };
25
+ details?: Record<string, unknown>;
26
+ error?: string;
27
+ }
28
+ export interface Connector<TInput = unknown, TRaw = unknown> {
29
+ readonly type: SourceType;
30
+ readonly metadata: ConnectorMetadata;
31
+ testConnection(input?: TInput): Promise<ConnectionTestResult>;
32
+ fetch(input: TInput): Promise<FetchResult<TRaw>>;
33
+ extractClaims(fetchResult: FetchResult<TRaw>): Promise<ExtractedClaim[]>;
34
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=connector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.js","sourceRoot":"","sources":["../../../src/connectors/types/connector.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import type { ClaimEnvironment, ClaimScope, ClaimSourceRole, ClaimValueType } from '../../domain/entities/claim.js';
2
+ export interface ClaimProvenance {
3
+ connector: string;
4
+ repository?: string;
5
+ filePath: string;
6
+ url?: string;
7
+ extractionMethod: string;
8
+ lineRange?: [number, number];
9
+ page?: number;
10
+ observedAt: string;
11
+ evidence: string;
12
+ }
13
+ export interface ExtractedClaim {
14
+ subject: string;
15
+ predicate: string;
16
+ value: string;
17
+ valueType: ClaimValueType;
18
+ normalizedValue?: string | null;
19
+ confidence?: number;
20
+ environment?: ClaimEnvironment | null;
21
+ scope?: ClaimScope | null;
22
+ sourceRole?: ClaimSourceRole | null;
23
+ isHistorical?: boolean;
24
+ validFrom?: Date | null;
25
+ validUntil?: Date | null;
26
+ valueConstraint?: string | null;
27
+ multiValueContext?: string | null;
28
+ observedAt?: Date;
29
+ externalId: string;
30
+ provenance: ClaimProvenance;
31
+ }
32
+ export interface FetchResult<T = unknown> {
33
+ sourceIdentifier: string;
34
+ sourceName: string;
35
+ sourceUri: string;
36
+ fetchedAt: Date;
37
+ rawData: T;
38
+ metadata: Record<string, unknown>;
39
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fetchResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchResult.js","sourceRoot":"","sources":["../../../src/connectors/types/fetchResult.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ export declare class SsrfError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ /**
5
+ * Validates whether an IP address is considered private, loopback, link-local, or cloud metadata.
6
+ */
7
+ export declare function isPrivateOrRestrictedIp(ip: string): boolean;
8
+ /**
9
+ * Validates a target URL against SSRF vulnerabilities by resolving DNS and verifying the IP.
10
+ */
11
+ export declare function validateSafeUrl(rawUrl: string): Promise<URL>;
@@ -0,0 +1,122 @@
1
+ import dns from 'node:dns/promises';
2
+ import net from 'node:net';
3
+ export class SsrfError extends Error {
4
+ constructor(message) {
5
+ super(`SSRF Protection: ${message}`);
6
+ this.name = 'SsrfError';
7
+ }
8
+ }
9
+ /**
10
+ * Validates whether an IP address is considered private, loopback, link-local, or cloud metadata.
11
+ */
12
+ export function isPrivateOrRestrictedIp(ip) {
13
+ // Normalize IPv4-mapped IPv6 (e.g. ::ffff:127.0.0.1)
14
+ if (ip.startsWith('::ffff:')) {
15
+ ip = ip.substring(7);
16
+ }
17
+ // IPv4 checks
18
+ if (net.isIPv4(ip)) {
19
+ const parts = ip.split('.').map((p) => parseInt(p, 10));
20
+ if (parts.length !== 4 || parts.some((p) => isNaN(p) || p < 0 || p > 255)) {
21
+ return true; // invalid = restricted
22
+ }
23
+ const [a, b, c, _d] = parts;
24
+ // 0.0.0.0/8 (Current network)
25
+ if (a === 0)
26
+ return true;
27
+ // 127.0.0.0/8 (Loopback)
28
+ if (a === 127)
29
+ return true;
30
+ // 10.0.0.0/8 (Private)
31
+ if (a === 10)
32
+ return true;
33
+ // 172.16.0.0/12 (Private: 172.16.0.0 - 172.31.255.255)
34
+ if (a === 172 && b >= 16 && b <= 31)
35
+ return true;
36
+ // 192.168.0.0/16 (Private)
37
+ if (a === 192 && b === 168)
38
+ return true;
39
+ // 169.254.0.0/16 (Link-local & AWS/GCP metadata 169.254.169.254)
40
+ if (a === 169 && b === 254)
41
+ return true;
42
+ // 100.64.0.0/10 (Carrier-grade NAT)
43
+ if (a === 100 && b >= 64 && b <= 127)
44
+ return true;
45
+ // 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 (Documentation)
46
+ if (a === 192 && b === 0 && c === 2)
47
+ return true;
48
+ if (a === 198 && b === 51 && c === 100)
49
+ return true;
50
+ if (a === 203 && b === 0 && c === 113)
51
+ return true;
52
+ // 224.0.0.0/4 (Multicast) & 240.0.0.0/4 (Reserved / Broadcast)
53
+ if (a >= 224)
54
+ return true;
55
+ return false;
56
+ }
57
+ // IPv6 checks
58
+ if (net.isIPv6(ip)) {
59
+ const lower = ip.toLowerCase();
60
+ // ::1 (Loopback)
61
+ if (lower === '::1' || lower === '0000:0000:0000:0000:0000:0000:0000:0001')
62
+ return true;
63
+ // :: (Unspecified)
64
+ if (lower === '::' || lower === '0000:0000:0000:0000:0000:0000:0000:0000')
65
+ return true;
66
+ // fc00::/7 (Unique Local Address - ULA)
67
+ if (lower.startsWith('fc') || lower.startsWith('fd'))
68
+ return true;
69
+ // fe80::/10 (Link-local)
70
+ if (lower.startsWith('fe8') ||
71
+ lower.startsWith('fe9') ||
72
+ lower.startsWith('fea') ||
73
+ lower.startsWith('feb'))
74
+ return true;
75
+ return false;
76
+ }
77
+ return true;
78
+ }
79
+ /**
80
+ * Validates a target URL against SSRF vulnerabilities by resolving DNS and verifying the IP.
81
+ */
82
+ export async function validateSafeUrl(rawUrl) {
83
+ let parsedUrl;
84
+ try {
85
+ parsedUrl = new URL(rawUrl);
86
+ }
87
+ catch {
88
+ throw new SsrfError(`Malformed URL: '${rawUrl}'`);
89
+ }
90
+ if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') {
91
+ throw new SsrfError(`Forbidden protocol: '${parsedUrl.protocol}'. Only http: and https: are permitted.`);
92
+ }
93
+ const hostname = parsedUrl.hostname.toLowerCase();
94
+ // Explicit hostnames that are strictly banned
95
+ const bannedHosts = ['localhost', 'metadata.google.internal', 'instance-data', '169.254.169.254'];
96
+ if (bannedHosts.includes(hostname) ||
97
+ hostname.endsWith('.localhost') ||
98
+ hostname.endsWith('.local')) {
99
+ throw new SsrfError(`Forbidden host: '${hostname}'`);
100
+ }
101
+ // Resolve DNS to verify destination IP addresses
102
+ try {
103
+ const addresses = await dns.lookup(hostname, { all: true });
104
+ if (!addresses || addresses.length === 0) {
105
+ throw new SsrfError(`Failed to resolve DNS for hostname '${hostname}'`);
106
+ }
107
+ for (const record of addresses) {
108
+ if (isPrivateOrRestrictedIp(record.address)) {
109
+ throw new SsrfError(`Resolved IP '${record.address}' for host '${hostname}' is private/loopback/restricted. Request blocked.`);
110
+ }
111
+ }
112
+ }
113
+ catch (error) {
114
+ if (error instanceof SsrfError) {
115
+ throw error;
116
+ }
117
+ const msg = error instanceof Error ? error.message : String(error);
118
+ throw new SsrfError(`DNS resolution failure for '${hostname}': ${msg}`);
119
+ }
120
+ return parsedUrl;
121
+ }
122
+ //# sourceMappingURL=ssrfGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssrfGuard.js","sourceRoot":"","sources":["../../../src/connectors/website/ssrfGuard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { Connector, ConnectorMetadata, ConnectionTestResult } from '../types/connector.js';
2
+ import { FetchResult, ExtractedClaim } from '../types/fetchResult.js';
3
+ import { ConnectorSecurityDescriptor } from '../base/security.js';
4
+ export interface WebsiteInput {
5
+ url: string;
6
+ sourceName?: string;
7
+ scope?: string;
8
+ environment?: string;
9
+ timeoutMs?: number;
10
+ }
11
+ export interface WebsiteRawData {
12
+ url: string;
13
+ canonicalUrl?: string;
14
+ title: string;
15
+ statusCode: number;
16
+ contentType: string;
17
+ headers: Record<string, string>;
18
+ textSnippet: string;
19
+ extractedLines: string[];
20
+ }
21
+ export declare class WebsiteConnector implements Connector<WebsiteInput, WebsiteRawData> {
22
+ readonly type: "website";
23
+ readonly metadata: ConnectorMetadata;
24
+ readonly security: ConnectorSecurityDescriptor;
25
+ testConnection(input?: WebsiteInput): Promise<ConnectionTestResult>;
26
+ fetch(input: WebsiteInput): Promise<FetchResult<WebsiteRawData>>;
27
+ extractClaims(fetchResult: FetchResult<WebsiteRawData>): Promise<ExtractedClaim[]>;
28
+ private extractTitle;
29
+ private extractCleanLines;
30
+ }