@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,66 +1,38 @@
|
|
|
1
|
-
import { ITool } from '@framers/agentos';
|
|
2
|
-
import { SearchProviderService } from '../services/searchProvider';
|
|
3
1
|
/**
|
|
4
|
-
* Web
|
|
2
|
+
* Web Search Tool — multi-provider search via SearchProviderService.
|
|
5
3
|
*
|
|
6
|
-
*
|
|
7
|
-
* @implements {ITool}
|
|
4
|
+
* Updated to conform to AgentOS `ITool` (inputSchema + ToolExecutionContext).
|
|
8
5
|
*
|
|
9
|
-
* @
|
|
10
|
-
* ```typescript
|
|
11
|
-
* const tool = new WebSearchTool(searchService);
|
|
12
|
-
* const result = await tool.execute({
|
|
13
|
-
* query: 'AgentOS extensions',
|
|
14
|
-
* maxResults: 10,
|
|
15
|
-
* provider: 'serper'
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
error?: string;
|
|
48
|
-
}>;
|
|
49
|
-
/**
|
|
50
|
-
* Validates input parameters for the web search
|
|
51
|
-
*
|
|
52
|
-
* @param {any} input - The input to validate
|
|
53
|
-
* @returns {{valid: boolean, errors: string[]}} Validation result
|
|
54
|
-
*/
|
|
55
|
-
validate(input: any): {
|
|
56
|
-
valid: boolean;
|
|
57
|
-
errors: string[];
|
|
8
|
+
import type { ITool, JSONSchemaObject, ToolExecutionContext, ToolExecutionResult } from '@framers/agentos';
|
|
9
|
+
import type { ProviderResponse, MultiSearchResponse } from '../services/searchProvider.js';
|
|
10
|
+
import { SearchProviderService } from '../services/searchProvider.js';
|
|
11
|
+
export interface WebSearchInput {
|
|
12
|
+
query: string;
|
|
13
|
+
maxResults?: number;
|
|
14
|
+
provider?: 'serper' | 'serpapi' | 'brave' | 'searxng' | 'duckduckgo';
|
|
15
|
+
multiSearch?: boolean;
|
|
16
|
+
category?: string;
|
|
17
|
+
}
|
|
18
|
+
export type WebSearchOutput = ProviderResponse | MultiSearchResponse;
|
|
19
|
+
export declare class WebSearchTool implements ITool<WebSearchInput, WebSearchOutput> {
|
|
20
|
+
private readonly searchService;
|
|
21
|
+
private readonly defaultMultiSearch;
|
|
22
|
+
readonly id = "web-search-v1";
|
|
23
|
+
/** Tool call name used by the LLM / ToolExecutor. */
|
|
24
|
+
readonly name = "web_search";
|
|
25
|
+
readonly displayName = "Web Search";
|
|
26
|
+
readonly description = "Search the web using multiple providers (Serper, SerpAPI, Brave, SearXNG, DuckDuckGo fallback). Set multiSearch=true to query ALL providers in parallel for higher-confidence, deduplicated results.";
|
|
27
|
+
readonly category = "research";
|
|
28
|
+
readonly hasSideEffects = false;
|
|
29
|
+
readonly inputSchema: JSONSchemaObject;
|
|
30
|
+
readonly requiredCapabilities: string[];
|
|
31
|
+
constructor(searchService: SearchProviderService, defaultMultiSearch?: boolean);
|
|
32
|
+
execute(input: WebSearchInput, _context: ToolExecutionContext): Promise<ToolExecutionResult<WebSearchOutput>>;
|
|
33
|
+
validateArgs(input: Record<string, any>): {
|
|
34
|
+
isValid: boolean;
|
|
35
|
+
errors?: any[];
|
|
58
36
|
};
|
|
59
|
-
/**
|
|
60
|
-
* Returns the JSON schema for the tool's input
|
|
61
|
-
*
|
|
62
|
-
* @returns {Object} JSON Schema object
|
|
63
|
-
*/
|
|
64
|
-
getSchema(): any;
|
|
65
37
|
}
|
|
66
38
|
//# sourceMappingURL=webSearch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webSearch.d.ts","sourceRoot":"","sources":["../../src/tools/webSearch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webSearch.d.ts","sourceRoot":"","sources":["../../src/tools/webSearch.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,CAAC;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAErE,qBAAa,aAAc,YAAW,KAAK,CAAC,cAAc,EAAE,eAAe,CAAC;IAgDxE,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAhDrC,SAAgB,EAAE,mBAAmB;IACrC,qDAAqD;IACrD,SAAgB,IAAI,gBAAgB;IACpC,SAAgB,WAAW,gBAAgB;IAC3C,SAAgB,WAAW,0MAC8K;IACzM,SAAgB,QAAQ,cAAc;IACtC,SAAgB,cAAc,SAAS;IAEvC,SAAgB,WAAW,EAAE,gBAAgB,CAiC3C;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;IA4BnH,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE;CAgC/E"}
|
package/dist/tools/webSearch.js
CHANGED
|
@@ -1,70 +1,86 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WebSearchTool = void 0;
|
|
1
|
+
// @ts-nocheck
|
|
4
2
|
/**
|
|
5
|
-
* Web
|
|
3
|
+
* Web Search Tool — multi-provider search via SearchProviderService.
|
|
6
4
|
*
|
|
7
|
-
*
|
|
8
|
-
* @implements {ITool}
|
|
5
|
+
* Updated to conform to AgentOS `ITool` (inputSchema + ToolExecutionContext).
|
|
9
6
|
*
|
|
10
|
-
* @
|
|
11
|
-
* ```typescript
|
|
12
|
-
* const tool = new WebSearchTool(searchService);
|
|
13
|
-
* const result = await tool.execute({
|
|
14
|
-
* query: 'AgentOS extensions',
|
|
15
|
-
* maxResults: 10,
|
|
16
|
-
* provider: 'serper'
|
|
17
|
-
* });
|
|
18
|
-
* ```
|
|
7
|
+
* @module @framers/agentos-ext-web-search
|
|
19
8
|
*/
|
|
20
|
-
class WebSearchTool {
|
|
9
|
+
export class WebSearchTool {
|
|
21
10
|
searchService;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
11
|
+
defaultMultiSearch;
|
|
12
|
+
id = 'web-search-v1';
|
|
13
|
+
/** Tool call name used by the LLM / ToolExecutor. */
|
|
14
|
+
name = 'web_search';
|
|
15
|
+
displayName = 'Web Search';
|
|
16
|
+
description = 'Search the web using multiple providers (Serper, SerpAPI, Brave, SearXNG, DuckDuckGo fallback). Set multiSearch=true to query ALL providers in parallel for higher-confidence, deduplicated results.';
|
|
17
|
+
category = 'research';
|
|
18
|
+
hasSideEffects = false;
|
|
19
|
+
inputSchema = {
|
|
20
|
+
type: 'object',
|
|
21
|
+
required: ['query'],
|
|
22
|
+
properties: {
|
|
23
|
+
query: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
description: 'The search query',
|
|
26
|
+
},
|
|
27
|
+
maxResults: {
|
|
28
|
+
type: 'integer',
|
|
29
|
+
description: 'Maximum number of results to return',
|
|
30
|
+
default: 10,
|
|
31
|
+
minimum: 1,
|
|
32
|
+
maximum: 50,
|
|
33
|
+
},
|
|
34
|
+
provider: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
description: 'Specific search provider to use (ignored when multiSearch is true)',
|
|
37
|
+
enum: ['serper', 'serpapi', 'brave', 'searxng', 'duckduckgo'],
|
|
38
|
+
},
|
|
39
|
+
multiSearch: {
|
|
40
|
+
type: 'boolean',
|
|
41
|
+
description: 'When true, searches ALL available providers in parallel and returns merged, deduplicated results ranked by cross-provider agreement. Useful for deep research or fact verification.',
|
|
42
|
+
default: false,
|
|
43
|
+
},
|
|
44
|
+
category: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
description: 'Search category (SearXNG only). Options: general, news, images, videos, it, science, files, social_media',
|
|
47
|
+
enum: ['general', 'news', 'images', 'videos', 'it', 'science', 'files', 'social_media'],
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
additionalProperties: false,
|
|
51
|
+
};
|
|
52
|
+
requiredCapabilities = ['capability:web_search'];
|
|
53
|
+
constructor(searchService, defaultMultiSearch = false) {
|
|
30
54
|
this.searchService = searchService;
|
|
55
|
+
this.defaultMultiSearch = defaultMultiSearch;
|
|
31
56
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
* @returns {Promise<{success: boolean, output?: any, error?: string}>} The search results
|
|
40
|
-
*
|
|
41
|
-
* @throws {Error} Throws if all providers fail
|
|
42
|
-
*/
|
|
43
|
-
async execute(input) {
|
|
57
|
+
async execute(input, _context) {
|
|
58
|
+
if (!this.searchService) {
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
error: 'Search service not initialized. Try using browser_navigate to search directly, or set a search API key (SERPER_API_KEY, BRAVE_API_KEY).',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
44
64
|
try {
|
|
65
|
+
const useMultiSearch = input.multiSearch ?? this.defaultMultiSearch;
|
|
66
|
+
if (useMultiSearch && !input.provider) {
|
|
67
|
+
const results = await this.searchService.multiSearch(input.query, {
|
|
68
|
+
maxResults: input.maxResults || 10,
|
|
69
|
+
});
|
|
70
|
+
return { success: true, output: results };
|
|
71
|
+
}
|
|
45
72
|
const results = await this.searchService.search(input.query, {
|
|
46
73
|
maxResults: input.maxResults || 10,
|
|
47
|
-
provider: input.provider
|
|
74
|
+
provider: input.provider,
|
|
75
|
+
category: input.category,
|
|
48
76
|
});
|
|
49
|
-
return {
|
|
50
|
-
success: true,
|
|
51
|
-
output: results
|
|
52
|
-
};
|
|
77
|
+
return { success: true, output: results };
|
|
53
78
|
}
|
|
54
79
|
catch (error) {
|
|
55
|
-
return {
|
|
56
|
-
success: false,
|
|
57
|
-
error: error.message
|
|
58
|
-
};
|
|
80
|
+
return { success: false, error: error?.message || String(error) };
|
|
59
81
|
}
|
|
60
82
|
}
|
|
61
|
-
|
|
62
|
-
* Validates input parameters for the web search
|
|
63
|
-
*
|
|
64
|
-
* @param {any} input - The input to validate
|
|
65
|
-
* @returns {{valid: boolean, errors: string[]}} Validation result
|
|
66
|
-
*/
|
|
67
|
-
validate(input) {
|
|
83
|
+
validateArgs(input) {
|
|
68
84
|
const errors = [];
|
|
69
85
|
if (!input.query) {
|
|
70
86
|
errors.push('Query is required');
|
|
@@ -78,45 +94,18 @@ class WebSearchTool {
|
|
|
78
94
|
}
|
|
79
95
|
}
|
|
80
96
|
if (input.provider !== undefined) {
|
|
81
|
-
const validProviders = ['serper', 'serpapi', 'brave', 'duckduckgo'];
|
|
97
|
+
const validProviders = ['serper', 'serpapi', 'brave', 'searxng', 'duckduckgo'];
|
|
82
98
|
if (!validProviders.includes(input.provider)) {
|
|
83
99
|
errors.push('Invalid provider');
|
|
84
100
|
}
|
|
85
101
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
*
|
|
94
|
-
* @returns {Object} JSON Schema object
|
|
95
|
-
*/
|
|
96
|
-
getSchema() {
|
|
97
|
-
return {
|
|
98
|
-
type: 'object',
|
|
99
|
-
required: ['query'],
|
|
100
|
-
properties: {
|
|
101
|
-
query: {
|
|
102
|
-
type: 'string',
|
|
103
|
-
description: 'The search query'
|
|
104
|
-
},
|
|
105
|
-
maxResults: {
|
|
106
|
-
type: 'number',
|
|
107
|
-
description: 'Maximum number of results to return',
|
|
108
|
-
default: 10,
|
|
109
|
-
minimum: 1,
|
|
110
|
-
maximum: 50
|
|
111
|
-
},
|
|
112
|
-
provider: {
|
|
113
|
-
type: 'string',
|
|
114
|
-
description: 'Specific search provider to use',
|
|
115
|
-
enum: ['serper', 'serpapi', 'brave', 'duckduckgo']
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
};
|
|
102
|
+
if (input.multiSearch !== undefined && typeof input.multiSearch !== 'boolean') {
|
|
103
|
+
errors.push('multiSearch must be a boolean');
|
|
104
|
+
}
|
|
105
|
+
if (input.multiSearch && input.provider) {
|
|
106
|
+
errors.push('Cannot specify both multiSearch and a specific provider');
|
|
107
|
+
}
|
|
108
|
+
return errors.length === 0 ? { isValid: true } : { isValid: false, errors };
|
|
119
109
|
}
|
|
120
110
|
}
|
|
121
|
-
exports.WebSearchTool = WebSearchTool;
|
|
122
111
|
//# sourceMappingURL=webSearch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webSearch.js","sourceRoot":"","sources":["../../src/tools/webSearch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webSearch.js","sourceRoot":"","sources":["../../src/tools/webSearch.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,YAAY,EAAE,CAAC;KACzB,EAAE,CAAC;IACJ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,YAAY,EAAE,CAAC;KACzB,EAAE,CAAC;IACJ,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
package/dist/types.js
CHANGED
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,cAAc;AACd;;GAEG"}
|
package/manifest.json
CHANGED
|
@@ -2,39 +2,39 @@
|
|
|
2
2
|
"$schema": "https://agentos.sh/schemas/extension-manifest-v1.json",
|
|
3
3
|
"id": "com.framers.research.web-search",
|
|
4
4
|
"name": "Web Search Extension",
|
|
5
|
-
"version": "1.
|
|
6
|
-
"description": "
|
|
5
|
+
"version": "1.2.0",
|
|
6
|
+
"description": "Multi-provider web search with Firecrawl, Tavily, Serper, Brave — RRF fusion, semantic dedup, Cohere/LLM neural reranking, research aggregation, and fact-checking for AgentOS",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Frame.dev",
|
|
9
9
|
"email": "support@frame.dev",
|
|
10
|
-
"url": "https://github.com/
|
|
10
|
+
"url": "https://github.com/framerslab"
|
|
11
11
|
},
|
|
12
12
|
"license": "MIT",
|
|
13
|
-
"keywords": ["search", "web", "research", "fact-check", "serper", "serpapi", "brave"],
|
|
13
|
+
"keywords": ["search", "web", "research", "fact-check", "firecrawl", "tavily", "serper", "serpapi", "brave", "searxng", "cohere", "reranking", "rrf"],
|
|
14
14
|
"agentosVersion": "^2.0.0",
|
|
15
15
|
"categories": ["productivity", "research"],
|
|
16
16
|
"repository": {
|
|
17
17
|
"type": "git",
|
|
18
|
-
"url": "https://github.com/
|
|
18
|
+
"url": "https://github.com/framerslab/agentos-extensions"
|
|
19
19
|
},
|
|
20
20
|
"extensions": [
|
|
21
21
|
{
|
|
22
22
|
"kind": "tool",
|
|
23
|
-
"id": "
|
|
23
|
+
"id": "web_search",
|
|
24
24
|
"displayName": "Web Search",
|
|
25
25
|
"description": "Search the web for information",
|
|
26
26
|
"entry": "./dist/tools/webSearch.js"
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
"kind": "tool",
|
|
30
|
-
"id": "
|
|
30
|
+
"id": "research_aggregate",
|
|
31
31
|
"displayName": "Research Aggregator",
|
|
32
32
|
"description": "Aggregate research from multiple searches",
|
|
33
33
|
"entry": "./dist/tools/researchAggregator.js"
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
"kind": "tool",
|
|
37
|
-
"id": "
|
|
37
|
+
"id": "fact_check",
|
|
38
38
|
"displayName": "Fact Checker",
|
|
39
39
|
"description": "Verify facts across multiple sources",
|
|
40
40
|
"entry": "./dist/tools/factCheck.js"
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"properties": {
|
|
45
45
|
"search.provider": {
|
|
46
46
|
"type": "string",
|
|
47
|
-
"enum": ["serper", "serpapi", "brave", "duckduckgo"],
|
|
47
|
+
"enum": ["serper", "serpapi", "brave", "searxng", "duckduckgo"],
|
|
48
48
|
"default": "duckduckgo",
|
|
49
49
|
"description": "Search API provider to use"
|
|
50
50
|
},
|
|
@@ -59,6 +59,11 @@
|
|
|
59
59
|
"minimum": 1,
|
|
60
60
|
"maximum": 20,
|
|
61
61
|
"description": "Maximum requests per second"
|
|
62
|
+
},
|
|
63
|
+
"search.multiSearch": {
|
|
64
|
+
"type": "boolean",
|
|
65
|
+
"default": false,
|
|
66
|
+
"description": "Default multi-provider parallel search for all search tools. When enabled, queries fan out to ALL available providers, results are deduplicated and reranked by cross-provider agreement."
|
|
62
67
|
}
|
|
63
68
|
}
|
|
64
69
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@framers/agentos-ext-web-search",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Web search, research aggregation, and fact-checking tools for AgentOS",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -14,16 +14,6 @@
|
|
|
14
14
|
"./manifest.json": "./manifest.json",
|
|
15
15
|
"./package.json": "./package.json"
|
|
16
16
|
},
|
|
17
|
-
"scripts": {
|
|
18
|
-
"build": "tsc",
|
|
19
|
-
"test": "vitest run",
|
|
20
|
-
"test:watch": "vitest",
|
|
21
|
-
"test:coverage": "vitest run --coverage",
|
|
22
|
-
"lint": "eslint src --ext .ts",
|
|
23
|
-
"typecheck": "tsc --noEmit",
|
|
24
|
-
"docs": "typedoc --out docs src/index.ts",
|
|
25
|
-
"clean": "rimraf dist"
|
|
26
|
-
},
|
|
27
17
|
"keywords": [
|
|
28
18
|
"agentos",
|
|
29
19
|
"extension",
|
|
@@ -46,20 +36,19 @@
|
|
|
46
36
|
"license": "MIT",
|
|
47
37
|
"repository": {
|
|
48
38
|
"type": "git",
|
|
49
|
-
"url": "https://github.com/
|
|
39
|
+
"url": "git+https://github.com/framerslab/agentos-extensions.git",
|
|
50
40
|
"directory": "registry/curated/research/web-search"
|
|
51
41
|
},
|
|
52
42
|
"publishConfig": {
|
|
53
43
|
"access": "public"
|
|
54
44
|
},
|
|
55
45
|
"peerDependencies": {
|
|
56
|
-
"@framers/agentos": "^0.
|
|
46
|
+
"@framers/agentos": "^0.10.28"
|
|
57
47
|
},
|
|
58
48
|
"dependencies": {
|
|
59
49
|
"axios": "^1.7.7"
|
|
60
50
|
},
|
|
61
51
|
"devDependencies": {
|
|
62
|
-
"@framers/agentos": "^0.1.0",
|
|
63
52
|
"@types/node": "^20.12.12",
|
|
64
53
|
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
|
65
54
|
"@typescript-eslint/parser": "^7.0.0",
|
|
@@ -68,6 +57,27 @@
|
|
|
68
57
|
"rimraf": "^5.0.7",
|
|
69
58
|
"typedoc": "^0.25.13",
|
|
70
59
|
"typescript": "^5.4.5",
|
|
71
|
-
"vitest": "^1.6.0"
|
|
60
|
+
"vitest": "^1.6.0",
|
|
61
|
+
"@framers/agentos": "^0.10.28"
|
|
62
|
+
},
|
|
63
|
+
"homepage": "https://github.com/framerslab/agentos-extensions/tree/master/registry/curated/research/web-search#readme",
|
|
64
|
+
"bugs": {
|
|
65
|
+
"url": "https://github.com/framerslab/agentos-extensions/issues"
|
|
66
|
+
},
|
|
67
|
+
"files": [
|
|
68
|
+
"dist",
|
|
69
|
+
"manifest.json",
|
|
70
|
+
"README.md",
|
|
71
|
+
"LICENSE"
|
|
72
|
+
],
|
|
73
|
+
"scripts": {
|
|
74
|
+
"build": "tsc",
|
|
75
|
+
"test": "vitest run --passWithNoTests",
|
|
76
|
+
"test:watch": "vitest",
|
|
77
|
+
"test:coverage": "vitest run --coverage",
|
|
78
|
+
"lint": "eslint src --ext .ts",
|
|
79
|
+
"typecheck": "tsc --noEmit",
|
|
80
|
+
"docs": "typedoc --out docs src/index.ts",
|
|
81
|
+
"clean": "rimraf dist"
|
|
72
82
|
}
|
|
73
|
-
}
|
|
83
|
+
}
|
package/.eslintrc.json
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"root": true,
|
|
3
|
-
"parser": "@typescript-eslint/parser",
|
|
4
|
-
"plugins": ["@typescript-eslint"],
|
|
5
|
-
"extends": [
|
|
6
|
-
"eslint:recommended",
|
|
7
|
-
"plugin:@typescript-eslint/recommended"
|
|
8
|
-
],
|
|
9
|
-
"parserOptions": {
|
|
10
|
-
"ecmaVersion": 2022,
|
|
11
|
-
"sourceType": "module",
|
|
12
|
-
"project": "./tsconfig.json"
|
|
13
|
-
},
|
|
14
|
-
"rules": {
|
|
15
|
-
"@typescript-eslint/explicit-function-return-type": "off",
|
|
16
|
-
"@typescript-eslint/no-explicit-any": "warn",
|
|
17
|
-
"@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],
|
|
18
|
-
"no-console": ["warn", { "allow": ["warn", "error"] }]
|
|
19
|
-
},
|
|
20
|
-
"ignorePatterns": ["dist", "node_modules", "coverage", "*.js"]
|
|
21
|
-
}
|
package/CHANGELOG.md
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# @framers/agentos-ext-web-search
|
|
2
|
-
|
|
3
|
-
## 1.1.0
|
|
4
|
-
|
|
5
|
-
### Minor Changes
|
|
6
|
-
|
|
7
|
-
- [`e6a2eb6`](https://github.com/framersai/agentos-extensions/commit/e6a2eb61145c5715df63668b795fe90720a3c7c1) Thanks [@jddunn](https://github.com/jddunn)! - Initial release of AgentOS extension packages.
|
|
8
|
-
|
|
9
|
-
- Auth: JWT authentication and subscription management
|
|
10
|
-
- Anchor Providers: Solana on-chain provenance anchoring
|
|
11
|
-
- Wunderland Tip Ingestion: Tip content processing pipeline
|
|
12
|
-
- Web Search: Search, research aggregation, and fact-checking
|
|
13
|
-
- Web Browser: Browser automation and content extraction
|
|
14
|
-
- Telegram Integration: Telegram Bot API integration
|
|
15
|
-
- Telegram Bot: Telegram bot communications handler
|
|
16
|
-
- CLI Executor: Shell command execution and file management
|
package/src/index.ts
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AgentOS Web Search Extension
|
|
3
|
-
*
|
|
4
|
-
* Provides web search capabilities through multiple providers with automatic fallback.
|
|
5
|
-
*
|
|
6
|
-
* @module @framers/agentos-ext-web-search
|
|
7
|
-
* @version 1.0.0
|
|
8
|
-
* @license MIT
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { ExtensionContext, ExtensionPack } from '@framers/agentos';
|
|
12
|
-
import { WebSearchTool } from './tools/webSearch';
|
|
13
|
-
import { ResearchAggregatorTool } from './tools/researchAggregator';
|
|
14
|
-
import { FactCheckTool } from './tools/factCheck';
|
|
15
|
-
import { SearchProviderService } from './services/searchProvider';
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Extension configuration options
|
|
19
|
-
*/
|
|
20
|
-
export interface WebSearchExtensionOptions {
|
|
21
|
-
/** Serper.dev API key */
|
|
22
|
-
serperApiKey?: string;
|
|
23
|
-
/** SerpAPI API key */
|
|
24
|
-
serpApiKey?: string;
|
|
25
|
-
/** Brave Search API key */
|
|
26
|
-
braveApiKey?: string;
|
|
27
|
-
/** Default maximum results for searches */
|
|
28
|
-
defaultMaxResults?: number;
|
|
29
|
-
/** Rate limiting configuration */
|
|
30
|
-
rateLimit?: {
|
|
31
|
-
maxRequests: number;
|
|
32
|
-
windowMs: number;
|
|
33
|
-
};
|
|
34
|
-
/** Extension priority in the stack */
|
|
35
|
-
priority?: number;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Creates the web search extension pack
|
|
40
|
-
*
|
|
41
|
-
* @param {ExtensionContext} context - The extension context
|
|
42
|
-
* @returns {ExtensionPack} The configured extension pack
|
|
43
|
-
*
|
|
44
|
-
* @example
|
|
45
|
-
* ```typescript
|
|
46
|
-
* import { createExtensionPack } from '@framers/agentos-ext-web-search';
|
|
47
|
-
*
|
|
48
|
-
* const pack = createExtensionPack({
|
|
49
|
-
* options: {
|
|
50
|
-
* serperApiKey: process.env.SERPER_API_KEY,
|
|
51
|
-
* defaultMaxResults: 10
|
|
52
|
-
* },
|
|
53
|
-
* logger: console
|
|
54
|
-
* });
|
|
55
|
-
* ```
|
|
56
|
-
*/
|
|
57
|
-
export function createExtensionPack(context: ExtensionContext): ExtensionPack {
|
|
58
|
-
const options = context.options as WebSearchExtensionOptions || {};
|
|
59
|
-
|
|
60
|
-
// Initialize search service with configuration
|
|
61
|
-
const searchService = new SearchProviderService({
|
|
62
|
-
serperApiKey: options.serperApiKey,
|
|
63
|
-
serpApiKey: options.serpApiKey,
|
|
64
|
-
braveApiKey: options.braveApiKey,
|
|
65
|
-
rateLimit: options.rateLimit
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
// Create tool instances
|
|
69
|
-
const webSearchTool = new WebSearchTool(searchService);
|
|
70
|
-
const researchAggregator = new ResearchAggregatorTool(searchService);
|
|
71
|
-
const factCheckTool = new FactCheckTool(searchService);
|
|
72
|
-
|
|
73
|
-
return {
|
|
74
|
-
name: '@framers/agentos-ext-web-search',
|
|
75
|
-
version: '1.0.0',
|
|
76
|
-
descriptors: [
|
|
77
|
-
{
|
|
78
|
-
id: 'webSearch',
|
|
79
|
-
kind: 'tool',
|
|
80
|
-
priority: options.priority || 50,
|
|
81
|
-
payload: webSearchTool
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
id: 'researchAggregator',
|
|
85
|
-
kind: 'tool',
|
|
86
|
-
priority: options.priority || 50,
|
|
87
|
-
payload: researchAggregator
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
id: 'factCheck',
|
|
91
|
-
kind: 'tool',
|
|
92
|
-
priority: options.priority || 50,
|
|
93
|
-
payload: factCheckTool
|
|
94
|
-
}
|
|
95
|
-
],
|
|
96
|
-
/**
|
|
97
|
-
* Called when extension is activated
|
|
98
|
-
*/
|
|
99
|
-
onActivate: async () => {
|
|
100
|
-
if (context.onActivate) {
|
|
101
|
-
await context.onActivate();
|
|
102
|
-
}
|
|
103
|
-
context.logger?.info('Web Search Extension activated');
|
|
104
|
-
},
|
|
105
|
-
/**
|
|
106
|
-
* Called when extension is deactivated
|
|
107
|
-
*/
|
|
108
|
-
onDeactivate: async () => {
|
|
109
|
-
if (context.onDeactivate) {
|
|
110
|
-
await context.onDeactivate();
|
|
111
|
-
}
|
|
112
|
-
context.logger?.info('Web Search Extension deactivated');
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Export types for consumers
|
|
118
|
-
export { WebSearchTool, ResearchAggregatorTool, FactCheckTool };
|
|
119
|
-
export { SearchProviderService, SearchResult, ProviderResponse } from './services/searchProvider';
|
|
120
|
-
export type { SearchProviderConfig } from './services/searchProvider';
|
|
121
|
-
|
|
122
|
-
// Default export for convenience
|
|
123
|
-
export default createExtensionPack;
|