fix: WebSearch providers + MCPTool bugs (#593)
* fix: WebSearch providers + MCPTool bugs WebSearchTool: - custom.ts: fix buildAuthHeadersForPreset WEB_AUTH_HEADER opt-out - custom.ts: fix WEB_AUTH_SCHEME empty string handling - custom.ts: fix walkJsonPath null safety for jsonPath parsing - duckduckgo.ts: use SafeSearchType enum instead of raw 0 - mojeek.ts: always send Accept: application/json header - README: fix timeout documentation (15s -> 120s to match code) - custom.test.ts: add tests for auth header behavior MCPTool: - MCPTool.ts: fix outputSchema to accept ContentBlockParam[] (not just string) - MCPTool.ts: fix isResultTruncated for array output (iterates text blocks) * fix: address PR #593 review feedback 1. Export buildAuthHeadersForPreset and add direct tests for: - WEB_AUTH_HEADER="" explicit opt-out behavior - WEB_AUTH_SCHEME="" stripping scheme prefix - Preset defaults (authHeader + authScheme) - No WEB_KEY returns empty headers 2. Add duckduckgo.test.ts verifying SafeSearchType.STRICT === 0, confirming the enum change is semantically identical to the previous raw value. Addresses review by @Vasanthdev2004 at pullrequestreview-4093533095 --------- Co-authored-by: FluxLuFFy <flux@openclaude.dev> Co-authored-by: Fix Bot <fix@openclaude.local>
This commit is contained in:
@@ -221,12 +221,18 @@ function auditLogCustomSearch(url: string): void {
|
||||
// Auth — preset overrides for built-in providers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
function buildAuthHeadersForPreset(preset?: ProviderPreset): Record<string, string> {
|
||||
export function buildAuthHeadersForPreset(preset?: ProviderPreset): Record<string, string> {
|
||||
const apiKey = process.env.WEB_KEY
|
||||
if (!apiKey) return {}
|
||||
|
||||
const headerName = process.env.WEB_AUTH_HEADER ?? preset?.authHeader ?? 'Authorization'
|
||||
const scheme = process.env.WEB_AUTH_SCHEME ?? preset?.authScheme ?? 'Bearer'
|
||||
// WEB_AUTH_HEADER="" is an explicit opt-out of auth headers entirely
|
||||
const explicitHeader = process.env.WEB_AUTH_HEADER
|
||||
if (explicitHeader === '') return {}
|
||||
|
||||
const headerName = explicitHeader ?? preset?.authHeader ?? 'Authorization'
|
||||
const scheme = process.env.WEB_AUTH_SCHEME !== undefined
|
||||
? process.env.WEB_AUTH_SCHEME
|
||||
: (preset?.authScheme ?? 'Bearer')
|
||||
return { [headerName]: `${scheme} ${apiKey}`.trim() }
|
||||
}
|
||||
|
||||
@@ -350,7 +356,7 @@ function buildRequest(query: string) {
|
||||
function walkJsonPath(obj: any, path: string): any {
|
||||
let current = obj
|
||||
for (const seg of path.split('.')) {
|
||||
if (current == null) return undefined
|
||||
if (current == null || typeof current !== 'object') return undefined
|
||||
current = current[seg]
|
||||
}
|
||||
return current
|
||||
@@ -364,6 +370,7 @@ function extractFromNode(node: any): SearchHit[] {
|
||||
for (const sub of Object.values(node)) all.push(...extractFromNode(sub))
|
||||
return all
|
||||
}
|
||||
// node is a primitive (string/number) — not a valid hit structure
|
||||
return []
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user