@framers/agentos-ext-web-search 1.1.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.
Files changed (41) hide show
  1. package/.eslintrc.json +21 -0
  2. package/CHANGELOG.md +16 -0
  3. package/LICENSE +21 -0
  4. package/README.md +218 -0
  5. package/dist/index.d.ts +58 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +100 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/services/searchProvider.d.ts +160 -0
  10. package/dist/services/searchProvider.d.ts.map +1 -0
  11. package/dist/services/searchProvider.js +342 -0
  12. package/dist/services/searchProvider.js.map +1 -0
  13. package/dist/tools/factCheck.d.ts +99 -0
  14. package/dist/tools/factCheck.d.ts.map +1 -0
  15. package/dist/tools/factCheck.js +287 -0
  16. package/dist/tools/factCheck.js.map +1 -0
  17. package/dist/tools/researchAggregator.d.ts +101 -0
  18. package/dist/tools/researchAggregator.d.ts.map +1 -0
  19. package/dist/tools/researchAggregator.js +275 -0
  20. package/dist/tools/researchAggregator.js.map +1 -0
  21. package/dist/tools/webSearch.d.ts +66 -0
  22. package/dist/tools/webSearch.d.ts.map +1 -0
  23. package/dist/tools/webSearch.js +122 -0
  24. package/dist/tools/webSearch.js.map +1 -0
  25. package/dist/types.d.ts +38 -0
  26. package/dist/types.d.ts.map +1 -0
  27. package/dist/types.js +6 -0
  28. package/dist/types.js.map +1 -0
  29. package/manifest.json +65 -0
  30. package/package.json +73 -0
  31. package/src/index.ts +123 -0
  32. package/src/services/searchProvider.ts +416 -0
  33. package/src/tools/factCheck.ts +318 -0
  34. package/src/tools/researchAggregator.ts +297 -0
  35. package/src/tools/webSearch.ts +128 -0
  36. package/src/types.ts +41 -0
  37. package/test/integration.spec.ts +173 -0
  38. package/test/searchProvider.spec.ts +153 -0
  39. package/test/webSearch.spec.ts +128 -0
  40. package/tsconfig.json +21 -0
  41. package/vitest.config.ts +32 -0
