{"version":3,"sources":["../../../src/tools/search/duckDuckGoSearch.ts"],"names":["DuckDuckGoSearchToolOutput","SearchToolOutput","results","register","createSnapshot","loadSnapshot","snapshot","Object","assign","DuckDuckGoSearchTool","Tool","name","description","emitter","Emitter","root","child","namespace","creator","inputSchema","z","object","query","string","min","max","options","maxResults","httpClientOptions","proxy","getEnv","rejectUnauthorized","parseEnv","asBoolean","_createClient","throttle","rawDDGSearch","default","pThrottle","limit","interval","_run","input","run","headers","HeaderGenerator","getHeaders","client","paginate","size","handler","cursor","data","noResults","done","safeSearch","SafeSearchType","MODERATE","search","offset","user_agent","signal","uri_modifier","rawUrl","url","URL","searchParams","delete","toString","nextCursor","undefined","length","stripHtml","map","result","title","enumerable"],"mappings":"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","file":"duckDuckGoSearch.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { SearchOptions, search as rawDDGSearch, SafeSearchType } from \"duck-duck-scrape\";\nimport { Options as ThrottleOptions } from \"p-throttle\";\nimport {\n  SearchToolOptions,\n  SearchToolOutput,\n  SearchToolResult,\n  SearchToolRunOptions,\n} from \"./base.js\";\nimport { ToolEmitter, Tool, ToolInput } from \"@/tools/base.js\";\nimport { HeaderGenerator } from \"header-generator\";\nimport type { NeedleOptions } from \"needle\";\nimport { z } from \"zod\";\nimport { Cache } from \"@/cache/decoratorCache.js\";\nimport { RunContext } from \"@/context.js\";\nimport { paginate } from \"@/internals/helpers/paginate.js\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { getEnv, parseEnv } from \"@/internals/env.js\";\n\nexport { SafeSearchType as DuckDuckGoSearchToolSearchType };\n\nexport interface DuckDuckGoSearchToolOptions extends SearchToolOptions {\n  search?: SearchOptions;\n  throttle?: ThrottleOptions | false;\n  httpClientOptions?: NeedleOptions;\n  maxResults: number;\n}\n\nexport interface DuckDuckGoSearchToolRunOptions extends SearchToolRunOptions {\n  search?: SearchOptions;\n  httpClientOptions?: NeedleOptions;\n}\n\nexport interface DuckDuckGoSearchToolResult extends SearchToolResult {}\n\nexport class DuckDuckGoSearchToolOutput extends SearchToolOutput<DuckDuckGoSearchToolResult> {\n  constructor(public readonly results: DuckDuckGoSearchToolResult[]) {\n    super(results);\n  }\n\n  static {\n    this.register();\n  }\n\n  createSnapshot() {\n    return {\n      results: this.results,\n    };\n  }\n\n  loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n    Object.assign(this, snapshot);\n  }\n}\n\nexport class DuckDuckGoSearchTool extends Tool<\n  DuckDuckGoSearchToolOutput,\n  DuckDuckGoSearchToolOptions,\n  DuckDuckGoSearchToolRunOptions\n> {\n  name = \"DuckDuckGo\";\n  description =\n    \"Search for online trends, news, current events, real-time information, or research topics.\";\n\n  public readonly emitter: ToolEmitter<ToolInput<this>, DuckDuckGoSearchToolOutput> =\n    Emitter.root.child({\n      namespace: [\"tool\", \"search\", \"ddg\"],\n      creator: this,\n    });\n\n  @Cache()\n  inputSchema() {\n    return z.object({\n      query: z.string({ description: `Search query` }).min(1).max(128),\n    });\n  }\n\n  public constructor(options: Partial<DuckDuckGoSearchToolOptions> = {}) {\n    super({\n      ...options,\n      maxResults: options?.maxResults ?? 15,\n      httpClientOptions: {\n        proxy: getEnv(\"BEEAI_DDG_TOOL_PROXY\"),\n        rejectUnauthorized: parseEnv.asBoolean(\"BEEAI_DDG_TOOL_PROXY_VERIFY\", true),\n        ...options?.httpClientOptions,\n      },\n    });\n  }\n\n  static {\n    this.register();\n  }\n\n  @Cache({ enumerable: false })\n  protected async _createClient() {\n    const { throttle } = this.options;\n    if (throttle === false) {\n      return rawDDGSearch;\n    }\n\n    const { default: pThrottle } = await import(\"p-throttle\");\n    return pThrottle({\n      ...throttle,\n      limit: throttle?.limit ?? 1,\n      interval: throttle?.interval ?? 3000,\n    })(rawDDGSearch);\n  }\n\n  protected async _run(\n    { query: input }: ToolInput<this>,\n    options: Partial<DuckDuckGoSearchToolRunOptions>,\n    run: RunContext<this>,\n  ) {\n    const headers = new HeaderGenerator().getHeaders();\n    const client = await this._createClient();\n\n    const results = await paginate({\n      size: this.options.maxResults,\n      handler: async ({ cursor = 0 }) => {\n        const { results: data, noResults: done } = await client(\n          input,\n          {\n            safeSearch: SafeSearchType.MODERATE,\n            ...this.options.search,\n            ...options?.search,\n            offset: cursor,\n          },\n          {\n            headers,\n            user_agent: headers[\"user-agent\"],\n            ...this.options?.httpClientOptions,\n            ...options?.httpClientOptions,\n            signal: run.signal,\n            uri_modifier: (rawUrl) => {\n              const url = new URL(rawUrl);\n              url.searchParams.delete(\"ss_mkt\");\n              return url.toString();\n            },\n          },\n        );\n\n        return {\n          data,\n          nextCursor: done ? undefined : cursor + data.length,\n        };\n      },\n    });\n\n    const { stripHtml } = await import(\"string-strip-html\");\n\n    return new DuckDuckGoSearchToolOutput(\n      results.map((result) => ({\n        title: stripHtml(result.title).result,\n        description: stripHtml(result.description).result,\n        url: result.url,\n      })),\n    );\n  }\n}\n"]}