{"version":3,"sources":["../../../src/tools/search/duckDuckGoSearch.ts"],"names":["DuckDuckGoSearchToolOutput","SearchToolOutput","constructor","results","register","createSnapshot","loadSnapshot","snapshot","Object","assign","DuckDuckGoSearchTool","Tool","name","description","emitter","Emitter","root","child","namespace","creator","client","inputSchema","z","object","query","string","min","max","options","maxResults","_createClient","throttle","pThrottle","default","rawDDGSearch","limit","interval","_run","input","run","headers","HeaderGenerator","getHeaders","stripHtml","paginate","size","handler","cursor","data","noResults","done","safeSearch","SafeSearchType","MODERATE","search","offset","user_agent","httpClientOptions","signal","uri_modifier","rawUrl","url","URL","searchParams","delete","toString","nextCursor","undefined","length","map","result","title"],"mappings":"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","file":"duckDuckGoSearch.cjs","sourcesContent":["/**\n * Copyright 2025 IBM Corp.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SearchOptions, search as rawDDGSearch, SafeSearchType } from \"duck-duck-scrape\";\nimport type { 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\";\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  protected readonly client: any;\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({ ...options, maxResults: options?.maxResults ?? 15 });\n\n    this.client = this._createClient();\n  }\n\n  static {\n    this.register();\n  }\n\n  protected async _createClient() {\n    const { throttle } = this.options;\n    const pThrottle = (await import(\"p-throttle\")).default;\n\n    return throttle === false\n      ? rawDDGSearch\n      : 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 { stripHtml } = await import(\"string-strip-html\");\n\n    interface SearchResult {\n      title: string;\n      description: string;\n      url: string;\n    }\n\n    const results = await paginate<SearchResult>({\n      size: this.options.maxResults,\n      handler: async ({ cursor = 0 }) => {\n        const { results: data, noResults: done } = await this.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: string) => {\n              const url = new URL(rawUrl);\n              url.searchParams.delete(\"ss_mkt\");\n              return url.toString();\n            },\n          },\n        );\n\n        return {\n          data: data as SearchResult[],\n          nextCursor: done ? undefined : cursor + data.length,\n        };\n      },\n    });\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  loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>): void {\n    super.loadSnapshot(snapshot);\n    Object.assign(this, { client: this._createClient() });\n  }\n}\n"]}