{"version":3,"file":"live_search.cjs","names":[],"sources":["../src/live_search.ts"],"sourcesContent":["/**\n * Web search source configuration for xAI Live Search.\n * Corresponds to a `{\"type\": \"web\", ...}` entry in `search_parameters.sources`.\n */\nexport interface XAIWebSource {\n  type: \"web\";\n  /**\n   * Optional ISO alpha-2 country code used to bias results\n   * towards a specific country/region.\n   */\n  country?: string;\n  /**\n   * Websites that should be excluded from the search results.\n   * Maximum of 5 entries.\n   */\n  excluded_websites?: string[];\n  /**\n   * Websites that should be exclusively included in the search results.\n   * Maximum of 5 entries.\n   */\n  allowed_websites?: string[];\n  /**\n   * Whether to enable safe search filtering for this source.\n   */\n  safe_search?: boolean;\n}\n\n/**\n * News search source configuration for xAI Live Search.\n * Corresponds to a `{\"type\": \"news\", ...}` entry in `search_parameters.sources`.\n */\nexport interface XAINewsSource {\n  type: \"news\";\n  /**\n   * Optional ISO alpha-2 country code used to bias results\n   * towards a specific country/region.\n   */\n  country?: string;\n  /**\n   * Websites that should be excluded from the search results.\n   * Maximum of 5 entries.\n   */\n  excluded_websites?: string[];\n  /**\n   * Whether to enable safe search filtering for this source.\n   */\n  safe_search?: boolean;\n}\n\n/**\n * X (formerly Twitter) search source configuration for xAI Live Search.\n * Corresponds to a `{\"type\": \"x\", ...}` entry in `search_parameters.sources`.\n */\nexport interface XAIXSource {\n  type: \"x\";\n  /**\n   * X handles that should be explicitly included in the search.\n   * Maximum of 10 entries.\n   */\n  included_x_handles?: string[];\n  /**\n   * X handles that should be excluded from the search.\n   * Maximum of 10 entries.\n   */\n  excluded_x_handles?: string[];\n  /**\n   * Minimum number of favorites a post must have to be included.\n   */\n  post_favorite_count?: number;\n  /**\n   * Minimum number of views a post must have to be included.\n   */\n  post_view_count?: number;\n}\n\n/**\n * RSS feed search source configuration for xAI Live Search.\n * Corresponds to a `{\"type\": \"rss\", ...}` entry in `search_parameters.sources`.\n */\nexport interface XAIRssSource {\n  type: \"rss\";\n  /**\n   * Links to RSS feeds to be used as a data source.\n   * The API currently expects a single URL.\n   */\n  links: string[];\n}\n\nexport type XAISearchSource =\n  | XAIWebSource\n  | XAINewsSource\n  | XAIXSource\n  | XAIRssSource;\n\n/**\n * Search parameters for xAI's Live Search API.\n * Controls how the model searches for and retrieves real-time information.\n *\n * @note The Live Search API is being deprecated by xAI in favor of\n * the agentic tool calling approach. Consider using `tools: [{ type: \"live_search\" }]`\n * for future compatibility.\n */\nexport interface XAISearchParameters {\n  /**\n   * Controls when the model should perform a search.\n   * - \"auto\": Let the model decide when to search (default)\n   * - \"on\": Always search for every request\n   * - \"off\": Never search\n   */\n  mode?: \"auto\" | \"on\" | \"off\";\n  /**\n   * Maximum number of search results to return.\n   * @default 20\n   */\n  max_search_results?: number;\n  /**\n   * Filter search results to only include content from after this date.\n   * Format: ISO 8601 date string (e.g., \"2024-01-01\")\n   */\n  from_date?: string;\n  /**\n   * Filter search results to only include content from before this date.\n   * Format: ISO 8601 date string (e.g., \"2024-12-31\")\n   */\n  to_date?: string;\n  /**\n   * Whether to return citations/sources for the search results.\n   * @default true\n   */\n  return_citations?: boolean;\n  /**\n   * Specific web/news/X/RSS sources that can be used for the search.\n   * Each entry corresponds to a `{\"type\": \"...\", ...}` object in\n   * `search_parameters.sources` as documented in the xAI Live Search docs.\n   *\n   * If omitted, xAI will default to enabling `web`, `news` and `x` sources.\n   */\n  sources?: XAISearchSource[];\n}\n\n/**\n * Concrete payload shape sent as `search_parameters` to the xAI API.\n */\nexport interface XAISearchParametersPayload {\n  mode: \"auto\" | \"on\" | \"off\";\n  max_search_results?: number;\n  from_date?: string;\n  to_date?: string;\n  return_citations?: boolean;\n  sources?: XAISearchSource[];\n}\n\n/**\n * Merge search parameters from instance defaults, tool definition\n * and per-call overrides.\n *\n * Precedence (lowest → highest):\n *   1. tool-level configuration (e.g. from xaiLiveSearch)\n *   2. instance-level defaults\n *   3. per-call overrides passed via `searchParameters`\n */\nexport function mergeSearchParams(\n  instanceParams?: XAISearchParameters,\n  callParams?: XAISearchParameters,\n  toolParams?: XAISearchParameters\n): XAISearchParameters | undefined {\n  if (!instanceParams && !callParams && !toolParams) {\n    return undefined;\n  }\n\n  return {\n    ...(toolParams ?? {}),\n    ...(instanceParams ?? {}),\n    ...(callParams ?? {}),\n  };\n}\n\n/**\n * Build the `search_parameters` payload to send to the xAI API\n * from high-level `XAISearchParameters`.\n */\nexport function buildSearchParametersPayload(\n  params?: XAISearchParameters\n): XAISearchParametersPayload | undefined {\n  if (!params) {\n    return undefined;\n  }\n\n  const payload: XAISearchParametersPayload = {\n    mode: params.mode ?? \"auto\",\n  };\n\n  if (params.max_search_results !== undefined) {\n    payload.max_search_results = params.max_search_results;\n  }\n  if (params.from_date !== undefined) {\n    payload.from_date = params.from_date;\n  }\n  if (params.to_date !== undefined) {\n    payload.to_date = params.to_date;\n  }\n  if (params.return_citations !== undefined) {\n    payload.return_citations = params.return_citations;\n  }\n  if (params.sources && params.sources.length > 0) {\n    payload.sources = params.sources;\n  }\n\n  return payload;\n}\n\n/**\n * Filter out xAI built-in tools (like `live_search`) from a tools array.\n * Used before sending the request to the xAI API, since built-in tools\n * are controlled via `search_parameters` instead.\n */\nexport function filterXAIBuiltInTools<\n  // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n  T extends { [key: string]: any },\n>(payload?: { tools?: T[]; excludedTypes?: string[] }): T[] | undefined {\n  if (!payload?.tools) {\n    return undefined;\n  }\n\n  const filtered = payload.tools.filter((tool) => {\n    if (tool == null || typeof tool !== \"object\") {\n      return true;\n    }\n\n    if (!(\"type\" in tool)) {\n      return true;\n    }\n\n    if (!payload?.excludedTypes?.length) {\n      return true;\n    }\n\n    return !payload.excludedTypes.includes(tool.type);\n  });\n\n  return filtered.length > 0 ? filtered : undefined;\n}\n"],"mappings":";;;;;;;;;;AAiKA,SAAgB,kBACd,gBACA,YACA,YACiC;AACjC,KAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,WACrC;AAGF,QAAO;EACL,GAAI,cAAc,EAAE;EACpB,GAAI,kBAAkB,EAAE;EACxB,GAAI,cAAc,EAAE;EACrB;;;;;;AAOH,SAAgB,6BACd,QACwC;AACxC,KAAI,CAAC,OACH;CAGF,MAAM,UAAsC,EAC1C,MAAM,OAAO,QAAQ,QACtB;AAED,KAAI,OAAO,uBAAuB,KAAA,EAChC,SAAQ,qBAAqB,OAAO;AAEtC,KAAI,OAAO,cAAc,KAAA,EACvB,SAAQ,YAAY,OAAO;AAE7B,KAAI,OAAO,YAAY,KAAA,EACrB,SAAQ,UAAU,OAAO;AAE3B,KAAI,OAAO,qBAAqB,KAAA,EAC9B,SAAQ,mBAAmB,OAAO;AAEpC,KAAI,OAAO,WAAW,OAAO,QAAQ,SAAS,EAC5C,SAAQ,UAAU,OAAO;AAG3B,QAAO;;;;;;;AAQT,SAAgB,sBAGd,SAAsE;AACtE,KAAI,CAAC,SAAS,MACZ;CAGF,MAAM,WAAW,QAAQ,MAAM,QAAQ,SAAS;AAC9C,MAAI,QAAQ,QAAQ,OAAO,SAAS,SAClC,QAAO;AAGT,MAAI,EAAE,UAAU,MACd,QAAO;AAGT,MAAI,CAAC,SAAS,eAAe,OAC3B,QAAO;AAGT,SAAO,CAAC,QAAQ,cAAc,SAAS,KAAK,KAAK;GACjD;AAEF,QAAO,SAAS,SAAS,IAAI,WAAW,KAAA"}