{"version":3,"sources":["../../../src/tools/search/googleSearch.ts"],"names":["GoogleSearchToolOutput","SearchToolOutput","constructor","results","register","createSnapshot","loadSnapshot","snapshot","Object","assign","GoogleSearchTool","Tool","name","description","emitter","Emitter","root","child","namespace","creator","inputSchema","z","object","query","string","min","max","apiKey","cseId","options","maxResults","parseEnv","ValueError","join","ValidationError","message","propertyName","client","GoogleSearchAPI","Customsearch","auth","_run","input","_options","run","paginate","size","handler","cursor","limit","maxChunkSize","data","items","cse","list","cx","q","start","num","Math","safe","signal","nextCursor","length","undefined","map","result","title","snippet","url","link"],"mappings":"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","file":"googleSearch.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 { customsearch_v1 as GoogleSearchAPI } from \"@googleapis/customsearch\";\nimport {\n  SearchToolOptions,\n  SearchToolOutput,\n  SearchToolResult,\n  SearchToolRunOptions,\n} from \"./base.js\";\nimport { ToolEmitter, Tool, ToolInput } from \"@/tools/base.js\";\nimport { z } from \"zod\";\nimport { Cache } from \"@/cache/decoratorCache.js\";\nimport { ValueError } from \"@/errors.js\";\nimport { parseEnv } from \"@/internals/env.js\";\nimport { RunContext } from \"@/context.js\";\nimport { paginate } from \"@/internals/helpers/paginate.js\";\nimport { ValidationError } from \"ajv\";\nimport { Emitter } from \"@/emitter/emitter.js\";\n\nexport interface GoogleSearchToolOptions extends SearchToolOptions {\n  apiKey?: string;\n  cseId?: string;\n  maxResults: number;\n}\n\ntype GoogleSearchToolRunOptions = SearchToolRunOptions;\n\nexport interface GoogleSearchToolResult extends SearchToolResult {}\n\nexport class GoogleSearchToolOutput extends SearchToolOutput<GoogleSearchToolResult> {\n  constructor(public readonly results: GoogleSearchToolResult[]) {\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 GoogleSearchTool extends Tool<\n  GoogleSearchToolOutput,\n  GoogleSearchToolOptions,\n  GoogleSearchToolRunOptions\n> {\n  name = \"GoogleSearch\";\n  description = `Search for online trends, news, current events, real-time information, or research topics.`;\n\n  public readonly emitter: ToolEmitter<ToolInput<this>, GoogleSearchToolOutput> =\n    Emitter.root.child({\n      namespace: [\"tool\", \"search\", \"google\"],\n      creator: this,\n    });\n\n  @Cache()\n  inputSchema() {\n    return z.object({\n      query: z.string({ description: `Search query` }).min(1).max(2048),\n    });\n  }\n\n  protected apiKey: string;\n  protected cseId: string;\n\n  public constructor(options: GoogleSearchToolOptions = { maxResults: 10 }) {\n    super(options);\n\n    this.apiKey = options.apiKey || parseEnv(\"GOOGLE_API_KEY\", z.string());\n    this.cseId = options.cseId || parseEnv(\"GOOGLE_CSE_ID\", z.string());\n\n    if (!this.apiKey || !this.cseId) {\n      throw new ValueError(\n        [\n          `\"apiKey\" or \"cseId\" must both be provided.`,\n          `Either set them directly or put them in ENV (\"GOOGLE_API_KEY\" / \"GOOGLE_CSE_ID\")`,\n        ].join(\"\\n\"),\n      );\n    }\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  @Cache()\n  protected get client(): GoogleSearchAPI.Customsearch {\n    return new GoogleSearchAPI.Customsearch({\n      auth: this.apiKey,\n    });\n  }\n\n  static {\n    this.register();\n  }\n\n  protected async _run(\n    { query: input }: ToolInput<this>,\n    _options: Partial<GoogleSearchToolRunOptions>,\n    run: RunContext<this>,\n  ) {\n    const results = await paginate({\n      size: this.options.maxResults,\n      handler: async ({ cursor = 0, limit }) => {\n        const maxChunkSize = 10;\n\n        const {\n          data: { items = [] },\n        } = await this.client.cse.list(\n          {\n            cx: this.cseId,\n            q: input,\n            start: cursor,\n            num: Math.min(limit, maxChunkSize),\n            safe: \"active\",\n          },\n          {\n            signal: run.signal,\n          },\n        );\n\n        return {\n          data: items,\n          nextCursor: items.length < maxChunkSize ? undefined : cursor + items.length,\n        };\n      },\n    });\n\n    return new GoogleSearchToolOutput(\n      results.map((result) => ({\n        title: result.title || \"\",\n        description: result.snippet || \"\",\n        url: result.link || \"\",\n      })),\n    );\n  }\n\n  createSnapshot() {\n    return {\n      ...super.createSnapshot(),\n      apiKey: this.apiKey,\n      cseId: this.cseId,\n    };\n  }\n\n  loadSnapshot({ apiKey, cseId, ...snapshot }: ReturnType<typeof this.createSnapshot>) {\n    super.loadSnapshot(snapshot);\n    Object.assign(this, {\n      apiKey,\n      cseId,\n    });\n  }\n}\n"]}