{"version":3,"file":"search-D8qyKEPq.mjs","names":[],"sources":["../src/commands/search.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { consola } from \"consola\";\nimport { sanitizeTerminalText } from \"../tui.ts\";\nimport { providerApiKeyEnvVar } from \"../core/providers.ts\";\nimport {\n  AuthError,\n  NoProviderConfiguredError,\n  SearchNotSupportedError,\n  UnknownProviderError,\n} from \"../core/errors.ts\";\nimport type {\n  SearchAllResult,\n  SearchProviderMetadata,\n  SearchProviderPagination,\n  SearchProviderResult,\n} from \"../core/all.ts\";\nimport type { SearchFilterReport } from \"../core/search-filters.ts\";\nimport { MAX_SEARCH_CONTINUATION_LENGTH } from \"../core/search-continuation.ts\";\nimport type {\n  ReadonlySearchResult,\n  SearchPageOptions,\n  SearchPagination,\n  SearchResult,\n} from \"../core/types.ts\";\n\nexport default defineCommand({\n  meta: {\n    name: \"search\",\n    description: \"Search the web using one or more providers\",\n  },\n  args: {\n    query: {\n      type: \"positional\",\n      description: \"Search query; pass more than one quoted query for a batch\",\n      required: true,\n    },\n    provider: {\n      type: \"string\",\n      description: 'Search provider to use, or \"all\" for parallel search',\n    },\n    \"max-results\": {\n      type: \"string\",\n      description: \"Maximum number of results\",\n      default: \"10\",\n    },\n    continuation: {\n      type: \"string\",\n      description: \"Opaque token returned by a previous search through one provider\",\n    },\n    highlights: {\n      type: \"boolean\",\n      description: \"Return passages relevant to the query when supported\",\n      negativeDescription: \"Disable passages relevant to the query when supported\",\n      default: true,\n    },\n    summary: {\n      type: \"boolean\",\n      description: \"Request generated summaries or answers when supported\",\n      default: false,\n    },\n    \"full-text\": {\n      type: \"boolean\",\n      description: \"Request full page text when supported\",\n      default: false,\n    },\n    \"include-domains\": {\n      type: \"string\",\n      description: \"Domains to include, separated by commas\",\n    },\n    \"exclude-domains\": {\n      type: \"string\",\n      description: \"Domains to exclude, separated by commas\",\n    },\n    sources: {\n      type: \"string\",\n      description: \"Source types separated by commas when supported\",\n    },\n    categories: {\n      type: \"string\",\n      description: \"Categories separated by commas when supported\",\n    },\n    category: {\n      type: \"string\",\n      description: \"Single provider category when supported\",\n    },\n    \"start-published-date\": {\n      type: \"string\",\n      description: \"Only return results published after this ISO date\",\n    },\n    \"end-published-date\": {\n      type: \"string\",\n      description: \"Only return results published before this ISO date\",\n    },\n    json: {\n      type: \"boolean\",\n      description: \"Output as JSON\",\n      default: false,\n    },\n  },\n  async run({ args }) {\n    const registry = await import(\"../core/registry.ts\");\n    const parsed = parseSearchArguments(args);\n    const providerName = parsed.provider;\n    try {\n      const output = await runSearch(parsed);\n      writeSearchOutput(output, parsed.json);\n    } catch (error) {\n      await handleSearchError(error, providerName, registry);\n    }\n  },\n});\n\ntype SearchCommandArgs = {\n  readonly _: readonly string[];\n  readonly query: string;\n  readonly provider?: string;\n  readonly \"max-results\": string;\n  readonly continuation?: string;\n  readonly highlights: boolean;\n  readonly summary: boolean;\n  readonly \"full-text\": boolean;\n  readonly \"include-domains\"?: string;\n  readonly \"exclude-domains\"?: string;\n  readonly sources?: string;\n  readonly categories?: string;\n  readonly category?: string;\n  readonly \"start-published-date\"?: string;\n  readonly \"end-published-date\"?: string;\n  readonly json: boolean;\n};\n\ntype ParsedSearchArguments = {\n  readonly query: string | readonly string[];\n  readonly provider?: string;\n  readonly options: SearchPageOptions;\n  readonly json: boolean;\n};\n\ntype ReadonlySearchProviderResult = Readonly<Omit<SearchProviderResult, \"results\">> & {\n  readonly results: readonly ReadonlySearchResult[];\n};\n\ntype ReadonlySearchAllEvidence = ReadonlySearchResult & {\n  readonly provider: SearchAllResult[\"provider\"];\n};\n\ntype ReadonlySearchAllResult = ReadonlySearchAllEvidence & {\n  readonly providers: readonly string[];\n  readonly evidence: readonly ReadonlySearchAllEvidence[];\n};\n\ntype ReadonlySearchAllResponse = {\n  readonly results: readonly ReadonlySearchAllResult[];\n  readonly successfulProviders: readonly string[];\n  readonly errors: readonly {\n    readonly provider: string;\n    readonly error: Readonly<Error>;\n  }[];\n  readonly filterReports: readonly Readonly<SearchFilterReport>[];\n  readonly providerPagination: readonly Readonly<SearchProviderPagination>[];\n  readonly providerMetadata?: readonly Readonly<SearchProviderMetadata>[];\n};\n\ntype SerializableSearchAllResponse = Omit<ReadonlySearchAllResponse, \"errors\"> & {\n  readonly errors: readonly { readonly provider: string; readonly error: string }[];\n};\n\ntype ReadonlySearchBatchItem =\n  | {\n      readonly query: string;\n      readonly provider: string;\n      readonly results: readonly ReadonlySearchResult[];\n      readonly filterReports: readonly Readonly<SearchFilterReport>[];\n      readonly pagination?: SearchPagination;\n      readonly providerPagination?: readonly Readonly<SearchProviderPagination>[];\n      readonly providerMetadata?: readonly Readonly<SearchProviderMetadata>[];\n      readonly errors?: readonly { readonly provider: string; readonly error: string }[];\n    }\n  | { readonly query: string; readonly error: string };\n\ntype SearchCommandOutput =\n  | ReadonlySearchProviderResult\n  | SerializableSearchAllResponse\n  | readonly ReadonlySearchBatchItem[];\n\nfunction parseSearchArguments(args: SearchCommandArgs): ParsedSearchArguments {\n  const queries = args._.length > 1 ? args._ : [args.query];\n  if (queries.some((query) => !query.trim())) {\n    return exitWithError(\"Search query cannot be empty.\");\n  }\n  const continuation = continuationError(args.continuation, queries, args.provider);\n  if (continuation !== undefined) return exitWithError(continuation);\n  const maxResults = parseMaxResults(args[\"max-results\"]);\n  if (!maxResults.ok) return exitWithError(maxResults.message);\n\n  return {\n    query: queries.length === 1 ? queries[0] : queries,\n    provider: args.provider || undefined,\n    options: parseSearchOptions(args, maxResults.value),\n    json: args.json,\n  };\n}\n\n/**\n * A continuation token names one page of one provider, so a batch or a fan-out cannot take it.\n * @param continuation - Token from the previous search, when any.\n * @param queries - Queries the command is about to run.\n * @param provider - Requested provider name, when any.\n * @returns {string | undefined} The refusal to print, or undefined when the token can be used.\n */\nfunction continuationError(\n  continuation: string | undefined,\n  queries: readonly string[],\n  provider: string | undefined,\n): string | undefined {\n  if (continuation === undefined) return undefined;\n  if (queries.length > 1) return \"--continuation is only supported for a single query.\";\n  if (provider === \"all\") return \"--continuation is not supported with --provider all.\";\n  return undefined;\n}\n\nfunction parseSearchOptions(args: SearchCommandArgs, maxResults: number): SearchPageOptions {\n  const includeDomains = parseList(args[\"include-domains\"]);\n  const excludeDomains = parseList(args[\"exclude-domains\"]);\n  const sources = parseList(args.sources);\n  const categories = parseList(args.categories);\n  return {\n    maxResults,\n    ...(args.continuation === undefined ? {} : { continuation: args.continuation }),\n    highlights: args.highlights,\n    ...parseContentOptions(args),\n    ...(includeDomains === undefined ? {} : { includeDomains }),\n    ...(excludeDomains === undefined ? {} : { excludeDomains }),\n    ...(sources === undefined ? {} : { sources }),\n    ...(categories === undefined ? {} : { categories }),\n    ...(args.category === undefined ? {} : { category: args.category }),\n    ...(args[\"start-published-date\"] === undefined\n      ? {}\n      : { startPublishedDate: args[\"start-published-date\"] }),\n    ...(args[\"end-published-date\"] === undefined\n      ? {}\n      : { endPublishedDate: args[\"end-published-date\"] }),\n  };\n}\n\nfunction parseContentOptions(\n  args: SearchCommandArgs,\n): Pick<SearchPageOptions, \"summary\" | \"fullText\"> {\n  return {\n    ...(args.summary ? { summary: true } : {}),\n    ...(args[\"full-text\"] ? { fullText: true } : {}),\n  };\n}\n\nasync function runSearch(args: Readonly<ParsedSearchArguments>): Promise<SearchCommandOutput> {\n  const { query, provider, options } = args;\n  if (typeof query !== \"string\") {\n    const { searchBatch } = await import(\"../core/batch.ts\");\n    return searchBatch(query, { provider, ...options });\n  }\n\n  const { searchAllDetailed, searchProviderDetailed, searchWithFallback } =\n    await import(\"../core/all.ts\");\n  if (provider === \"all\") {\n    return serializeSearchAllResponse(await searchAllDetailed(query, options));\n  }\n  if (provider !== undefined) {\n    return searchProviderDetailed(provider, query, options);\n  }\n  return searchWithFallback(query, options);\n}\n\nfunction serializeSearchAllResponse(\n  response: ReadonlySearchAllResponse,\n): SerializableSearchAllResponse {\n  return {\n    ...response,\n    errors: response.errors.map(({ provider, error }) => ({ provider, error: error.message })),\n  };\n}\n\nfunction writeSearchOutput(output: SearchCommandOutput, json: boolean): void {\n  if (json) {\n    process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`);\n    return;\n  }\n\n  if (isSearchBatchOutput(output)) {\n    writeHumanSearchBatch(output);\n    return;\n  }\n  writeHumanSearchResults(output.results);\n  if (\"errors\" in output) reportProviderErrors(output.errors);\n  if (\"ignoredFilters\" in output) {\n    reportFilterWarning(output.provider, output.ignoredFilters, output.undeclaredFilters);\n    reportPagination(output.provider, output.pagination);\n  } else {\n    for (const report of output.filterReports) {\n      reportFilterWarning(report.provider, report.ignoredFilters, report.undeclaredFilters);\n    }\n    for (const page of output.providerPagination) {\n      reportPagination(page.provider, page.pagination);\n    }\n  }\n}\n\nfunction isSearchBatchOutput(\n  output: SearchCommandOutput,\n): output is readonly ReadonlySearchBatchItem[] {\n  return Array.isArray(output);\n}\n\nfunction writeHumanSearchBatch(outcomes: readonly ReadonlySearchBatchItem[]): void {\n  for (const outcome of outcomes) {\n    const query = sanitizeTerminalText(outcome.query, 2048);\n    consola.log(`\\x1B[1m${query}\\x1B[0m`);\n    if (\"error\" in outcome) {\n      consola.error(sanitizeTerminalText(outcome.error, 2048));\n      continue;\n    }\n    writeHumanSearchResults(outcome.results);\n    if (outcome.errors !== undefined) reportProviderErrors(outcome.errors);\n    for (const report of outcome.filterReports) {\n      reportFilterWarning(report.provider, report.ignoredFilters, report.undeclaredFilters);\n    }\n    if (outcome.pagination !== undefined) {\n      reportPagination(outcome.provider, outcome.pagination);\n    }\n    for (const page of outcome.providerPagination ?? []) {\n      reportPagination(page.provider, page.pagination);\n    }\n  }\n}\n\nfunction writeHumanSearchResults(\n  results: readonly Readonly<Pick<SearchResult, \"title\" | \"url\" | \"snippet\">>[],\n): void {\n  if (results.length === 0) {\n    consola.info(\"No results found.\");\n    return;\n  }\n  for (const result of results) {\n    const title = sanitizeTerminalText(result.title, 2048);\n    const url = sanitizeTerminalText(result.url, 2048);\n    consola.log(`\\x1B[1m\\x1B[36m${title}\\x1B[0m`);\n    consola.log(`  ${url}`);\n    if (result.snippet) {\n      const sanitizedSnippet = sanitizeTerminalText(result.snippet, 2048);\n      const snippet =\n        sanitizedSnippet.length > 120 ? `${sanitizedSnippet.slice(0, 120)}...` : sanitizedSnippet;\n      consola.log(`  \\x1B[90m${snippet}\\x1B[0m`);\n    }\n    consola.log(\"\");\n  }\n}\n\nfunction reportPagination(providerName: string, pagination: SearchPagination): void {\n  if (pagination.status !== \"next\" && pagination.status !== \"unknown\") return;\n  const provider = sanitizeTerminalText(providerName, 200);\n  const continuation = sanitizeTerminalText(\n    pagination.continuation,\n    MAX_SEARCH_CONTINUATION_LENGTH,\n  );\n  consola.info(`${provider} continuation (${pagination.status}): ${continuation}`);\n}\n\nfunction reportProviderErrors(\n  errors: readonly { readonly provider: string; readonly error: string }[],\n): void {\n  for (const error of errors) {\n    const provider = sanitizeTerminalText(error.provider, 200);\n    const message = sanitizeTerminalText(error.error, 2048);\n    consola.error(`${provider}: ${message}`);\n  }\n}\n\nfunction reportFilterWarning(\n  providerName: string,\n  ignoredFilters: readonly string[],\n  undeclaredFilters: readonly string[],\n): void {\n  const provider = sanitizeTerminalText(providerName, 200);\n  if (ignoredFilters.length > 0) {\n    consola.info(`${provider} ignored filters: ${ignoredFilters.join(\", \")}`);\n  }\n  if (undeclaredFilters.length > 0) {\n    consola.info(`${provider} has undeclared filters: ${undeclaredFilters.join(\", \")}`);\n  }\n}\n\nasync function handleSearchError(\n  error: unknown,\n  providerName: string | undefined,\n  registry: Readonly<Pick<typeof import(\"../core/registry.ts\"), \"providers\">>,\n): Promise<never> {\n  if (error instanceof AuthError) {\n    const provider = providerName || error.provider;\n    const envVar = providerApiKeyEnvVar(provider);\n    if (provider === \"openai-codex\") {\n      consola.info(\n        \"Sign in with Pi, OMP, Codex, or OpenCode. Let that client refresh an expired login.\",\n      );\n    } else if (envVar !== null) consola.info(`Set the ${envVar} environment variable.`);\n    return exitWithError(`Authentication failed for provider \"${provider}\".`);\n  }\n  if (error instanceof SearchNotSupportedError) {\n    return exitWithError(`Provider \"${error.provider}\" does not support web search.`);\n  }\n  if (error instanceof UnknownProviderError) {\n    reportAvailableProviders(registry.providers());\n    return exitWithError(`Unknown provider: ${providerName}`);\n  }\n  if (error instanceof NoProviderConfiguredError) {\n    reportConfiguredProviderHint(registry.providers());\n    return exitWithError(error.message);\n  }\n  throw error;\n}\n\nfunction reportAvailableProviders(available: readonly string[]): void {\n  consola.info(\n    available.length > 0\n      ? `Available providers: ${available.join(\", \")}`\n      : \"No providers registered. Import a provider first.\",\n  );\n}\n\nfunction reportConfiguredProviderHint(available: readonly string[]): void {\n  if (available.length === 0) return;\n  consola.info(`Registered providers: ${available.join(\", \")}`);\n  consola.info(\"Set one provider API key env var or pass --provider explicitly.\");\n}\n\nfunction exitWithError(message: string): never {\n  consola.error(message);\n  process.exit(1);\n}\n\ntype ParsedMaxResults = { ok: true; value: number } | { ok: false; message: string };\n\nfunction parseMaxResults(input: string): ParsedMaxResults {\n  if (!/^\\d+$/.test(input)) {\n    return {\n      ok: false,\n      message: \"Invalid --max-results value. Expected a positive integer.\",\n    };\n  }\n\n  const value = Number.parseInt(input, 10);\n  if (value < 1) {\n    return {\n      ok: false,\n      message: \"Invalid --max-results value. Expected a positive integer.\",\n    };\n  }\n\n  return { ok: true, value };\n}\n\nfunction parseList(input: string | undefined): readonly string[] | undefined {\n  if (input === undefined) return undefined;\n  return input\n    .split(\",\")\n    .map((value) => value.trim())\n    .filter(Boolean);\n}\n"],"mappings":"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"}