@nahisaho/katashiro-analyzer 0.2.2 → 0.2.4

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 (153) hide show
  1. package/dist/factcheck/ClaimParser.d.ts +41 -0
  2. package/dist/factcheck/ClaimParser.d.ts.map +1 -0
  3. package/dist/factcheck/ClaimParser.js +149 -0
  4. package/dist/factcheck/ClaimParser.js.map +1 -0
  5. package/dist/factcheck/ConsistencyChecker.d.ts +56 -0
  6. package/dist/factcheck/ConsistencyChecker.d.ts.map +1 -0
  7. package/dist/factcheck/ConsistencyChecker.js +184 -0
  8. package/dist/factcheck/ConsistencyChecker.js.map +1 -0
  9. package/dist/factcheck/EvidenceCollector.d.ts +89 -0
  10. package/dist/factcheck/EvidenceCollector.d.ts.map +1 -0
  11. package/dist/factcheck/EvidenceCollector.js +222 -0
  12. package/dist/factcheck/EvidenceCollector.js.map +1 -0
  13. package/dist/factcheck/FactChecker.d.ts +81 -0
  14. package/dist/factcheck/FactChecker.d.ts.map +1 -0
  15. package/dist/factcheck/FactChecker.js +302 -0
  16. package/dist/factcheck/FactChecker.js.map +1 -0
  17. package/dist/factcheck/TrustedSourceRegistry.d.ts +47 -0
  18. package/dist/factcheck/TrustedSourceRegistry.d.ts.map +1 -0
  19. package/dist/factcheck/TrustedSourceRegistry.js +208 -0
  20. package/dist/factcheck/TrustedSourceRegistry.js.map +1 -0
  21. package/dist/factcheck/VerdictGenerator.d.ts +36 -0
  22. package/dist/factcheck/VerdictGenerator.d.ts.map +1 -0
  23. package/dist/factcheck/VerdictGenerator.js +154 -0
  24. package/dist/factcheck/VerdictGenerator.js.map +1 -0
  25. package/dist/factcheck/index.d.ts +15 -0
  26. package/dist/factcheck/index.d.ts.map +1 -0
  27. package/dist/factcheck/index.js +14 -0
  28. package/dist/factcheck/index.js.map +1 -0
  29. package/dist/factcheck/types.d.ts +265 -0
  30. package/dist/factcheck/types.d.ts.map +1 -0
  31. package/dist/factcheck/types.js +18 -0
  32. package/dist/factcheck/types.js.map +1 -0
  33. package/dist/index.d.ts +5 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +10 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/interpreter/CodeInterpreter.d.ts +119 -0
  38. package/dist/interpreter/CodeInterpreter.d.ts.map +1 -0
  39. package/dist/interpreter/CodeInterpreter.js +241 -0
  40. package/dist/interpreter/CodeInterpreter.js.map +1 -0
  41. package/dist/interpreter/CodeValidator.d.ts +57 -0
  42. package/dist/interpreter/CodeValidator.d.ts.map +1 -0
  43. package/dist/interpreter/CodeValidator.js +283 -0
  44. package/dist/interpreter/CodeValidator.js.map +1 -0
  45. package/dist/interpreter/ExecutionEngine.d.ts +73 -0
  46. package/dist/interpreter/ExecutionEngine.d.ts.map +1 -0
  47. package/dist/interpreter/ExecutionEngine.js +273 -0
  48. package/dist/interpreter/ExecutionEngine.js.map +1 -0
  49. package/dist/interpreter/ResultFormatter.d.ts +72 -0
  50. package/dist/interpreter/ResultFormatter.d.ts.map +1 -0
  51. package/dist/interpreter/ResultFormatter.js +187 -0
  52. package/dist/interpreter/ResultFormatter.js.map +1 -0
  53. package/dist/interpreter/SandboxManager.d.ts +111 -0
  54. package/dist/interpreter/SandboxManager.d.ts.map +1 -0
  55. package/dist/interpreter/SandboxManager.js +215 -0
  56. package/dist/interpreter/SandboxManager.js.map +1 -0
  57. package/dist/interpreter/SessionManager.d.ts +101 -0
  58. package/dist/interpreter/SessionManager.d.ts.map +1 -0
  59. package/dist/interpreter/SessionManager.js +184 -0
  60. package/dist/interpreter/SessionManager.js.map +1 -0
  61. package/dist/interpreter/index.d.ts +13 -0
  62. package/dist/interpreter/index.d.ts.map +1 -0
  63. package/dist/interpreter/index.js +13 -0
  64. package/dist/interpreter/index.js.map +1 -0
  65. package/dist/interpreter/types.d.ts +311 -0
  66. package/dist/interpreter/types.d.ts.map +1 -0
  67. package/dist/interpreter/types.js +91 -0
  68. package/dist/interpreter/types.js.map +1 -0
  69. package/dist/moa/AgentOrchestrator.d.ts +53 -0
  70. package/dist/moa/AgentOrchestrator.d.ts.map +1 -0
  71. package/dist/moa/AgentOrchestrator.js +164 -0
  72. package/dist/moa/AgentOrchestrator.js.map +1 -0
  73. package/dist/moa/ConsensusCalculator.d.ts +76 -0
  74. package/dist/moa/ConsensusCalculator.d.ts.map +1 -0
  75. package/dist/moa/ConsensusCalculator.js +221 -0
  76. package/dist/moa/ConsensusCalculator.js.map +1 -0
  77. package/dist/moa/MoAEngine.d.ts +97 -0
  78. package/dist/moa/MoAEngine.d.ts.map +1 -0
  79. package/dist/moa/MoAEngine.js +303 -0
  80. package/dist/moa/MoAEngine.js.map +1 -0
  81. package/dist/moa/ResponseAggregator.d.ts +65 -0
  82. package/dist/moa/ResponseAggregator.d.ts.map +1 -0
  83. package/dist/moa/ResponseAggregator.js +274 -0
  84. package/dist/moa/ResponseAggregator.js.map +1 -0
  85. package/dist/moa/TaskAnalyzer.d.ts +30 -0
  86. package/dist/moa/TaskAnalyzer.d.ts.map +1 -0
  87. package/dist/moa/TaskAnalyzer.js +116 -0
  88. package/dist/moa/TaskAnalyzer.js.map +1 -0
  89. package/dist/moa/index.d.ts +19 -0
  90. package/dist/moa/index.d.ts.map +1 -0
  91. package/dist/moa/index.js +18 -0
  92. package/dist/moa/index.js.map +1 -0
  93. package/dist/moa/types.d.ts +261 -0
  94. package/dist/moa/types.d.ts.map +1 -0
  95. package/dist/moa/types.js +70 -0
  96. package/dist/moa/types.js.map +1 -0
  97. package/dist/research/ConvergenceDetector.d.ts +37 -0
  98. package/dist/research/ConvergenceDetector.d.ts.map +1 -0
  99. package/dist/research/ConvergenceDetector.js +62 -0
  100. package/dist/research/ConvergenceDetector.js.map +1 -0
  101. package/dist/research/DeepResearchOrchestrator.d.ts +63 -0
  102. package/dist/research/DeepResearchOrchestrator.d.ts.map +1 -0
  103. package/dist/research/DeepResearchOrchestrator.js +283 -0
  104. package/dist/research/DeepResearchOrchestrator.js.map +1 -0
  105. package/dist/research/FindingIntegrator.d.ts +42 -0
  106. package/dist/research/FindingIntegrator.d.ts.map +1 -0
  107. package/dist/research/FindingIntegrator.js +239 -0
  108. package/dist/research/FindingIntegrator.js.map +1 -0
  109. package/dist/research/GapAnalyzer.d.ts +41 -0
  110. package/dist/research/GapAnalyzer.d.ts.map +1 -0
  111. package/dist/research/GapAnalyzer.js +145 -0
  112. package/dist/research/GapAnalyzer.js.map +1 -0
  113. package/dist/research/QueryGenerator.d.ts +38 -0
  114. package/dist/research/QueryGenerator.d.ts.map +1 -0
  115. package/dist/research/QueryGenerator.js +79 -0
  116. package/dist/research/QueryGenerator.js.map +1 -0
  117. package/dist/research/index.d.ts +14 -0
  118. package/dist/research/index.d.ts.map +1 -0
  119. package/dist/research/index.js +13 -0
  120. package/dist/research/index.js.map +1 -0
  121. package/dist/research/types.d.ts +215 -0
  122. package/dist/research/types.d.ts.map +1 -0
  123. package/dist/research/types.js +18 -0
  124. package/dist/research/types.js.map +1 -0
  125. package/dist/trend/ForecastEngine.d.ts +65 -0
  126. package/dist/trend/ForecastEngine.d.ts.map +1 -0
  127. package/dist/trend/ForecastEngine.js +260 -0
  128. package/dist/trend/ForecastEngine.js.map +1 -0
  129. package/dist/trend/TimeSeriesCollector.d.ts +42 -0
  130. package/dist/trend/TimeSeriesCollector.d.ts.map +1 -0
  131. package/dist/trend/TimeSeriesCollector.js +172 -0
  132. package/dist/trend/TimeSeriesCollector.js.map +1 -0
  133. package/dist/trend/TrendAnalyzer.d.ts +72 -0
  134. package/dist/trend/TrendAnalyzer.d.ts.map +1 -0
  135. package/dist/trend/TrendAnalyzer.js +291 -0
  136. package/dist/trend/TrendAnalyzer.js.map +1 -0
  137. package/dist/trend/TrendDetector.d.ts +67 -0
  138. package/dist/trend/TrendDetector.d.ts.map +1 -0
  139. package/dist/trend/TrendDetector.js +325 -0
  140. package/dist/trend/TrendDetector.js.map +1 -0
  141. package/dist/trend/VisualizationGenerator.d.ts +75 -0
  142. package/dist/trend/VisualizationGenerator.d.ts.map +1 -0
  143. package/dist/trend/VisualizationGenerator.js +294 -0
  144. package/dist/trend/VisualizationGenerator.js.map +1 -0
  145. package/dist/trend/index.d.ts +16 -0
  146. package/dist/trend/index.d.ts.map +1 -0
  147. package/dist/trend/index.js +18 -0
  148. package/dist/trend/index.js.map +1 -0
  149. package/dist/trend/types.d.ts +279 -0
  150. package/dist/trend/types.d.ts.map +1 -0
  151. package/dist/trend/types.js +17 -0
  152. package/dist/trend/types.js.map +1 -0
  153. package/package.json +4 -2
