{"version":3,"sources":["../../../src/tools/search/searXNGSearch.ts"],"names":["SearXNGToolOutput","SearchToolOutput","register","createSnapshot","results","loadSnapshot","snapshot","Object","assign","SearXNGTool","Tool","name","description","emitter","Emitter","root","child","namespace","creator","inputSchema","z","object","query","string","min","describe","options","maxResults","ValidationError","message","propertyName","_run","input","_options","run","params","createURLParams","q","format","baseUrl","parseEnv","url","decodeURIComponent","toString","response","fetch","signal","ok","Error","text","data","json","slice","map","result","title","content"],"mappings":";;;;;;;;;;;;AAuCO,MAAMA,0BAA0BC,yBAAAA,CAAAA;EAvCvC;;;EAwCE;AACE,IAAA,IAAA,CAAKC,QAAQ,EAAA;AACf;EAEAC,cAAiB,GAAA;AACf,IAAO,OAAA;AACLC,MAAAA,OAAAA,EAAS,IAAKA,CAAAA;AAChB,KAAA;AACF;AAEAC,EAAAA,YAAAA,CAAaC,QAAkD,EAAA;AAC7DC,IAAOC,MAAAA,CAAAA,MAAAA,CAAO,MAAMF,QAAAA,CAAAA;AACtB;AACF;AAEO,MAAMG,oBAAoBC,eAAAA,CAAAA;EAvDjC;;;EA4DEC,IAAO,GAAA,YAAA;EACPC,WAAc,GAAA,CAAA,0FAAA,CAAA;EAEEC,OACdC,GAAAA,mBAAAA,CAAQC,KAAKC,KAAM,CAAA;IACjBC,SAAW,EAAA;AAAC,MAAA,MAAA;AAAQ,MAAA,QAAA;AAAU,MAAA;;IAC9BC,OAAS,EAAA;GACX,CAAA;EAEFC,WAAc,GAAA;AACZ,IAAA,OAAOC,MAAEC,MAAO,CAAA;AACdC,MAAAA,KAAAA,EAAOF,MAAEG,MAAM,EAAA,CAAGC,IAAI,CAAA,CAAA,CAAGC,SAAS,CAAmB,iBAAA,CAAA;KACvD,CAAA;AACF;AAEA,EAAA,WAAA,CAAmBC,OAA8B,GAAA;IAAEC,UAAY,EAAA;GAAM,EAAA;AACnE,IAAA,KAAA,CAAMD,OAAAA,CAAAA;AAEN,IAAA,IAAIA,OAAQC,CAAAA,UAAAA,GAAa,CAAKD,IAAAA,OAAAA,CAAQC,aAAa,GAAK,EAAA;AACtD,MAAA,MAAM,IAAIC,mBAAgB,CAAA;AACxB,QAAA;UACEC,OAAS,EAAA,iDAAA;UACTC,YAAc,EAAA;AAChB;AACD,OAAA,CAAA;AACH;AACF;EAEA,MAAgBC,IAAAA,CACdC,KACAC,EAAAA,QAAAA,EACAC,GACA,EAAA;AACA,IAAA,MAAMC,SAASC,2BAAgB,CAAA;AAC7BC,MAAAA,CAAAA,EAAGL,KAAMV,CAAAA,KAAAA;MACTgB,MAAQ,EAAA;KACV,CAAA;AAEA,IAAMC,MAAAA,OAAAA,GAAU,KAAKb,OAAQa,CAAAA,OAAAA,IAAWC,iBAAS,kBAAoBpB,EAAAA,KAAAA,CAAEG,QAAM,CAAA;AAC7E,IAAMkB,MAAAA,GAAAA,GAAM,GAAGF,OAAAA,CAAAA,CAAAA,EAAWG,mBAAmBP,MAAOQ,CAAAA,QAAAA,EAAQ,CAAA,CAAA,CAAA;AAC5D,IAAMC,MAAAA,QAAAA,GAAW,MAAMC,KAAAA,CAAMJ,GAAK,EAAA;AAChCK,MAAAA,MAAAA,EAAQZ,GAAIY,CAAAA;KACd,CAAA;AAEA,IAAI,IAAA,CAACF,SAASG,EAAI,EAAA;AAChB,MAAA,MAAM,IAAIC,KAAAA,CAAM,MAAMJ,QAAAA,CAASK,MAAI,CAAA;AACrC;AAEA,IAAMC,MAAAA,IAAAA,GAAO,MAAMN,QAAAA,CAASO,IAAI,EAAA;AAEhC,IAAA,OAAO,IAAInD,iBAAAA,CACTkD,IAAK9C,CAAAA,OAAAA,CACFgD,KAAM,CAAA,CAAA,EAAG,IAAK1B,CAAAA,OAAAA,CAAQC,UAAU,CAAA,CAChC0B,GAAI,CAAA,CAACC,MAA6D,MAAA;AACjEb,MAAAA,GAAAA,EAAKa,OAAOb,GAAO,IAAA,EAAA;AACnBc,MAAAA,KAAAA,EAAOD,OAAOC,KAAS,IAAA,EAAA;AACvB3C,MAAAA,WAAAA,EAAa0C,OAAOE,OAAW,IAAA;AACjC,KAAA,CAAA,CAAA,CAAA;AAEN;AACF","file":"searXNGSearch.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 { ToolEmitter, Tool, ToolInput } from \"@/tools/base.js\";\nimport { z } from \"zod\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { createURLParams } from \"@/internals/fetcher.js\";\nimport { RunContext } from \"@/context.js\";\nimport {\n  SearchToolOptions,\n  SearchToolOutput,\n  SearchToolResult,\n  SearchToolRunOptions,\n} from \"@/tools/search/base.js\";\nimport { ValidationError } from \"ajv\";\nimport { parseEnv } from \"@/internals/env.js\";\n\nexport interface SearXNGToolOptions extends SearchToolOptions {\n  baseUrl?: string;\n  maxResults: number;\n}\n\ntype SearXNGToolRunOptions = SearchToolRunOptions;\n\nexport interface SearXNGToolResult extends SearchToolResult {}\n\nexport class SearXNGToolOutput extends SearchToolOutput<SearXNGToolResult> {\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 SearXNGTool extends Tool<\n  SearXNGToolOutput,\n  SearXNGToolOptions,\n  SearXNGToolRunOptions\n> {\n  name = \"Web Search\";\n  description = `Search for online trends, news, current events, real-time information, or research topics.`;\n\n  public readonly emitter: ToolEmitter<ToolInput<this>, SearchToolOutput<SearXNGToolResult>> =\n    Emitter.root.child({\n      namespace: [\"tool\", \"search\", \"searXNG\"],\n      creator: this,\n    });\n\n  inputSchema() {\n    return z.object({\n      query: z.string().min(1).describe(`Web search query.`),\n    });\n  }\n\n  public constructor(options: SearXNGToolOptions = { maxResults: 10 }) {\n    super(options);\n\n    if (options.maxResults < 1 || options.maxResults > 100) {\n      throw new ValidationError([\n        {\n          message: \"Property 'maxResults' must be between 1 and 100\",\n          propertyName: \"options.maxResults\",\n        },\n      ]);\n    }\n  }\n\n  protected async _run(\n    input: ToolInput<this>,\n    _options: Partial<SearchToolRunOptions>,\n    run: RunContext<this>,\n  ) {\n    const params = createURLParams({\n      q: input.query,\n      format: \"json\",\n    });\n\n    const baseUrl = this.options.baseUrl || parseEnv(\"SEARXNG_BASE_URL\", z.string());\n    const url = `${baseUrl}?${decodeURIComponent(params.toString())}`;\n    const response = await fetch(url, {\n      signal: run.signal,\n    });\n\n    if (!response.ok) {\n      throw new Error(await response.text());\n    }\n\n    const data = await response.json();\n\n    return new SearXNGToolOutput(\n      data.results\n        .slice(0, this.options.maxResults)\n        .map((result: { url: string; title: string; content: string }) => ({\n          url: result.url || \"\",\n          title: result.title || \"\",\n          description: result.content || \"\",\n        })),\n    );\n  }\n}\n"]}