@nahisaho/katashiro-collector 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 (105) hide show
  1. package/dist/browser/ActionExecutor.d.ts +85 -0
  2. package/dist/browser/ActionExecutor.d.ts.map +1 -0
  3. package/dist/browser/ActionExecutor.js +171 -0
  4. package/dist/browser/ActionExecutor.js.map +1 -0
  5. package/dist/browser/BrowserAutomation.d.ts +147 -0
  6. package/dist/browser/BrowserAutomation.d.ts.map +1 -0
  7. package/dist/browser/BrowserAutomation.js +463 -0
  8. package/dist/browser/BrowserAutomation.js.map +1 -0
  9. package/dist/browser/ContentExtractor.d.ts +54 -0
  10. package/dist/browser/ContentExtractor.d.ts.map +1 -0
  11. package/dist/browser/ContentExtractor.js +159 -0
  12. package/dist/browser/ContentExtractor.js.map +1 -0
  13. package/dist/browser/SessionManager.d.ts +67 -0
  14. package/dist/browser/SessionManager.d.ts.map +1 -0
  15. package/dist/browser/SessionManager.js +173 -0
  16. package/dist/browser/SessionManager.js.map +1 -0
  17. package/dist/browser/index.d.ts +17 -0
  18. package/dist/browser/index.d.ts.map +1 -0
  19. package/dist/browser/index.js +17 -0
  20. package/dist/browser/index.js.map +1 -0
  21. package/dist/browser/types.d.ts +361 -0
  22. package/dist/browser/types.d.ts.map +1 -0
  23. package/dist/browser/types.js +23 -0
  24. package/dist/browser/types.js.map +1 -0
  25. package/dist/document/DocumentParser.d.ts +91 -0
  26. package/dist/document/DocumentParser.d.ts.map +1 -0
  27. package/dist/document/DocumentParser.js +234 -0
  28. package/dist/document/DocumentParser.js.map +1 -0
  29. package/dist/document/index.d.ts +11 -0
  30. package/dist/document/index.d.ts.map +1 -0
  31. package/dist/document/index.js +10 -0
  32. package/dist/document/index.js.map +1 -0
  33. package/dist/document/parsers/DOCXParser.d.ts +63 -0
  34. package/dist/document/parsers/DOCXParser.d.ts.map +1 -0
  35. package/dist/document/parsers/DOCXParser.js +362 -0
  36. package/dist/document/parsers/DOCXParser.js.map +1 -0
  37. package/dist/document/parsers/PDFParser.d.ts +60 -0
  38. package/dist/document/parsers/PDFParser.d.ts.map +1 -0
  39. package/dist/document/parsers/PDFParser.js +338 -0
  40. package/dist/document/parsers/PDFParser.js.map +1 -0
  41. package/dist/document/parsers/XLSXParser.d.ts +55 -0
  42. package/dist/document/parsers/XLSXParser.d.ts.map +1 -0
  43. package/dist/document/parsers/XLSXParser.js +314 -0
  44. package/dist/document/parsers/XLSXParser.js.map +1 -0
  45. package/dist/document/parsers/index.d.ts +10 -0
  46. package/dist/document/parsers/index.d.ts.map +1 -0
  47. package/dist/document/parsers/index.js +10 -0
  48. package/dist/document/parsers/index.js.map +1 -0
  49. package/dist/document/types.d.ts +251 -0
  50. package/dist/document/types.d.ts.map +1 -0
  51. package/dist/document/types.js +13 -0
  52. package/dist/document/types.js.map +1 -0
  53. package/dist/index.d.ts +7 -2
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +14 -2
  56. package/dist/index.js.map +1 -1
  57. package/dist/research/CoverageAnalyzer.d.ts +50 -0
  58. package/dist/research/CoverageAnalyzer.d.ts.map +1 -0
  59. package/dist/research/CoverageAnalyzer.js +169 -0
  60. package/dist/research/CoverageAnalyzer.js.map +1 -0
  61. package/dist/research/QueryPlanner.d.ts +57 -0
  62. package/dist/research/QueryPlanner.d.ts.map +1 -0
  63. package/dist/research/QueryPlanner.js +102 -0
  64. package/dist/research/QueryPlanner.js.map +1 -0
  65. package/dist/research/ResultAggregator.d.ts +39 -0
  66. package/dist/research/ResultAggregator.d.ts.map +1 -0
  67. package/dist/research/ResultAggregator.js +85 -0
  68. package/dist/research/ResultAggregator.js.map +1 -0
  69. package/dist/research/WideResearchEngine.d.ts +110 -0
  70. package/dist/research/WideResearchEngine.d.ts.map +1 -0
  71. package/dist/research/WideResearchEngine.js +330 -0
  72. package/dist/research/WideResearchEngine.js.map +1 -0
  73. package/dist/research/agents/AcademicSearchAgent.d.ts +57 -0
  74. package/dist/research/agents/AcademicSearchAgent.d.ts.map +1 -0
  75. package/dist/research/agents/AcademicSearchAgent.js +180 -0
  76. package/dist/research/agents/AcademicSearchAgent.js.map +1 -0
  77. package/dist/research/agents/EncyclopediaAgent.d.ts +49 -0
  78. package/dist/research/agents/EncyclopediaAgent.d.ts.map +1 -0
  79. package/dist/research/agents/EncyclopediaAgent.js +153 -0
  80. package/dist/research/agents/EncyclopediaAgent.js.map +1 -0
  81. package/dist/research/agents/NewsSearchAgent.d.ts +38 -0
  82. package/dist/research/agents/NewsSearchAgent.d.ts.map +1 -0
  83. package/dist/research/agents/NewsSearchAgent.js +146 -0
  84. package/dist/research/agents/NewsSearchAgent.js.map +1 -0
  85. package/dist/research/agents/WebSearchAgent.d.ts +45 -0
  86. package/dist/research/agents/WebSearchAgent.d.ts.map +1 -0
  87. package/dist/research/agents/WebSearchAgent.js +135 -0
  88. package/dist/research/agents/WebSearchAgent.js.map +1 -0
  89. package/dist/research/agents/index.d.ts +13 -0
  90. package/dist/research/agents/index.d.ts.map +1 -0
  91. package/dist/research/agents/index.js +12 -0
  92. package/dist/research/agents/index.js.map +1 -0
  93. package/dist/research/agents/types.d.ts +60 -0
  94. package/dist/research/agents/types.d.ts.map +1 -0
  95. package/dist/research/agents/types.js +9 -0
  96. package/dist/research/agents/types.js.map +1 -0
  97. package/dist/research/index.d.ts +16 -0
  98. package/dist/research/index.d.ts.map +1 -0
  99. package/dist/research/index.js +17 -0
  100. package/dist/research/index.js.map +1 -0
  101. package/dist/research/types.d.ts +206 -0
  102. package/dist/research/types.d.ts.map +1 -0
  103. package/dist/research/types.js +33 -0
  104. package/dist/research/types.js.map +1 -0
  105. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -3,8 +3,8 @@