@@ -0,0 +1,222 @@
1
+ /**
2
+ * EvidenceCollector - エビデンスの収集
3
+ *
4
+ * @requirement REQ-ANALYZE-006
5
+ * @design DES-ANALYZE-006-FactChecker
6
+ */
7
+ /**
8
+ * エビデンスを収集するクラス
9
+ */
10
+ export class EvidenceCollector {
11
+ registry;
12
+ searchClient;
13
+ scraper;
14
+ config;
15
+ constructor(registry, searchClient, scraper, config) {
16
+ this.registry = registry;
17
+ this.searchClient = searchClient;
18
+ this.scraper = scraper;
19
+ this.config = {
20
+ maxResultsPerSource: config?.maxResultsPerSource ?? 5,
21
+ timeoutMs: config?.timeoutMs ?? 30000,
22
+ };
23
+ }
24
+ /**
25
+ * 主張に関連するエビデンスを収集
26
+ */
27
+ async collect(claim, sourceTypes = ['trusted_news', 'factcheck_org', 'academic']) {
28
+ const evidence = [];
29
+ if (!this.searchClient) {
30
+ // 検索クライアントがない場合はダミーのエビデンスを返す
31
+ return this.generateDummyEvidence(claim, sourceTypes);
32
+ }
33
+ // 各ソースタイプで検索
34
+ for (const sourceType of sourceTypes) {
35
+ const query = this.buildSearchQuery(claim, sourceType);
36
+ try {
37
+ const results = await this.searchClient.search(query, {
38
+ maxResults: this.config.maxResultsPerSource,
39
+ });
40
+ for (const result of results) {
41
+ const domain = this.extractDomain(result.url);
42
+ // 信頼できるソースかチェック
43
+ if (this.registry.isTrusted(domain) || sourceType === 'factcheck_org') {
44
+ const content = this.scraper
45
+ ? await this.scraper.scrape(result.url)
46
+ : { url: result.url, title: result.title, content: result.snippet || '' };
47
+ const relation = this.determineRelation(claim.normalized, content.content);
48
+ const credibility = this.registry.getCredibility(domain);
49
+ evidence.push({
50
+ id: `ev-${Date.now()}-${Math.random().toString(36).slice(2)}`,
51
+ sourceName: result.title,
52
+ sourceUrl: result.url,
53
+ sourceType: this.registry.getSourceType(domain) || sourceType,
54
+ excerpt: this.extractRelevantExcerpt(content.content, claim.normalized),
55
+ relation,
56
+ credibilityScore: credibility,
57
+ publishedDate: content.publishedDate,
58
+ retrievedAt: new Date(),
59
+ });
60
+ }
61
+ }
62
+ }
63
+ catch {
64
+ // 検索エラーは無視して続行
65
+ continue;
66
+ }
67
+ }
68
+ return evidence;
69
+ }
70
+ /**
71
+ * クイックチェック用のエビデンス収集(少数)
72
+ */
73
+ async collectQuick(claim, maxSources = 3) {
74
+ if (!this.searchClient) {
75
+ return this.generateDummyEvidence(claim, ['factcheck_org']).slice(0, maxSources);
76
+ }
77
+ const query = `fact check "${claim.normalized}"`;
78
+ const results = await this.searchClient.search(query, { maxResults: maxSources });
79
+ return results.map((result, index) => ({
80
+ id: `ev-quick-${Date.now()}-${index}`,
81
+ sourceName: result.title,
82
+ sourceUrl: result.url,
83
+ sourceType: 'factcheck_org',
84
+ excerpt: result.snippet || '',
85
+ relation: 'neutral',
86
+ credibilityScore: this.registry.getCredibility(this.extractDomain(result.url)),
87
+ retrievedAt: new Date(),
88
+ }));
89
+ }
90
+ /**
91
+ * 既存のファクトチェック結果を検索
92
+ */
93
+ async findExistingFactChecks(claim) {
94
+ const existingChecks = [];
95
+ if (!this.searchClient) {
96
+ return existingChecks;
97
+ }
98
+ const factCheckOrgs = this.registry.getSourcesByType('factcheck_org');
99
+ for (const org of factCheckOrgs.slice(0, 3)) {
100
+ const query = `site:${org.domain} "${claim.normalized.slice(0, 50)}"`;
101
+ try {
102
+ const results = await this.searchClient.search(query, { maxResults: 1 });
103
+ if (results.length > 0) {
104
+ const result = results[0];
105
+ const verdictMatch = result.title.toLowerCase().match(/(true|false|mostly true|mostly false|half true|mixture|misleading)/);
106
+ existingChecks.push({
107
+ organization: org.name,
108
+ verdict: verdictMatch ? verdictMatch[1] : 'unknown',
109
+ url: result.url,
110
+ date: new Date(),
111
+ });
112
+ }
113
+ }
114
+ catch {
115
+ continue;
116
+ }
117
+ }
118
+ return existingChecks;
119
+ }
120
+ /**
121
+ * 検索クエリを構築
122
+ */
123
+ buildSearchQuery(claim, sourceType) {
124
+ const entities = claim.entities.slice(0, 3).join(' ');
125
+ const claimPart = claim.normalized.slice(0, 100);
126
+ switch (sourceType) {
127
+ case 'factcheck_org':
128
+ return `fact check ${entities} ${claimPart}`;
129
+ case 'academic':
130
+ return `research study ${entities}`;
131
+ case 'statistics':
132
+ return `statistics data ${entities}`;
133
+ case 'government':
134
+ return `official ${entities}`;
135
+ default:
136
+ return `${entities} ${claimPart}`;
137
+ }
138
+ }
139
+ /**
140
+ * URLからドメインを抽出
141
+ */
142
+ extractDomain(url) {
143
+ try {
144
+ const parsed = new URL(url);
145
+ return parsed.hostname.replace(/^www\./, '');
146
+ }
147
+ catch {
148
+ return url;
149
+ }
150
+ }
151
+ /**
152
+ * コンテンツと主張の関係を判定
153
+ */
154
+ determineRelation(claim, content) {
155
+ const lowerContent = content.toLowerCase();
156
+ const lowerClaim = claim.toLowerCase();
157
+ // キーワードベースの簡易判定
158
+ const keywords = lowerClaim.split(/\s+/).filter(w => w.length > 4);
159
+ const matchCount = keywords.filter(k => lowerContent.includes(k)).length;
160
+ const matchRatio = keywords.length > 0 ? matchCount / keywords.length : 0;
161
+ // 否定表現のチェック
162
+ const negationPatterns = [
163
+ /not\s+true/i, /false/i, /incorrect/i, /wrong/i,
164
+ /debunk/i, /myth/i, /hoax/i, /misleading/i,
165
+ ];
166
+ const hasNegation = negationPatterns.some(p => p.test(content));
167
+ // 肯定表現のチェック
168
+ const affirmationPatterns = [
169
+ /confirmed/i, /verified/i, /accurate/i, /correct/i,
170
+ /true/i, /fact/i,
171
+ ];
172
+ const hasAffirmation = affirmationPatterns.some(p => p.test(content));
173
+ if (hasNegation && matchRatio > 0.3) {
174
+ return 'contradicts';
175
+ }
176
+ else if (hasAffirmation && matchRatio > 0.3) {
177
+ return 'supports';
178
+ }
179
+ else if (matchRatio > 0.5) {
180
+ return 'partially_supports';
181
+ }
182
+ else if (matchRatio > 0.2) {
183
+ return 'context';
184
+ }
185
+ else {
186
+ return 'neutral';
187
+ }
188
+ }
189
+ /**
190
+ * 関連する抜粋を抽出
191
+ */
192
+ extractRelevantExcerpt(content, claim) {
193
+ const keywords = claim.toLowerCase().split(/\s+/).filter(w => w.length > 4);
194
+ const sentences = content.split(/[.!?]+/).filter(s => s.trim().length > 0);
195
+ // キーワードを含む文を探す
196
+ for (const sentence of sentences) {
197
+ const lowerSentence = sentence.toLowerCase();
198
+ const hasKeyword = keywords.some(k => lowerSentence.includes(k));
199
+ if (hasKeyword && sentence.length > 50 && sentence.length < 500) {
200
+ return sentence.trim();
201
+ }
202
+ }
203
+ // 見つからない場合は最初の部分を返す
204
+ return content.slice(0, 300).trim() + '...';
205
+ }
206
+ /**
207
+ * ダミーのエビデンスを生成(テスト用)
208
+ */
209
+ generateDummyEvidence(claim, sourceTypes) {
210
+ return sourceTypes.map((sourceType, index) => ({
211
+ id: `ev-dummy-${Date.now()}-${index}`,
212
+ sourceName: `Source ${index + 1}`,
213
+ sourceUrl: `https://example.com/source${index + 1}`,
214
+ sourceType,
215
+ excerpt: `Evidence related to: ${claim.normalized.slice(0, 50)}...`,
216
+ relation: 'neutral',
217
+ credibilityScore: 0.5,
218
+ retrievedAt: new Date(),
219
+ }));
220
+ }
221
+ }
222
+ //# sourceMappingURL=EvidenceCollector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvidenceCollector.js","sourceRoot":"","sources":["../../src/factcheck/EvidenceCollector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * FactChecker - ファクトチェックオーケストレーター
3
+ *
4
+ * @requirement REQ-ANALYZE-006
5
+ * @design DES-ANALYZE-006-FactChecker
6
+ */
7
+ import type { Result } from '@nahisaho/katashiro-core';
8
+ import type { FactCheckRequest, FactCheckResultDetail, QuickCheckResult, FactCheckerConfig, StrictnessLevel, VerificationSourceType } from './types.js';
9
+ import { type SearchClient, type Scraper } from './EvidenceCollector.js';
10
+ /**
11
+ * ファクトチェックエラーコード
12
+ */
13
+ export type FactCheckErrorCode = 'INVALID_CLAIM' | 'COLLECTION_FAILED' | 'VERIFICATION_FAILED' | 'TIMEOUT';
14
+ /**
15
+ * ファクトチェックエラー
16
+ */
17
+ export interface FactCheckError {
18
+ code: FactCheckErrorCode;
19
+ message: string;
20
+ details?: unknown;
21
+ }
22
+ /**
23
+ * ファクトチェッカー - メインクラス
24
+ */
25
+ export declare class FactChecker {
26
+ private config;
27
+ private claimParser;
28
+ private registry;
29
+ private evidenceCollector;
30
+ private consistencyChecker;
31
+ private verdictGenerator;
32
+ constructor(config?: Partial<FactCheckerConfig>, searchClient?: SearchClient, scraper?: Scraper);
33
+ /**
34
+ * 単一の主張をファクトチェック
35
+ */
36
+ check(request: FactCheckRequest): Promise<Result<FactCheckResultDetail, FactCheckError>>;
37
+ /**
38
+ * 複数の主張をバッチでファクトチェック
39
+ */
40
+ checkBatch(claims: string[], options?: {
41
+ strictnessLevel?: StrictnessLevel;
42
+ verificationSources?: VerificationSourceType[];
43
+ }): Promise<Result<FactCheckResultDetail[], FactCheckError>>;
44
+ /**
45
+ * クイックチェック(簡易版)
46
+ */
47
+ quickCheck(claim: string): Promise<Result<QuickCheckResult, FactCheckError>>;
48
+ /**
49
+ * テキストから主張を抽出
50
+ */
51
+ extractClaims(text: string): string[];
52
+ /**
53
+ * 検証詳細を構築
54
+ */
55
+ private buildVerificationDetails;
56
+ /**
57
+ * 参考文献を構築
58
+ */
59
+ private buildReferences;
60
+ /**
61
+ * サマリーを生成
62
+ */
63
+ private generateSummary;
64
+ /**
65
+ * 詳細説明を生成
66
+ */
67
+ private generateExplanation;
68
+ /**
69
+ * 確信度を計算
70
+ */
71
+ private calculateConfidence;
72
+ /**
73
+ * メタデータを構築
74
+ */
75
+ private buildMetadata;
76
+ /**
77
+ * クイックチェック用の理由を生成
78
+ */
79
+ private generateQuickReason;
80
+ }
81
+ //# sourceMappingURL=FactChecker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FactChecker.d.ts","sourceRoot":"","sources":["../../src/factcheck/FactChecker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAKhB,iBAAiB,EACjB,eAAe,EACf,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAIpB,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,OAAO,EACb,MAAM,wBAAwB,CAAC;AAIhC;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,eAAe,GACf,mBAAmB,GACnB,qBAAqB,GACrB,SAAS,CAAC;AAEd;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,gBAAgB,CAAmB;gBAGzC,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,YAAY,CAAC,EAAE,YAAY,EAC3B,OAAO,CAAC,EAAE,OAAO;IAkBnB;;OAEG;IACG,KAAK,CACT,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC;IAwGzD;;OAEG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,CAAC,EAAE;QACR,eAAe,CAAC,EAAE,eAAe,CAAC;QAClC,mBAAmB,CAAC,EAAE,sBAAsB,EAAE,CAAC;KAChD,GACA,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,EAAE,cAAc,CAAC,CAAC;IA4B3D;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;IA4DlF;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAKrC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA4BhC;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAavB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqD3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwB3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAc5B"}
@@ -0,0 +1,302 @@
1
+ /**
2
+ * FactChecker - ファクトチェックオーケストレーター
3
+ *
4
+ * @requirement REQ-ANALYZE-006
5
+ * @design DES-ANALYZE-006-FactChecker
6
+ */
7
+ import { ok, err } from '@nahisaho/katashiro-core';
8
+ import { DEFAULT_FACTCHECKER_CONFIG } from './types.js';
9
+ import { ClaimParser } from './ClaimParser.js';
10
+ import { TrustedSourceRegistry } from './TrustedSourceRegistry.js';
11
+ import { EvidenceCollector, } from './EvidenceCollector.js';
12
+ import { ConsistencyChecker } from './ConsistencyChecker.js';
13
+ import { VerdictGenerator } from './VerdictGenerator.js';
14
+ /**
15
+ * ファクトチェッカー - メインクラス
16
+ */
17
+ export class FactChecker {
18
+ config;
19
+ claimParser;
20
+ registry;
21
+ evidenceCollector;
22
+ consistencyChecker;
23
+ verdictGenerator;
24
+ constructor(config, searchClient, scraper) {
25
+ this.config = { ...DEFAULT_FACTCHECKER_CONFIG, ...config };
26
+ this.claimParser = new ClaimParser();
27
+ this.registry = new TrustedSourceRegistry(this.config.trustedSources);
28
+ this.evidenceCollector = new EvidenceCollector(this.registry, searchClient, scraper, {
29
+ maxResultsPerSource: this.config.maxConcurrentSearches,
30
+ timeoutMs: this.config.searchTimeoutMs,
31
+ });
32
+ this.consistencyChecker = new ConsistencyChecker();
33
+ this.verdictGenerator = new VerdictGenerator();
34
+ }
35
+ /**
36
+ * 単一の主張をファクトチェック
37
+ */
38
+ async check(request) {
39
+ const startTime = Date.now();
40
+ // 入力検証
41
+ if (!request.claim || request.claim.trim().length === 0) {
42
+ return err({
43
+ code: 'INVALID_CLAIM',
44
+ message: 'Claim cannot be empty',
45
+ });
46
+ }
47
+ try {
48
+ // 1. 主張を解析
49
+ const extractedClaim = this.claimParser.parseSingle(request.claim);
50
+ // 2. エビデンスを収集
51
+ const sourceTypes = request.verificationSources || [
52
+ 'trusted_news',
53
+ 'factcheck_org',
54
+ 'academic',
55
+ ];
56
+ const evidence = await this.evidenceCollector.collect(extractedClaim, sourceTypes);
57
+ // 3. 既存のファクトチェック結果を検索
58
+ const existingFactChecks = await this.evidenceCollector.findExistingFactChecks(extractedClaim);
59
+ // 4. 一貫性をチェック
60
+ const consistencyResult = this.consistencyChecker.check(extractedClaim, evidence);
61
+ // 5. 主張を検証
62
+ const claimVerification = this.consistencyChecker.verify(extractedClaim, evidence);
63
+ // 6. 判定を生成
64
+ const strictnessLevel = request.strictnessLevel || this.config.defaultStrictnessLevel;
65
+ const verdict = this.verdictGenerator.generate({
66
+ claimVerifications: [claimVerification],
67
+ consistencyScore: consistencyResult.score,
68
+ evidenceCount: evidence.length,
69
+ strictnessLevel,
70
+ existingFactChecks,
71
+ });
72
+ // 7. 検証詳細を構築
73
+ const verificationDetails = this.buildVerificationDetails(evidence, consistencyResult.score);
74
+ // 8. 参考文献を構築
75
+ const references = this.buildReferences(evidence);
76
+ // 9. サマリーと説明を生成
77
+ const summary = this.generateSummary(request.claim, verdict, evidence.length);
78
+ const explanation = this.generateExplanation(extractedClaim, verdict, evidence, consistencyResult);
79
+ // 10. 結果を構築
80
+ const result = {
81
+ claim: request.claim,
82
+ normalizedClaim: extractedClaim.normalized,
83
+ verdict,
84
+ confidenceScore: this.calculateConfidence(evidence, consistencyResult.score, verdict),
85
+ evidence,
86
+ verificationDetails,
87
+ summary,
88
+ explanation,
89
+ references,
90
+ existingFactChecks: existingFactChecks.length > 0 ? existingFactChecks : undefined,
91
+ metadata: this.buildMetadata(startTime, sourceTypes),
92
+ };
93
+ return ok(result);
94
+ }
95
+ catch (error) {
96
+ return err({
97
+ code: 'VERIFICATION_FAILED',
98
+ message: `Fact check failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
99
+ details: error,
100
+ });
101
+ }
102
+ }
103
+ /**
104
+ * 複数の主張をバッチでファクトチェック
105
+ */
106
+ async checkBatch(claims, options) {
107
+ const results = [];
108
+ for (const claim of claims) {
109
+ const result = await this.check({
110
+ claim,
111
+ strictnessLevel: options?.strictnessLevel,
112
+ verificationSources: options?.verificationSources,
113
+ });
114
+ if (result.isOk() && result._tag === 'Ok') {
115
+ results.push(result.value);
116
+ }
117
+ else {
118
+ // エラーの場合はスキップして続行
119
+ continue;
120
+ }
121
+ }
122
+ if (results.length === 0) {
123
+ return err({
124
+ code: 'VERIFICATION_FAILED',
125
+ message: 'All claims failed to verify',
126
+ });
127
+ }
128
+ return ok(results);
129
+ }
130
+ /**
131
+ * クイックチェック(簡易版)
132
+ */
133
+ async quickCheck(claim) {
134
+ if (!claim || claim.trim().length === 0) {
135
+ return err({
136
+ code: 'INVALID_CLAIM',
137
+ message: 'Claim cannot be empty',
138
+ });
139
+ }
140
+ try {
141
+ // 主張を解析
142
+ const extractedClaim = this.claimParser.parseSingle(claim);
143
+ // 少数のエビデンスを収集
144
+ const evidence = await this.evidenceCollector.collectQuick(extractedClaim, 3);
145
+ // カウント
146
+ const supporting = evidence.filter(e => e.relation === 'supports' || e.relation === 'partially_supports').length;
147
+ const contradicting = evidence.filter(e => e.relation === 'contradicts').length;
148
+ // クイック判定
149
+ const quickVerdict = this.verdictGenerator.generateQuick(supporting, contradicting, evidence.length);
150
+ // 理由を生成
151
+ const reason = this.generateQuickReason(quickVerdict.label, supporting, contradicting, evidence.length);
152
+ // トップソースを取得
153
+ const topSources = evidence
154
+ .slice(0, 3)
155
+ .map(e => e.sourceName);
156
+ return ok({
157
+ verdict: quickVerdict.label,
158
+ confidence: Math.abs(quickVerdict.score),
159
+ reason,
160
+ topSources,
161
+ });
162
+ }
163
+ catch (error) {
164
+ return err({
165
+ code: 'VERIFICATION_FAILED',
166
+ message: `Quick check failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
167
+ });
168
+ }
169
+ }
170
+ /**
171
+ * テキストから主張を抽出
172
+ */
173
+ extractClaims(text) {
174
+ const claims = this.claimParser.parse(text);
175
+ return claims.map(c => c.original);
176
+ }
177
+ /**
178
+ * 検証詳細を構築
179
+ */
180
+ buildVerificationDetails(evidence, consistencyScore) {
181
+ const supporting = evidence.filter(e => e.relation === 'supports' || e.relation === 'partially_supports').length;
182
+ const contradicting = evidence.filter(e => e.relation === 'contradicts').length;
183
+ const limitations = [];
184
+ if (evidence.length < 5) {
185
+ limitations.push('Limited number of sources available');
186
+ }
187
+ if (consistencyScore < 0.5) {
188
+ limitations.push('Sources show inconsistent information');
189
+ }
190
+ return {
191
+ sourcesExamined: evidence.length,
192
+ supportingEvidence: supporting,
193
+ contradictingEvidence: contradicting,
194
+ consistencyScore,
195
+ limitations,
196
+ };
197
+ }
198
+ /**
199
+ * 参考文献を構築
200
+ */
201
+ buildReferences(evidence) {
202
+ return evidence.map((e, index) => ({
203
+ id: `ref-${index + 1}`,
204
+ title: e.sourceName,
205
+ url: e.sourceUrl,
206
+ publishedDate: e.publishedDate,
207
+ sourceType: e.sourceType,
208
+ }));
209
+ }
210
+ /**
211
+ * サマリーを生成
212
+ */
213
+ generateSummary(claim, verdict, evidenceCount) {
214
+ const verdictUpper = verdict.label.toUpperCase().replace(/_/g, ' ');
215
+ const truncatedClaim = claim.length > 100 ? claim.slice(0, 100) + '...' : claim;
216
+ return `This claim is ${verdictUpper}. Based on ${evidenceCount} sources examined, ` +
217
+ `"${truncatedClaim}" has been evaluated with a confidence of ` +
218
+ `${Math.round(Math.abs(verdict.score) * 100)}%.`;
219
+ }
220
+ /**
221
+ * 詳細説明を生成
222
+ */
223
+ generateExplanation(claim, verdict, evidence, consistency) {
224
+ const lines = [];
225
+ // 主張の分析
226
+ lines.push(`**Claim Analysis:**`);
227
+ lines.push(`- Type: ${claim.type}`);
228
+ lines.push(`- Verifiability: ${claim.verifiability}`);
229
+ lines.push('');
230
+ // 判定理由
231
+ lines.push(`**Verdict Rationale:**`);
232
+ lines.push(verdict.rationale);
233
+ lines.push('');
234
+ // エビデンスサマリー
235
+ lines.push(`**Evidence Summary:**`);
236
+ const supporting = evidence.filter(e => e.relation === 'supports' || e.relation === 'partially_supports');
237
+ const contradicting = evidence.filter(e => e.relation === 'contradicts');
238
+ if (supporting.length > 0) {
239
+ lines.push(`- ${supporting.length} source(s) support this claim`);
240
+ }
241
+ if (contradicting.length > 0) {
242
+ lines.push(`- ${contradicting.length} source(s) contradict this claim`);
243
+ }
244
+ lines.push('');
245
+ // 一貫性
246
+ lines.push(`**Consistency Analysis:**`);
247
+ lines.push(`- Consistency score: ${(consistency.score * 100).toFixed(0)}%`);
248
+ for (const note of consistency.notes) {
249
+ lines.push(`- ${note}`);
250
+ }
251
+ lines.push('');
252
+ // 注意事項
253
+ if (verdict.caveats.length > 0) {
254
+ lines.push(`**Caveats:**`);
255
+ for (const caveat of verdict.caveats) {
256
+ lines.push(`- ${caveat}`);
257
+ }
258
+ }
259
+ return lines.join('\n');
260
+ }
261
+ /**
262
+ * 確信度を計算
263
+ */
264
+ calculateConfidence(evidence, consistencyScore, verdict) {
265
+ // 基本スコア: 判定スコアの絶対値
266
+ let confidence = Math.abs(verdict.score);
267
+ // エビデンス数による調整
268
+ const evidenceFactor = Math.min(1.0, evidence.length / 5);
269
+ confidence = confidence * 0.6 + evidenceFactor * 0.2;
270
+ // 一貫性による調整
271
+ confidence = confidence + consistencyScore * 0.2;
272
+ // 高信頼性ソースがある場合にボーナス
273
+ const highCredibilityCount = evidence.filter(e => e.credibilityScore > 0.8).length;
274
+ if (highCredibilityCount > 0) {
275
+ confidence = Math.min(1.0, confidence + highCredibilityCount * 0.05);
276
+ }
277
+ return Math.max(0, Math.min(1, confidence));
278
+ }
279
+ /**
280
+ * メタデータを構築
281
+ */
282
+ buildMetadata(startTime, sourceTypes) {
283
+ return {
284
+ checkedAt: new Date(),
285
+ processingTimeMs: Date.now() - startTime,
286
+ verificationSourcesUsed: sourceTypes,
287
+ version: '0.2.3',
288
+ };
289
+ }
290
+ /**
291
+ * クイックチェック用の理由を生成
292
+ */
293
+ generateQuickReason(label, supporting, contradicting, total) {
294
+ if (total === 0) {
295
+ return 'No evidence found for quick verification';
296
+ }
297
+ const verdictText = label.replace(/_/g, ' ');
298
+ return `Based on ${total} quick checks: ${supporting} supporting, ` +
299
+ `${contradicting} contradicting. Verdict: ${verdictText}.`;
300
+ }
301
+ }
302
+ //# sourceMappingURL=FactChecker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FactChecker.js","sourceRoot":"","sources":["../../src/factcheck/FactChecker.ts"],"names":[],"mappings":"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"}