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,52 @@
1
+ import { GitHubRepoResponse, GitHubContentFile, GitHubFilePayload, GitHubRateLimitInfo } from './githubTypes.js';
2
+ export interface GitHubClientOptions {
3
+ token?: string;
4
+ baseUrl?: string;
5
+ timeoutMs?: number;
6
+ }
7
+ export declare class GitHubClient {
8
+ private readonly token?;
9
+ private readonly baseUrl;
10
+ private readonly timeoutMs;
11
+ constructor(options?: GitHubClientOptions);
12
+ hasToken(): boolean;
13
+ /**
14
+ * Internal reusable HTTP request execution with rate limit handling,
15
+ * authentication headers, timeouts, and sanitized error mapping.
16
+ */
17
+ request<T>(endpoint: string, query?: Record<string, string | undefined>): Promise<{
18
+ data: T;
19
+ rateLimit?: GitHubRateLimitInfo;
20
+ }>;
21
+ /**
22
+ * Fetches metadata for a GitHub repository.
23
+ */
24
+ getRepository(owner: string, repo: string): Promise<GitHubRepoResponse>;
25
+ /**
26
+ * Fetches the default README file for a repository.
27
+ * Returns null if README does not exist (HTTP 404).
28
+ */
29
+ getReadme(owner: string, repo: string, ref?: string): Promise<GitHubFilePayload | null>;
30
+ /**
31
+ * Fetches a specific file's content from a repository.
32
+ * Returns null if the file does not exist.
33
+ */
34
+ getFileContent(owner: string, repo: string, filePath: string, ref?: string): Promise<GitHubFilePayload | null>;
35
+ /**
36
+ * Lists files in a specific directory.
37
+ */
38
+ listDirectory(owner: string, repo: string, dirPath: string, ref?: string): Promise<GitHubContentFile[] | null>;
39
+ /**
40
+ * Discovers and retrieves all GitHub Actions workflow YAML files
41
+ * from `.github/workflows`.
42
+ */
43
+ getWorkflowFiles(owner: string, repo: string, ref?: string): Promise<GitHubFilePayload[]>;
44
+ /**
45
+ * Extracts rate limit metrics from response headers.
46
+ */
47
+ private extractRateLimit;
48
+ /**
49
+ * Decodes a base64 GitHub content object into a UTF-8 string payload.
50
+ */
51
+ private parseContentFile;
52
+ }
@@ -0,0 +1,207 @@
1
+ import { sanitizeSecrets, sanitizeErrorMessage } from '../base/connectorUtils.js';
2
+ import { AuthenticationError, NotFoundError, ConnectorError } from '../../domain/types/common.js';
3
+ import { logger } from '../../utils/logger.js';
4
+ export class GitHubClient {
5
+ token;
6
+ baseUrl;
7
+ timeoutMs;
8
+ constructor(options) {
9
+ this.token = options?.token?.trim() || undefined;
10
+ this.baseUrl = options?.baseUrl?.replace(/\/+$/, '') || 'https://api.github.com';
11
+ this.timeoutMs = options?.timeoutMs ?? 15000;
12
+ }
13
+ hasToken() {
14
+ return Boolean(this.token && this.token.length > 0);
15
+ }
16
+ /**
17
+ * Internal reusable HTTP request execution with rate limit handling,
18
+ * authentication headers, timeouts, and sanitized error mapping.
19
+ */
20
+ async request(endpoint, query) {
21
+ const url = new URL(`${this.baseUrl}${endpoint.startsWith('/') ? endpoint : `/${endpoint}`}`);
22
+ if (query) {
23
+ for (const [key, val] of Object.entries(query)) {
24
+ if (val !== undefined && val !== null) {
25
+ url.searchParams.set(key, val);
26
+ }
27
+ }
28
+ }
29
+ const headers = {
30
+ Accept: 'application/vnd.github.v3+json',
31
+ 'User-Agent': 'contradiction-mcp/0.1.0',
32
+ };
33
+ if (this.token) {
34
+ headers.Authorization = `Bearer ${this.token}`;
35
+ }
36
+ const controller = new AbortController();
37
+ const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
38
+ try {
39
+ logger.debug('Executing GitHub API request', {
40
+ url: url.origin + url.pathname,
41
+ hasAuth: Boolean(this.token),
42
+ });
43
+ const response = await fetch(url.toString(), {
44
+ method: 'GET',
45
+ headers,
46
+ signal: controller.signal,
47
+ });
48
+ clearTimeout(timeoutId);
49
+ const rateLimit = this.extractRateLimit(response.headers);
50
+ if (response.status === 401) {
51
+ throw new AuthenticationError('GitHub API authentication failed. Verify that GITHUB_TOKEN is valid.');
52
+ }
53
+ if (response.status === 403) {
54
+ if (rateLimit && rateLimit.remaining === 0) {
55
+ throw new ConnectorError(`GitHub API rate limit exceeded (limit: ${rateLimit.limit}). Resets at ${rateLimit.resetAt.toISOString()}. Provide GITHUB_TOKEN for higher rate limits.`);
56
+ }
57
+ const errorBody = await response.text().catch(() => '');
58
+ throw new ConnectorError(`GitHub API access forbidden (HTTP 403): ${sanitizeSecrets(errorBody) || 'Permission denied'}`);
59
+ }
60
+ if (response.status === 404) {
61
+ throw new NotFoundError('GitHub resource', `${endpoint}${query?.ref ? ` (ref: ${query.ref})` : ''}`);
62
+ }
63
+ if (!response.ok) {
64
+ const errorBody = await response.text().catch(() => '');
65
+ throw new ConnectorError(`GitHub API request failed with HTTP ${response.status}: ${sanitizeSecrets(errorBody)}`);
66
+ }
67
+ const data = (await response.json());
68
+ return { data, rateLimit };
69
+ }
70
+ catch (error) {
71
+ clearTimeout(timeoutId);
72
+ if (error instanceof AuthenticationError ||
73
+ error instanceof NotFoundError ||
74
+ error instanceof ConnectorError) {
75
+ throw error;
76
+ }
77
+ if (error instanceof Error && error.name === 'AbortError') {
78
+ throw new ConnectorError(`GitHub API request timed out after ${this.timeoutMs}ms`);
79
+ }
80
+ const cleanMessage = sanitizeErrorMessage(error);
81
+ throw new ConnectorError(`GitHub API communication failure: ${cleanMessage}`, error);
82
+ }
83
+ }
84
+ /**
85
+ * Fetches metadata for a GitHub repository.
86
+ */
87
+ async getRepository(owner, repo) {
88
+ const { data } = await this.request(`/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}`);
89
+ return data;
90
+ }
91
+ /**
92
+ * Fetches the default README file for a repository.
93
+ * Returns null if README does not exist (HTTP 404).
94
+ */
95
+ async getReadme(owner, repo, ref) {
96
+ try {
97
+ const { data } = await this.request(`/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/readme`, ref ? { ref } : undefined);
98
+ return this.parseContentFile(data);
99
+ }
100
+ catch (error) {
101
+ if (error instanceof NotFoundError) {
102
+ return null;
103
+ }
104
+ throw error;
105
+ }
106
+ }
107
+ /**
108
+ * Fetches a specific file's content from a repository.
109
+ * Returns null if the file does not exist.
110
+ */
111
+ async getFileContent(owner, repo, filePath, ref) {
112
+ try {
113
+ const cleanPath = filePath.replace(/^\/+/, '');
114
+ const { data } = await this.request(`/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/contents/${encodeURI(cleanPath)}`, ref ? { ref } : undefined);
115
+ if (data.type !== 'file') {
116
+ return null;
117
+ }
118
+ return this.parseContentFile(data);
119
+ }
120
+ catch (error) {
121
+ if (error instanceof NotFoundError) {
122
+ return null;
123
+ }
124
+ throw error;
125
+ }
126
+ }
127
+ /**
128
+ * Lists files in a specific directory.
129
+ */
130
+ async listDirectory(owner, repo, dirPath, ref) {
131
+ try {
132
+ const cleanPath = dirPath.replace(/^\/+/, '');
133
+ const { data } = await this.request(`/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/contents/${encodeURI(cleanPath)}`, ref ? { ref } : undefined);
134
+ return Array.isArray(data) ? data : null;
135
+ }
136
+ catch (error) {
137
+ if (error instanceof NotFoundError) {
138
+ return null;
139
+ }
140
+ throw error;
141
+ }
142
+ }
143
+ /**
144
+ * Discovers and retrieves all GitHub Actions workflow YAML files
145
+ * from `.github/workflows`.
146
+ */
147
+ async getWorkflowFiles(owner, repo, ref) {
148
+ const dirEntries = await this.listDirectory(owner, repo, '.github/workflows', ref);
149
+ if (!dirEntries) {
150
+ return [];
151
+ }
152
+ const workflowFiles = dirEntries.filter((entry) => entry.type === 'file' && (entry.name.endsWith('.yml') || entry.name.endsWith('.yaml')));
153
+ const payloads = [];
154
+ for (const entry of workflowFiles) {
155
+ const file = await this.getFileContent(owner, repo, entry.path, ref);
156
+ if (file) {
157
+ payloads.push(file);
158
+ }
159
+ }
160
+ return payloads;
161
+ }
162
+ /**
163
+ * Extracts rate limit metrics from response headers.
164
+ */
165
+ extractRateLimit(headers) {
166
+ const limitHeader = headers.get('x-ratelimit-limit');
167
+ const remainingHeader = headers.get('x-ratelimit-remaining');
168
+ const resetHeader = headers.get('x-ratelimit-reset');
169
+ if (!limitHeader || !remainingHeader || !resetHeader) {
170
+ return undefined;
171
+ }
172
+ const limit = parseInt(limitHeader, 10);
173
+ const remaining = parseInt(remainingHeader, 10);
174
+ const resetSeconds = parseInt(resetHeader, 10);
175
+ if (isNaN(limit) || isNaN(remaining) || isNaN(resetSeconds)) {
176
+ return undefined;
177
+ }
178
+ return {
179
+ limit,
180
+ remaining,
181
+ resetAt: new Date(resetSeconds * 1000),
182
+ };
183
+ }
184
+ /**
185
+ * Decodes a base64 GitHub content object into a UTF-8 string payload.
186
+ */
187
+ parseContentFile(data) {
188
+ let content = '';
189
+ if (data.content) {
190
+ if (data.encoding === 'base64') {
191
+ const cleanBase64 = data.content.replace(/\r?\n|\r/g, '');
192
+ content = Buffer.from(cleanBase64, 'base64').toString('utf-8');
193
+ }
194
+ else {
195
+ content = data.content;
196
+ }
197
+ }
198
+ return {
199
+ path: data.path,
200
+ content,
201
+ url: data.html_url || data.url,
202
+ sha: data.sha,
203
+ size: data.size,
204
+ };
205
+ }
206
+ }
207
+ //# sourceMappingURL=githubClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubClient.js","sourceRoot":"","sources":["../../../src/connectors/github/githubClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { Connector, ConnectorMetadata, ConnectionTestResult } from '../types/connector.js';
2
+ import { FetchResult, ExtractedClaim } from '../types/fetchResult.js';
3
+ import { GitHubConnectorInput, GitHubFetchData } from './githubTypes.js';
4
+ import { GitHubClient } from './githubClient.js';
5
+ import { GitHubExtractor } from './githubExtractor.js';
6
+ import { GitHubNormalizer } from './githubNormalizer.js';
7
+ export declare class GitHubConnector implements Connector<GitHubConnectorInput, GitHubFetchData> {
8
+ readonly type: "github";
9
+ readonly metadata: ConnectorMetadata;
10
+ private readonly client;
11
+ private readonly extractor;
12
+ private readonly normalizer;
13
+ constructor(client?: GitHubClient, extractor?: GitHubExtractor, normalizer?: GitHubNormalizer);
14
+ /**
15
+ * Tests connection to GitHub and verifies target repository accessibility.
16
+ */
17
+ testConnection(input?: GitHubConnectorInput): Promise<ConnectionTestResult>;
18
+ /**
19
+ * Fetches target repository metadata and files for claim extraction.
20
+ */
21
+ fetch(input: GitHubConnectorInput): Promise<FetchResult<GitHubFetchData>>;
22
+ /**
23
+ * Extracts and normalizes factual claims from fetched repository data.
24
+ */
25
+ extractClaims(fetchResult: FetchResult<GitHubFetchData>): Promise<ExtractedClaim[]>;
26
+ }
@@ -0,0 +1,169 @@
1
+ import { GitHubClient } from './githubClient.js';
2
+ import { GitHubExtractor } from './githubExtractor.js';
3
+ import { GitHubNormalizer } from './githubNormalizer.js';
4
+ import { createSourceExternalId, sanitizeErrorMessage } from '../base/connectorUtils.js';
5
+ import { ValidationError } from '../../domain/types/common.js';
6
+ import { logger } from '../../utils/logger.js';
7
+ export class GitHubConnector {
8
+ type = 'github';
9
+ metadata = {
10
+ type: 'github',
11
+ displayName: 'GitHub Repository',
12
+ description: 'Extracts runtime versions, dependencies, port requirements, and configurations from GitHub repositories via the GitHub REST API.',
13
+ authRequirement: 'optional',
14
+ enabled: true,
15
+ capabilities: {
16
+ supportsIncrementalSync: true,
17
+ supportsFileInspection: true,
18
+ supportedFileTypes: ['package.json', 'Dockerfile', 'README.md', '.github/workflows/*.yml'],
19
+ },
20
+ };
21
+ client;
22
+ extractor;
23
+ normalizer;
24
+ constructor(client, extractor, normalizer) {
25
+ this.client = client || new GitHubClient();
26
+ this.extractor = extractor || new GitHubExtractor();
27
+ this.normalizer = normalizer || new GitHubNormalizer();
28
+ }
29
+ /**
30
+ * Tests connection to GitHub and verifies target repository accessibility.
31
+ */
32
+ async testConnection(input) {
33
+ const hasAuth = this.client.hasToken();
34
+ if (!input || !input.owner || !input.repo) {
35
+ // General API accessibility check
36
+ try {
37
+ const { rateLimit } = await this.client.request('/rate_limit');
38
+ return {
39
+ accessible: true,
40
+ authenticated: hasAuth,
41
+ targetFound: true,
42
+ rateLimit,
43
+ details: { message: 'GitHub API is accessible' },
44
+ };
45
+ }
46
+ catch (error) {
47
+ return {
48
+ accessible: false,
49
+ authenticated: hasAuth,
50
+ targetFound: false,
51
+ error: sanitizeErrorMessage(error),
52
+ };
53
+ }
54
+ }
55
+ try {
56
+ const repo = await this.client.getRepository(input.owner, input.repo);
57
+ return {
58
+ accessible: true,
59
+ authenticated: hasAuth,
60
+ targetFound: true,
61
+ details: {
62
+ owner: repo.owner.login,
63
+ repo: repo.name,
64
+ fullName: repo.full_name,
65
+ defaultBranch: repo.default_branch,
66
+ isPrivate: repo.private,
67
+ htmlUrl: repo.html_url,
68
+ },
69
+ };
70
+ }
71
+ catch (error) {
72
+ const msg = sanitizeErrorMessage(error);
73
+ const isRateLimited = msg.toLowerCase().includes('rate limit');
74
+ return {
75
+ accessible: isRateLimited ? true : false,
76
+ authenticated: hasAuth,
77
+ targetFound: false,
78
+ error: msg,
79
+ details: isRateLimited ? { rateLimited: true, message: msg } : undefined,
80
+ };
81
+ }
82
+ }
83
+ /**
84
+ * Fetches target repository metadata and files for claim extraction.
85
+ */
86
+ async fetch(input) {
87
+ if (!input.owner || !input.repo) {
88
+ throw new ValidationError("GitHub connector requires both 'owner' and 'repo' in input");
89
+ }
90
+ logger.info('Fetching repository via GitHub connector', {
91
+ owner: input.owner,
92
+ repo: input.repo,
93
+ branch: input.branch,
94
+ });
95
+ const repoData = await this.client.getRepository(input.owner, input.repo);
96
+ const branch = input.branch || repoData.default_branch;
97
+ const files = [];
98
+ // 1. Fetch README
99
+ try {
100
+ const readme = await this.client.getReadme(input.owner, input.repo, branch);
101
+ if (readme) {
102
+ files.push(readme);
103
+ }
104
+ }
105
+ catch (err) {
106
+ logger.debug('No README found or error fetching README', { error: String(err) });
107
+ }
108
+ // 2. Fetch package.json
109
+ try {
110
+ const pkg = await this.client.getFileContent(input.owner, input.repo, 'package.json', branch);
111
+ if (pkg) {
112
+ files.push(pkg);
113
+ }
114
+ }
115
+ catch (err) {
116
+ logger.debug('No package.json found or error fetching package.json', { error: String(err) });
117
+ }
118
+ // 3. Fetch Dockerfile
119
+ try {
120
+ const dockerfile = await this.client.getFileContent(input.owner, input.repo, 'Dockerfile', branch);
121
+ if (dockerfile) {
122
+ files.push(dockerfile);
123
+ }
124
+ }
125
+ catch (err) {
126
+ logger.debug('No Dockerfile found or error fetching Dockerfile', { error: String(err) });
127
+ }
128
+ // 4. Fetch GitHub Actions workflows
129
+ try {
130
+ const workflows = await this.client.getWorkflowFiles(input.owner, input.repo, branch);
131
+ files.push(...workflows);
132
+ }
133
+ catch (err) {
134
+ logger.debug('No workflows found or error fetching workflows', { error: String(err) });
135
+ }
136
+ const repoInfo = {
137
+ owner: repoData.owner.login,
138
+ repo: repoData.name,
139
+ fullName: repoData.full_name,
140
+ defaultBranch: repoData.default_branch,
141
+ htmlUrl: repoData.html_url,
142
+ description: repoData.description,
143
+ };
144
+ const sourceExternalId = createSourceExternalId('github', repoInfo.fullName);
145
+ return {
146
+ sourceIdentifier: sourceExternalId,
147
+ sourceName: repoInfo.fullName,
148
+ sourceUri: repoInfo.htmlUrl,
149
+ fetchedAt: new Date(),
150
+ rawData: {
151
+ repository: repoInfo,
152
+ files,
153
+ },
154
+ metadata: {
155
+ branch,
156
+ filesCount: files.length,
157
+ inspectedFiles: files.map((f) => f.path),
158
+ },
159
+ };
160
+ }
161
+ /**
162
+ * Extracts and normalizes factual claims from fetched repository data.
163
+ */
164
+ async extractClaims(fetchResult) {
165
+ const rawClaims = this.extractor.extractClaims(fetchResult.rawData.repository, fetchResult.sourceIdentifier, fetchResult.rawData.files);
166
+ return this.normalizer.normalizeClaims(rawClaims);
167
+ }
168
+ }
169
+ //# sourceMappingURL=githubConnector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubConnector.js","sourceRoot":"","sources":["../../../src/connectors/github/githubConnector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { GitHubFilePayload, GitHubRepoInfo } from './githubTypes.js';
2
+ import { ExtractedClaim } from '../types/fetchResult.js';
3
+ export declare class GitHubExtractor {
4
+ /**
5
+ * Extracts factual claims from a set of repository files.
6
+ */
7
+ extractClaims(repo: GitHubRepoInfo, sourceExternalId: string, files: GitHubFilePayload[]): ExtractedClaim[];
8
+ /**
9
+ * Extracts factual claims from package.json.
10
+ */
11
+ private extractFromPackageJson;
12
+ /**
13
+ * Extracts factual claims from Dockerfile.
14
+ */
15
+ private extractFromDockerfile;
16
+ /**
17
+ * Extracts factual claims from README.md.
18
+ */
19
+ private extractFromReadme;
20
+ /**
21
+ * Extracts factual claims from GitHub Actions workflow files.
22
+ */
23
+ private extractFromWorkflow;
24
+ private findLineNumber;
25
+ private extractEvidence;
26
+ }