@@ -0,0 +1,342 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SearchProviderService = void 0;
4
+ /**
5
+ * Service for managing multiple search providers with fallback support
6
+ *
7
+ * @class SearchProviderService
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const service = new SearchProviderService({
12
+ * serperApiKey: 'your-key',
13
+ * rateLimit: { maxRequests: 10, windowMs: 60000 }
14
+ * });
15
+ *
16
+ * const results = await service.search('query');
17
+ * ```
18
+ */
19
+ class SearchProviderService {
20
+ config;
21
+ rateLimitState;
22
+ /**
23
+ * Creates an instance of SearchProviderService
24
+ *
25
+ * @param {SearchProviderConfig} config - Configuration for the service
26
+ */
27
+ constructor(config) {
28
+ this.config = {
29
+ maxRetries: 3,
30
+ rateLimit: {
31
+ maxRequests: 10,
32
+ windowMs: 60000
33
+ },
34
+ ...config
35
+ };
36
+ this.rateLimitState = new Map();
37
+ }
38
+ /**
39
+ * Performs a search across available providers with automatic fallback
40
+ *
41
+ * @param {string} query - The search query
42
+ * @param {Object} options - Search options
43
+ * @param {number} [options.maxResults=10] - Maximum results to return
44
+ * @param {string} [options.provider] - Specific provider to use
45
+ * @returns {Promise<ProviderResponse>} Search results with metadata
46
+ *
47
+ * @throws {Error} If all providers fail and no fallback is available
48
+ */
49
+ async search(query, options = {}) {
50
+ const startTime = Date.now();
51
+ const maxResults = options.maxResults || 10;
52
+ // If specific provider requested, try only that one
53
+ if (options.provider) {
54
+ return this.searchWithProvider(query, options.provider, maxResults, startTime);
55
+ }
56
+ // Try providers in order of preference
57
+ const providers = this.getAvailableProviders();
58
+ for (const provider of providers) {
59
+ try {
60
+ if (await this.checkRateLimit(provider)) {
61
+ return await this.searchWithProvider(query, provider, maxResults, startTime);
62
+ }
63
+ }
64
+ catch (error) {
65
+ console.warn(`Provider ${provider} failed:`, error);
66
+ continue;
67
+ }
68
+ }
69
+ // Final fallback to DuckDuckGo (no API key required)
70
+ return this.searchDuckDuckGo(query, maxResults, startTime);
71
+ }
72
+ /**
73
+ * Searches using a specific provider
74
+ *
75
+ * @private
76
+ * @param {string} query - Search query
77
+ * @param {string} provider - Provider name
78
+ * @param {number} maxResults - Maximum results
79
+ * @param {number} startTime - Request start timestamp
80
+ * @returns {Promise<ProviderResponse>} Search results
81
+ */
82
+ async searchWithProvider(query, provider, maxResults, startTime) {
83
+ let results;
84
+ switch (provider) {
85
+ case 'serper':
86
+ results = await this.searchSerper(query, maxResults);
87
+ break;
88
+ case 'serpapi':
89
+ results = await this.searchSerpApi(query, maxResults);
90
+ break;
91
+ case 'brave':
92
+ results = await this.searchBrave(query, maxResults);
93
+ break;
94
+ case 'duckduckgo':
95
+ default:
96
+ results = await this.searchDuckDuckGoAPI(query, maxResults);
97
+ break;
98
+ }
99
+ return {
100
+ provider,
101
+ results: results.slice(0, maxResults),
102
+ metadata: {
103
+ query,
104
+ timestamp: new Date().toISOString(),
105
+ responseTime: Date.now() - startTime
106
+ }
107
+ };
108
+ }
109
+ /**
110
+ * Gets list of available providers based on configured API keys
111
+ *
112
+ * @private
113
+ * @returns {string[]} Array of available provider names
114
+ */
115
+ getAvailableProviders() {
116
+ const providers = [];
117
+ if (this.config.serperApiKey)
118
+ providers.push('serper');
119
+ if (this.config.serpApiKey)
120
+ providers.push('serpapi');
121
+ if (this.config.braveApiKey)
122
+ providers.push('brave');
123
+ return providers;
124
+ }
125
+ /**
126
+ * Checks if a provider is within rate limits
127
+ *
128
+ * @private
129
+ * @param {string} provider - Provider name
130
+ * @returns {Promise<boolean>} True if within limits
131
+ */
132
+ async checkRateLimit(provider) {
133
+ const now = Date.now();
134
+ const state = this.rateLimitState.get(provider);
135
+ if (!state || now > state.resetTime) {
136
+ this.rateLimitState.set(provider, {
137
+ count: 1,
138
+ resetTime: now + this.config.rateLimit.windowMs
139
+ });
140
+ return true;
141
+ }
142
+ if (state.count >= this.config.rateLimit.maxRequests) {
143
+ return false;
144
+ }
145
+ state.count++;
146
+ return true;
147
+ }
148
+ /**
149
+ * Search using Serper.dev API
150
+ *
151
+ * @private
152
+ * @param {string} query - Search query
153
+ * @param {number} maxResults - Maximum results
154
+ * @returns {Promise<SearchResult[]>} Search results
155
+ */
156
+ async searchSerper(query, maxResults) {
157
+ const response = await fetch('https://google.serper.dev/search', {
158
+ method: 'POST',
159
+ headers: {
160
+ 'X-API-KEY': this.config.serperApiKey,
161
+ 'Content-Type': 'application/json'
162
+ },
163
+ body: JSON.stringify({ q: query, num: maxResults })
164
+ });
165
+ if (!response.ok)
166
+ throw new Error(`Serper API error: ${response.statusText}`);
167
+ const data = await response.json();
168
+ return (data.organic || []).map((item) => ({
169
+ title: item.title,
170
+ url: item.link,
171
+ snippet: item.snippet,
172
+ position: item.position
173
+ }));
174
+ }
175
+ /**
176
+ * Search using SerpAPI
177
+ *
178
+ * @private
179
+ * @param {string} query - Search query
180
+ * @param {number} maxResults - Maximum results
181
+ * @returns {Promise<SearchResult[]>} Search results
182
+ */
183
+ async searchSerpApi(query, maxResults) {
184
+ const params = new URLSearchParams({
185
+ q: query,
186
+ api_key: this.config.serpApiKey,
187
+ num: maxResults.toString()
188
+ });
189
+ const response = await fetch(`https://serpapi.com/search?${params}`);
190
+ if (!response.ok)
191
+ throw new Error(`SerpAPI error: ${response.statusText}`);
192
+ const data = await response.json();
193
+ return (data.organic_results || []).map((item) => ({
194
+ title: item.title,
195
+ url: item.link,
196
+ snippet: item.snippet,
197
+ position: item.position
198
+ }));
199
+ }
200
+ /**
201
+ * Search using Brave Search API
202
+ *
203
+ * @private
204
+ * @param {string} query - Search query
205
+ * @param {number} maxResults - Maximum results
206
+ * @returns {Promise<SearchResult[]>} Search results
207
+ */
208
+ async searchBrave(query, maxResults) {
209
+ const params = new URLSearchParams({
210
+ q: query,
211
+ count: maxResults.toString()
212
+ });
213
+ const response = await fetch(`https://api.search.brave.com/res/v1/web/search?${params}`, {
214
+ headers: {
215
+ 'X-Subscription-Token': this.config.braveApiKey
216
+ }
217
+ });
218
+ if (!response.ok)
219
+ throw new Error(`Brave API error: ${response.statusText}`);
220
+ const data = await response.json();
221
+ return (data.web?.results || []).map((item, index) => ({
222
+ title: item.title,
223
+ url: item.url,
224
+ snippet: item.description,
225
+ position: index + 1
226
+ }));
227
+ }
228
+ /**
229
+ * Search using DuckDuckGo (HTML scraping fallback)
230
+ *
231
+ * @private
232
+ * @param {string} query - Search query
233
+ * @param {number} maxResults - Maximum results
234
+ * @param {number} startTime - Request start timestamp
235
+ * @returns {Promise<ProviderResponse>} Search results
236
+ */
237
+ async searchDuckDuckGo(query, maxResults, startTime) {
238
+ try {
239
+ const results = await this.searchDuckDuckGoAPI(query, maxResults);
240
+ return {
241
+ provider: 'duckduckgo',
242
+ results,
243
+ metadata: {
244
+ query,
245
+ timestamp: new Date().toISOString(),
246
+ responseTime: Date.now() - startTime,
247
+ fallback: true
248
+ }
249
+ };
250
+ }
251
+ catch (error) {
252
+ // Return empty results rather than throwing
253
+ return {
254
+ provider: 'duckduckgo',
255
+ results: [],
256
+ metadata: {
257
+ query,
258
+ timestamp: new Date().toISOString(),
259
+ responseTime: Date.now() - startTime,
260
+ fallback: true
261
+ }
262
+ };
263
+ }
264
+ }
265
+ /**
266
+ * Search using DuckDuckGo instant answer API
267
+ *
268
+ * @private
269
+ * @param {string} query - Search query
270
+ * @param {number} maxResults - Maximum results
271
+ * @returns {Promise<SearchResult[]>} Search results
272
+ */
273
+ async searchDuckDuckGoAPI(query, maxResults) {
274
+ // DuckDuckGo instant answer API (limited but free)
275
+ const params = new URLSearchParams({
276
+ q: query,
277
+ format: 'json',
278
+ no_html: '1',
279
+ skip_disambig: '1'
280
+ });
281
+ const response = await fetch(`https://api.duckduckgo.com/?${params}`);
282
+ const data = await response.json();
283
+ const results = [];
284
+ // Add instant answer if available
285
+ if (data.AbstractText && data.AbstractURL) {
286
+ results.push({
287
+ title: data.Heading || query,
288
+ url: data.AbstractURL,
289
+ snippet: data.AbstractText
290
+ });
291
+ }
292
+ // Add related topics
293
+ if (data.RelatedTopics) {
294
+ for (const topic of data.RelatedTopics.slice(0, maxResults - 1)) {
295
+ if (topic.FirstURL && topic.Text) {
296
+ results.push({
297
+ title: topic.Text.split(' - ')[0] || topic.Text,
298
+ url: topic.FirstURL,
299
+ snippet: topic.Text
300
+ });
301
+ }
302
+ }
303
+ }
304
+ return results.slice(0, maxResults);
305
+ }
306
+ /**
307
+ * Gets recommended search providers with signup information
308
+ *
309
+ * @static
310
+ * @returns {Array} Array of provider recommendations
311
+ */
312
+ static getRecommendedProviders() {
313
+ return [
314
+ {
315
+ name: 'Serper',
316
+ signupUrl: 'https://serper.dev',
317
+ freeQuota: '2,500 queries/month',
318
+ description: 'Google search results API'
319
+ },
320
+ {
321
+ name: 'SerpAPI',
322
+ signupUrl: 'https://serpapi.com',
323
+ freeQuota: '100 searches/month',
324
+ description: 'Multiple search engines API'
325
+ },
326
+ {
327
+ name: 'Brave Search',
328
+ signupUrl: 'https://brave.com/search-api',
329
+ freeQuota: '2,000 queries/month',
330
+ description: 'Privacy-focused search API'
331
+ },
332
+ {
333
+ name: 'DuckDuckGo',
334
+ signupUrl: 'No signup required',
335
+ freeQuota: 'Unlimited (rate limited)',
336
+ description: 'Privacy-focused, no API key needed'
337
+ }
338
+ ];
339
+ }
340
+ }
341
+ exports.SearchProviderService = SearchProviderService;
342
+ //# sourceMappingURL=searchProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchProvider.js","sourceRoot":"","sources":["../../src/services/searchProvider.ts"],"names":[],"mappings":";;;AAsCA;;;;;;;;;;;;;;GAcG;AACH,MAAa,qBAAqB;IACxB,MAAM,CAAuB;IAC7B,cAAc,CAAoD;IAE1E;;;;OAIG;IACH,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,GAAG;YACZ,UAAU,EAAE,CAAC;YACb,SAAS,EAAE;gBACT,WAAW,EAAE,EAAE;gBACf,QAAQ,EAAE,KAAK;aAChB;YACD,GAAG,MAAM;SACV,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;IAClC,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,MAAM,CACV,KAAa,EACb,UAGI,EAAE;QAEN,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAE5C,oDAAoD;QACpD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QACjF,CAAC;QAED,uCAAuC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE/C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,IAAI,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACxC,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;gBAC/E,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,YAAY,QAAQ,UAAU,EAAE,KAAK,CAAC,CAAC;gBACpD,SAAS;YACX,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,kBAAkB,CAC9B,KAAa,EACb,QAAgB,EAChB,UAAkB,EAClB,SAAiB;QAEjB,IAAI,OAAuB,CAAC;QAE5B,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACX,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACrD,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACtD,MAAM;YACR,KAAK,OAAO;gBACV,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACpD,MAAM;YACR,KAAK,YAAY,CAAC;YAClB;gBACE,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBAC5D,MAAM;QACV,CAAC;QAED,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;YACrC,QAAQ,EAAE;gBACR,KAAK;gBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACrC;SACF,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,qBAAqB;QAC3B,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY;YAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAErD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,cAAc,CAAC,QAAgB;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE;gBAChC,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAU,CAAC,QAAQ;aACjD,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,SAAU,CAAC,WAAW,EAAE,CAAC;YACtD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,UAAkB;QAC1D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kCAAkC,EAAE;YAC/D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa;gBACtC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;SACpD,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAE9E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;YAC9C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,IAAI;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,UAAkB;QAC3D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,CAAC,EAAE,KAAK;YACR,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,UAAW;YAChC,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE;SAC3B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAE3E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;YACtD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,IAAI;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,UAAkB;QACzD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,CAAC,EAAE,KAAK;YACR,KAAK,EAAE,UAAU,CAAC,QAAQ,EAAE;SAC7B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kDAAkD,MAAM,EAAE,EAAE;YACvF,OAAO,EAAE;gBACP,sBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAY;aACjD;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAE7E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC;YAClE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,QAAQ,EAAE,KAAK,GAAG,CAAC;SACpB,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,gBAAgB,CAC5B,KAAa,EACb,UAAkB,EAClB,SAAiB;QAEjB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAClE,OAAO;gBACL,QAAQ,EAAE,YAAY;gBACtB,OAAO;gBACP,QAAQ,EAAE;oBACR,KAAK;oBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACpC,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4CAA4C;YAC5C,OAAO;gBACL,QAAQ,EAAE,YAAY;gBACtB,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE;oBACR,KAAK;oBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACpC,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,mBAAmB,CAAC,KAAa,EAAE,UAAkB;QACjE,mDAAmD;QACnD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,CAAC,EAAE,KAAK;YACR,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG;YACZ,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,kCAAkC;QAClC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;gBAC5B,GAAG,EAAE,IAAI,CAAC,WAAW;gBACrB,OAAO,EAAE,IAAI,CAAC,YAAY;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,qBAAqB;QACrB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;gBAChE,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACjC,OAAO,CAAC,IAAI,CAAC;wBACX,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI;wBAC/C,GAAG,EAAE,KAAK,CAAC,QAAQ;wBACnB,OAAO,EAAE,KAAK,CAAC,IAAI;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,uBAAuB;QAC5B,OAAO;YACL;gBACE,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,oBAAoB;gBAC/B,SAAS,EAAE,qBAAqB;gBAChC,WAAW,EAAE,2BAA2B;aACzC;YACD;gBACE,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,qBAAqB;gBAChC,SAAS,EAAE,oBAAoB;gBAC/B,WAAW,EAAE,6BAA6B;aAC3C;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,SAAS,EAAE,8BAA8B;gBACzC,SAAS,EAAE,qBAAqB;gBAChC,WAAW,EAAE,4BAA4B;aAC1C;YACD;gBACE,IAAI,EAAE,YAAY;gBAClB,SAAS,EAAE,oBAAoB;gBAC/B,SAAS,EAAE,0BAA0B;gBACrC,WAAW,EAAE,oCAAoC;aAClD;SACF,CAAC;IACJ,CAAC;CACF;AA1WD,sDA0WC"}
@@ -0,0 +1,99 @@
1
+ import { ITool } from '@framers/agentos';
2
+ import { SearchProviderService } from '../services/searchProvider';
3
+ /**
4
+ * Fact checking tool that verifies statements against web sources
5
+ *
6
+ * @class FactCheckTool
7
+ * @implements {ITool}
8
+ *
9
+ * @example
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
+ * ```
18
+ */
19
+ export declare class FactCheckTool implements ITool {
20
+ private searchService;
21
+ readonly id = "factCheck";
22
+ readonly name = "Fact Check";
23
+ readonly description = "Verify facts and statements against web sources";
24
+ /**
25
+ * Creates an instance of FactCheckTool
26
+ * @param {SearchProviderService} searchService - The search provider service
27
+ */
28
+ constructor(searchService: SearchProviderService);
29
+ /**
30
+ * Executes fact checking on a statement
31
+ *
32
+ * @param {Object} input - The fact check parameters
33
+ * @param {string} input.statement - The statement to fact-check
34
+ * @param {boolean} [input.checkSources=true] - Whether to include source citations
35
+ * @param {string} [input.confidence='medium'] - Required confidence level
36
+ * @returns {Promise<{success: boolean, output?: any, error?: string}>} Fact check results
37
+ */
38
+ execute(input: {
39
+ statement: string;
40
+ checkSources?: boolean;
41
+ confidence?: 'low' | 'medium' | 'high';
42
+ }): Promise<{
43
+ success: boolean;
44
+ output?: any;
45
+ error?: string;
46
+ }>;
47
+ /**
48
+ * Generates queries for fact-checking a statement
49
+ *
50
+ * @private
51
+ * @param {string} statement - The statement to check
52
+ * @returns {string[]} Array of search queries
53
+ */
54
+ 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
+ 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
+ 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
+ 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
+ }
99
+ //# sourceMappingURL=factCheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factCheck.d.ts","sourceRoot":"","sources":["../../src/tools/factCheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,aAAc,YAAW,KAAK;IAS7B,OAAO,CAAC,aAAa;IARjC,SAAgB,EAAE,eAAe;IACjC,SAAgB,IAAI,gBAAgB;IACpC,SAAgB,WAAW,qDAAqD;IAEhF;;;OAGG;gBACiB,aAAa,EAAE,qBAAqB;IAExD;;;;;;;;OAQG;IACG,OAAO,CAAC,KAAK,EAAE;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,UAAU,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;KACxC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAmD/D;;;;;;OAMG;IACH,OAAO,CAAC,wBAAwB;IAUhC;;;;;;;;OAQG;IACH,OAAO,CAAC,uBAAuB;IA2F/B;;;;;;;OAOG;IACH,OAAO,CAAC,0BAA0B;IAKlC;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAwBtB;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IA2B1D;;;;OAIG;IACH,SAAS,IAAI,GAAG;CAwBjB"}