{"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":";;;;;;;;;;;;AA4BO,MAAMA,0BAA0BC,yBAAAA,CAAAA;EA5BvC;;;EA6BE;AACE,IAAA,IAAA,CAAKC,QAAAA,EAAQ;AACf;EAEAC,cAAAA,GAAiB;AACf,IAAA,OAAO;AACLC,MAAAA,OAAAA,EAAS,IAAA,CAAKA;AAChB,KAAA;AACF,EAAA;AAEAC,EAAAA,YAAAA,CAAaC,QAAAA,EAAkD;AAC7DC,IAAAA,MAAAA,CAAOC,MAAAA,CAAO,MAAMF,QAAAA,CAAAA;AACtB,EAAA;AACF;AAEO,MAAMG,oBAAoBC,eAAAA,CAAAA;EA5CjC;;;EAiDEC,IAAAA,GAAO,YAAA;EACPC,WAAAA,GAAc,CAAA,0FAAA,CAAA;EAEEC,OAAAA,GACdC,mBAAAA,CAAQC,KAAKC,KAAAA,CAAM;IACjBC,SAAAA,EAAW;AAAC,MAAA,MAAA;AAAQ,MAAA,QAAA;AAAU,MAAA;;IAC9BC,OAAAA,EAAS;GACX,CAAA;EAEFC,WAAAA,GAAc;AACZ,IAAA,OAAOC,MAAEC,MAAAA,CAAO;AACdC,MAAAA,KAAAA,EAAOF,MAAEG,MAAAA,EAAM,CAAGC,IAAI,CAAA,CAAA,CAAGC,SAAS,CAAA,iBAAA,CAAmB;KACvD,CAAA;AACF,EAAA;AAEA,EAAA,WAAA,CAAmBC,OAAAA,GAA8B;IAAEC,UAAAA,EAAY;GAAG,EAAG;AACnE,IAAA,KAAA,CAAMD,OAAAA,CAAAA;AAEN,IAAA,IAAIA,OAAAA,CAAQC,UAAAA,GAAa,CAAA,IAAKD,OAAAA,CAAQC,aAAa,GAAA,EAAK;AACtD,MAAA,MAAM,IAAIC,mBAAAA,CAAgB;AACxB,QAAA;UACEC,OAAAA,EAAS,iDAAA;UACTC,YAAAA,EAAc;AAChB;AACD,OAAA,CAAA;AACH,IAAA;AACF,EAAA;EAEA,MAAgBC,IAAAA,CACdC,KAAAA,EACAC,QAAAA,EACAC,GAAAA,EACA;AACA,IAAA,MAAMC,SAASC,2BAAAA,CAAgB;AAC7BC,MAAAA,CAAAA,EAAGL,KAAAA,CAAMV,KAAAA;MACTgB,MAAAA,EAAQ;KACV,CAAA;AAEA,IAAA,MAAMC,OAAAA,GAAU,KAAKb,OAAAA,CAAQa,OAAAA,IAAWC,iBAAS,kBAAA,EAAoBpB,KAAAA,CAAEG,QAAM,CAAA;AAC7E,IAAA,MAAMkB,GAAAA,GAAM,GAAGF,OAAAA,CAAAA,CAAAA,EAAWG,mBAAmBP,MAAAA,CAAOQ,QAAAA,EAAQ,CAAA,CAAA,CAAA;AAC5D,IAAA,MAAMC,QAAAA,GAAW,MAAMC,KAAAA,CAAMJ,GAAAA,EAAK;AAChCK,MAAAA,MAAAA,EAAQZ,GAAAA,CAAIY;KACd,CAAA;AAEA,IAAA,IAAI,CAACF,SAASG,EAAAA,EAAI;AAChB,MAAA,MAAM,IAAIC,KAAAA,CAAM,MAAMJ,QAAAA,CAASK,MAAI,CAAA;AACrC,IAAA;AAEA,IAAA,MAAMC,IAAAA,GAAO,MAAMN,QAAAA,CAASO,IAAAA,EAAI;AAEhC,IAAA,OAAO,IAAInD,iBAAAA,CACTkD,IAAAA,CAAK9C,OAAAA,CACFgD,KAAAA,CAAM,CAAA,EAAG,IAAA,CAAK1B,OAAAA,CAAQC,UAAU,CAAA,CAChC0B,GAAAA,CAAI,CAACC,MAAAA,MAA6D;AACjEb,MAAAA,GAAAA,EAAKa,OAAOb,GAAAA,IAAO,EAAA;AACnBc,MAAAA,KAAAA,EAAOD,OAAOC,KAAAA,IAAS,EAAA;AACvB3C,MAAAA,WAAAA,EAAa0C,OAAOE,OAAAA,IAAW;AACjC,KAAA,CAAA,CAAA,CAAA;AAEN,EAAA;AACF","file":"searXNGSearch.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\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"]}