@framers/agentos-ext-web-search 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -188
- package/dist/index.d.ts +18 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +57 -50
- package/dist/index.js.map +1 -1
- package/dist/services/searchProvider.d.ts +89 -3
- package/dist/services/searchProvider.d.ts.map +1 -1
- package/dist/services/searchProvider.js +342 -26
- package/dist/services/searchProvider.js.map +1 -1
- package/dist/tools/factCheck.d.ts +46 -88
- package/dist/tools/factCheck.d.ts.map +1 -1
- package/dist/tools/factCheck.js +141 -170
- package/dist/tools/factCheck.js.map +1 -1
- package/dist/tools/researchAggregator.d.ts +37 -91
- package/dist/tools/researchAggregator.d.ts.map +1 -1
- package/dist/tools/researchAggregator.js +141 -175
- package/dist/tools/researchAggregator.js.map +1 -1
- package/dist/tools/webSearch.d.ts +31 -59
- package/dist/tools/webSearch.d.ts.map +1 -1
- package/dist/tools/webSearch.js +76 -87
- package/dist/tools/webSearch.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/manifest.json +14 -9
- package/package.json +26 -16
- package/.eslintrc.json +0 -21
- package/CHANGELOG.md +0 -16
- package/src/index.ts +0 -123
- package/src/services/searchProvider.ts +0 -416
- package/src/tools/factCheck.ts +0 -318
- package/src/tools/researchAggregator.ts +0 -297
- package/src/tools/webSearch.ts +0 -128
- package/src/types.ts +0 -41
- package/test/integration.spec.ts +0 -173
- package/test/searchProvider.spec.ts +0 -153
- package/test/webSearch.spec.ts +0 -128
- package/tsconfig.json +0 -21
- package/vitest.config.ts +0 -32
|
@@ -1,99 +1,57 @@
|
|
|
1
|
-
import { ITool } from '@framers/agentos';
|
|
2
|
-
import { SearchProviderService } from '../services/searchProvider';
|
|
3
1
|
/**
|
|
4
|
-
* Fact
|
|
2
|
+
* Fact Check Tool — verify statements against web sources.
|
|
5
3
|
*
|
|
6
|
-
*
|
|
7
|
-
* @implements {ITool}
|
|
4
|
+
* Updated to conform to AgentOS `ITool` (inputSchema + ToolExecutionContext).
|
|
8
5
|
*
|
|
9
|
-
* @
|
|
10
|
-
* ```typescript
|
|
11
|
-
* const tool = new FactCheckTool(searchService);
|
|
12
|
-
* const result = await tool.execute({
|
|
13
|
-
* statement: 'The Earth orbits the Sun',
|
|
14
|
-
* checkSources: true,
|
|
15
|
-
* confidence: 'high'
|
|
16
|
-
* });
|
|
17
|
-
* ```
|
|
6
|
+
* @module @framers/agentos-ext-web-search
|
|
18
7
|
*/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
statement: string;
|
|
40
|
-
checkSources?: boolean;
|
|
41
|
-
confidence?: 'low' | 'medium' | 'high';
|
|
42
|
-
}): Promise<{
|
|
43
|
-
success: boolean;
|
|
44
|
-
output?: any;
|
|
45
|
-
error?: string;
|
|
8
|
+
import type { ITool, JSONSchemaObject, ToolExecutionContext, ToolExecutionResult } from '@framers/agentos';
|
|
9
|
+
import { SearchProviderService } from '../services/searchProvider.js';
|
|
10
|
+
export interface FactCheckInput {
|
|
11
|
+
statement: string;
|
|
12
|
+
checkSources?: boolean;
|
|
13
|
+
confidence?: 'low' | 'medium' | 'high';
|
|
14
|
+
multiSearch?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface FactCheckOutput {
|
|
17
|
+
statement: string;
|
|
18
|
+
verdict: 'TRUE' | 'FALSE' | 'UNVERIFIED' | 'PARTIALLY TRUE';
|
|
19
|
+
confidence: number;
|
|
20
|
+
confidenceLevel: 'low' | 'medium' | 'high';
|
|
21
|
+
explanation: string;
|
|
22
|
+
sources: Array<{
|
|
23
|
+
title: string;
|
|
24
|
+
url: string;
|
|
25
|
+
snippet: string;
|
|
26
|
+
provider: string;
|
|
27
|
+
query: string;
|
|
46
28
|
}>;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
29
|
+
contradictingSources: string[];
|
|
30
|
+
supportingSources: string[];
|
|
31
|
+
meetsRequiredConfidence: boolean;
|
|
32
|
+
timestamp: string;
|
|
33
|
+
}
|
|
34
|
+
export declare class FactCheckTool implements ITool<FactCheckInput, FactCheckOutput> {
|
|
35
|
+
private readonly searchService;
|
|
36
|
+
private readonly defaultMultiSearch;
|
|
37
|
+
readonly id = "fact-check-v1";
|
|
38
|
+
/** Tool call name used by the LLM / ToolExecutor. */
|
|
39
|
+
readonly name = "fact_check";
|
|
40
|
+
readonly displayName = "Fact Check";
|
|
41
|
+
readonly description = "Verify a statement against web sources and return a verdict with confidence.";
|
|
42
|
+
readonly category = "research";
|
|
43
|
+
readonly hasSideEffects = false;
|
|
44
|
+
readonly inputSchema: JSONSchemaObject;
|
|
45
|
+
readonly requiredCapabilities: string[];
|
|
46
|
+
constructor(searchService: SearchProviderService, defaultMultiSearch?: boolean);
|
|
47
|
+
execute(input: FactCheckInput, _context: ToolExecutionContext): Promise<ToolExecutionResult<FactCheckOutput>>;
|
|
48
|
+
validateArgs(input: Record<string, any>): {
|
|
49
|
+
isValid: boolean;
|
|
50
|
+
errors?: any[];
|
|
51
|
+
};
|
|
54
52
|
private generateFactCheckQueries;
|
|
55
|
-
/**
|
|
56
|
-
* Analyzes search results to determine fact validity
|
|
57
|
-
*
|
|
58
|
-
* @private
|
|
59
|
-
* @param {string} statement - Original statement
|
|
60
|
-
* @param {any[]} searchResults - Search results to analyze
|
|
61
|
-
* @param {string} requiredConfidence - Required confidence level
|
|
62
|
-
* @returns {Object} Analysis results with verdict and confidence
|
|
63
|
-
*/
|
|
64
53
|
private analyzeFactCheckResults;
|
|
65
|
-
/**
|
|
66
|
-
* Checks if confidence level meets requirement
|
|
67
|
-
*
|
|
68
|
-
* @private
|
|
69
|
-
* @param {string} actual - Actual confidence level
|
|
70
|
-
* @param {string} required - Required confidence level
|
|
71
|
-
* @returns {boolean} True if requirement is met
|
|
72
|
-
*/
|
|
73
54
|
private meetsConfidenceRequirement;
|
|
74
|
-
/**
|
|
75
|
-
* Compiles relevant sources from search results
|
|
76
|
-
*
|
|
77
|
-
* @private
|
|
78
|
-
* @param {any[]} searchResults - Search results to compile from
|
|
79
|
-
* @returns {any[]} Compiled sources with metadata
|
|
80
|
-
*/
|
|
81
55
|
private compileSources;
|
|
82
|
-
/**
|
|
83
|
-
* Validates input parameters
|
|
84
|
-
*
|
|
85
|
-
* @param {any} input - Input to validate
|
|
86
|
-
* @returns {{valid: boolean, errors: string[]}} Validation result
|
|
87
|
-
*/
|
|
88
|
-
validate(input: any): {
|
|
89
|
-
valid: boolean;
|
|
90
|
-
errors: string[];
|
|
91
|
-
};
|
|
92
|
-
/**
|
|
93
|
-
* Returns the JSON schema for the tool's input
|
|
94
|
-
*
|
|
95
|
-
* @returns {Object} JSON Schema object
|
|
96
|
-
*/
|
|
97
|
-
getSchema(): any;
|
|
98
56
|
}
|
|
99
57
|
//# sourceMappingURL=factCheck.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factCheck.d.ts","sourceRoot":"","sources":["../../src/tools/factCheck.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"factCheck.d.ts","sourceRoot":"","sources":["../../src/tools/factCheck.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE3G,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,YAAY,GAAG,gBAAgB,CAAC;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjG,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,uBAAuB,EAAE,OAAO,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAc,YAAW,KAAK,CAAC,cAAc,EAAE,eAAe,CAAC;IA0CxE,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IA1CrC,SAAgB,EAAE,mBAAmB;IACrC,qDAAqD;IACrD,SAAgB,IAAI,gBAAgB;IACpC,SAAgB,WAAW,gBAAgB;IAC3C,SAAgB,WAAW,kFAAkF;IAC7G,SAAgB,QAAQ,cAAc;IACtC,SAAgB,cAAc,SAAS;IAEvC,SAAgB,WAAW,EAAE,gBAAgB,CA4B3C;IAEF,SAAgB,oBAAoB,WAA6B;gBAG9C,aAAa,EAAE,qBAAqB,EACpC,kBAAkB,GAAE,OAAe;IAGhD,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;IAoEnH,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE;IAgC9E,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,uBAAuB;IAwF/B,OAAO,CAAC,0BAA0B;IAKlC,OAAO,CAAC,cAAc;CAwBvB"}
|
package/dist/tools/factCheck.js
CHANGED
|
@@ -1,60 +1,93 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FactCheckTool = void 0;
|
|
1
|
+
// @ts-nocheck
|
|
4
2
|
/**
|
|
5
|
-
* Fact
|
|
3
|
+
* Fact Check Tool — verify statements against web sources.
|
|
6
4
|
*
|
|
7
|
-
*
|
|
8
|
-
* @implements {ITool}
|
|
5
|
+
* Updated to conform to AgentOS `ITool` (inputSchema + ToolExecutionContext).
|
|
9
6
|
*
|
|
10
|
-
* @
|
|
11
|
-
* ```typescript
|
|
12
|
-
* const tool = new FactCheckTool(searchService);
|
|
13
|
-
* const result = await tool.execute({
|
|
14
|
-
* statement: 'The Earth orbits the Sun',
|
|
15
|
-
* checkSources: true,
|
|
16
|
-
* confidence: 'high'
|
|
17
|
-
* });
|
|
18
|
-
* ```
|
|
7
|
+
* @module @framers/agentos-ext-web-search
|
|
19
8
|
*/
|
|
20
|
-
class FactCheckTool {
|
|
9
|
+
export class FactCheckTool {
|
|
21
10
|
searchService;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
11
|
+
defaultMultiSearch;
|
|
12
|
+
id = 'fact-check-v1';
|
|
13
|
+
/** Tool call name used by the LLM / ToolExecutor. */
|
|
14
|
+
name = 'fact_check';
|
|
15
|
+
displayName = 'Fact Check';
|
|
16
|
+
description = 'Verify a statement against web sources and return a verdict with confidence.';
|
|
17
|
+
category = 'research';
|
|
18
|
+
hasSideEffects = false;
|
|
19
|
+
inputSchema = {
|
|
20
|
+
type: 'object',
|
|
21
|
+
required: ['statement'],
|
|
22
|
+
properties: {
|
|
23
|
+
statement: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
description: 'The statement to fact-check',
|
|
26
|
+
minLength: 5,
|
|
27
|
+
},
|
|
28
|
+
checkSources: {
|
|
29
|
+
type: 'boolean',
|
|
30
|
+
description: 'Whether to include source citations',
|
|
31
|
+
default: true,
|
|
32
|
+
},
|
|
33
|
+
confidence: {
|
|
34
|
+
type: 'string',
|
|
35
|
+
description: 'Required confidence level for the verdict',
|
|
36
|
+
enum: ['low', 'medium', 'high'],
|
|
37
|
+
default: 'medium',
|
|
38
|
+
},
|
|
39
|
+
multiSearch: {
|
|
40
|
+
type: 'boolean',
|
|
41
|
+
description: 'When true, each verification query fans out to ALL available providers in parallel for higher-confidence cross-provider consensus.',
|
|
42
|
+
default: false,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
additionalProperties: false,
|
|
46
|
+
};
|
|
47
|
+
requiredCapabilities = ['capability:web_search'];
|
|
48
|
+
constructor(searchService, defaultMultiSearch = false) {
|
|
30
49
|
this.searchService = searchService;
|
|
50
|
+
this.defaultMultiSearch = defaultMultiSearch;
|
|
31
51
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
* @returns {Promise<{success: boolean, output?: any, error?: string}>} Fact check results
|
|
40
|
-
*/
|
|
41
|
-
async execute(input) {
|
|
52
|
+
async execute(input, _context) {
|
|
53
|
+
if (!this.searchService) {
|
|
54
|
+
return {
|
|
55
|
+
success: false,
|
|
56
|
+
error: 'Search service not initialized. Try using browser_navigate to search directly, or set a search API key (SERPER_API_KEY, BRAVE_API_KEY).',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
42
59
|
try {
|
|
43
60
|
const checkSources = input.checkSources !== false;
|
|
44
61
|
const requiredConfidence = input.confidence || 'medium';
|
|
45
|
-
|
|
62
|
+
const useMultiSearch = input.multiSearch ?? this.defaultMultiSearch;
|
|
46
63
|
const queries = this.generateFactCheckQueries(input.statement);
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
.
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
64
|
+
let searchResults;
|
|
65
|
+
if (useMultiSearch) {
|
|
66
|
+
const multiPromises = queries.map((query) => this.searchService
|
|
67
|
+
.multiSearch(query, { maxResults: 5 })
|
|
68
|
+
.then((multi) => ({
|
|
69
|
+
provider: 'multi',
|
|
70
|
+
results: multi.results,
|
|
71
|
+
metadata: { query, timestamp: multi.metadata.timestamp },
|
|
72
|
+
}))
|
|
73
|
+
.catch((err) => ({
|
|
74
|
+
provider: 'error',
|
|
75
|
+
results: [],
|
|
76
|
+
metadata: { query, error: err?.message || String(err), timestamp: new Date().toISOString() },
|
|
77
|
+
})));
|
|
78
|
+
searchResults = (await Promise.all(multiPromises));
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
const searchPromises = queries.map((query) => this.searchService
|
|
82
|
+
.search(query, { maxResults: 5 })
|
|
83
|
+
.catch((err) => ({
|
|
84
|
+
provider: 'error',
|
|
85
|
+
results: [],
|
|
86
|
+
metadata: { query, error: err?.message || String(err), timestamp: new Date().toISOString() },
|
|
87
|
+
})));
|
|
88
|
+
searchResults = (await Promise.all(searchPromises));
|
|
89
|
+
}
|
|
56
90
|
const analysis = this.analyzeFactCheckResults(input.statement, searchResults, requiredConfidence);
|
|
57
|
-
// Compile sources if requested
|
|
58
91
|
const sources = checkSources ? this.compileSources(searchResults) : [];
|
|
59
92
|
return {
|
|
60
93
|
success: true,
|
|
@@ -62,46 +95,56 @@ class FactCheckTool {
|
|
|
62
95
|
statement: input.statement,
|
|
63
96
|
verdict: analysis.verdict,
|
|
64
97
|
confidence: analysis.confidence,
|
|
98
|
+
confidenceLevel: analysis.confidenceLevel,
|
|
65
99
|
explanation: analysis.explanation,
|
|
66
|
-
sources
|
|
100
|
+
sources,
|
|
67
101
|
contradictingSources: analysis.contradictingSources,
|
|
68
102
|
supportingSources: analysis.supportingSources,
|
|
69
|
-
|
|
70
|
-
|
|
103
|
+
meetsRequiredConfidence: analysis.meetsRequiredConfidence,
|
|
104
|
+
timestamp: new Date().toISOString(),
|
|
105
|
+
},
|
|
71
106
|
};
|
|
72
107
|
}
|
|
73
108
|
catch (error) {
|
|
74
|
-
return {
|
|
75
|
-
success: false,
|
|
76
|
-
error: error.message
|
|
77
|
-
};
|
|
109
|
+
return { success: false, error: error?.message || String(error) };
|
|
78
110
|
}
|
|
79
111
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
112
|
+
validateArgs(input) {
|
|
113
|
+
const errors = [];
|
|
114
|
+
if (!input.statement) {
|
|
115
|
+
errors.push('Statement is required');
|
|
116
|
+
}
|
|
117
|
+
else if (typeof input.statement !== 'string') {
|
|
118
|
+
errors.push('Statement must be a string');
|
|
119
|
+
}
|
|
120
|
+
else if (input.statement.length < 5) {
|
|
121
|
+
errors.push('Statement must be at least 5 characters long');
|
|
122
|
+
}
|
|
123
|
+
if (input.confidence !== undefined) {
|
|
124
|
+
if (!['low', 'medium', 'high'].includes(input.confidence)) {
|
|
125
|
+
errors.push('Confidence must be low, medium, or high');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (input.checkSources !== undefined && typeof input.checkSources !== 'boolean') {
|
|
129
|
+
errors.push('checkSources must be a boolean');
|
|
130
|
+
}
|
|
131
|
+
if (input.multiSearch !== undefined && typeof input.multiSearch !== 'boolean') {
|
|
132
|
+
errors.push('multiSearch must be a boolean');
|
|
133
|
+
}
|
|
134
|
+
return errors.length === 0 ? { isValid: true } : { isValid: false, errors };
|
|
135
|
+
}
|
|
136
|
+
// ============================================================================
|
|
137
|
+
// Internals (ported from the previous implementation)
|
|
138
|
+
// ============================================================================
|
|
87
139
|
generateFactCheckQueries(statement) {
|
|
88
140
|
return [
|
|
89
|
-
statement,
|
|
90
|
-
`"${statement}" fact check`,
|
|
91
|
-
`${statement} true or false`,
|
|
92
|
-
`${statement} debunked myths`,
|
|
93
|
-
`is it true that ${statement}
|
|
141
|
+
statement,
|
|
142
|
+
`"${statement}" fact check`,
|
|
143
|
+
`${statement} true or false`,
|
|
144
|
+
`${statement} debunked myths`,
|
|
145
|
+
`is it true that ${statement}`,
|
|
94
146
|
];
|
|
95
147
|
}
|
|
96
|
-
/**
|
|
97
|
-
* Analyzes search results to determine fact validity
|
|
98
|
-
*
|
|
99
|
-
* @private
|
|
100
|
-
* @param {string} statement - Original statement
|
|
101
|
-
* @param {any[]} searchResults - Search results to analyze
|
|
102
|
-
* @param {string} requiredConfidence - Required confidence level
|
|
103
|
-
* @returns {Object} Analysis results with verdict and confidence
|
|
104
|
-
*/
|
|
105
148
|
analyzeFactCheckResults(statement, searchResults, requiredConfidence) {
|
|
106
149
|
let supportingCount = 0;
|
|
107
150
|
let contradictingCount = 0;
|
|
@@ -109,35 +152,37 @@ class FactCheckTool {
|
|
|
109
152
|
const supportingSources = [];
|
|
110
153
|
const contradictingSources = [];
|
|
111
154
|
const statementLower = statement.toLowerCase();
|
|
155
|
+
void statementLower; // retained for future use
|
|
112
156
|
const negativeIndicators = ['false', 'myth', 'debunked', 'incorrect', 'wrong', 'not true', 'fake'];
|
|
113
157
|
const positiveIndicators = ['true', 'correct', 'accurate', 'confirmed', 'verified', 'fact'];
|
|
114
158
|
for (const searchResult of searchResults) {
|
|
115
159
|
if (!searchResult.results)
|
|
116
160
|
continue;
|
|
117
161
|
for (const result of searchResult.results) {
|
|
118
|
-
const contentLower = (result.title + ' ' + result.snippet).toLowerCase();
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
result.url.includes('
|
|
122
|
-
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
162
|
+
const contentLower = (String(result.title || '') + ' ' + String(result.snippet || '')).toLowerCase();
|
|
163
|
+
const isFactCheckSite = String(result.url || '').includes('snopes') ||
|
|
164
|
+
String(result.url || '').includes('factcheck') ||
|
|
165
|
+
String(result.url || '').includes('politifact');
|
|
166
|
+
// Multi-search results with cross-provider agreement get extra weight
|
|
167
|
+
const agreementBonus = typeof result.agreementCount === 'number' ? Math.max(0, result.agreementCount - 1) : 0;
|
|
168
|
+
const weight = (isFactCheckSite ? 2 : 1) + agreementBonus;
|
|
169
|
+
const hasNegative = negativeIndicators.some((ind) => contentLower.includes(ind));
|
|
170
|
+
const hasPositive = positiveIndicators.some((ind) => contentLower.includes(ind));
|
|
127
171
|
if (hasNegative && !hasPositive) {
|
|
128
172
|
contradictingCount += weight;
|
|
129
|
-
|
|
173
|
+
if (result.url)
|
|
174
|
+
contradictingSources.push(String(result.url));
|
|
130
175
|
}
|
|
131
176
|
else if (hasPositive && !hasNegative) {
|
|
132
177
|
supportingCount += weight;
|
|
133
|
-
|
|
178
|
+
if (result.url)
|
|
179
|
+
supportingSources.push(String(result.url));
|
|
134
180
|
}
|
|
135
181
|
else {
|
|
136
182
|
neutralCount += 1;
|
|
137
183
|
}
|
|
138
184
|
}
|
|
139
185
|
}
|
|
140
|
-
// Calculate confidence and verdict
|
|
141
186
|
const total = supportingCount + contradictingCount + neutralCount;
|
|
142
187
|
let confidence;
|
|
143
188
|
let verdict;
|
|
@@ -163,15 +208,14 @@ class FactCheckTool {
|
|
|
163
208
|
else if (supportRatio > 0.4 && contradictRatio > 0.4) {
|
|
164
209
|
verdict = 'PARTIALLY TRUE';
|
|
165
210
|
confidence = 50;
|
|
166
|
-
explanation =
|
|
211
|
+
explanation = 'Mixed evidence with both supporting and contradicting sources.';
|
|
167
212
|
}
|
|
168
213
|
else {
|
|
169
214
|
verdict = 'UNVERIFIED';
|
|
170
215
|
confidence = Math.max(supportRatio, contradictRatio) * 100;
|
|
171
|
-
explanation =
|
|
216
|
+
explanation = 'Insufficient clear evidence to verify this statement.';
|
|
172
217
|
}
|
|
173
218
|
}
|
|
174
|
-
// Adjust confidence based on required level
|
|
175
219
|
const confidenceLevel = confidence > 80 ? 'high' : confidence > 50 ? 'medium' : 'low';
|
|
176
220
|
return {
|
|
177
221
|
verdict,
|
|
@@ -180,28 +224,13 @@ class FactCheckTool {
|
|
|
180
224
|
explanation,
|
|
181
225
|
supportingSources: supportingSources.slice(0, 5),
|
|
182
226
|
contradictingSources: contradictingSources.slice(0, 5),
|
|
183
|
-
meetsRequiredConfidence: this.meetsConfidenceRequirement(confidenceLevel, requiredConfidence)
|
|
227
|
+
meetsRequiredConfidence: this.meetsConfidenceRequirement(confidenceLevel, requiredConfidence),
|
|
184
228
|
};
|
|
185
229
|
}
|
|
186
|
-
/**
|
|
187
|
-
* Checks if confidence level meets requirement
|
|
188
|
-
*
|
|
189
|
-
* @private
|
|
190
|
-
* @param {string} actual - Actual confidence level
|
|
191
|
-
* @param {string} required - Required confidence level
|
|
192
|
-
* @returns {boolean} True if requirement is met
|
|
193
|
-
*/
|
|
194
230
|
meetsConfidenceRequirement(actual, required) {
|
|
195
231
|
const levels = { low: 1, medium: 2, high: 3 };
|
|
196
232
|
return levels[actual] >= levels[required];
|
|
197
233
|
}
|
|
198
|
-
/**
|
|
199
|
-
* Compiles relevant sources from search results
|
|
200
|
-
*
|
|
201
|
-
* @private
|
|
202
|
-
* @param {any[]} searchResults - Search results to compile from
|
|
203
|
-
* @returns {any[]} Compiled sources with metadata
|
|
204
|
-
*/
|
|
205
234
|
compileSources(searchResults) {
|
|
206
235
|
const sources = [];
|
|
207
236
|
const seenUrls = new Set();
|
|
@@ -209,79 +238,21 @@ class FactCheckTool {
|
|
|
209
238
|
if (!searchResult.results)
|
|
210
239
|
continue;
|
|
211
240
|
for (const result of searchResult.results) {
|
|
241
|
+
if (!result.url)
|
|
242
|
+
continue;
|
|
212
243
|
if (seenUrls.has(result.url))
|
|
213
244
|
continue;
|
|
214
245
|
seenUrls.add(result.url);
|
|
215
246
|
sources.push({
|
|
216
|
-
title: result.title,
|
|
217
|
-
url: result.url,
|
|
218
|
-
snippet: result.snippet,
|
|
219
|
-
provider: searchResult.provider,
|
|
220
|
-
query: searchResult.metadata
|
|
247
|
+
title: String(result.title || ''),
|
|
248
|
+
url: String(result.url),
|
|
249
|
+
snippet: String(result.snippet || ''),
|
|
250
|
+
provider: String(searchResult.provider || 'unknown'),
|
|
251
|
+
query: String(searchResult.metadata?.query || ''),
|
|
221
252
|
});
|
|
222
253
|
}
|
|
223
254
|
}
|
|
224
|
-
return sources.slice(0, 10);
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Validates input parameters
|
|
228
|
-
*
|
|
229
|
-
* @param {any} input - Input to validate
|
|
230
|
-
* @returns {{valid: boolean, errors: string[]}} Validation result
|
|
231
|
-
*/
|
|
232
|
-
validate(input) {
|
|
233
|
-
const errors = [];
|
|
234
|
-
if (!input.statement) {
|
|
235
|
-
errors.push('Statement is required');
|
|
236
|
-
}
|
|
237
|
-
else if (typeof input.statement !== 'string') {
|
|
238
|
-
errors.push('Statement must be a string');
|
|
239
|
-
}
|
|
240
|
-
else if (input.statement.length < 5) {
|
|
241
|
-
errors.push('Statement must be at least 5 characters long');
|
|
242
|
-
}
|
|
243
|
-
if (input.confidence !== undefined) {
|
|
244
|
-
if (!['low', 'medium', 'high'].includes(input.confidence)) {
|
|
245
|
-
errors.push('Confidence must be low, medium, or high');
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
if (input.checkSources !== undefined && typeof input.checkSources !== 'boolean') {
|
|
249
|
-
errors.push('checkSources must be a boolean');
|
|
250
|
-
}
|
|
251
|
-
return {
|
|
252
|
-
valid: errors.length === 0,
|
|
253
|
-
errors
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Returns the JSON schema for the tool's input
|
|
258
|
-
*
|
|
259
|
-
* @returns {Object} JSON Schema object
|
|
260
|
-
*/
|
|
261
|
-
getSchema() {
|
|
262
|
-
return {
|
|
263
|
-
type: 'object',
|
|
264
|
-
required: ['statement'],
|
|
265
|
-
properties: {
|
|
266
|
-
statement: {
|
|
267
|
-
type: 'string',
|
|
268
|
-
description: 'The statement to fact-check',
|
|
269
|
-
minLength: 5
|
|
270
|
-
},
|
|
271
|
-
checkSources: {
|
|
272
|
-
type: 'boolean',
|
|
273
|
-
description: 'Whether to include source citations',
|
|
274
|
-
default: true
|
|
275
|
-
},
|
|
276
|
-
confidence: {
|
|
277
|
-
type: 'string',
|
|
278
|
-
description: 'Required confidence level for the verdict',
|
|
279
|
-
enum: ['low', 'medium', 'high'],
|
|
280
|
-
default: 'medium'
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
};
|
|
255
|
+
return sources.slice(0, 10);
|
|
284
256
|
}
|
|
285
257
|
}
|
|
286
|
-
exports.FactCheckTool = FactCheckTool;
|
|
287
258
|
//# sourceMappingURL=factCheck.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factCheck.js","sourceRoot":"","sources":["../../src/tools/factCheck.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"factCheck.js","sourceRoot":"","sources":["../../src/tools/factCheck.ts"],"names":[],"mappings":"AAAA,cAAc;AACd;;;;;;GAMG;AA0BH,MAAM,OAAO,aAAa;IA0CL;IACA;IA1CH,EAAE,GAAG,eAAe,CAAC;IACrC,qDAAqD;IACrC,IAAI,GAAG,YAAY,CAAC;IACpB,WAAW,GAAG,YAAY,CAAC;IAC3B,WAAW,GAAG,8EAA8E,CAAC;IAC7F,QAAQ,GAAG,UAAU,CAAC;IACtB,cAAc,GAAG,KAAK,CAAC;IAEvB,WAAW,GAAqB;QAC9C,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,CAAC,WAAW,CAAC;QACvB,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,6BAA6B;gBAC1C,SAAS,EAAE,CAAC;aACb;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,qCAAqC;gBAClD,OAAO,EAAE,IAAI;aACd;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,2CAA2C;gBACxD,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC;gBAC/B,OAAO,EAAE,QAAQ;aAClB;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,SAAS;gBACf,WAAW,EACT,oIAAoI;gBACtI,OAAO,EAAE,KAAK;aACf;SACF;QACD,oBAAoB,EAAE,KAAK;KAC5B,CAAC;IAEc,oBAAoB,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAEjE,YACmB,aAAoC,EACpC,qBAA8B,KAAK;QADnC,kBAAa,GAAb,aAAa,CAAuB;QACpC,uBAAkB,GAAlB,kBAAkB,CAAiB;IACnD,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,KAAqB,EAAE,QAA8B;QACjE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,yIAAyI;aACjJ,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC;YAClD,MAAM,kBAAkB,GAAG,KAAK,CAAC,UAAU,IAAI,QAAQ,CAAC;YACxD,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,kBAAkB,CAAC;YAEpE,MAAM,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAE/D,IAAI,aAAiC,CAAC;YAEtC,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC1C,IAAI,CAAC,aAAa;qBACf,WAAW,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;qBACrC,IAAI,CAAC,CAAC,KAAK,EAAoB,EAAE,CAAC,CAAC;oBAClC,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE;iBACzD,CAAC,CAAC;qBACF,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBACf,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,EAAE;oBACX,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;iBAC7F,CAAC,CAAC,CACN,CAAC;gBACF,aAAa,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAuB,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC3C,IAAI,CAAC,aAAa;qBACf,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;qBAChC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBACf,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,EAAE;oBACX,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;iBAC7F,CAAC,CAAC,CACN,CAAC;gBACF,aAAa,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAuB,CAAC;YAC5E,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,SAAS,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAC;YAClG,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAEvE,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE;oBACN,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,eAAe,EAAE,QAAQ,CAAC,eAAe;oBACzC,WAAW,EAAE,QAAQ,CAAC,WAAW;oBACjC,OAAO;oBACP,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB;oBACnD,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;oBAC7C,uBAAuB,EAAE,QAAQ,CAAC,uBAAuB;oBACzD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACpE,CAAC;IACH,CAAC;IAED,YAAY,CAAC,KAA0B;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;aAAM,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAChF,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9E,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC9E,CAAC;IAED,+EAA+E;IAC/E,sDAAsD;IACtD,+EAA+E;IAEvE,wBAAwB,CAAC,SAAiB;QAChD,OAAO;YACL,SAAS;YACT,IAAI,SAAS,cAAc;YAC3B,GAAG,SAAS,gBAAgB;YAC5B,GAAG,SAAS,iBAAiB;YAC7B,mBAAmB,SAAS,EAAE;SAC/B,CAAC;IACJ,CAAC;IAEO,uBAAuB,CAAC,SAAiB,EAAE,aAAoB,EAAE,kBAA0B;QACjG,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAC3B,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,MAAM,iBAAiB,GAAa,EAAE,CAAC;QACvC,MAAM,oBAAoB,GAAa,EAAE,CAAC;QAE1C,MAAM,cAAc,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAC/C,KAAK,cAAc,CAAC,CAAC,0BAA0B;QAE/C,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QACnG,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAE5F,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YACzC,IAAI,CAAC,YAAY,CAAC,OAAO;gBAAE,SAAS;YAEpC,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC1C,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBAErG,MAAM,eAAe,GACnB,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAC3C,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;oBAC9C,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;gBAElD,sEAAsE;gBACtE,MAAM,cAAc,GAAG,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9G,MAAM,MAAM,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC;gBAE1D,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBACjF,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBAEjF,IAAI,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC;oBAChC,kBAAkB,IAAI,MAAM,CAAC;oBAC7B,IAAI,MAAM,CAAC,GAAG;wBAAE,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChE,CAAC;qBAAM,IAAI,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC;oBACvC,eAAe,IAAI,MAAM,CAAC;oBAC1B,IAAI,MAAM,CAAC,GAAG;wBAAE,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7D,CAAC;qBAAM,CAAC;oBACN,YAAY,IAAI,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,eAAe,GAAG,kBAAkB,GAAG,YAAY,CAAC;QAClE,IAAI,UAAkB,CAAC;QACvB,IAAI,OAAmC,CAAC;QACxC,IAAI,WAAmB,CAAC;QAExB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,GAAG,YAAY,CAAC;YACvB,UAAU,GAAG,CAAC,CAAC;YACf,WAAW,GAAG,qDAAqD,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,eAAe,GAAG,KAAK,CAAC;YAC7C,MAAM,eAAe,GAAG,kBAAkB,GAAG,KAAK,CAAC;YAEnD,IAAI,YAAY,GAAG,GAAG,EAAE,CAAC;gBACvB,OAAO,GAAG,MAAM,CAAC;gBACjB,UAAU,GAAG,YAAY,GAAG,GAAG,CAAC;gBAChC,WAAW,GAAG,4CAA4C,eAAe,uBAAuB,CAAC;YACnG,CAAC;iBAAM,IAAI,eAAe,GAAG,GAAG,EAAE,CAAC;gBACjC,OAAO,GAAG,OAAO,CAAC;gBAClB,UAAU,GAAG,eAAe,GAAG,GAAG,CAAC;gBACnC,WAAW,GAAG,+CAA+C,kBAAkB,0BAA0B,CAAC;YAC5G,CAAC;iBAAM,IAAI,YAAY,GAAG,GAAG,IAAI,eAAe,GAAG,GAAG,EAAE,CAAC;gBACvD,OAAO,GAAG,gBAAgB,CAAC;gBAC3B,UAAU,GAAG,EAAE,CAAC;gBAChB,WAAW,GAAG,gEAAgE,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,YAAY,CAAC;gBACvB,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,GAAG,CAAC;gBAC3D,WAAW,GAAG,uDAAuD,CAAC;YACxE,CAAC;QACH,CAAC;QAED,MAAM,eAAe,GAA8B,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;QAEjH,OAAO;YACL,OAAO;YACP,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YAClC,eAAe;YACf,WAAW;YACX,iBAAiB,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAChD,oBAAoB,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACtD,uBAAuB,EAAE,IAAI,CAAC,0BAA0B,CAAC,eAAe,EAAE,kBAAkB,CAAC;SAC9F,CAAC;IACJ,CAAC;IAEO,0BAA0B,CAAC,MAAc,EAAE,QAAgB;QACjE,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9C,OAAO,MAAM,CAAC,MAA6B,CAAC,IAAI,MAAM,CAAC,QAA+B,CAAC,CAAC;IAC1F,CAAC;IAEO,cAAc,CAAC,aAAoB;QACzC,MAAM,OAAO,GAA4F,EAAE,CAAC;QAC5G,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QAEnC,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YACzC,IAAI,CAAC,YAAY,CAAC,OAAO;gBAAE,SAAS;YAEpC,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC1C,IAAI,CAAC,MAAM,CAAC,GAAG;oBAAE,SAAS;gBAC1B,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACvC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAEzB,OAAO,CAAC,IAAI,CAAC;oBACX,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;oBACjC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;oBACvB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;oBACrC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,QAAQ,IAAI,SAAS,CAAC;oBACpD,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;iBAClD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC;CACF"}
|