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,284 @@
1
+ import { claimMatcher } from './claimMatcher.js';
2
+ import { valueComparator } from './valueComparator.js';
3
+ import { contradictionClassifier } from './contradictionClassifier.js';
4
+ import { confidenceScorer } from './confidenceScorer.js';
5
+ import { explanationBuilder } from './explanationBuilder.js';
6
+ import { contextAnalyzer } from './contextAnalyzer.js';
7
+ export class ContradictionEngine {
8
+ analyzePair(claimA, claimB, sourceA, sourceB) {
9
+ // 1. Same claim identity check
10
+ if (claimA.id && claimB.id && claimA.id === claimB.id) {
11
+ const emptyMatch = {
12
+ matches: true,
13
+ subjectSimilarity: 1.0,
14
+ predicateSimilarity: 1.0,
15
+ normalizedSubjectA: claimA.subject,
16
+ normalizedSubjectB: claimB.subject,
17
+ normalizedPredicateA: claimA.predicate,
18
+ normalizedPredicateB: claimB.predicate,
19
+ reason: 'Identical claim comparison',
20
+ };
21
+ const emptyComp = {
22
+ comparable: true,
23
+ equal: true,
24
+ compatible: true,
25
+ normalizedA: claimA.value,
26
+ normalizedB: claimB.value,
27
+ valueType: claimA.valueType,
28
+ differenceStrength: 0.0,
29
+ };
30
+ const relationship = {
31
+ type: 'SAME_FACT',
32
+ confidence: 1.0,
33
+ explanation: 'A claim cannot contradict itself.',
34
+ isContradictionEligible: false,
35
+ contextFactors: {
36
+ environmentMatch: true,
37
+ scopeMatch: true,
38
+ roleMatch: true,
39
+ temporalMatch: true,
40
+ setMembershipMatch: false,
41
+ },
42
+ };
43
+ return {
44
+ isContradiction: false,
45
+ analysisStatus: 'NOT_A_CONTRADICTION',
46
+ relationship,
47
+ contradictionType: 'UNKNOWN',
48
+ severity: 'LOW',
49
+ confidence: 0.0,
50
+ explanation: 'A claim cannot contradict itself.',
51
+ evidence: {
52
+ claimA,
53
+ claimB,
54
+ match: emptyMatch,
55
+ comparison: emptyComp,
56
+ },
57
+ };
58
+ }
59
+ // 2. Claim matching (Do they refer to the same conceptual fact?)
60
+ const match = claimMatcher.match({ subject: claimA.subject, predicate: claimA.predicate }, { subject: claimB.subject, predicate: claimB.predicate });
61
+ if (!match.matches) {
62
+ const fallbackComp = valueComparator.compare(claimA.value, claimB.value, claimA.valueType);
63
+ const relationship = {
64
+ type: 'UNKNOWN',
65
+ confidence: 0.0,
66
+ explanation: `Claims describe distinct subjects or properties (${match.reason}).`,
67
+ isContradictionEligible: false,
68
+ contextFactors: {
69
+ environmentMatch: claimA.environment === claimB.environment,
70
+ scopeMatch: claimA.scope === claimB.scope,
71
+ roleMatch: claimA.sourceRole === claimB.sourceRole,
72
+ temporalMatch: true,
73
+ setMembershipMatch: false,
74
+ },
75
+ };
76
+ return {
77
+ isContradiction: false,
78
+ analysisStatus: 'NOT_A_CONTRADICTION',
79
+ relationship,
80
+ contradictionType: 'UNKNOWN',
81
+ severity: 'LOW',
82
+ confidence: 0.0,
83
+ explanation: explanationBuilder.buildNonContradictionReason({
84
+ match,
85
+ comparison: fallbackComp,
86
+ claimA,
87
+ claimB,
88
+ contextRelationship: relationship,
89
+ }),
90
+ evidence: {
91
+ claimA,
92
+ claimB,
93
+ match,
94
+ comparison: fallbackComp,
95
+ },
96
+ };
97
+ }
98
+ // 3. Context Analysis (Dimensional context evaluation)
99
+ const contextResult = contextAnalyzer.analyze(claimA, claimB);
100
+ if (!contextResult.relationship.isContradictionEligible) {
101
+ const fallbackComp = valueComparator.compare(claimA.value, claimB.value, claimA.valueType);
102
+ return {
103
+ isContradiction: false,
104
+ analysisStatus: 'NOT_A_CONTRADICTION',
105
+ relationship: contextResult.relationship,
106
+ contradictionType: 'UNKNOWN',
107
+ severity: 'LOW',
108
+ confidence: contextResult.relationship.confidence,
109
+ explanation: explanationBuilder.buildNonContradictionReason({
110
+ match,
111
+ comparison: fallbackComp,
112
+ claimA,
113
+ claimB,
114
+ contextRelationship: contextResult.relationship,
115
+ }),
116
+ evidence: {
117
+ claimA,
118
+ claimB,
119
+ match,
120
+ comparison: fallbackComp,
121
+ context: contextResult,
122
+ },
123
+ };
124
+ }
125
+ // 4. Value comparison
126
+ const resolvedValueType = claimA.valueType === claimB.valueType ? claimA.valueType : undefined;
127
+ const comparison = valueComparator.compare(claimA.value, claimB.value, resolvedValueType);
128
+ // If values are equivalent after normalization
129
+ if (comparison.equal) {
130
+ const relationship = {
131
+ type: 'SAME_FACT',
132
+ confidence: 1.0,
133
+ explanation: `Both claims assert equivalent normalized values ('${comparison.normalizedA}').`,
134
+ isContradictionEligible: false,
135
+ contextFactors: contextResult.relationship.contextFactors,
136
+ };
137
+ return {
138
+ isContradiction: false,
139
+ analysisStatus: 'NOT_A_CONTRADICTION',
140
+ relationship,
141
+ contradictionType: 'UNKNOWN',
142
+ severity: 'LOW',
143
+ confidence: 0.0,
144
+ explanation: explanationBuilder.buildNonContradictionReason({
145
+ match,
146
+ comparison,
147
+ claimA,
148
+ claimB,
149
+ contextRelationship: relationship,
150
+ }),
151
+ evidence: {
152
+ claimA,
153
+ claimB,
154
+ match,
155
+ comparison,
156
+ context: contextResult,
157
+ },
158
+ };
159
+ }
160
+ // If values are compatible (e.g. SemVer range satisfaction or overlapping range)
161
+ if (comparison.compatible) {
162
+ const relationship = {
163
+ type: 'COMPATIBLE_FACT',
164
+ confidence: 0.9,
165
+ explanation: `Values '${claimA.value}' and '${claimB.value}' are compatible (${comparison.differenceType || 'COMPATIBLE'}).`,
166
+ isContradictionEligible: false,
167
+ contextFactors: contextResult.relationship.contextFactors,
168
+ };
169
+ return {
170
+ isContradiction: false,
171
+ analysisStatus: 'NOT_A_CONTRADICTION',
172
+ relationship,
173
+ contradictionType: 'UNKNOWN',
174
+ severity: 'LOW',
175
+ confidence: 0.1,
176
+ explanation: explanationBuilder.buildNonContradictionReason({
177
+ match,
178
+ comparison,
179
+ claimA,
180
+ claimB,
181
+ contextRelationship: relationship,
182
+ }),
183
+ evidence: {
184
+ claimA,
185
+ claimB,
186
+ match,
187
+ comparison,
188
+ context: contextResult,
189
+ },
190
+ };
191
+ }
192
+ // Inconclusive / uncomparable check
193
+ if (!comparison.comparable) {
194
+ const relationship = {
195
+ type: 'UNKNOWN',
196
+ confidence: 0.2,
197
+ explanation: `Values cannot be reliably compared under valueType '${claimA.valueType}'.`,
198
+ isContradictionEligible: false,
199
+ contextFactors: contextResult.relationship.contextFactors,
200
+ };
201
+ return {
202
+ isContradiction: false,
203
+ analysisStatus: 'UNCERTAIN',
204
+ relationship,
205
+ contradictionType: 'UNKNOWN',
206
+ severity: 'LOW',
207
+ confidence: 0.2,
208
+ explanation: explanationBuilder.buildNonContradictionReason({
209
+ match,
210
+ comparison,
211
+ claimA,
212
+ claimB,
213
+ contextRelationship: relationship,
214
+ }),
215
+ evidence: {
216
+ claimA,
217
+ claimB,
218
+ match,
219
+ comparison,
220
+ context: contextResult,
221
+ },
222
+ };
223
+ }
224
+ // 5. Contradiction classification & severity
225
+ const classification = contradictionClassifier.classify({
226
+ predicate: claimA.predicate,
227
+ valueType: comparison.valueType,
228
+ comparison,
229
+ });
230
+ // 6. Confidence scoring
231
+ const confidenceResult = confidenceScorer.calculate({
232
+ subjectSimilarity: match.subjectSimilarity,
233
+ predicateSimilarity: match.predicateSimilarity,
234
+ valueComparable: comparison.comparable,
235
+ valueDifferenceStrength: comparison.differenceStrength,
236
+ claimAConfidence: claimA.confidence,
237
+ claimBConfidence: claimB.confidence,
238
+ sourceATrust: sourceA ? sourceA.trustScore : 1.0,
239
+ sourceBTrust: sourceB ? sourceB.trustScore : 1.0,
240
+ isAmbiguous: !comparison.comparable || comparison.differenceStrength < 0.3,
241
+ });
242
+ // 7. Explanation generation
243
+ const explanation = explanationBuilder.build({
244
+ claimA,
245
+ claimB,
246
+ sourceA,
247
+ sourceB,
248
+ match,
249
+ comparison,
250
+ classification,
251
+ context: {
252
+ relationship: contextResult.relationship,
253
+ compatibilityScore: contextResult.compatibilityScore,
254
+ divergenceDimensions: contextResult.divergenceDimensions,
255
+ },
256
+ });
257
+ const relationship = {
258
+ type: 'INCOMPATIBLE_FACT',
259
+ confidence: confidenceResult.confidence,
260
+ explanation,
261
+ isContradictionEligible: true,
262
+ contextFactors: contextResult.relationship.contextFactors,
263
+ };
264
+ return {
265
+ isContradiction: true,
266
+ analysisStatus: 'CONFIRMED_CONTRADICTION',
267
+ relationship,
268
+ contradictionType: classification.contradictionType,
269
+ severity: classification.severity,
270
+ confidence: confidenceResult.confidence,
271
+ explanation,
272
+ evidence: {
273
+ claimA,
274
+ claimB,
275
+ match,
276
+ comparison,
277
+ context: contextResult,
278
+ confidenceBreakdown: confidenceResult.breakdown,
279
+ },
280
+ };
281
+ }
282
+ }
283
+ export const contradictionEngine = new ContradictionEngine();
284
+ //# sourceMappingURL=contradictionEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contradictionEngine.js","sourceRoot":"","sources":["../../src/analysis/contradictionEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { Claim } from '../domain/entities/claim.js';
2
+ import { Source } from '../domain/entities/source.js';
3
+ import { ClaimMatchResult } from './claimMatcher.js';
4
+ import { ValueComparisonResult } from './valueComparator.js';
5
+ import { ClassificationResult } from './contradictionClassifier.js';
6
+ export interface ExplanationContext {
7
+ claimA: Claim;
8
+ claimB: Claim;
9
+ sourceA?: Source | null;
10
+ sourceB?: Source | null;
11
+ match: ClaimMatchResult;
12
+ comparison: ValueComparisonResult;
13
+ classification: ClassificationResult;
14
+ context?: {
15
+ relationship?: {
16
+ type: string;
17
+ explanation: string;
18
+ };
19
+ compatibilityScore?: number;
20
+ divergenceDimensions?: string[];
21
+ };
22
+ }
23
+ export declare class ExplanationBuilder {
24
+ build(context: ExplanationContext): string;
25
+ buildNonContradictionReason(options: {
26
+ match: ClaimMatchResult;
27
+ comparison: ValueComparisonResult;
28
+ claimA: Claim;
29
+ claimB: Claim;
30
+ contextRelationship?: {
31
+ type: string;
32
+ explanation: string;
33
+ };
34
+ }): string;
35
+ }
36
+ export declare const explanationBuilder: ExplanationBuilder;
@@ -0,0 +1,77 @@
1
+ export class ExplanationBuilder {
2
+ build(context) {
3
+ const { claimA, claimB, sourceA, sourceB, match, comparison, classification } = context;
4
+ const sourceAName = sourceA ? sourceA.name : `Source (${claimA.sourceId})`;
5
+ const sourceBName = sourceB ? sourceB.name : `Source (${claimB.sourceId})`;
6
+ // 1. Same fact statement
7
+ const factStatement = `Both claims describe the ${claimA.predicate} for '${claimA.subject}' (${match.reason}).`;
8
+ // 2. Context detail
9
+ let contextStatement = '';
10
+ if (claimA.environment && claimB.environment && claimA.environment !== 'unknown') {
11
+ contextStatement = ` Operational context: ${claimA.environment} vs ${claimB.environment}.`;
12
+ }
13
+ // 3. What each source claims
14
+ const claimAStatement = `${sourceAName} reports '${claimA.value}' (observed on ${claimA.observedAt.toISOString().split('T')[0]}).`;
15
+ const claimBStatement = `${sourceBName} reports '${claimB.value}' (observed on ${claimB.observedAt.toISOString().split('T')[0]}).`;
16
+ // 4. Why the values conflict
17
+ let conflictDetail = '';
18
+ if (comparison.normalizedA !== claimA.value || comparison.normalizedB !== claimB.value) {
19
+ conflictDetail = `Normalized as '${comparison.normalizedA}' vs '${comparison.normalizedB}'.`;
20
+ }
21
+ let conflictReason;
22
+ switch (classification.contradictionType) {
23
+ case 'VERSION_MISMATCH':
24
+ conflictReason = `The versions are mutually exclusive. ${conflictDetail}`.trim();
25
+ break;
26
+ case 'DATE_MISMATCH':
27
+ conflictReason =
28
+ `The dates represent conflicting milestones or deadlines. ${conflictDetail}`.trim();
29
+ break;
30
+ case 'QUANTITY_MISMATCH':
31
+ conflictReason =
32
+ `The specified numeric quantities or limits do not match. ${conflictDetail}`.trim();
33
+ break;
34
+ case 'STATUS_MISMATCH':
35
+ conflictReason =
36
+ `The reported lifecycle or operational statuses conflict. ${conflictDetail}`.trim();
37
+ break;
38
+ case 'POLICY_MISMATCH':
39
+ conflictReason =
40
+ `The stated rules or access policies are contradictory. ${conflictDetail}`.trim();
41
+ break;
42
+ case 'EXISTENCE_MISMATCH':
43
+ conflictReason = `One statement asserts presence while the other indicates omission or non-existence.`;
44
+ break;
45
+ default:
46
+ conflictReason =
47
+ `The reported values are incompatible and cannot both hold simultaneously. ${conflictDetail}`.trim();
48
+ break;
49
+ }
50
+ // 5. Classification & severity summary
51
+ const summary = `Classified as ${classification.contradictionType} with ${classification.severity} severity.`;
52
+ return `${factStatement}${contextStatement} However, ${claimAStatement} Meanwhile, ${claimBStatement} ${conflictReason} ${summary}`;
53
+ }
54
+ buildNonContradictionReason(options) {
55
+ const { match, comparison, claimA, claimB, contextRelationship } = options;
56
+ if (contextRelationship &&
57
+ contextRelationship.type !== 'SAME_FACT' &&
58
+ contextRelationship.type !== 'INCOMPATIBLE_FACT') {
59
+ return `No contradiction detected (${contextRelationship.type}): ${contextRelationship.explanation}`;
60
+ }
61
+ if (!match.matches) {
62
+ return `No contradiction detected: Claims refer to distinct subjects or predicates (${match.reason}).`;
63
+ }
64
+ if (comparison.equal) {
65
+ return `No contradiction detected: Both claims specify equivalent values for '${claimA.subject}' ('${comparison.normalizedA}').`;
66
+ }
67
+ if (comparison.compatible) {
68
+ return `No contradiction detected (COMPATIBLE_FACT): Values '${claimA.value}' and '${claimB.value}' are compatible (e.g. version range satisfied or overlapping constraints).`;
69
+ }
70
+ if (!comparison.comparable) {
71
+ return `Inconclusive comparison: Values '${claimA.value}' and '${claimB.value}' cannot be reliably compared under valueType '${claimA.valueType}'.`;
72
+ }
73
+ return `No contradiction detected.`;
74
+ }
75
+ }
76
+ export const explanationBuilder = new ExplanationBuilder();
77
+ //# sourceMappingURL=explanationBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explanationBuilder.js","sourceRoot":"","sources":["../../src/analysis/explanationBuilder.ts"],"names":[],"mappings":"AAqBA,MAAM,OAAO,kBAAkB;IACtB,KAAK,CAAC,OAA2B;QACtC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;QAExF,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,QAAQ,GAAG,CAAC;QAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,QAAQ,GAAG,CAAC;QAE3E,yBAAyB;QACzB,MAAM,aAAa,GAAG,4BAA4B,MAAM,CAAC,SAAS,SAAS,MAAM,CAAC,OAAO,MAAM,KAAK,CAAC,MAAM,IAAI,CAAC;QAEhH,oBAAoB;QACpB,IAAI,gBAAgB,GAAG,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACjF,gBAAgB,GAAG,yBAAyB,MAAM,CAAC,WAAW,OAAO,MAAM,CAAC,WAAW,GAAG,CAAC;QAC7F,CAAC;QAED,6BAA6B;QAC7B,MAAM,eAAe,GAAG,GAAG,WAAW,aAAa,MAAM,CAAC,KAAK,kBAAkB,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnI,MAAM,eAAe,GAAG,GAAG,WAAW,aAAa,MAAM,CAAC,KAAK,kBAAkB,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEnI,6BAA6B;QAC7B,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,UAAU,CAAC,WAAW,KAAK,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,WAAW,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;YACvF,cAAc,GAAG,kBAAkB,UAAU,CAAC,WAAW,SAAS,UAAU,CAAC,WAAW,IAAI,CAAC;QAC/F,CAAC;QAED,IAAI,cAAsB,CAAC;QAC3B,QAAQ,cAAc,CAAC,iBAAiB,EAAE,CAAC;YACzC,KAAK,kBAAkB;gBACrB,cAAc,GAAG,wCAAwC,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC;gBACjF,MAAM;YACR,KAAK,eAAe;gBAClB,cAAc;oBACZ,4DAA4D,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC;gBACtF,MAAM;YACR,KAAK,mBAAmB;gBACtB,cAAc;oBACZ,4DAA4D,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC;gBACtF,MAAM;YACR,KAAK,iBAAiB;gBACpB,cAAc;oBACZ,4DAA4D,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC;gBACtF,MAAM;YACR,KAAK,iBAAiB;gBACpB,cAAc;oBACZ,0DAA0D,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC;gBACpF,MAAM;YACR,KAAK,oBAAoB;gBACvB,cAAc,GAAG,qFAAqF,CAAC;gBACvG,MAAM;YACR;gBACE,cAAc;oBACZ,6EAA6E,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC;gBACvG,MAAM;QACV,CAAC;QAED,uCAAuC;QACvC,MAAM,OAAO,GAAG,iBAAiB,cAAc,CAAC,iBAAiB,SAAS,cAAc,CAAC,QAAQ,YAAY,CAAC;QAE9G,OAAO,GAAG,aAAa,GAAG,gBAAgB,aAAa,eAAe,eAAe,eAAe,IAAI,cAAc,IAAI,OAAO,EAAE,CAAC;IACtI,CAAC;IAEM,2BAA2B,CAAC,OAMlC;QACC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC;QAE3E,IACE,mBAAmB;YACnB,mBAAmB,CAAC,IAAI,KAAK,WAAW;YACxC,mBAAmB,CAAC,IAAI,KAAK,mBAAmB,EAChD,CAAC;YACD,OAAO,8BAA8B,mBAAmB,CAAC,IAAI,MAAM,mBAAmB,CAAC,WAAW,EAAE,CAAC;QACvG,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,+EAA+E,KAAK,CAAC,MAAM,IAAI,CAAC;QACzG,CAAC;QAED,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,yEAAyE,MAAM,CAAC,OAAO,OAAO,UAAU,CAAC,WAAW,KAAK,CAAC;QACnI,CAAC;QAED,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC1B,OAAO,wDAAwD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAK,6EAA6E,CAAC;QACjL,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YAC3B,OAAO,oCAAoC,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAK,kDAAkD,MAAM,CAAC,SAAS,IAAI,CAAC;QACtJ,CAAC;QAED,OAAO,4BAA4B,CAAC;IACtC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,38 @@
1
+ export interface ValueComparisonResult {
2
+ comparable: boolean;
3
+ equal: boolean;
4
+ compatible?: boolean;
5
+ normalizedA: string;
6
+ normalizedB: string;
7
+ valueType: string;
8
+ differenceStrength: number;
9
+ differenceType?: string;
10
+ details?: Record<string, unknown>;
11
+ }
12
+ export declare class ValueComparator {
13
+ compare(valA: string, valB: string, explicitValueType?: string): ValueComparisonResult;
14
+ private inferValueType;
15
+ private isLikelyVersion;
16
+ cleanSemverRange(val: string): string | null;
17
+ normalizeVersion(val: string): {
18
+ canonical: string;
19
+ segments: number[];
20
+ } | null;
21
+ private compareVersions;
22
+ private isLikelyDate;
23
+ normalizeDate(val: string): string | null;
24
+ private compareDates;
25
+ private isLikelyPrice;
26
+ normalizePrice(val: string): {
27
+ amount: number;
28
+ currency?: string;
29
+ } | null;
30
+ private comparePrices;
31
+ private isLikelyNumber;
32
+ private compareNumbers;
33
+ private compareStatuses;
34
+ private normalizeBoolean;
35
+ private compareBooleans;
36
+ private compareStrings;
37
+ }
38
+ export declare const valueComparator: ValueComparator;