3
3
  * 情報収集パッケージ
4
4
  *
5
5
  * @requirement REQ-COLLECT-001 ~ REQ-COLLECT-009
6
- * @design DES-KATASHIRO-001 §2.2 Collector Container
7
- * @task TSK-010 ~ TSK-015
6
+ * @design DES-KATASHIRO-001 §2.2 Collector Container, DES-COLLECT-003, DES-COLLECT-008
7
+ * @task TSK-010 ~ TSK-015, TASK-001, TASK-002
8
8
  */
9
9
  // 実装
10
10
  export { WebSearchClient } from './web-search/index.js';
@@ -17,4 +17,16 @@ export { MediaExtractor } from './media/index.js';
17
17
  export { APIClient as ApiClient } from './api/index.js';
18
18
  // Source tracking (v0.2.0)
19
19
  export { SourceTracker, CredibilityScorer, } from './source/index.js';
20
+ // Document parsing (v0.2.3) - DES-COLLECT-003
21
+ export { DocumentParser, PDFParser, DOCXParser, XLSXParser, DEFAULT_PARSE_OPTIONS, } from './document/index.js';
22
+ // Wide Research (v0.2.3) - DES-COLLECT-008
23
+ export { WideResearchEngine, QueryPlanner, ResultAggregator, CoverageAnalyzer, WebSearchAgent, NewsSearchAgent, AcademicSearchAgent, EncyclopediaAgent, DEFAULT_RESEARCH_CONFIG, } from './research/index.js';
24
+ // Browser Automation (v0.2.3) - DES-COLLECT-009
25
+ export {
26
+ // Main class
27
+ BrowserAutomation, BrowserAutomationError,
28
+ // Sub-components
29
+ ActionExecutor, ContentExtractor, SessionManager,
30
+ // Config
31
+ DEFAULT_BROWSER_CONFIG, } from './browser/index.js';
20
32
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAsBH,KAAK;AACL,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAyB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAuB,MAAM,kBAAkB,CAAC;AAEvE,kDAAkD;AAClD,OAAO,EAAE,SAAS,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAExD,2BAA2B;AAC3B,OAAO,EACL,aAAa,EAGb,iBAAiB,GAGlB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAsBH,KAAK;AACL,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAyB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAuB,MAAM,kBAAkB,CAAC;AAEvE,kDAAkD;AAClD,OAAO,EAAE,SAAS,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAExD,2BAA2B;AAC3B,OAAO,EACL,aAAa,EAGb,iBAAiB,GAGlB,MAAM,mBAAmB,CAAC;AAE3B,8CAA8C;AAC9C,OAAO,EACL,cAAc,EACd,SAAS,EACT,UAAU,EACV,UAAU,EACV,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAyB7B,2CAA2C;AAC3C,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AA4B7B,gDAAgD;AAChD,OAAO;AACL,aAAa;AACb,iBAAiB,EACjB,sBAAsB;AACtB,iBAAiB;AACjB,cAAc,EACd,gBAAgB,EAChB,cAAc;AACd,SAAS;AACT,sBAAsB,GAuCvB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * CoverageAnalyzer - カバレッジ分析
3
+ *
4
+ * 検索結果のソースカバレッジと品質を分析する。
5
+ *
6
+ * @requirement REQ-COLLECT-008
7
+ * @design DES-COLLECT-008
8
+ * @task TASK-002
9
+ */
10
+ import type { CoverageReport, SourceType } from './types.js';
11
+ import type { AgentExecutionResult } from './agents/types.js';
12
+ /**
13
+ * カバレッジ分析クラス
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const analyzer = new CoverageAnalyzer();
18
+ * const coverage = analyzer.analyze(results, ['web', 'news', 'academic']);
19
+ * ```
20
+ */
21
+ export declare class CoverageAnalyzer {
22
+ /**
23
+ * カバレッジを分析
24
+ */
25
+ analyze(results: AgentExecutionResult[], expectedSources: SourceType[]): CoverageReport;
26
+ /**
27
+ * 観点の多様性を計算
28
+ *
29
+ * ソースタイプの多様性に基づいてスコアを算出。
30
+ * 異なるカテゴリ(web, news, academic, encyclopedia)をカバーするほど高スコア。
31
+ */
32
+ private calculatePerspectiveDiversity;
33
+ /**
34
+ * 時間的カバレッジを分析
35
+ */
36
+ private analyzeTemporalCoverage;
37
+ /**
38
+ * 時間分布を計算
39
+ */
40
+ private calculateTimeDistribution;
41
+ /**
42
+ * ギャップを識別
43
+ */
44
+ private identifyGaps;
45
+ /**
46
+ * 追加推奨ソースを提案
47
+ */
48
+ private suggestAdditionalSources;
49
+ }
50
+ //# sourceMappingURL=CoverageAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoverageAnalyzer.d.ts","sourceRoot":"","sources":["../../src/research/CoverageAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EAIX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D;;;;;;;;GAQG;AACH,qBAAa,gBAAgB;IAC3B;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,oBAAoB,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,cAAc;IAmCvF;;;;;OAKG;IACH,OAAO,CAAC,6BAA6B;IAuBrC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAuB/B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA+BjC;;OAEG;IACH,OAAO,CAAC,YAAY;IAuCpB;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAgBjC"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * CoverageAnalyzer - カバレッジ分析
3
+ *
4
+ * 検索結果のソースカバレッジと品質を分析する。
5
+ *
6
+ * @requirement REQ-COLLECT-008
7
+ * @design DES-COLLECT-008
8
+ * @task TASK-002
9
+ */
10
+ /**
11
+ * カバレッジ分析クラス
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const analyzer = new CoverageAnalyzer();
16
+ * const coverage = analyzer.analyze(results, ['web', 'news', 'academic']);
17
+ * ```
18
+ */
19
+ export class CoverageAnalyzer {
20
+ /**
21
+ * カバレッジを分析
22
+ */
23
+ analyze(results, expectedSources) {
24
+ const coveredSources = results
25
+ .filter((r) => r.result.status === 'success' || r.result.status === 'partial')
26
+ .map((r) => r.agent.type);
27
+ const failedSources = results
28
+ .filter((r) => r.result.status === 'failed' || r.result.status === 'timeout')
29
+ .map((r) => r.agent.type);
30
+ // カバレッジ率を計算
31
+ const coverageRate = coveredSources.length / Math.max(expectedSources.length, 1);
32
+ // 観点の多様性を計算
33
+ const perspectiveDiversity = this.calculatePerspectiveDiversity(coveredSources);
34
+ // 時間的カバレッジを分析
35
+ const temporalCoverage = this.analyzeTemporalCoverage(results);
36
+ // ギャップを識別
37
+ const gaps = this.identifyGaps(expectedSources, coveredSources, results);
38
+ // 追加推奨ソースを提案
39
+ const suggestedSources = this.suggestAdditionalSources(coveredSources, expectedSources);
40
+ return {
41
+ coveredSources,
42
+ failedSources,
43
+ coverageRate,
44
+ perspectiveDiversity,
45
+ temporalCoverage,
46
+ suggestedSources,
47
+ gaps,
48
+ };
49
+ }
50
+ /**
51
+ * 観点の多様性を計算
52
+ *
53
+ * ソースタイプの多様性に基づいてスコアを算出。
54
+ * 異なるカテゴリ(web, news, academic, encyclopedia)をカバーするほど高スコア。
55
+ */
56
+ calculatePerspectiveDiversity(coveredSources) {
57
+ // ソースタイプを大カテゴリに分類
58
+ const categories = {
59
+ general: ['web'],
60
+ news: ['news'],
61
+ academic: ['academic'],
62
+ reference: ['encyclopedia', 'government'],
63
+ social: ['social'],
64
+ };
65
+ // カバーしているカテゴリ数を計算
66
+ let coveredCategories = 0;
67
+ const totalCategories = Object.keys(categories).length;
68
+ for (const [, sourceTypes] of Object.entries(categories)) {
69
+ if (sourceTypes.some((st) => coveredSources.includes(st))) {
70
+ coveredCategories++;
71
+ }
72
+ }
73
+ return coveredCategories / totalCategories;
74
+ }
75
+ /**
76
+ * 時間的カバレッジを分析
77
+ */
78
+ analyzeTemporalCoverage(results) {
79
+ const allFindings = results.flatMap((r) => r.result.findings);
80
+ const datedFindings = allFindings.filter((f) => f.publishedAt);
81
+ if (datedFindings.length === 0) {
82
+ return undefined;
83
+ }
84
+ const dates = datedFindings
85
+ .map((f) => f.publishedAt)
86
+ .sort((a, b) => a.getTime() - b.getTime());
87
+ const distribution = this.calculateTimeDistribution(dates);
88
+ return {
89
+ oldestResult: dates[0],
90
+ newestResult: dates[dates.length - 1],
91
+ distribution,
92
+ };
93
+ }
94
+ /**
95
+ * 時間分布を計算
96
+ */
97
+ calculateTimeDistribution(dates) {
98
+ const now = new Date();
99
+ const periods = [
100
+ { label: 'Last 24h', days: 1 },
101
+ { label: 'Last week', days: 7 },
102
+ { label: 'Last month', days: 30 },
103
+ { label: 'Last year', days: 365 },
104
+ { label: 'Older', days: Infinity },
105
+ ];
106
+ const distribution = [];
107
+ for (const period of periods) {
108
+ const cutoff = new Date(now.getTime() - period.days * 24 * 60 * 60 * 1000);
109
+ const count = dates.filter((d) => {
110
+ if (period.days === Infinity) {
111
+ const yearAgo = new Date(now.getTime() - 365 * 24 * 60 * 60 * 1000);
112
+ return d < yearAgo;
113
+ }
114
+ const prevCutoff = periods[periods.indexOf(period) - 1]?.days ?? 0;
115
+ const prevDate = new Date(now.getTime() - prevCutoff * 24 * 60 * 60 * 1000);
116
+ return d >= cutoff && d < prevDate;
117
+ }).length;
118
+ distribution.push({ period: period.label, count });
119
+ }
120
+ return distribution;
121
+ }
122
+ /**
123
+ * ギャップを識別
124
+ */
125
+ identifyGaps(expectedSources, coveredSources, results) {
126
+ const gaps = [];
127
+ // ソースギャップ
128
+ const missingSources = expectedSources.filter((s) => !coveredSources.includes(s));
129
+ if (missingSources.length > 0) {
130
+ gaps.push({
131
+ type: 'source',
132
+ description: `Missing sources: ${missingSources.join(', ')}`,
133
+ suggestion: `Add ${missingSources[0]} agent or retry failed sources`,
134
+ });
135
+ }
136
+ // 結果数が少ない場合
137
+ const totalResults = results.reduce((sum, r) => sum + r.result.findings.length, 0);
138
+ if (totalResults < 5) {
139
+ gaps.push({
140
+ type: 'perspective',
141
+ description: 'Very few results found',
142
+ suggestion: 'Try broadening the search query or using different keywords',
143
+ });
144
+ }
145
+ // 学術ソースがない場合
146
+ if (!coveredSources.includes('academic') && expectedSources.includes('academic')) {
147
+ gaps.push({
148
+ type: 'perspective',
149
+ description: 'No academic/research perspective',
150
+ suggestion: 'Consider adding academic sources for authoritative information',
151
+ });
152
+ }
153
+ return gaps;
154
+ }
155
+ /**
156
+ * 追加推奨ソースを提案
157
+ */
158
+ suggestAdditionalSources(coveredSources, expectedSources) {
159
+ const allPossibleSources = [
160
+ 'web',
161
+ 'news',
162
+ 'academic',
163
+ 'encyclopedia',
164
+ ];
165
+ // まだカバーしていないソースを提案
166
+ return allPossibleSources.filter((s) => !coveredSources.includes(s) && !expectedSources.includes(s));
167
+ }
168
+ }
169
+ //# sourceMappingURL=CoverageAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoverageAnalyzer.js","sourceRoot":"","sources":["../../src/research/CoverageAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * QueryPlanner - クエリ計画立案
3
+ *
4
+ * 検索クエリを各エージェント向けに最適化し、実行計画を生成する。
5
+ *
6
+ * @requirement REQ-COLLECT-008
7
+ * @design DES-COLLECT-008
8
+ * @task TASK-002
9
+ */
10
+ import type { WideResearchQuery, SourceType } from './types.js';
11
+ import type { ISearchAgent, AgentSearchQuery } from './agents/types.js';
12
+ /**
13
+ * クエリ実行計画
14
+ */
15
+ export interface QueryPlan {
16
+ /** 実行するエージェント */
17
+ agents: ISearchAgent[];
18
+ /** エージェント別のクエリ */
19
+ queries: Map<SourceType, AgentSearchQuery>;
20
+ /** 各エージェントのタイムアウト */
21
+ timeout: number;
22
+ }
23
+ /**
24
+ * クエリ計画立案クラス
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * const planner = new QueryPlanner();
29
+ * const plan = planner.plan(query, agents);
30
+ * ```
31
+ */
32
+ export declare class QueryPlanner {
33
+ /**
34
+ * クエリ計画を生成
35
+ */
36
+ plan(query: WideResearchQuery, agents: ISearchAgent[], config?: {
37
+ agentTimeout: number;
38
+ maxResultsPerSource: number;
39
+ }): QueryPlan;
40
+ /**
41
+ * エージェント固有のクエリを生成
42
+ */
43
+ private createAgentQuery;
44
+ /**
45
+ * ソースタイプに応じてクエリを最適化
46
+ */
47
+ private optimizeQueryForSource;
48
+ /**
49
+ * 学術検索用にクエリをクリーン化
50
+ */
51
+ private cleanAcademicQuery;
52
+ /**
53
+ * 百科事典用にクエリを簡略化
54
+ */
55
+ private simplifyQuery;
56
+ }
57
+ //# sourceMappingURL=QueryPlanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryPlanner.d.ts","sourceRoot":"","sources":["../../src/research/QueryPlanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,iBAAiB;IACjB,MAAM,EAAE,YAAY,EAAE,CAAC;IAEvB,kBAAkB;IAClB,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IAE3C,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACH,IAAI,CACF,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,YAAY,EAAE,EACtB,MAAM,GAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,mBAAmB,EAAE,MAAM,CAAC;KACsB,GACnD,SAAS;IAeZ;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoB9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;IACH,OAAO,CAAC,aAAa;CAYtB"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * QueryPlanner - クエリ計画立案
3
+ *
4
+ * 検索クエリを各エージェント向けに最適化し、実行計画を生成する。
5
+ *
6
+ * @requirement REQ-COLLECT-008
7
+ * @design DES-COLLECT-008
8
+ * @task TASK-002
9
+ */
10
+ /**
11
+ * クエリ計画立案クラス
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const planner = new QueryPlanner();
16
+ * const plan = planner.plan(query, agents);
17
+ * ```
18
+ */
19
+ export class QueryPlanner {
20
+ /**
21
+ * クエリ計画を生成
22
+ */
23
+ plan(query, agents, config = { agentTimeout: 30000, maxResultsPerSource: 20 }) {
24
+ const queries = new Map();
25
+ for (const agent of agents) {
26
+ const agentQuery = this.createAgentQuery(query, agent.type, config);
27
+ queries.set(agent.type, agentQuery);
28
+ }
29
+ return {
30
+ agents,
31
+ queries,
32
+ timeout: config.agentTimeout,
33
+ };
34
+ }
35
+ /**
36
+ * エージェント固有のクエリを生成
37
+ */
38
+ createAgentQuery(query, sourceType, config) {
39
+ // ソースタイプに応じてクエリを最適化
40
+ const optimizedQuery = this.optimizeQueryForSource(query.topic, sourceType);
41
+ return {
42
+ query: optimizedQuery,
43
+ maxResults: query.maxResultsPerSource ?? config.maxResultsPerSource,
44
+ languages: query.languages,
45
+ dateRange: query.dateRange,
46
+ timeout: query.agentTimeout ?? config.agentTimeout,
47
+ };
48
+ }
49
+ /**
50
+ * ソースタイプに応じてクエリを最適化
51
+ */
52
+ optimizeQueryForSource(topic, sourceType) {
53
+ switch (sourceType) {
54
+ case 'academic':
55
+ // 学術検索では専門用語を保持、不要な修飾語を削除
56
+ return this.cleanAcademicQuery(topic);
57
+ case 'news':
58
+ // ニュース検索では最新情報を優先
59
+ return topic;
60
+ case 'encyclopedia':
61
+ // 百科事典では概念的なクエリに
62
+ return this.simplifyQuery(topic);
63
+ case 'web':
64
+ default:
65
+ return topic;
66
+ }
67
+ }
68
+ /**
69
+ * 学術検索用にクエリをクリーン化
70
+ */
71
+ cleanAcademicQuery(query) {
72
+ // "最新の", "について", などの修飾語を除去
73
+ const removePatterns = [
74
+ /最新の/g,
75
+ /について/g,
76
+ /に関する/g,
77
+ /とは/g,
78
+ /what is/gi,
79
+ /latest/gi,
80
+ /recent/gi,
81
+ ];
82
+ let cleaned = query;
83
+ for (const pattern of removePatterns) {
84
+ cleaned = cleaned.replace(pattern, '');
85
+ }
86
+ return cleaned.trim();
87
+ }
88
+ /**
89
+ * 百科事典用にクエリを簡略化
90
+ */
91
+ simplifyQuery(query) {
92
+ // 最初の主要な名詞句を抽出(シンプルなアプローチ)
93
+ const words = query.split(/\s+/);
94
+ // 3語以下ならそのまま
95
+ if (words.length <= 3) {
96
+ return query;
97
+ }
98
+ // 最初の3語を使用
99
+ return words.slice(0, 3).join(' ');
100
+ }
101
+ }
102
+ //# sourceMappingURL=QueryPlanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryPlanner.js","sourceRoot":"","sources":["../../src/research/QueryPlanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH;;;;;;;;GAQG;AACH,MAAM,OAAO,YAAY;IACvB;;OAEG;IACH,IAAI,CACF,KAAwB,EACxB,MAAsB,EACtB,SAGI,EAAE,YAAY,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,EAAE;QAEpD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgC,CAAC;QAExD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACtC,CAAC;QAED,OAAO;YACL,MAAM;YACN,OAAO;YACP,OAAO,EAAE,MAAM,CAAC,YAAY;SAC7B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,gBAAgB,CACtB,KAAwB,EACxB,UAAsB,EACtB,MAA6D;QAE7D,oBAAoB;QACpB,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAE5E,OAAO;YACL,KAAK,EAAE,cAAc;YACrB,UAAU,EAAE,KAAK,CAAC,mBAAmB,IAAI,MAAM,CAAC,mBAAmB;YACnE,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY;SACnD,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,KAAa,EAAE,UAAsB;QAClE,QAAQ,UAAU,EAAE,CAAC;YACnB,KAAK,UAAU;gBACb,0BAA0B;gBAC1B,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAExC,KAAK,MAAM;gBACT,kBAAkB;gBAClB,OAAO,KAAK,CAAC;YAEf,KAAK,cAAc;gBACjB,iBAAiB;gBACjB,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAEnC,KAAK,KAAK,CAAC;YACX;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,KAAa;QACtC,2BAA2B;QAC3B,MAAM,cAAc,GAAG;YACrB,MAAM;YACN,OAAO;YACP,OAAO;YACP,KAAK;YACL,WAAW;YACX,UAAU;YACV,UAAU;SACX,CAAC;QAEF,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,KAAa;QACjC,2BAA2B;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEjC,aAAa;QACb,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,WAAW;QACX,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * ResultAggregator - 結果集約
3
+ *
4
+ * 複数エージェントの結果を集約・重複排除・ランキングする。
5
+ *
6
+ * @requirement REQ-COLLECT-008
7
+ * @design DES-COLLECT-008
8
+ * @task TASK-002
9
+ */
10
+ import type { Finding } from './types.js';
11
+ import type { AgentSearchResult } from './agents/types.js';
12
+ /**
13
+ * 結果集約クラス
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const aggregator = new ResultAggregator();
18
+ * const findings = aggregator.aggregate(results, 'AI ethics');
19
+ * ```
20
+ */
21
+ export declare class ResultAggregator {
22
+ /**
23
+ * 結果を集約
24
+ */
25
+ aggregate(results: AgentSearchResult[], originalQuery: string): Finding[];
26
+ /**
27
+ * URL/タイトルベースで重複排除
28
+ */
29
+ private deduplicate;
30
+ /**
31
+ * URLを正規化
32
+ */
33
+ private normalizeUrl;
34
+ /**
35
+ * 関連性でランキング
36
+ */
37
+ private rankByRelevance;
38
+ }
39
+ //# sourceMappingURL=ResultAggregator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResultAggregator.d.ts","sourceRoot":"","sources":["../../src/research/ResultAggregator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;;;;;;;GAQG;AACH,qBAAa,gBAAgB;IAC3B;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,iBAAiB,EAAE,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,EAAE;IAazE;;OAEG;IACH,OAAO,CAAC,WAAW;IA0BnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;IACH,OAAO,CAAC,eAAe;CAUxB"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * ResultAggregator - 結果集約
3
+ *
4
+ * 複数エージェントの結果を集約・重複排除・ランキングする。
5
+ *
6
+ * @requirement REQ-COLLECT-008
7
+ * @design DES-COLLECT-008
8
+ * @task TASK-002
9
+ */
10
+ /**
11
+ * 結果集約クラス
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const aggregator = new ResultAggregator();
16
+ * const findings = aggregator.aggregate(results, 'AI ethics');
17
+ * ```
18
+ */
19
+ export class ResultAggregator {
20
+ /**
21
+ * 結果を集約
22
+ */
23
+ aggregate(results, originalQuery) {
24
+ // 全結果をフラット化
25
+ const allFindings = results.flatMap((r) => r.findings);
26
+ // 重複排除
27
+ const deduplicated = this.deduplicate(allFindings);
28
+ // 関連性でソート
29
+ const sorted = this.rankByRelevance(deduplicated, originalQuery);
30
+ return sorted;
31
+ }
32
+ /**
33
+ * URL/タイトルベースで重複排除
34
+ */
35
+ deduplicate(findings) {
36
+ const seen = new Map();
37
+ for (const finding of findings) {
38
+ const key = this.normalizeUrl(finding.url);
39
+ if (!seen.has(key)) {
40
+ seen.set(key, finding);
41
+ }
42
+ else {
43
+ // 既存の結果とマージ(より高いスコアを採用)
44
+ const existing = seen.get(key);
45
+ if (finding.relevanceScore > existing.relevanceScore) {
46
+ seen.set(key, {
47
+ ...existing,
48
+ ...finding,
49
+ // 最高スコアを維持
50
+ relevanceScore: Math.max(existing.relevanceScore, finding.relevanceScore),
51
+ credibilityScore: Math.max(existing.credibilityScore, finding.credibilityScore),
52
+ });
53
+ }
54
+ }
55
+ }
56
+ return Array.from(seen.values());
57
+ }
58
+ /**
59
+ * URLを正規化
60
+ */
61
+ normalizeUrl(url) {
62
+ try {
63
+ const parsed = new URL(url);
64
+ // クエリパラメータとフラグメントを除去
65
+ return `${parsed.protocol}//${parsed.host}${parsed.pathname}`.toLowerCase();
66
+ }
67
+ catch {
68
+ return url.toLowerCase();
69
+ }
70
+ }
71
+ /**
72
+ * 関連性でランキング
73
+ */
74
+ rankByRelevance(findings, _query) {
75
+ return findings
76
+ .map((f) => ({
77
+ ...f,
78
+ // 複合スコアを計算
79
+ _compositeScore: f.relevanceScore * 0.6 + f.credibilityScore * 0.4,
80
+ }))
81
+ .sort((a, b) => b._compositeScore - a._compositeScore)
82
+ .map(({ _compositeScore, ...finding }) => finding);
83
+ }
84
+ }
85
+ //# sourceMappingURL=ResultAggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResultAggregator.js","sourceRoot":"","sources":["../../src/research/ResultAggregator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH;;;;;;;;GAQG;AACH,MAAM,OAAO,gBAAgB;IAC3B;;OAEG;IACH,SAAS,CAAC,OAA4B,EAAE,aAAqB;QAC3D,YAAY;QACZ,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAEvD,OAAO;QACP,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAEnD,UAAU;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAEjE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,QAAmB;QACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;QAExC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAE3C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,wBAAwB;gBACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;gBAChC,IAAI,OAAO,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;oBACrD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;wBACZ,GAAG,QAAQ;wBACX,GAAG,OAAO;wBACV,WAAW;wBACX,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC;wBACzE,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,CAAC;qBAChF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,GAAW;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,qBAAqB;YACrB,OAAO,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC;QAC9E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,QAAmB,EAAE,MAAc;QACzD,OAAO,QAAQ;aACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,GAAG,CAAC;YACJ,WAAW;YACX,eAAe,EAAE,CAAC,CAAC,cAAc,GAAG,GAAG,GAAG,CAAC,CAAC,gBAAgB,GAAG,GAAG;SACnE,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC;aACrD,GAAG,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,CAAC,OAAkB,CAAC,CAAC;IAClE,CAAC;CACF"}