@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,63 @@
1
+ /**
2
+ * DeepResearchOrchestrator - 深層リサーチの実行オーケストレーター
3
+ *
4
+ * @requirement REQ-ANALYZE-008
5
+ * @design DES-ANALYZE-008
6
+ * @task TASK-003
7
+ */
8
+ import type { DeepResearchQuery, DeepResearchResult, ResearchProgress, UserGuidance } from './types.js';
9
+ /**
10
+ * 深層リサーチを実行するオーケストレーター
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const orchestrator = new DeepResearchOrchestrator();
15
+ *
16
+ * // 基本的な使い方
17
+ * for await (const progress of orchestrator.research({
18
+ * topic: 'AI ethics',
19
+ * focusAreas: ['privacy', 'bias'],
20
+ * })) {
21
+ * console.log(`Iteration ${progress.iteration}: ${progress.phase}`);
22
+ * console.log(`Novelty: ${(progress.noveltyRate * 100).toFixed(1)}%`);
23
+ * }
24
+ *
25
+ * // 結果の取得
26
+ * const result = orchestrator.getResult();
27
+ * console.log(`Total findings: ${result.keyFindings.length}`);
28
+ * ```
29
+ */
30
+ export declare class DeepResearchOrchestrator {
31
+ private wideResearch;
32
+ private gapAnalyzer;
33
+ private convergenceDetector;
34
+ private queryGenerator;
35
+ private findingIntegrator;
36
+ private currentResult;
37
+ constructor();
38
+ /**
39
+ * 深層リサーチを実行(AsyncGenerator)
40
+ */
41
+ research(query: DeepResearchQuery): AsyncGenerator<ResearchProgress, void, UserGuidance | undefined>;
42
+ /**
43
+ * 最終結果を取得
44
+ */
45
+ getResult(): DeepResearchResult | null;
46
+ /**
47
+ * ルートノードを追加
48
+ */
49
+ private addRootNode;
50
+ /**
51
+ * サマリーを生成
52
+ */
53
+ private generateSummary;
54
+ /**
55
+ * 主要発見を抽出
56
+ */
57
+ private extractKeyFindings;
58
+ /**
59
+ * IDを正規化
60
+ */
61
+ private normalizeId;
62
+ }
63
+ //# sourceMappingURL=DeepResearchOrchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeepResearchOrchestrator.d.ts","sourceRoot":"","sources":["../../src/research/DeepResearchOrchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAKhB,YAAY,EACb,MAAM,YAAY,CAAC;AAcpB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,aAAa,CAAmC;;IAUxD;;OAEG;IACI,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,cAAc,CAAC,gBAAgB,EAAE,IAAI,EAAE,YAAY,GAAG,SAAS,CAAC;IA0M3G;;OAEG;IACH,SAAS,IAAI,kBAAkB,GAAG,IAAI;IAItC;;OAEG;IACH,OAAO,CAAC,WAAW;IAYnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,OAAO,CAAC,WAAW;CAOpB"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * DeepResearchOrchestrator - 深層リサーチの実行オーケストレーター
3
+ *
4
+ * @requirement REQ-ANALYZE-008
5
+ * @design DES-ANALYZE-008
6
+ * @task TASK-003
7
+ */
8
+ import { KnowledgeGraph } from '@nahisaho/katashiro-knowledge';
9
+ import { WideResearchEngine } from '@nahisaho/katashiro-collector';
10
+ import { isOk } from '@nahisaho/katashiro-core';
11
+ import { GapAnalyzer } from './GapAnalyzer.js';
12
+ import { ConvergenceDetector } from './ConvergenceDetector.js';
13
+ import { QueryGenerator } from './QueryGenerator.js';
14
+ import { FindingIntegrator } from './FindingIntegrator.js';
15
+ const DEFAULT_CONFIG = {
16
+ maxIterations: 10,
17
+ convergenceThreshold: 0.15,
18
+ iterationTimeout: 60000, // 1分
19
+ totalTimeout: 600000, // 10分
20
+ depthPriority: 'balanced',
21
+ };
22
+ /**
23
+ * 深層リサーチを実行するオーケストレーター
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const orchestrator = new DeepResearchOrchestrator();
28
+ *
29
+ * // 基本的な使い方
30
+ * for await (const progress of orchestrator.research({
31
+ * topic: 'AI ethics',
32
+ * focusAreas: ['privacy', 'bias'],
33
+ * })) {
34
+ * console.log(`Iteration ${progress.iteration}: ${progress.phase}`);
35
+ * console.log(`Novelty: ${(progress.noveltyRate * 100).toFixed(1)}%`);
36
+ * }
37
+ *
38
+ * // 結果の取得
39
+ * const result = orchestrator.getResult();
40
+ * console.log(`Total findings: ${result.keyFindings.length}`);
41
+ * ```
42
+ */
43
+ export class DeepResearchOrchestrator {
44
+ wideResearch;
45
+ gapAnalyzer;
46
+ convergenceDetector;
47
+ queryGenerator;
48
+ findingIntegrator;
49
+ currentResult = null;
50
+ constructor() {
51
+ this.wideResearch = new WideResearchEngine();
52
+ this.gapAnalyzer = new GapAnalyzer();
53
+ this.convergenceDetector = new ConvergenceDetector();
54
+ this.queryGenerator = new QueryGenerator();
55
+ this.findingIntegrator = new FindingIntegrator();
56
+ }
57
+ /**
58
+ * 深層リサーチを実行(AsyncGenerator)
59
+ */
60
+ async *research(query) {
61
+ const config = { ...DEFAULT_CONFIG, ...query };
62
+ const startTime = Date.now();
63
+ // 知識グラフを初期化
64
+ const graph = new KnowledgeGraph();
65
+ this.addRootNode(graph, query.topic);
66
+ // 状態の初期化
67
+ const iterations = [];
68
+ const allSources = [];
69
+ const noveltyRates = [];
70
+ let totalFindingsProcessed = 0;
71
+ let completionReason = 'max_iterations';
72
+ for (let i = 0; i < config.maxIterations; i++) {
73
+ // タイムアウトチェック
74
+ if (Date.now() - startTime > config.totalTimeout) {
75
+ completionReason = 'timeout';
76
+ break;
77
+ }
78
+ // フェーズ1: クエリ生成
79
+ const queries = i === 0
80
+ ? this.queryGenerator.generateInitialQueries(query.topic, query.focusAreas, query.context)
81
+ : this.queryGenerator.generateFromGaps(await this.gapAnalyzer.analyze(this.findingIntegrator.toSimpleGraph(graph), query.topic, query.focusAreas), this.findingIntegrator.toSimpleGraph(graph), query.excludeAreas);
82
+ // クエリが生成できない場合は終了
83
+ if (queries.length === 0) {
84
+ completionReason = 'converged';
85
+ break;
86
+ }
87
+ // フェーズ2: 検索実行
88
+ yield {
89
+ iteration: i + 1,
90
+ phase: 'searching',
91
+ currentQuery: queries[0] || '',
92
+ totalFindingsCount: totalFindingsProcessed,
93
+ noveltyRate: i > 0 ? noveltyRates[noveltyRates.length - 1] || 0 : 1,
94
+ convergenceScore: this.convergenceDetector.calculate(noveltyRates, i > 0 ? noveltyRates[noveltyRates.length - 1] || 0 : 1),
95
+ gaps: [],
96
+ elapsedTime: Date.now() - startTime,
97
+ };
98
+ const findings = [];
99
+ for (const q of queries.slice(0, 3)) {
100
+ // 最大3クエリ
101
+ try {
102
+ const result = await this.wideResearch.research({
103
+ topic: q,
104
+ depth: 'medium',
105
+ maxResultsPerSource: 5,
106
+ agentTimeout: config.iterationTimeout / 3,
107
+ });
108
+ if (isOk(result)) {
109
+ findings.push(...result.value.findings);
110
+ // ソース情報を収集
111
+ for (const source of result.value.sources) {
112
+ allSources.push({
113
+ url: `search://${source.type}/${encodeURIComponent(source.query)}`,
114
+ title: `${source.type}: ${source.query}`,
115
+ type: source.type,
116
+ accessedAt: new Date(),
117
+ });
118
+ }
119
+ }
120
+ }
121
+ catch {
122
+ // 検索エラーは無視して続行
123
+ }
124
+ }
125
+ // フェーズ3: 統合
126
+ yield {
127
+ iteration: i + 1,
128
+ phase: 'integrating',
129
+ currentQuery: queries[0] || '',
130
+ totalFindingsCount: totalFindingsProcessed,
131
+ noveltyRate: i > 0 ? noveltyRates[noveltyRates.length - 1] || 0 : 1,
132
+ convergenceScore: this.convergenceDetector.calculate(noveltyRates, i > 0 ? noveltyRates[noveltyRates.length - 1] || 0 : 1),
133
+ gaps: [],
134
+ elapsedTime: Date.now() - startTime,
135
+ };
136
+ const previousNodeCount = graph.getAllNodes().length;
137
+ const integrationResult = await this.findingIntegrator.integrate(graph, findings, query.topic);
138
+ // 新規情報率を計算
139
+ const noveltyRate = previousNodeCount > 0 ? integrationResult.newNodesCount / previousNodeCount : 1;
140
+ noveltyRates.push(noveltyRate);
141
+ totalFindingsProcessed += findings.length;
142
+ // イテレーション記録
143
+ iterations.push({
144
+ iterationNumber: i + 1,
145
+ queries,
146
+ findingsCount: findings.length,
147
+ newNodesCount: integrationResult.newNodesCount,
148
+ newEdgesCount: integrationResult.newEdgesCount,
149
+ noveltyRate,
150
+ duration: Date.now() - startTime - iterations.reduce((sum, r) => sum + r.duration, 0),
151
+ });
152
+ // フェーズ4: ギャップ分析
153
+ const gaps = await this.gapAnalyzer.analyze(this.findingIntegrator.toSimpleGraph(graph), query.topic, query.focusAreas);
154
+ yield {
155
+ iteration: i + 1,
156
+ phase: 'analyzing',
157
+ currentQuery: queries[0] || '',
158
+ totalFindingsCount: totalFindingsProcessed,
159
+ noveltyRate,
160
+ convergenceScore: this.convergenceDetector.calculate(noveltyRates.slice(0, -1), noveltyRate),
161
+ gaps,
162
+ elapsedTime: Date.now() - startTime,
163
+ };
164
+ // 収束チェック
165
+ if (this.convergenceDetector.hasConverged(noveltyRates.slice(0, -1), noveltyRate, config.convergenceThreshold)) {
166
+ completionReason = 'converged';
167
+ break;
168
+ }
169
+ // ユーザーガイダンス(オプション)
170
+ if (query.userGuidance && gaps.length > 0) {
171
+ const guidance = yield {
172
+ iteration: i + 1,
173
+ phase: 'waiting_guidance',
174
+ currentQuery: queries[0] || '',
175
+ totalFindingsCount: totalFindingsProcessed,
176
+ noveltyRate,
177
+ convergenceScore: this.convergenceDetector.calculate(noveltyRates.slice(0, -1), noveltyRate),
178
+ gaps,
179
+ elapsedTime: Date.now() - startTime,
180
+ };
181
+ // ユーザーからの停止指示
182
+ if (guidance?.action === 'stop') {
183
+ completionReason = 'user_stopped';
184
+ break;
185
+ }
186
+ }
187
+ }
188
+ // 最終結果を構築
189
+ const simpleGraph = this.findingIntegrator.toSimpleGraph(graph);
190
+ const remainingGaps = await this.gapAnalyzer.analyze(simpleGraph, query.topic, query.focusAreas);
191
+ this.currentResult = {
192
+ topic: query.topic,
193
+ knowledgeGraph: simpleGraph,
194
+ summary: this.generateSummary(simpleGraph, query.topic),
195
+ keyFindings: this.extractKeyFindings(simpleGraph),
196
+ sources: allSources,
197
+ iterations,
198
+ remainingGaps,
199
+ statistics: {
200
+ totalIterations: iterations.length,
201
+ totalFindingsProcessed,
202
+ totalNodesCreated: simpleGraph.nodes.length,
203
+ totalEdgesCreated: simpleGraph.edges.length,
204
+ averageNoveltyRate: noveltyRates.length > 0 ? noveltyRates.reduce((sum, r) => sum + r, 0) / noveltyRates.length : 0,
205
+ totalDuration: Date.now() - startTime,
206
+ },
207
+ completionReason,
208
+ };
209
+ // 最終進捗
210
+ yield {
211
+ iteration: iterations.length,
212
+ phase: 'completed',
213
+ currentQuery: '',
214
+ totalFindingsCount: totalFindingsProcessed,
215
+ noveltyRate: noveltyRates.length > 0 ? noveltyRates[noveltyRates.length - 1] || 0 : 0,
216
+ convergenceScore: 1,
217
+ gaps: remainingGaps,
218
+ elapsedTime: Date.now() - startTime,
219
+ };
220
+ }
221
+ /**
222
+ * 最終結果を取得
223
+ */
224
+ getResult() {
225
+ return this.currentResult;
226
+ }
227
+ /**
228
+ * ルートノードを追加
229
+ */
230
+ addRootNode(graph, topic) {
231
+ graph.addNode({
232
+ id: `topic-${this.normalizeId(topic)}`,
233
+ type: 'topic',
234
+ label: topic,
235
+ properties: {
236
+ name: topic,
237
+ isRoot: true,
238
+ },
239
+ });
240
+ }
241
+ /**
242
+ * サマリーを生成
243
+ */
244
+ generateSummary(graph, topic) {
245
+ const findingCount = graph.nodes.filter((n) => n.type === 'finding').length;
246
+ const conceptCount = graph.nodes.filter((n) => n.type === 'concept').length;
247
+ const entityCount = graph.nodes.filter((n) => !['finding', 'concept', 'topic'].includes(n.type)).length;
248
+ const topConcepts = graph.nodes
249
+ .filter((n) => n.type === 'concept')
250
+ .slice(0, 5)
251
+ .map((n) => n.label)
252
+ .join(', ');
253
+ return `Research on "${topic}" identified ${findingCount} findings, ${conceptCount} concepts, and ${entityCount} entities. Key concepts include: ${topConcepts || 'N/A'}.`;
254
+ }
255
+ /**
256
+ * 主要発見を抽出
257
+ */
258
+ extractKeyFindings(graph) {
259
+ return graph.nodes
260
+ .filter((n) => n.type === 'finding')
261
+ .sort((a, b) => (b.properties.relevanceScore || 0) - (a.properties.relevanceScore || 0))
262
+ .slice(0, 10)
263
+ .map((node) => ({
264
+ id: node.id,
265
+ title: node.label,
266
+ summary: node.properties.description || '',
267
+ importance: ((node.properties.relevanceScore || 0) > 0.7 ? 'high' : 'medium'),
268
+ sources: [node.properties.url || ''],
269
+ relatedConcepts: [],
270
+ }));
271
+ }
272
+ /**
273
+ * IDを正規化
274
+ */
275
+ normalizeId(text) {
276
+ return text
277
+ .toLowerCase()
278
+ .replace(/[^a-z0-9]+/g, '-')
279
+ .replace(/^-|-$/g, '')
280
+ .slice(0, 50);
281
+ }
282
+ }
283
+ //# sourceMappingURL=DeepResearchOrchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeepResearchOrchestrator.js","sourceRoot":"","sources":["../../src/research/DeepResearchOrchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * FindingIntegrator - 検索結果を知識グラフに統合
3
+ *
4
+ * @requirement REQ-ANALYZE-008
5
+ * @design DES-ANALYZE-008
6
+ * @task TASK-003
7
+ */
8
+ import { KnowledgeGraph } from '@nahisaho/katashiro-knowledge';
9
+ import type { Finding } from '@nahisaho/katashiro-collector';
10
+ import type { IntegrationResult, SimpleKnowledgeGraph } from './types.js';
11
+ /**
12
+ * 検索結果を知識グラフに統合するクラス
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const integrator = new FindingIntegrator();
17
+ *
18
+ * const result = await integrator.integrate(graph, findings, 'AI ethics');
19
+ * console.log(`Added ${result.newNodesCount} nodes, ${result.newEdgesCount} edges`);
20
+ * ```
21
+ */
22
+ export declare class FindingIntegrator {
23
+ private entityExtractor;
24
+ constructor();
25
+ /**
26
+ * Findingを知識グラフに統合
27
+ */
28
+ integrate(graph: KnowledgeGraph, findings: Finding[], _topic: string): Promise<IntegrationResult>;
29
+ /**
30
+ * グラフをシンプルな形式に変換
31
+ */
32
+ toSimpleGraph(graph: KnowledgeGraph): SimpleKnowledgeGraph;
33
+ /**
34
+ * IDを正規化
35
+ */
36
+ private normalizeId;
37
+ /**
38
+ * タイトルからコンセプトキーワードを抽出
39
+ */
40
+ private extractConceptKeywords;
41
+ }
42
+ //# sourceMappingURL=FindingIntegrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FindingIntegrator.d.ts","sourceRoot":"","sources":["../../src/research/FindingIntegrator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAG1E;;;;;;;;;;GAUG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,eAAe,CAAkB;;IAMzC;;OAEG;IACG,SAAS,CACb,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC;IAkI7B;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,oBAAoB;IAO1D;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAqE/B"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * FindingIntegrator - 検索結果を知識グラフに統合
3
+ *
4
+ * @requirement REQ-ANALYZE-008
5
+ * @design DES-ANALYZE-008
6
+ * @task TASK-003
7
+ */
8
+ import { EntityExtractor } from '../entity/index.js';
9
+ /**
10
+ * 検索結果を知識グラフに統合するクラス
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const integrator = new FindingIntegrator();
15
+ *
16
+ * const result = await integrator.integrate(graph, findings, 'AI ethics');
17
+ * console.log(`Added ${result.newNodesCount} nodes, ${result.newEdgesCount} edges`);
18
+ * ```
19
+ */
20
+ export class FindingIntegrator {
21
+ entityExtractor;
22
+ constructor() {
23
+ this.entityExtractor = new EntityExtractor();
24
+ }
25
+ /**
26
+ * Findingを知識グラフに統合
27
+ */
28
+ async integrate(graph, findings, _topic) {
29
+ let newNodesCount = 0;
30
+ let newEdgesCount = 0;
31
+ let updatedNodesCount = 0;
32
+ const existingNodeIds = new Set(graph.getAllNodes().map((n) => n.id));
33
+ for (const finding of findings) {
34
+ // Findingからノードを作成
35
+ const findingNodeId = `finding-${finding.id}`;
36
+ if (!existingNodeIds.has(findingNodeId)) {
37
+ graph.addNode({
38
+ id: findingNodeId,
39
+ type: 'finding',
40
+ label: finding.title,
41
+ properties: {
42
+ name: finding.title,
43
+ description: finding.summary,
44
+ url: finding.url,
45
+ sourceType: finding.sourceType,
46
+ sourceName: finding.sourceName,
47
+ relevanceScore: finding.relevanceScore,
48
+ credibilityScore: finding.credibilityScore,
49
+ publishedAt: finding.publishedAt?.toISOString(),
50
+ author: finding.author,
51
+ },
52
+ });
53
+ existingNodeIds.add(findingNodeId);
54
+ newNodesCount++;
55
+ // ルートトピックとの関連を追加
56
+ const rootNodes = graph.getAllNodes().filter((n) => n.type === 'topic');
57
+ for (const rootNode of rootNodes) {
58
+ try {
59
+ graph.addEdge({
60
+ source: rootNode.id,
61
+ target: findingNodeId,
62
+ predicate: 'has_finding',
63
+ weight: finding.relevanceScore,
64
+ });
65
+ newEdgesCount++;
66
+ }
67
+ catch {
68
+ // エッジが既に存在する場合はスキップ
69
+ }
70
+ }
71
+ }
72
+ // エンティティを抽出してノードとして追加
73
+ const content = `${finding.title} ${finding.summary}`;
74
+ const entities = await this.entityExtractor.extract(content);
75
+ for (const entity of entities.all) {
76
+ const entityNodeId = `entity-${entity.type}-${this.normalizeId(entity.text)}`;
77
+ if (!existingNodeIds.has(entityNodeId)) {
78
+ graph.addNode({
79
+ id: entityNodeId,
80
+ type: entity.type,
81
+ label: entity.text,
82
+ properties: {
83
+ name: entity.text,
84
+ entityType: entity.type,
85
+ sources: [finding.url],
86
+ },
87
+ });
88
+ existingNodeIds.add(entityNodeId);
89
+ newNodesCount++;
90
+ }
91
+ else {
92
+ // 既存ノードのソースを更新 - KnowledgeGraphには updateNode がないので追加はスキップ
93
+ updatedNodesCount++;
94
+ }
95
+ // FindingとEntityの関連を追加
96
+ const edgeId = `edge-${findingNodeId}-${entityNodeId}`;
97
+ try {
98
+ graph.addEdge({
99
+ id: edgeId,
100
+ source: findingNodeId,
101
+ target: entityNodeId,
102
+ predicate: 'mentions',
103
+ weight: 1,
104
+ });
105
+ newEdgesCount++;
106
+ }
107
+ catch {
108
+ // エッジが既に存在する場合はスキップ
109
+ }
110
+ }
111
+ // キーワードベースのコンセプトノードを追加
112
+ const conceptKeywords = this.extractConceptKeywords(finding.title);
113
+ for (const keyword of conceptKeywords) {
114
+ const conceptNodeId = `concept-${this.normalizeId(keyword)}`;
115
+ if (!existingNodeIds.has(conceptNodeId)) {
116
+ graph.addNode({
117
+ id: conceptNodeId,
118
+ type: 'concept',
119
+ label: keyword,
120
+ properties: {
121
+ name: keyword,
122
+ sources: [finding.url],
123
+ },
124
+ });
125
+ existingNodeIds.add(conceptNodeId);
126
+ newNodesCount++;
127
+ }
128
+ // FindingとConceptの関連を追加
129
+ try {
130
+ graph.addEdge({
131
+ source: findingNodeId,
132
+ target: conceptNodeId,
133
+ predicate: 'relates_to',
134
+ weight: 0.7,
135
+ });
136
+ newEdgesCount++;
137
+ }
138
+ catch {
139
+ // エッジが既に存在する場合はスキップ
140
+ }
141
+ }
142
+ }
143
+ return {
144
+ newNodesCount,
145
+ newEdgesCount,
146
+ updatedNodesCount,
147
+ };
148
+ }
149
+ /**
150
+ * グラフをシンプルな形式に変換
151
+ */
152
+ toSimpleGraph(graph) {
153
+ return {
154
+ nodes: graph.getAllNodes(),
155
+ edges: graph.getAllEdges(),
156
+ };
157
+ }
158
+ /**
159
+ * IDを正規化
160
+ */
161
+ normalizeId(text) {
162
+ return text
163
+ .toLowerCase()
164
+ .replace(/[^a-z0-9]+/g, '-')
165
+ .replace(/^-|-$/g, '')
166
+ .slice(0, 50);
167
+ }
168
+ /**
169
+ * タイトルからコンセプトキーワードを抽出
170
+ */
171
+ extractConceptKeywords(title) {
172
+ // シンプルな実装:重要そうな単語を抽出
173
+ const stopWords = new Set([
174
+ 'the',
175
+ 'a',
176
+ 'an',
177
+ 'is',
178
+ 'are',
179
+ 'was',
180
+ 'were',
181
+ 'be',
182
+ 'been',
183
+ 'being',
184
+ 'have',
185
+ 'has',
186
+ 'had',
187
+ 'do',
188
+ 'does',
189
+ 'did',
190
+ 'will',
191
+ 'would',
192
+ 'could',
193
+ 'should',
194
+ 'may',
195
+ 'might',
196
+ 'must',
197
+ 'of',
198
+ 'in',
199
+ 'to',
200
+ 'for',
201
+ 'with',
202
+ 'on',
203
+ 'at',
204
+ 'by',
205
+ 'from',
206
+ 'as',
207
+ 'into',
208
+ 'through',
209
+ 'during',
210
+ 'before',
211
+ 'after',
212
+ 'above',
213
+ 'below',
214
+ 'and',
215
+ 'or',
216
+ 'but',
217
+ 'not',
218
+ 'this',
219
+ 'that',
220
+ 'these',
221
+ 'those',
222
+ 'it',
223
+ 'its',
224
+ 'how',
225
+ 'what',
226
+ 'when',
227
+ 'where',
228
+ 'who',
229
+ 'why',
230
+ ]);
231
+ const words = title
232
+ .toLowerCase()
233
+ .split(/\W+/)
234
+ .filter((word) => word.length > 3 && !stopWords.has(word));
235
+ // 最大3つのキーワードを返す
236
+ return [...new Set(words)].slice(0, 3);
237
+ }
238
+ }
239
+ //# sourceMappingURL=FindingIntegrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FindingIntegrator.js","sourceRoot":"","sources":["../../src/research/FindingIntegrator.ts"],"names":[],"mappings":"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"}