@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.
- package/dist/browser/ActionExecutor.d.ts +85 -0
- package/dist/browser/ActionExecutor.d.ts.map +1 -0
- package/dist/browser/ActionExecutor.js +171 -0
- package/dist/browser/ActionExecutor.js.map +1 -0
- package/dist/browser/BrowserAutomation.d.ts +147 -0
- package/dist/browser/BrowserAutomation.d.ts.map +1 -0
- package/dist/browser/BrowserAutomation.js +463 -0
- package/dist/browser/BrowserAutomation.js.map +1 -0
- package/dist/browser/ContentExtractor.d.ts +54 -0
- package/dist/browser/ContentExtractor.d.ts.map +1 -0
- package/dist/browser/ContentExtractor.js +159 -0
- package/dist/browser/ContentExtractor.js.map +1 -0
- package/dist/browser/SessionManager.d.ts +67 -0
- package/dist/browser/SessionManager.d.ts.map +1 -0
- package/dist/browser/SessionManager.js +173 -0
- package/dist/browser/SessionManager.js.map +1 -0
- package/dist/browser/index.d.ts +17 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +17 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/types.d.ts +361 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +23 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/document/DocumentParser.d.ts +91 -0
- package/dist/document/DocumentParser.d.ts.map +1 -0
- package/dist/document/DocumentParser.js +234 -0
- package/dist/document/DocumentParser.js.map +1 -0
- package/dist/document/index.d.ts +11 -0
- package/dist/document/index.d.ts.map +1 -0
- package/dist/document/index.js +10 -0
- package/dist/document/index.js.map +1 -0
- package/dist/document/parsers/DOCXParser.d.ts +63 -0
- package/dist/document/parsers/DOCXParser.d.ts.map +1 -0
- package/dist/document/parsers/DOCXParser.js +362 -0
- package/dist/document/parsers/DOCXParser.js.map +1 -0
- package/dist/document/parsers/PDFParser.d.ts +60 -0
- package/dist/document/parsers/PDFParser.d.ts.map +1 -0
- package/dist/document/parsers/PDFParser.js +338 -0
- package/dist/document/parsers/PDFParser.js.map +1 -0
- package/dist/document/parsers/XLSXParser.d.ts +55 -0
- package/dist/document/parsers/XLSXParser.d.ts.map +1 -0
- package/dist/document/parsers/XLSXParser.js +314 -0
- package/dist/document/parsers/XLSXParser.js.map +1 -0
- package/dist/document/parsers/index.d.ts +10 -0
- package/dist/document/parsers/index.d.ts.map +1 -0
- package/dist/document/parsers/index.js +10 -0
- package/dist/document/parsers/index.js.map +1 -0
- package/dist/document/types.d.ts +251 -0
- package/dist/document/types.d.ts.map +1 -0
- package/dist/document/types.js +13 -0
- package/dist/document/types.js.map +1 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -2
- package/dist/index.js.map +1 -1
- package/dist/research/CoverageAnalyzer.d.ts +50 -0
- package/dist/research/CoverageAnalyzer.d.ts.map +1 -0
- package/dist/research/CoverageAnalyzer.js +169 -0
- package/dist/research/CoverageAnalyzer.js.map +1 -0
- package/dist/research/QueryPlanner.d.ts +57 -0
- package/dist/research/QueryPlanner.d.ts.map +1 -0
- package/dist/research/QueryPlanner.js +102 -0
- package/dist/research/QueryPlanner.js.map +1 -0
- package/dist/research/ResultAggregator.d.ts +39 -0
- package/dist/research/ResultAggregator.d.ts.map +1 -0
- package/dist/research/ResultAggregator.js +85 -0
- package/dist/research/ResultAggregator.js.map +1 -0
- package/dist/research/WideResearchEngine.d.ts +110 -0
- package/dist/research/WideResearchEngine.d.ts.map +1 -0
- package/dist/research/WideResearchEngine.js +330 -0
- package/dist/research/WideResearchEngine.js.map +1 -0
- package/dist/research/agents/AcademicSearchAgent.d.ts +57 -0
- package/dist/research/agents/AcademicSearchAgent.d.ts.map +1 -0
- package/dist/research/agents/AcademicSearchAgent.js +180 -0
- package/dist/research/agents/AcademicSearchAgent.js.map +1 -0
- package/dist/research/agents/EncyclopediaAgent.d.ts +49 -0
- package/dist/research/agents/EncyclopediaAgent.d.ts.map +1 -0
- package/dist/research/agents/EncyclopediaAgent.js +153 -0
- package/dist/research/agents/EncyclopediaAgent.js.map +1 -0
- package/dist/research/agents/NewsSearchAgent.d.ts +38 -0
- package/dist/research/agents/NewsSearchAgent.d.ts.map +1 -0
- package/dist/research/agents/NewsSearchAgent.js +146 -0
- package/dist/research/agents/NewsSearchAgent.js.map +1 -0
- package/dist/research/agents/WebSearchAgent.d.ts +45 -0
- package/dist/research/agents/WebSearchAgent.d.ts.map +1 -0
- package/dist/research/agents/WebSearchAgent.js +135 -0
- package/dist/research/agents/WebSearchAgent.js.map +1 -0
- package/dist/research/agents/index.d.ts +13 -0
- package/dist/research/agents/index.d.ts.map +1 -0
- package/dist/research/agents/index.js +12 -0
- package/dist/research/agents/index.js.map +1 -0
- package/dist/research/agents/types.d.ts +60 -0
- package/dist/research/agents/types.d.ts.map +1 -0
- package/dist/research/agents/types.js +9 -0
- package/dist/research/agents/types.js.map +1 -0
- package/dist/research/index.d.ts +16 -0
- package/dist/research/index.d.ts.map +1 -0
- package/dist/research/index.js +17 -0
- package/dist/research/index.js.map +1 -0
- package/dist/research/types.d.ts +206 -0
- package/dist/research/types.d.ts.map +1 -0
- package/dist/research/types.js +33 -0
- package/dist/research/types.js.map +1 -0
- 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"}
|