openhorse 0.1.17 → 0.1.19
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 +13 -4
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +2 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/framework/query.d.ts +3 -0
- package/dist/framework/query.d.ts.map +1 -1
- package/dist/framework/query.js +23 -20
- package/dist/framework/query.js.map +1 -1
- package/dist/framework/tool.d.ts +1 -0
- package/dist/framework/tool.d.ts.map +1 -1
- package/dist/framework/tool.js.map +1 -1
- package/dist/services/config.d.ts +8 -3
- package/dist/services/config.d.ts.map +1 -1
- package/dist/services/config.js +55 -3
- package/dist/services/config.js.map +1 -1
- package/dist/services/global-config.d.ts +29 -3
- package/dist/services/global-config.d.ts.map +1 -1
- package/dist/services/global-config.js +2 -2
- package/dist/services/global-config.js.map +1 -1
- package/dist/services/web-search-adapters.d.ts +24 -0
- package/dist/services/web-search-adapters.d.ts.map +1 -0
- package/dist/services/web-search-adapters.js +338 -0
- package/dist/services/web-search-adapters.js.map +1 -0
- package/dist/services/web-search-mcp.d.ts +32 -0
- package/dist/services/web-search-mcp.d.ts.map +1 -0
- package/dist/services/web-search-mcp.js +251 -0
- package/dist/services/web-search-mcp.js.map +1 -0
- package/dist/services/web-search-provider.d.ts +33 -0
- package/dist/services/web-search-provider.d.ts.map +1 -0
- package/dist/services/web-search-provider.js +139 -0
- package/dist/services/web-search-provider.js.map +1 -0
- package/dist/tools/web.d.ts +2 -2
- package/dist/tools/web.d.ts.map +1 -1
- package/dist/tools/web.js +95 -139
- package/dist/tools/web.js.map +1 -1
- package/package.json +1 -1
package/dist/services/config.js
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* openhorse - 配置加载
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* 其他参数由 Agent 内部智能控制。
|
|
5
|
+
* 用户只需配置少量核心项,其他参数由 Agent 内部智能控制。
|
|
7
6
|
*
|
|
8
7
|
* 配置加载优先级:
|
|
9
8
|
* 1. 命令行参数
|
|
@@ -29,7 +28,51 @@ const INTERNAL_DEFAULTS = {
|
|
|
29
28
|
name: 'openhorse',
|
|
30
29
|
mode: 'development',
|
|
31
30
|
logLevel: 'info',
|
|
31
|
+
toolConfirmation: 'allow',
|
|
32
32
|
};
|
|
33
|
+
function normalizeToolConfirmationPolicy(value) {
|
|
34
|
+
return value === 'ask' || value === 'allow' || value === 'deny'
|
|
35
|
+
? value
|
|
36
|
+
: undefined;
|
|
37
|
+
}
|
|
38
|
+
function parsePositiveInt(value) {
|
|
39
|
+
if (!value)
|
|
40
|
+
return undefined;
|
|
41
|
+
const parsed = Number.parseInt(value, 10);
|
|
42
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;
|
|
43
|
+
}
|
|
44
|
+
function loadWebSearchConfig(globalConfig, overrides) {
|
|
45
|
+
const merged = {
|
|
46
|
+
...globalConfig.webSearch,
|
|
47
|
+
...overrides.webSearch,
|
|
48
|
+
};
|
|
49
|
+
const endpoint = process.env.OPENHORSE_WEBSEARCH_MCP_ENDPOINT;
|
|
50
|
+
const apiKey = process.env.OPENHORSE_WEBSEARCH_API_KEY ?? process.env.DASHSCOPE_API_KEY;
|
|
51
|
+
const provider = process.env.OPENHORSE_WEBSEARCH_PROVIDER ?? process.env.OPENHORSE_WEBSEARCH_MCP_PROVIDER;
|
|
52
|
+
const toolName = process.env.OPENHORSE_WEBSEARCH_MCP_TOOL;
|
|
53
|
+
const timeoutMs = parsePositiveInt(process.env.OPENHORSE_WEBSEARCH_MCP_TIMEOUT_MS);
|
|
54
|
+
const authType = process.env.OPENHORSE_WEBSEARCH_AUTH_TYPE;
|
|
55
|
+
const apiKeyHeader = process.env.OPENHORSE_WEBSEARCH_API_KEY_HEADER;
|
|
56
|
+
const apiKeyQueryParam = process.env.OPENHORSE_WEBSEARCH_API_KEY_QUERY_PARAM;
|
|
57
|
+
if (provider)
|
|
58
|
+
merged.provider = provider;
|
|
59
|
+
if (endpoint)
|
|
60
|
+
merged.endpoint = endpoint;
|
|
61
|
+
if (apiKey)
|
|
62
|
+
merged.apiKey = apiKey;
|
|
63
|
+
if (toolName)
|
|
64
|
+
merged.toolName = toolName;
|
|
65
|
+
if (timeoutMs)
|
|
66
|
+
merged.timeoutMs = timeoutMs;
|
|
67
|
+
if (authType === 'bearer' || authType === 'header' || authType === 'query' || authType === 'none') {
|
|
68
|
+
merged.authType = authType;
|
|
69
|
+
}
|
|
70
|
+
if (apiKeyHeader)
|
|
71
|
+
merged.apiKeyHeader = apiKeyHeader;
|
|
72
|
+
if (apiKeyQueryParam)
|
|
73
|
+
merged.apiKeyQueryParam = apiKeyQueryParam;
|
|
74
|
+
return Object.keys(merged).length > 0 ? merged : undefined;
|
|
75
|
+
}
|
|
33
76
|
// ============================================================================
|
|
34
77
|
// 加载配置
|
|
35
78
|
// ============================================================================
|
|
@@ -40,11 +83,16 @@ const INTERNAL_DEFAULTS = {
|
|
|
40
83
|
function loadConfig(overrides = {}) {
|
|
41
84
|
const globalConfig = (0, global_config_1.loadGlobalConfig)();
|
|
42
85
|
const config = {
|
|
43
|
-
// 用户核心配置
|
|
86
|
+
// 用户核心配置
|
|
44
87
|
apiKey: overrides.apiKey ?? globalConfig.apiKey ?? process.env.OPENHORSE_API_KEY ?? '',
|
|
45
88
|
apiBaseUrl: overrides.apiBaseUrl ?? globalConfig.apiBaseUrl ?? process.env.OPENHORSE_API_BASE_URL ?? process.env.OPENHORSE_BASE_URL ?? undefined,
|
|
46
89
|
model: overrides.model ?? globalConfig.defaultModel ?? process.env.OPENHORSE_MODEL ?? 'gpt-4o',
|
|
47
90
|
fallbackModel: overrides.fallbackModel ?? globalConfig.fallbackModel ?? process.env.OPENHORSE_FALLBACK_MODEL ?? undefined,
|
|
91
|
+
toolConfirmation: normalizeToolConfirmationPolicy(overrides.toolConfirmation)
|
|
92
|
+
?? normalizeToolConfirmationPolicy(globalConfig.toolConfirmation)
|
|
93
|
+
?? normalizeToolConfirmationPolicy(process.env.OPENHORSE_TOOL_CONFIRMATION)
|
|
94
|
+
?? INTERNAL_DEFAULTS.toolConfirmation,
|
|
95
|
+
webSearch: loadWebSearchConfig(globalConfig, overrides),
|
|
48
96
|
// Agent 内部参数
|
|
49
97
|
name: overrides.name ?? process.env.OPENHORSE_NAME ?? INTERNAL_DEFAULTS.name,
|
|
50
98
|
mode: (overrides.mode ?? process.env.OPENHORSE_MODE ?? INTERNAL_DEFAULTS.mode),
|
|
@@ -80,6 +128,10 @@ function getConfigSummary(config) {
|
|
|
80
128
|
apiKey: config.apiKey ? `${config.apiKey.slice(0, 7)}***` : '(not set)',
|
|
81
129
|
mode: config.mode,
|
|
82
130
|
logLevel: config.logLevel,
|
|
131
|
+
toolConfirmation: config.toolConfirmation,
|
|
132
|
+
webSearch: config.webSearch?.endpoint || config.webSearch?.apiKey || config.webSearch?.toolName
|
|
133
|
+
? 'configured'
|
|
134
|
+
: '(default)',
|
|
83
135
|
};
|
|
84
136
|
}
|
|
85
137
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAgHH,gCA8BC;AAKD,oCAEC;AAKD,0CAMC;AAKD,4CAcC;AAjLD,mDAKyB;AAqCzB,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,MAAM,iBAAiB,GAAG;IACxB,gCAAgC;IAChC,2CAA2C;IAC3C,yCAAyC;IACzC,0BAA0B;IAC1B,qCAAqC;IACrC,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,MAAM;IAChB,gBAAgB,EAAE,OAAiC;CAC3C,CAAC;AAEX,SAAS,+BAA+B,CAAC,KAAc;IACrD,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM;QAC7D,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC;AAED,SAAS,mBAAmB,CAC1B,YAA0B,EAC1B,SAAsC;IAEtC,MAAM,MAAM,GAAuB;QACjC,GAAG,YAAY,CAAC,SAAS;QACzB,GAAG,SAAS,CAAC,SAAS;KACvB,CAAC;IAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACxF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC;IAC1G,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;IAC1D,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;IAC3D,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC;IACpE,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC;IAE7E,IAAI,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACzC,IAAI,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACzC,IAAI,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACnC,IAAI,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACzC,IAAI,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5C,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QAClG,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IACD,IAAI,YAAY;QAAE,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;IACrD,IAAI,gBAAgB;QAAE,MAAM,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAEjE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC;AAED,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAE/E;;;GAGG;AACH,SAAgB,UAAU,CAAC,YAAyC,EAAE;IACpE,MAAM,YAAY,GAAG,IAAA,gCAAgB,GAAE,CAAC;IAExC,MAAM,MAAM,GAAuB;QACjC,SAAS;QACT,MAAM,EACJ,SAAS,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;QAChF,UAAU,EACR,SAAS,CAAC,UAAU,IAAI,YAAY,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,SAAS;QACtI,KAAK,EACH,SAAS,CAAC,KAAK,IAAI,YAAY,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,QAAQ;QACzF,aAAa,EACX,SAAS,CAAC,aAAa,IAAI,YAAY,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,SAAS;QAC5G,gBAAgB,EACd,+BAA+B,CAAC,SAAS,CAAC,gBAAgB,CAAC;eACxD,+BAA+B,CAAC,YAAY,CAAC,gBAAgB,CAAC;eAC9D,+BAA+B,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;eACxE,iBAAiB,CAAC,gBAAgB;QACvC,SAAS,EAAE,mBAAmB,CAAC,YAAY,EAAE,SAAS,CAAC;QAEvD,aAAa;QACb,IAAI,EACF,SAAS,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,iBAAiB,CAAC,IAAI;QACxE,IAAI,EACF,CAAC,SAAS,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,iBAAiB,CAAC,IAAI,CAAiC;QAC1G,QAAQ,EACN,CAAC,SAAS,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,iBAAiB,CAAC,QAAQ,CAAmC;KAC1H,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,MAA0B;IACrD,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,MAA0B;IACxD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,2FAA2F,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,MAA0B;IACzD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,aAAa,IAAI,QAAQ;QAC1C,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,kBAAkB;QACnD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW;QACvE,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM,IAAI,MAAM,CAAC,SAAS,EAAE,QAAQ;YAC7F,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,WAAW;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* openhorse - 全局配置管理
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* 其他参数由 Agent 内部智能控制。
|
|
4
|
+
* 用户只需配置少量核心项,其他参数由 Agent 内部智能控制。
|
|
6
5
|
* 配置存储在 ~/.openhorse/openhorse.json
|
|
7
6
|
* 支持环境变量覆盖配置值。
|
|
8
7
|
*/
|
|
@@ -17,8 +16,31 @@ export interface ProjectConfig {
|
|
|
17
16
|
/** 是否已接受信任对话框 */
|
|
18
17
|
hasTrustDialogAccepted?: boolean;
|
|
19
18
|
}
|
|
19
|
+
/** How to handle tool permission checks that request interactive confirmation. */
|
|
20
|
+
export type ToolConfirmationPolicy = 'ask' | 'allow' | 'deny';
|
|
21
|
+
/** Remote MCP service used by the built-in web_search tool. */
|
|
22
|
+
export interface WebSearchMcpConfig {
|
|
23
|
+
/** Provider profile id. Use "auto" or omit to infer from apiBaseUrl/model. */
|
|
24
|
+
provider?: string;
|
|
25
|
+
/** Streamable HTTP MCP endpoint. */
|
|
26
|
+
endpoint?: string;
|
|
27
|
+
/** API key for the WebSearch MCP service. */
|
|
28
|
+
apiKey?: string;
|
|
29
|
+
/** Optional tool name override when the MCP exposes multiple tools. */
|
|
30
|
+
toolName?: string;
|
|
31
|
+
/** Request timeout in milliseconds. */
|
|
32
|
+
timeoutMs?: number;
|
|
33
|
+
/** How to apply apiKey. Defaults to bearer Authorization. */
|
|
34
|
+
authType?: 'bearer' | 'header' | 'query' | 'none';
|
|
35
|
+
/** Header name for authType "bearer" or "header". Defaults to Authorization. */
|
|
36
|
+
apiKeyHeader?: string;
|
|
37
|
+
/** Query parameter name for authType "query". */
|
|
38
|
+
apiKeyQueryParam?: string;
|
|
39
|
+
/** Extra HTTP headers for the MCP endpoint. */
|
|
40
|
+
headers?: Record<string, string>;
|
|
41
|
+
}
|
|
20
42
|
/**
|
|
21
|
-
* 全局配置 —
|
|
43
|
+
* 全局配置 — 用户只需关注少量核心项
|
|
22
44
|
* maxTokens/temperature/retries 等由 Agent 智能控制
|
|
23
45
|
*/
|
|
24
46
|
export interface GlobalConfig {
|
|
@@ -30,6 +52,10 @@ export interface GlobalConfig {
|
|
|
30
52
|
defaultModel: string;
|
|
31
53
|
/** 备用模型(主模型过载时自动切换) */
|
|
32
54
|
fallbackModel?: string;
|
|
55
|
+
/** Tool confirmation fallback while the current CLI cannot show prompts. */
|
|
56
|
+
toolConfirmation?: ToolConfirmationPolicy;
|
|
57
|
+
/** WebSearch MCP configuration. */
|
|
58
|
+
webSearch?: WebSearchMcpConfig;
|
|
33
59
|
totalSessions: number;
|
|
34
60
|
totalTokens: number;
|
|
35
61
|
totalCost: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-config.d.ts","sourceRoot":"","sources":["../../src/services/global-config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"global-config.d.ts","sourceRoot":"","sources":["../../src/services/global-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* openhorse - 全局配置管理
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* 其他参数由 Agent 内部智能控制。
|
|
5
|
+
* 用户只需配置少量核心项,其他参数由 Agent 内部智能控制。
|
|
7
6
|
* 配置存储在 ~/.openhorse/openhorse.json
|
|
8
7
|
* 支持环境变量覆盖配置值。
|
|
9
8
|
*/
|
|
@@ -29,6 +28,7 @@ const config_dir_1 = require("./config-dir");
|
|
|
29
28
|
// ============================================================================
|
|
30
29
|
const DEFAULT_CONFIG = {
|
|
31
30
|
defaultModel: 'gpt-4o',
|
|
31
|
+
toolConfirmation: 'allow',
|
|
32
32
|
totalSessions: 0,
|
|
33
33
|
totalTokens: 0,
|
|
34
34
|
totalCost: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-config.js","sourceRoot":"","sources":["../../src/services/global-config.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"global-config.js","sourceRoot":"","sources":["../../src/services/global-config.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAmGH,4CAeC;AAKD,4CAIC;AAKD,gDAKC;AAMD,4CAGC;AAED,8CAOC;AAMD,8CAUC;AAED,oDAKC;AAMD,sDAGC;AAED,4CAMC;AAiBD,0CAWC;AAQD,8CAoBC;AAED,gDAIC;AA3PD,2BAA6D;AAC7D,mCAAqC;AACrC,+BAA4B;AAC5B,6CAAkF;AA0ElF,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAE/E,MAAM,cAAc,GAAiB;IACnC,YAAY,EAAE,QAAQ;IACtB,gBAAgB,EAAE,OAAO;IACzB,aAAa,EAAE,CAAC;IAChB,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,CAAC;CACb,CAAC;AAEF,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E;;;GAGG;AACH,SAAgB,gBAAgB;IAC9B,IAAA,4BAAe,GAAE,CAAC;IAClB,MAAM,IAAI,GAAG,IAAA,gCAAmB,GAAE,CAAC;IAEnC,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,MAAoB;IACnD,IAAA,4BAAe,GAAE,CAAC;IAClB,MAAM,IAAI,GAAG,IAAA,gCAAmB,GAAE,CAAC;IACnC,IAAA,kBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,OAA8B;IAC/D,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;IAC5C,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC5B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAE/E,SAAgB,gBAAgB,CAAC,WAAmB;IAClD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,SAAgB,iBAAiB,CAAC,WAAmB,EAAE,aAA4B;IACjF,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,CAAC,QAAQ,GAAG;QAChB,GAAG,MAAM,CAAC,QAAQ;QAClB,CAAC,WAAW,CAAC,EAAE,aAAa;KAC7B,CAAC;IACF,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E,SAAgB,iBAAiB;IAC/B,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAElC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/C,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,oBAAoB;IAClC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3B,kBAAkB,CAAC,EAAE,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAE/E,SAAgB,qBAAqB;IACnC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,kBAAkB,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAAc,EAAE,IAAY;IAC3D,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,kBAAkB,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM;QACxC,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,IAAI;KACnC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAE/E,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAO/B,SAAS,mBAAmB;IAC1B,OAAO,IAAA,WAAI,EAAC,IAAA,yBAAY,GAAE,EAAE,oBAAoB,CAAC,CAAC;AACpD,CAAC;AAED,SAAgB,eAAe;IAC7B,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAC;IACnC,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA4B;IACpD,IAAA,4BAAe,GAAE,CAAC;IAClB,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAC;IACnC,IAAA,kBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,SAAgB,iBAAiB,CAAC,OAAe;IAC/C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QAAE,OAAO;IAE5B,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAElC,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IACpE,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,CAAC,OAAO,CAAC;QACd,OAAO;QACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACvC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC;IAED,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED,SAAgB,kBAAkB,CAAC,KAAa;IAC9C,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,IAAI,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACjG,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { OpenHorseCLIConfig } from './config';
|
|
2
|
+
export interface WebSearchAdapterInput {
|
|
3
|
+
query: string;
|
|
4
|
+
limit: number;
|
|
5
|
+
}
|
|
6
|
+
export interface WebSearchHit {
|
|
7
|
+
title: string;
|
|
8
|
+
url: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface WebSearchAdapterOutput {
|
|
12
|
+
provider: string;
|
|
13
|
+
hits: WebSearchHit[];
|
|
14
|
+
durationSeconds: number;
|
|
15
|
+
}
|
|
16
|
+
export type WebSearchMode = 'auto' | 'native' | 'mcp' | 'bailian' | 'zhipu' | 'tavily-mcp' | 'ddg' | 'duckduckgo' | 'tavily' | 'brave' | 'custom';
|
|
17
|
+
export declare function getWebSearchMode(config: OpenHorseCLIConfig): WebSearchMode;
|
|
18
|
+
export declare function shouldTryMcpFirst(mode: WebSearchMode): boolean;
|
|
19
|
+
export declare function shouldFallbackToAdapters(mode: WebSearchMode): boolean;
|
|
20
|
+
export declare function isExplicitAdapterMode(mode: WebSearchMode): boolean;
|
|
21
|
+
export declare function isMcpOnlyMode(mode: WebSearchMode): boolean;
|
|
22
|
+
export declare function runWebSearchAdapters(input: WebSearchAdapterInput, mode: WebSearchMode): Promise<WebSearchAdapterOutput>;
|
|
23
|
+
export declare function formatAdapterOutput(result: WebSearchAdapterOutput, query: string): string;
|
|
24
|
+
//# sourceMappingURL=web-search-adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search-adapters.d.ts","sourceRoot":"","sources":["../../src/services/web-search-adapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAGnD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAeD,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,QAAQ,GACR,KAAK,GACL,SAAS,GACT,OAAO,GACP,YAAY,GACZ,KAAK,GACL,YAAY,GACZ,QAAQ,GACR,OAAO,GACP,QAAQ,CAAC;AAkDb,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,aAAa,CAiB1E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAE9D;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAErE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAElE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAE1D;AAsPD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,qBAAqB,EAC5B,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,sBAAsB,CAAC,CAuBjC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAazF"}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getWebSearchMode = getWebSearchMode;
|
|
7
|
+
exports.shouldTryMcpFirst = shouldTryMcpFirst;
|
|
8
|
+
exports.shouldFallbackToAdapters = shouldFallbackToAdapters;
|
|
9
|
+
exports.isExplicitAdapterMode = isExplicitAdapterMode;
|
|
10
|
+
exports.isMcpOnlyMode = isMcpOnlyMode;
|
|
11
|
+
exports.runWebSearchAdapters = runWebSearchAdapters;
|
|
12
|
+
exports.formatAdapterOutput = formatAdapterOutput;
|
|
13
|
+
const axios_1 = __importDefault(require("axios"));
|
|
14
|
+
const ADAPTER_MODES = new Set(['ddg', 'duckduckgo', 'tavily', 'brave', 'custom']);
|
|
15
|
+
const MCP_ONLY_MODES = new Set(['native', 'mcp', 'bailian', 'zhipu', 'tavily-mcp']);
|
|
16
|
+
function hasProxyEnv() {
|
|
17
|
+
return Boolean(process.env.HTTPS_PROXY || process.env.HTTP_PROXY || process.env.https_proxy || process.env.http_proxy);
|
|
18
|
+
}
|
|
19
|
+
function isFetchMocked() {
|
|
20
|
+
return Boolean(global.fetch?._isMockFunction || global.fetch?.mock);
|
|
21
|
+
}
|
|
22
|
+
async function adapterFetch(url, init = {}) {
|
|
23
|
+
if (!hasProxyEnv() || isFetchMocked()) {
|
|
24
|
+
const response = await fetch(url, init);
|
|
25
|
+
return {
|
|
26
|
+
ok: response.ok,
|
|
27
|
+
status: response.status,
|
|
28
|
+
text: () => response.text(),
|
|
29
|
+
json: () => response.json(),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const response = await axios_1.default.request({
|
|
33
|
+
url,
|
|
34
|
+
method: init.method || 'GET',
|
|
35
|
+
headers: init.headers,
|
|
36
|
+
data: init.body,
|
|
37
|
+
timeout: 30000,
|
|
38
|
+
validateStatus: () => true,
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
ok: response.status >= 200 && response.status < 300,
|
|
42
|
+
status: response.status,
|
|
43
|
+
text: async () => typeof response.data === 'string' ? response.data : JSON.stringify(response.data),
|
|
44
|
+
json: async () => typeof response.data === 'string' ? JSON.parse(response.data) : response.data,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function getRawMode(config) {
|
|
48
|
+
return (config.webSearch?.provider
|
|
49
|
+
|| process.env.OPENHORSE_WEBSEARCH_PROVIDER
|
|
50
|
+
|| process.env.OPENHORSE_WEBSEARCH_MCP_PROVIDER
|
|
51
|
+
|| 'auto').trim().toLowerCase();
|
|
52
|
+
}
|
|
53
|
+
function getWebSearchMode(config) {
|
|
54
|
+
const mode = getRawMode(config);
|
|
55
|
+
if (mode === 'native'
|
|
56
|
+
|| mode === 'mcp'
|
|
57
|
+
|| mode === 'bailian'
|
|
58
|
+
|| mode === 'zhipu'
|
|
59
|
+
|| mode === 'tavily-mcp'
|
|
60
|
+
|| mode === 'ddg'
|
|
61
|
+
|| mode === 'duckduckgo'
|
|
62
|
+
|| mode === 'tavily'
|
|
63
|
+
|| mode === 'brave'
|
|
64
|
+
|| mode === 'custom') {
|
|
65
|
+
return mode;
|
|
66
|
+
}
|
|
67
|
+
return 'auto';
|
|
68
|
+
}
|
|
69
|
+
function shouldTryMcpFirst(mode) {
|
|
70
|
+
return !ADAPTER_MODES.has(mode);
|
|
71
|
+
}
|
|
72
|
+
function shouldFallbackToAdapters(mode) {
|
|
73
|
+
return mode === 'auto';
|
|
74
|
+
}
|
|
75
|
+
function isExplicitAdapterMode(mode) {
|
|
76
|
+
return ADAPTER_MODES.has(mode);
|
|
77
|
+
}
|
|
78
|
+
function isMcpOnlyMode(mode) {
|
|
79
|
+
return MCP_ONLY_MODES.has(mode);
|
|
80
|
+
}
|
|
81
|
+
function decodeHtml(value) {
|
|
82
|
+
return value
|
|
83
|
+
.replace(/&/g, '&')
|
|
84
|
+
.replace(/"/g, '"')
|
|
85
|
+
.replace(/'/g, "'")
|
|
86
|
+
.replace(/</g, '<')
|
|
87
|
+
.replace(/>/g, '>')
|
|
88
|
+
.replace(/<[^>]+>/g, '')
|
|
89
|
+
.trim();
|
|
90
|
+
}
|
|
91
|
+
function unwrapDuckDuckGoUrl(rawUrl) {
|
|
92
|
+
const decoded = decodeHtml(rawUrl);
|
|
93
|
+
try {
|
|
94
|
+
const url = decoded.startsWith('//') ? new URL('https:' + decoded) : new URL(decoded);
|
|
95
|
+
const uddg = url.searchParams.get('uddg');
|
|
96
|
+
return uddg ? decodeURIComponent(uddg) : url.toString();
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return decoded;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function limitHits(hits, limit) {
|
|
103
|
+
const seen = new Set();
|
|
104
|
+
const out = [];
|
|
105
|
+
for (const hit of hits) {
|
|
106
|
+
if (!hit.url || seen.has(hit.url))
|
|
107
|
+
continue;
|
|
108
|
+
seen.add(hit.url);
|
|
109
|
+
out.push(hit);
|
|
110
|
+
if (out.length >= limit)
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
function normalizeHit(raw) {
|
|
116
|
+
if (!raw || typeof raw !== 'object')
|
|
117
|
+
return null;
|
|
118
|
+
const title = raw.title || raw.name || raw.headline || raw.heading || raw.url || raw.link;
|
|
119
|
+
const url = raw.url || raw.link || raw.href || raw.uri;
|
|
120
|
+
if (typeof title !== 'string' || typeof url !== 'string')
|
|
121
|
+
return null;
|
|
122
|
+
const description = raw.description || raw.snippet || raw.content || raw.summary || raw.text;
|
|
123
|
+
return {
|
|
124
|
+
title,
|
|
125
|
+
url,
|
|
126
|
+
...(typeof description === 'string' && description ? { description } : {}),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function extractHits(payload) {
|
|
130
|
+
const arrays = [
|
|
131
|
+
payload?.results,
|
|
132
|
+
payload?.web?.results,
|
|
133
|
+
payload?.organic_results,
|
|
134
|
+
payload?.data,
|
|
135
|
+
payload?.items,
|
|
136
|
+
].filter(Array.isArray);
|
|
137
|
+
for (const array of arrays) {
|
|
138
|
+
const hits = array.map(normalizeHit).filter(Boolean);
|
|
139
|
+
if (hits.length > 0)
|
|
140
|
+
return hits;
|
|
141
|
+
}
|
|
142
|
+
if (Array.isArray(payload)) {
|
|
143
|
+
return payload.map(normalizeHit).filter(Boolean);
|
|
144
|
+
}
|
|
145
|
+
return [];
|
|
146
|
+
}
|
|
147
|
+
function withDuration(provider, start, hits) {
|
|
148
|
+
return {
|
|
149
|
+
provider,
|
|
150
|
+
hits,
|
|
151
|
+
durationSeconds: (Date.now() - start) / 1000,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const tavilyAdapter = {
|
|
155
|
+
name: 'tavily',
|
|
156
|
+
isConfigured() {
|
|
157
|
+
return Boolean(process.env.TAVILY_API_KEY || process.env.OPENHORSE_WEBSEARCH_API_KEY);
|
|
158
|
+
},
|
|
159
|
+
async search(input) {
|
|
160
|
+
const start = Date.now();
|
|
161
|
+
const apiKey = process.env.TAVILY_API_KEY || process.env.OPENHORSE_WEBSEARCH_API_KEY;
|
|
162
|
+
if (!apiKey)
|
|
163
|
+
throw new Error('Tavily search is not configured. Set TAVILY_API_KEY.');
|
|
164
|
+
const response = await adapterFetch('https://api.tavily.com/search', {
|
|
165
|
+
method: 'POST',
|
|
166
|
+
headers: {
|
|
167
|
+
'Content-Type': 'application/json',
|
|
168
|
+
Authorization: `Bearer ${apiKey}`,
|
|
169
|
+
},
|
|
170
|
+
body: JSON.stringify({
|
|
171
|
+
query: input.query,
|
|
172
|
+
max_results: input.limit,
|
|
173
|
+
search_depth: 'basic',
|
|
174
|
+
}),
|
|
175
|
+
});
|
|
176
|
+
if (!response.ok) {
|
|
177
|
+
throw new Error(`Tavily search failed: HTTP ${response.status} ${await response.text()}`);
|
|
178
|
+
}
|
|
179
|
+
const payload = await response.json();
|
|
180
|
+
return withDuration('tavily', start, limitHits(extractHits(payload), input.limit));
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
const braveAdapter = {
|
|
184
|
+
name: 'brave',
|
|
185
|
+
isConfigured() {
|
|
186
|
+
return Boolean(process.env.BRAVE_API_KEY);
|
|
187
|
+
},
|
|
188
|
+
async search(input) {
|
|
189
|
+
const start = Date.now();
|
|
190
|
+
if (!process.env.BRAVE_API_KEY)
|
|
191
|
+
throw new Error('Brave search is not configured. Set BRAVE_API_KEY.');
|
|
192
|
+
const url = new URL('https://api.search.brave.com/res/v1/web/search');
|
|
193
|
+
url.searchParams.set('q', input.query);
|
|
194
|
+
url.searchParams.set('count', String(Math.min(Math.max(input.limit, 1), 20)));
|
|
195
|
+
const response = await adapterFetch(url.toString(), {
|
|
196
|
+
headers: {
|
|
197
|
+
Accept: 'application/json',
|
|
198
|
+
'X-Subscription-Token': process.env.BRAVE_API_KEY,
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
if (!response.ok) {
|
|
202
|
+
throw new Error(`Brave search failed: HTTP ${response.status} ${await response.text()}`);
|
|
203
|
+
}
|
|
204
|
+
const payload = await response.json();
|
|
205
|
+
return withDuration('brave', start, limitHits(extractHits(payload), input.limit));
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
const customAdapter = {
|
|
209
|
+
name: 'custom',
|
|
210
|
+
isConfigured() {
|
|
211
|
+
return Boolean(process.env.OPENHORSE_WEBSEARCH_API || process.env.WEB_SEARCH_API);
|
|
212
|
+
},
|
|
213
|
+
async search(input) {
|
|
214
|
+
const start = Date.now();
|
|
215
|
+
const endpoint = process.env.OPENHORSE_WEBSEARCH_API || process.env.WEB_SEARCH_API;
|
|
216
|
+
if (!endpoint)
|
|
217
|
+
throw new Error('Custom search is not configured. Set OPENHORSE_WEBSEARCH_API.');
|
|
218
|
+
const method = (process.env.OPENHORSE_WEBSEARCH_METHOD || process.env.WEB_METHOD || 'GET').toUpperCase();
|
|
219
|
+
const queryParam = process.env.OPENHORSE_WEBSEARCH_QUERY_PARAM || process.env.WEB_QUERY_PARAM || 'q';
|
|
220
|
+
const headers = { Accept: 'application/json' };
|
|
221
|
+
const apiKey = process.env.OPENHORSE_WEBSEARCH_API_KEY || process.env.WEB_KEY;
|
|
222
|
+
const authHeader = process.env.OPENHORSE_WEBSEARCH_API_KEY_HEADER || process.env.WEB_AUTH_HEADER;
|
|
223
|
+
if (apiKey && authHeader)
|
|
224
|
+
headers[authHeader] = apiKey;
|
|
225
|
+
let response;
|
|
226
|
+
if (method === 'POST') {
|
|
227
|
+
headers['Content-Type'] = 'application/json';
|
|
228
|
+
response = await adapterFetch(endpoint, {
|
|
229
|
+
method: 'POST',
|
|
230
|
+
headers,
|
|
231
|
+
body: JSON.stringify({ [queryParam]: input.query, limit: input.limit }),
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
const url = new URL(endpoint);
|
|
236
|
+
url.searchParams.set(queryParam, input.query);
|
|
237
|
+
url.searchParams.set('limit', String(input.limit));
|
|
238
|
+
response = await adapterFetch(url.toString(), { headers });
|
|
239
|
+
}
|
|
240
|
+
if (!response.ok) {
|
|
241
|
+
throw new Error(`Custom search failed: HTTP ${response.status} ${await response.text()}`);
|
|
242
|
+
}
|
|
243
|
+
const payload = await response.json();
|
|
244
|
+
return withDuration('custom', start, limitHits(extractHits(payload), input.limit));
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
const duckDuckGoAdapter = {
|
|
248
|
+
name: 'duckduckgo',
|
|
249
|
+
isConfigured() {
|
|
250
|
+
return true;
|
|
251
|
+
},
|
|
252
|
+
async search(input) {
|
|
253
|
+
const start = Date.now();
|
|
254
|
+
const url = new URL('https://duckduckgo.com/html/');
|
|
255
|
+
url.searchParams.set('q', input.query);
|
|
256
|
+
const response = await adapterFetch(url.toString(), {
|
|
257
|
+
headers: {
|
|
258
|
+
'User-Agent': 'Mozilla/5.0 OpenHorse/0.1.18',
|
|
259
|
+
Accept: 'text/html,application/xhtml+xml,text/html;q=0.9,*/*;q=0.8',
|
|
260
|
+
},
|
|
261
|
+
});
|
|
262
|
+
if (!response.ok) {
|
|
263
|
+
throw new Error(`DuckDuckGo search failed: HTTP ${response.status}`);
|
|
264
|
+
}
|
|
265
|
+
const html = await response.text();
|
|
266
|
+
if (/anomaly in the request|making requests too quickly/i.test(html)) {
|
|
267
|
+
throw new Error('DuckDuckGo scraping is rate-limited from this network.');
|
|
268
|
+
}
|
|
269
|
+
const hits = [];
|
|
270
|
+
const anchorPattern = /<a[^>]+class="[^"]*result__a[^"]*"[^>]+href="([^"]+)"[^>]*>([\s\S]*?)<\/a>/gi;
|
|
271
|
+
let match;
|
|
272
|
+
while ((match = anchorPattern.exec(html)) !== null) {
|
|
273
|
+
hits.push({
|
|
274
|
+
title: decodeHtml(match[2]),
|
|
275
|
+
url: unwrapDuckDuckGoUrl(match[1]),
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
if (hits.length === 0) {
|
|
279
|
+
throw new Error('DuckDuckGo returned no parseable results.');
|
|
280
|
+
}
|
|
281
|
+
return withDuration('duckduckgo', start, limitHits(hits, input.limit));
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
const ADAPTER_BY_MODE = {
|
|
285
|
+
tavily: tavilyAdapter,
|
|
286
|
+
brave: braveAdapter,
|
|
287
|
+
custom: customAdapter,
|
|
288
|
+
ddg: duckDuckGoAdapter,
|
|
289
|
+
duckduckgo: duckDuckGoAdapter,
|
|
290
|
+
};
|
|
291
|
+
function autoAdapterChain() {
|
|
292
|
+
return [
|
|
293
|
+
tavilyAdapter,
|
|
294
|
+
braveAdapter,
|
|
295
|
+
customAdapter,
|
|
296
|
+
duckDuckGoAdapter,
|
|
297
|
+
].filter(adapter => adapter.isConfigured());
|
|
298
|
+
}
|
|
299
|
+
function explicitAdapterChain(mode) {
|
|
300
|
+
const adapter = ADAPTER_BY_MODE[mode];
|
|
301
|
+
return adapter ? [adapter] : [];
|
|
302
|
+
}
|
|
303
|
+
async function runWebSearchAdapters(input, mode) {
|
|
304
|
+
const chain = mode === 'auto' ? autoAdapterChain() : explicitAdapterChain(mode);
|
|
305
|
+
if (chain.length === 0) {
|
|
306
|
+
throw new Error(`No web search adapter is available for mode "${mode}".`);
|
|
307
|
+
}
|
|
308
|
+
const errors = [];
|
|
309
|
+
for (const adapter of chain) {
|
|
310
|
+
try {
|
|
311
|
+
const result = await adapter.search(input);
|
|
312
|
+
if (result.hits.length > 0 || mode !== 'auto')
|
|
313
|
+
return result;
|
|
314
|
+
errors.push(new Error(`${adapter.name} returned no results`));
|
|
315
|
+
}
|
|
316
|
+
catch (err) {
|
|
317
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
318
|
+
errors.push(error);
|
|
319
|
+
if (mode !== 'auto')
|
|
320
|
+
throw error;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
throw new Error(`All ${chain.length} web search adapters failed:\n`
|
|
324
|
+
+ errors.map((error, index) => ` ${index + 1}. ${error.message}`).join('\n'));
|
|
325
|
+
}
|
|
326
|
+
function formatAdapterOutput(result, query) {
|
|
327
|
+
const lines = [
|
|
328
|
+
`Web search results for "${query}" via ${result.provider}:`,
|
|
329
|
+
'',
|
|
330
|
+
'Sources:',
|
|
331
|
+
];
|
|
332
|
+
for (const hit of result.hits) {
|
|
333
|
+
const description = hit.description ? ` - ${hit.description}` : '';
|
|
334
|
+
lines.push(`- [${hit.title}](${hit.url})${description}`);
|
|
335
|
+
}
|
|
336
|
+
return lines.join('\n');
|
|
337
|
+
}
|
|
338
|
+
//# sourceMappingURL=web-search-adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search-adapters.js","sourceRoot":"","sources":["../../src/services/web-search-adapters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote WebSearch MCP client.
|
|
3
|
+
*
|
|
4
|
+
* The built-in web_search tool delegates search to a provider MCP service
|
|
5
|
+
* instead of scraping search-engine HTML locally.
|
|
6
|
+
*/
|
|
7
|
+
import type { WebSearchMcpConfig } from './config';
|
|
8
|
+
export declare const DEFAULT_WEBSEARCH_MCP_ENDPOINT = "https://dashscope.aliyuncs.com/api/v1/mcps/WebSearch/mcp";
|
|
9
|
+
export interface WebSearchMcpSearchResult {
|
|
10
|
+
output: string;
|
|
11
|
+
toolName: string;
|
|
12
|
+
endpoint: string;
|
|
13
|
+
provider?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class WebSearchMcpError extends Error {
|
|
16
|
+
readonly type: string;
|
|
17
|
+
readonly endpoint: string;
|
|
18
|
+
constructor(type: string, message: string, endpoint: string);
|
|
19
|
+
}
|
|
20
|
+
export declare class WebSearchMcpClient {
|
|
21
|
+
private readonly config;
|
|
22
|
+
private initialized;
|
|
23
|
+
private sessionId;
|
|
24
|
+
private tools;
|
|
25
|
+
constructor(config?: WebSearchMcpConfig);
|
|
26
|
+
search(query: string, limit?: number): Promise<WebSearchMcpSearchResult>;
|
|
27
|
+
private ensureInitialized;
|
|
28
|
+
private notification;
|
|
29
|
+
private request;
|
|
30
|
+
private sendJsonRpc;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=web-search-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search-mcp.d.ts","sourceRoot":"","sources":["../../src/services/web-search-mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAGnD,eAAO,MAAM,8BAA8B,6DAAiC,CAAC;AAkC7E,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAM5D;AAwHD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,KAAK,CAA2B;gBAE5B,MAAM,CAAC,EAAE,kBAAkB;IAIjC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;YAqBhE,iBAAiB;YA6BjB,YAAY;YAIZ,OAAO;YAoBP,WAAW;CA+E1B"}
|