{"version":3,"file":"batch-BfD8gvDg.mjs","names":[],"sources":["../src/core/batch.ts"],"sourcesContent":["import { EmptyQueryError, EmptyUrlError, validateMaxResults } from \"./errors.ts\";\nimport {\n  prepareSearchWithFallback,\n  searchAllDetailed,\n  searchProviderDetailed,\n  type SearchAllEvidence,\n  type SearchAllResult,\n  type SearchProviderMetadata,\n  type SearchProviderPagination,\n  type SearchProviderResult,\n} from \"./all.ts\";\nimport { readUrlDetailed, type ReadUrlOptions } from \"./read.ts\";\nimport { ProviderFallbackError, type ProviderFailure } from \"./fallback.ts\";\nimport { settleWithConcurrency, throwIfAborted, withExecutionBudget } from \"./execution.ts\";\nimport { hasSearchFilterWarning, type SearchFilterReport } from \"./search-filters.ts\";\nimport type {\n  ReadonlySearchResult,\n  ReadResult,\n  SearchPageOptions,\n  SearchPagination,\n  SearchRequestOptions,\n  SearchResult,\n} from \"./types.ts\";\n\n/** Maximum number of network operations accepted by one agent-tool batch. */\nexport const MAX_BATCH_ITEMS = 10;\n\n/** Shared search options applied to every query in a batch. */\nexport type SearchBatchOptions = SearchPageOptions & {\n  readonly provider?: string;\n};\n\n/** One successful or failed query outcome. */\nexport type SearchBatchItem =\n  | {\n      readonly query: string;\n      readonly provider: string;\n      readonly results: readonly (SearchResult | SearchAllResult)[];\n      readonly filterReports: readonly SearchFilterReport[];\n      readonly pagination?: SearchPagination;\n      readonly providerPagination?: readonly SearchProviderPagination[];\n      readonly providerMetadata?: readonly SearchProviderMetadata[];\n      readonly errors?: readonly { readonly provider: string; readonly error: string }[];\n      readonly attempts?: readonly string[];\n      readonly failures?: readonly ProviderFailure[];\n    }\n  | {\n      readonly query: string;\n      readonly error: string;\n      readonly attempts?: readonly string[];\n      readonly failures?: readonly ProviderFailure[];\n    };\n\n/** One successful or failed URL outcome. */\nexport type ReadBatchItem =\n  | { readonly url: string; readonly result: ReadResult }\n  | { readonly url: string; readonly error: string };\n\n/** One detailed URL outcome with effective provider provenance. */\nexport type ReadBatchDetailedItem =\n  | {\n      readonly url: string;\n      readonly result: Readonly<ReadResult>;\n      readonly requestedProvider: string;\n      readonly provider: string;\n      readonly attempts: readonly string[];\n      readonly failures: readonly ProviderFailure[];\n    }\n  | {\n      readonly url: string;\n      readonly error: string;\n      readonly attempts?: readonly string[];\n      readonly failures?: readonly ProviderFailure[];\n    };\n\n/**\n * Searches independent queries in parallel while preserving input order and failures.\n * @param queries - Search queries to execute.\n * @param options - Shared provider and search options.\n * @returns {Promise<readonly SearchBatchItem[]>} One result or error for every query.\n */\nexport async function searchBatch(\n  queries: readonly string[],\n  options?: Readonly<SearchBatchOptions>,\n): Promise<readonly SearchBatchItem[]> {\n  validateBatch(queries, \"query\", EmptyQueryError);\n  validateMaxResults(options?.maxResults);\n\n  const { provider: requestedProvider, continuation, ...searchOptions } = options ?? {};\n  if (continuation !== undefined) {\n    throw new TypeError(\"continuation is only supported for a single query\");\n  }\n  const executionOptions = withExecutionBudget(searchOptions);\n  throwIfAborted(executionOptions.signal);\n  if (requestedProvider === \"all\") {\n    return mapSearchOutcomes(\n      await settleNestedBatch(queries, (query) => searchAllForBatch(query, executionOptions)),\n    );\n  }\n\n  if (requestedProvider === undefined) {\n    try {\n      const search = await prepareSearchWithFallback(executionOptions);\n      return mapSearchOutcomes(\n        await settleBatch(\n          queries,\n          async (query) => singleBatchResult(await search(query)),\n          executionOptions,\n        ),\n      );\n    } catch (error) {\n      return queries.map((query) => ({ query, error: errorMessage(error) }));\n    }\n  }\n\n  try {\n    return mapSearchOutcomes(\n      await settleBatch(\n        queries,\n        async (query) =>\n          singleBatchResult(\n            await searchProviderDetailed(requestedProvider, query, executionOptions),\n          ),\n        executionOptions,\n      ),\n    );\n  } catch (error) {\n    return queries.map((query) => ({ query, error: errorMessage(error) }));\n  }\n}\n\n/**\n * Reads independent URLs while preserving the original batch contract.\n * @param urls - URLs to read.\n * @param options - Shared provider and read options.\n * @returns {Promise<readonly ReadBatchItem[]>} One result or error for every URL.\n */\nexport async function readBatch(\n  urls: readonly string[],\n  options?: Readonly<ReadUrlOptions>,\n): Promise<readonly ReadBatchItem[]> {\n  const outcomes = await readBatchDetailed(urls, options);\n  return outcomes.map((outcome): ReadBatchItem =>\n    \"error\" in outcome\n      ? { url: outcome.url, error: outcome.error }\n      : { url: outcome.url, result: outcome.result },\n  );\n}\n\n/**\n * Reads independent URLs and reports effective provider provenance per item.\n * @param urls - URLs to read.\n * @param options - Shared provider and read options.\n * @returns {Promise<readonly ReadBatchDetailedItem[]>} Detailed outcomes for every URL.\n */\nexport async function readBatchDetailed(\n  urls: readonly string[],\n  options?: Readonly<ReadUrlOptions>,\n): Promise<readonly ReadBatchDetailedItem[]> {\n  validateBatch(urls, \"URL\", EmptyUrlError);\n  if (options?.continuation !== undefined) {\n    throw new TypeError(\"continuation is only supported for a single URL\");\n  }\n  const executionOptions = withExecutionBudget(options);\n  throwIfAborted(executionOptions.signal);\n  const outcomes = await settleBatch(\n    urls,\n    (url) => readUrlDetailed(url, executionOptions),\n    executionOptions,\n  );\n  return outcomes.map((outcome): ReadBatchDetailedItem =>\n    outcome.ok\n      ? { url: outcome.input, ...outcome.value }\n      : {\n          url: outcome.input,\n          error: outcome.error,\n          ...(outcome.attempts === undefined ? {} : { attempts: outcome.attempts }),\n          ...(outcome.failures === undefined ? {} : { failures: outcome.failures }),\n        },\n  );\n}\n\ntype BatchOutcome<TResult> =\n  | { readonly ok: true; readonly input: string; readonly value: TResult }\n  | {\n      readonly ok: false;\n      readonly input: string;\n      readonly error: string;\n      readonly attempts?: readonly string[];\n      readonly failures?: readonly ProviderFailure[];\n    };\n\ntype ReadonlySearchAllEvidence = ReadonlySearchResult & { readonly provider: string };\ntype ReadonlySearchAllResult = ReadonlySearchAllEvidence & {\n  readonly providers: readonly string[];\n  readonly evidence: readonly ReadonlySearchAllEvidence[];\n};\n\ninterface BatchSearchResult {\n  readonly provider: string;\n  readonly results: readonly (ReadonlySearchResult | ReadonlySearchAllResult)[];\n  readonly filterReports: readonly SearchFilterReport[];\n  readonly pagination?: SearchPagination;\n  readonly providerPagination?: readonly SearchProviderPagination[];\n  readonly providerMetadata?: readonly SearchProviderMetadata[];\n  readonly errors?: readonly { readonly provider: string; readonly error: string }[];\n  readonly attempts?: readonly string[];\n  readonly failures?: readonly ProviderFailure[];\n}\n\ntype ReadonlySearchProviderResult = Readonly<Omit<SearchProviderResult, \"results\">> & {\n  readonly results: readonly ReadonlySearchResult[];\n  readonly attempts?: readonly string[];\n  readonly failures?: readonly ProviderFailure[];\n};\n\nasync function searchAllForBatch(\n  query: string,\n  options: Readonly<SearchRequestOptions>,\n): Promise<BatchSearchResult> {\n  const response = await searchAllDetailed(query, options);\n  if (response.successfulProviders.length === 0 && response.errors.length > 0) {\n    const errors = response.errors.map(({ provider, error }) => `${provider}: ${error.message}`);\n    throw new Error(`Search providers failed: ${errors.join(\"; \")}`);\n  }\n  return {\n    provider: \"all\",\n    results: response.results,\n    filterReports: response.filterReports,\n    providerPagination: response.providerPagination,\n    errors: response.errors.map(({ provider, error }) => ({\n      provider,\n      error: errorMessage(error),\n    })),\n    ...(response.providerMetadata === undefined\n      ? {}\n      : { providerMetadata: response.providerMetadata }),\n  };\n}\n\nfunction singleBatchResult(response: ReadonlySearchProviderResult): BatchSearchResult {\n  const { provider, ignoredFilters, undeclaredFilters } = response;\n  const filterReports = hasSearchFilterWarning(response)\n    ? [{ provider, ignoredFilters, undeclaredFilters }]\n    : [];\n  return {\n    provider,\n    results: response.results,\n    filterReports,\n    pagination: response.pagination,\n    ...(response.metadata === undefined\n      ? {}\n      : { providerMetadata: [{ provider, metadata: response.metadata }] }),\n    ...(response.attempts === undefined ? {} : { attempts: response.attempts }),\n    ...(response.failures === undefined ? {} : { failures: response.failures }),\n  };\n}\n\nasync function settleNestedBatch<TResult>(\n  inputs: readonly string[],\n  execute: (input: string) => Promise<TResult>,\n): Promise<readonly BatchOutcome<TResult>[]> {\n  const settled = await Promise.allSettled(\n    inputs.map((input) => {\n      try {\n        return execute(input);\n      } catch (error) {\n        return Promise.reject(error);\n      }\n    }),\n  );\n  return batchOutcomes(inputs, settled);\n}\n\nasync function settleBatch<TResult>(\n  inputs: readonly string[],\n  execute: (input: string) => Promise<TResult>,\n  options?: Readonly<SearchRequestOptions | ReadUrlOptions>,\n): Promise<readonly BatchOutcome<TResult>[]> {\n  const settled = await settleWithConcurrency(inputs, (input) => execute(input), options);\n  return batchOutcomes(inputs, settled);\n}\n\nfunction batchOutcomes<TResult>(\n  inputs: readonly string[],\n  settled: readonly Readonly<PromiseSettledResult<TResult>>[],\n): readonly BatchOutcome<TResult>[] {\n  return settled.map((outcome, index): BatchOutcome<TResult> =>\n    outcome.status === \"fulfilled\"\n      ? { ok: true, input: inputs[index] as string, value: outcome.value }\n      : { ok: false, input: inputs[index] as string, ...batchFailure(outcome.reason) },\n  );\n}\n\nfunction mapSearchOutcomes(\n  outcomes: readonly BatchOutcome<BatchSearchResult>[],\n): readonly SearchBatchItem[] {\n  return outcomes.map((outcome): SearchBatchItem =>\n    outcome.ok\n      ? {\n          query: outcome.input,\n          provider: outcome.value.provider,\n          results: outcome.value.results.map((result) =>\n            isSearchAllResult(result)\n              ? {\n                  ...mutableSearchResult(result),\n                  provider: result.provider,\n                  providers: [...result.providers],\n                  evidence: result.evidence.map(mutableSearchEvidence),\n                }\n              : mutableSearchResult(result),\n          ),\n          filterReports: outcome.value.filterReports,\n          ...batchSearchDiagnostics(outcome.value),\n        }\n      : {\n          query: outcome.input,\n          error: outcome.error,\n          ...(outcome.attempts === undefined ? {} : { attempts: outcome.attempts }),\n          ...(outcome.failures === undefined ? {} : { failures: outcome.failures }),\n        },\n  );\n}\n\nfunction batchSearchDiagnostics(\n  value: Readonly<BatchSearchResult>,\n): Omit<BatchSearchResult, \"provider\" | \"results\" | \"filterReports\"> {\n  return {\n    ...(value.pagination === undefined ? {} : { pagination: value.pagination }),\n    ...(value.providerPagination === undefined\n      ? {}\n      : { providerPagination: value.providerPagination }),\n    ...(value.providerMetadata === undefined ? {} : { providerMetadata: value.providerMetadata }),\n    ...(value.errors === undefined ? {} : { errors: value.errors }),\n    ...(value.attempts === undefined ? {} : { attempts: value.attempts }),\n    ...(value.failures === undefined ? {} : { failures: value.failures }),\n  };\n}\n\nfunction mutableSearchResult(result: ReadonlySearchResult): SearchResult {\n  const { highlights, metadata, ...rest } = result;\n  return {\n    ...rest,\n    ...(highlights ? { highlights: [...highlights] } : {}),\n    ...(metadata ? { metadata: { ...metadata } } : {}),\n  };\n}\n\nfunction mutableSearchEvidence(evidence: ReadonlySearchAllEvidence): SearchAllEvidence {\n  return { ...mutableSearchResult(evidence), provider: evidence.provider };\n}\n\nfunction isSearchAllResult(\n  result: ReadonlySearchResult | ReadonlySearchAllResult,\n): result is ReadonlySearchAllResult {\n  return \"providers\" in result && \"evidence\" in result;\n}\n\nfunction validateBatch(\n  inputs: readonly string[],\n  label: \"query\" | \"URL\",\n  EmptyInputError: new () => Error,\n): void {\n  if (inputs.length === 0) {\n    throw new TypeError(`Batch must contain at least one ${label}`);\n  }\n  if (inputs.length > MAX_BATCH_ITEMS) {\n    throw new RangeError(`Batch cannot contain more than ${MAX_BATCH_ITEMS} items`);\n  }\n  if (inputs.some((input) => !input.trim())) {\n    throw new EmptyInputError();\n  }\n}\n\nfunction batchFailure(error: unknown): {\n  readonly error: string;\n  readonly attempts?: readonly string[];\n  readonly failures?: readonly ProviderFailure[];\n} {\n  const message = errorMessage(error);\n  return error instanceof ProviderFallbackError\n    ? { error: message, attempts: error.attempts, failures: error.failures }\n    : { error: message };\n}\n\nfunction errorMessage(error: unknown): string {\n  const message = error instanceof Error ? error.message : String(error);\n  return message.replaceAll(/\\p{Cc}/gu, \" \");\n}\n"],"mappings":"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"}