{"version":3,"file":"read-BhgVYyX2.mjs","names":[],"sources":["../src/core/read.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { ReadOptions, ReadResult } from \"./types.ts\";\nimport { builtinProviders } from \"./providers.ts\";\nimport {\n  EmptyUrlError,\n  InvalidReadContinuationError,\n  ReadNotSupportedError,\n  StaleReadContinuationError,\n} from \"./errors.ts\";\nimport {\n  isFallbackEligible,\n  providerFailure,\n  ProviderFallbackError,\n  type ProviderFailure,\n} from \"./fallback.ts\";\nimport { createReadProvider, has, readProviders } from \"./registry.ts\";\nimport { isProviderConfigured } from \"./resolve.ts\";\nimport {\n  DEFAULT_CONCURRENCY,\n  MAX_AGENT_TIMEOUT_SECONDS,\n  MAX_CONCURRENCY,\n  providerRequestOptions,\n  throwIfAborted,\n  withExecutionBudget,\n} from \"./execution.ts\";\nimport {\n  MAX_PROVIDER_SEARCH_CONTINUATION_LENGTH,\n  MAX_SEARCH_CONTINUATION_LENGTH,\n} from \"./search-continuation.ts\";\n\nexport const readProviderNames = [\"jina\", \"context\", \"firecrawl\", \"tinyfish\", \"tavily\"] as const;\nexport type ReadProviderName = (typeof readProviderNames)[number];\n\n/** Default portable content limit used by agent surfaces. */\nexport const DEFAULT_AGENT_READ_MAX_CHARS = 20_000;\n\n/** Largest portable content page accepted by agent surfaces. */\nexport const MAX_AGENT_READ_CHARS = 200_000;\n\n/** Package guarantees that apply after every provider returns. */\nexport const packageCapabilities = {\n  execution: {\n    cancellation: { option: \"signal\" },\n    deadline: {\n      option: \"deadline\",\n      unit: \"unix-ms\",\n      agentOption: \"timeoutSeconds\",\n      agentUnit: \"seconds\",\n      agentMaximum: MAX_AGENT_TIMEOUT_SECONDS,\n    },\n    concurrency: {\n      option: \"concurrency\",\n      default: DEFAULT_CONCURRENCY,\n      maximum: MAX_CONCURRENCY,\n      scope: \"batch-and-fanout\",\n    },\n  },\n  search: {\n    continuation: {\n      option: \"continuation\",\n      opaque: true,\n      maximum: MAX_SEARCH_CONTINUATION_LENGTH,\n      providerStateMaximum: MAX_PROVIDER_SEARCH_CONTINUATION_LENGTH,\n      scope: \"single-provider-query\",\n    },\n  },\n  read: {\n    outputLimit: {\n      option: \"maxChars\",\n      unit: \"unicode-code-points\",\n      minimum: 1,\n      agentDefault: DEFAULT_AGENT_READ_MAX_CHARS,\n      agentMaximum: MAX_AGENT_READ_CHARS,\n    },\n    continuation: { option: \"continuation\", opaque: true },\n  },\n} as const;\n\nexport interface ReadUrlOptions extends ReadOptions {\n  readonly provider?: string;\n  readonly maxChars?: number;\n  readonly continuation?: string;\n  /** Keeps the page's links in a bounded read. Defaults to false. */\n  readonly links?: boolean;\n  /** Keeps the page's image URLs in a bounded read. Defaults to false. */\n  readonly images?: boolean;\n}\n\n/** Read result with requested mode, effective provider, and provider-attempt diagnostics. */\nexport interface ReadUrlDetailedResult {\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\ninterface ReadContinuationPayload {\n  readonly version: 1;\n  readonly provider: string;\n  readonly requestedProvider: string;\n  readonly requestFingerprint: string;\n  readonly contentFingerprint: string;\n  readonly offset: number;\n}\n\ninterface ReadContinuationEnvelope {\n  readonly payload: string;\n  readonly checksum: string;\n}\n\ntype ReadResultInput = Readonly<Omit<ReadResult, \"links\" | \"images\" | \"metadata\">> & {\n  readonly links?: readonly string[];\n  readonly images?: readonly string[];\n  readonly metadata?: Readonly<Record<string, unknown>>;\n};\n\n/** Optional page fields a bounded read keeps only on request. */\ninterface PageFields {\n  readonly links: boolean;\n  readonly images: boolean;\n}\n\nconst DEFAULT_READ_PROVIDER: ReadProviderName = \"jina\";\nconst MAX_CONTINUATION_LENGTH = 1_024;\n\n/**\n * Reads a URL while preserving the original result contract.\n * @param url - URL to read.\n * @param options - Provider, native read options, and portable output options.\n * @returns {Promise<ReadResult>} The normalized page result.\n */\nexport async function readUrl(\n  url: string,\n  options?: Readonly<ReadUrlOptions>,\n): Promise<ReadResult> {\n  return (await readUrlDetailed(url, options)).result;\n}\n\n/**\n * Reads a URL and reports the effective provider after automatic fallback.\n * @param url - URL to read.\n * @param options - Provider, native read options, and portable output options.\n * @returns {Promise<ReadUrlDetailedResult>} Result, provider, attempts, and failures.\n */\nexport async function readUrlDetailed(\n  url: string,\n  options?: Readonly<ReadUrlOptions>,\n): Promise<ReadUrlDetailedResult> {\n  const trimmedUrl = url.trim();\n  if (!trimmedUrl) throw new EmptyUrlError();\n\n  const {\n    provider: requestedProviderInput,\n    maxChars: maxCharsInput,\n    continuation,\n    links,\n    images,\n    ...readOptions\n  } = options ?? {};\n  const maxChars = readMaxChars(maxCharsInput);\n  const effectiveReadOptions = withExecutionBudget(readOptions);\n  throwIfAborted(effectiveReadOptions.signal);\n  const requestedProviderName = requestedProviderInput?.trim();\n  const requestedProvider = requestedProviderName || \"auto\";\n  const pageFields = { links: links === true, images: images === true };\n\n  if (continuation !== undefined) {\n    return continueRead(\n      trimmedUrl,\n      requestedProvider,\n      effectiveReadOptions,\n      maxChars,\n      continuation,\n      pageFields,\n    );\n  }\n\n  const response = requestedProviderName\n    ? await readExplicitly(trimmedUrl, effectiveReadOptions, requestedProviderName)\n    : await readAutomatically(trimmedUrl, effectiveReadOptions);\n  if (maxChars === undefined) return response;\n  return {\n    ...response,\n    result: pageReadResult(response.result, {\n      url: trimmedUrl,\n      readOptions: effectiveReadOptions,\n      maxChars,\n      offset: 0,\n      provider: response.provider,\n      requestedProvider: response.requestedProvider,\n      ...pageFields,\n    }),\n  };\n}\n\nasync function readExplicitly(\n  url: string,\n  options: Readonly<ReadOptions>,\n  requestedProvider: string,\n): Promise<ReadUrlDetailedResult> {\n  const provider = resolveReadProviderName(requestedProvider);\n  return {\n    result: await readFromProvider(url, options, provider),\n    requestedProvider: provider,\n    provider,\n    attempts: [provider],\n    failures: [],\n  };\n}\n\nasync function continueRead(\n  url: string,\n  requestedProvider: string,\n  readOptions: Readonly<ReadOptions>,\n  maxChars: number | undefined,\n  continuation: string,\n  pageFields: Readonly<PageFields>,\n): Promise<ReadUrlDetailedResult> {\n  const payload = decodeContinuation(continuation);\n  if (\n    payload.requestFingerprint !== requestFingerprint(url, readOptions) ||\n    (requestedProvider !== \"auto\" && requestedProvider !== payload.requestedProvider)\n  ) {\n    throw new InvalidReadContinuationError();\n  }\n\n  const provider = resolveReadProviderName(payload.provider);\n  const result = await readFromProvider(url, readOptions, provider);\n  if (contentFingerprint(result.content) !== payload.contentFingerprint) {\n    throw new StaleReadContinuationError();\n  }\n\n  return {\n    result: pageReadResult(result, {\n      url,\n      readOptions,\n      maxChars,\n      offset: payload.offset,\n      provider,\n      requestedProvider: payload.requestedProvider,\n      ...pageFields,\n    }),\n    requestedProvider: payload.requestedProvider,\n    provider,\n    attempts: [provider],\n    failures: [],\n  };\n}\n\nfunction resolveReadProviderName(providerName: string): string {\n  const registeredOrBuiltin =\n    has(providerName) || (builtinProviders as readonly string[]).includes(providerName);\n  if (registeredOrBuiltin && !readProviders().includes(providerName)) {\n    throw new ReadNotSupportedError(providerName);\n  }\n  return providerName;\n}\n\nasync function readAutomatically(\n  url: string,\n  options: Readonly<ReadOptions>,\n): Promise<ReadUrlDetailedResult> {\n  const providerNames = [DEFAULT_READ_PROVIDER, ...configuredReadProviders(DEFAULT_READ_PROVIDER)];\n  const attempts: string[] = [];\n  const failures: ProviderFailure[] = [];\n  let lastError: unknown;\n\n  for (const providerName of providerNames) {\n    attempts.push(providerName);\n    try {\n      return {\n        result: await readFromProvider(url, options, providerName),\n        requestedProvider: \"auto\",\n        provider: providerName,\n        attempts,\n        failures,\n      };\n    } catch (error) {\n      const failure = providerFailure(providerName, error);\n      if (!isFallbackEligible(error, providerName, \"read\")) {\n        if (failures.length === 0) throw error;\n        failures.push(failure);\n        throw new ProviderFallbackError(\"read\", failures, error);\n      }\n      failures.push(failure);\n      lastError = error;\n    }\n  }\n  throw new ProviderFallbackError(\"read\", failures, lastError);\n}\n\nasync function readFromProvider(\n  url: string,\n  options: Readonly<ReadOptions>,\n  providerName: string,\n): Promise<ReadResult> {\n  throwIfAborted(options.signal);\n  let result: ReadResult;\n  try {\n    const provider = await createReadProvider(providerName);\n    throwIfAborted(options.signal);\n    result = await provider.read(url, providerRequestOptions(options));\n  } catch (error) {\n    throwIfAborted(options.signal);\n    throw error;\n  }\n  throwIfAborted(options.signal);\n  return result;\n}\n\nfunction configuredReadProviders(initialProvider: string): string[] {\n  const registeredReaders = readProviders();\n  const builtins = readProviderNames.filter(\n    (name) =>\n      name !== initialProvider && registeredReaders.includes(name) && isProviderConfigured(name),\n  );\n  const custom = registeredReaders.filter(\n    (name) =>\n      name !== initialProvider &&\n      !(readProviderNames as readonly string[]).includes(name) &&\n      isProviderConfigured(name),\n  );\n  return [...builtins, ...custom];\n}\n\nfunction readMaxChars(value: number | undefined): number | undefined {\n  if (value === undefined) return undefined;\n  if (!Number.isSafeInteger(value) || value < 1) {\n    throw new RangeError(\"maxChars must be a positive safe integer\");\n  }\n  return value;\n}\n\n/**\n * Slices one page to the bound and drops what would smuggle the page past it: the\n * `text` and `html` duplicates always, `links` and `images` unless asked for, since a\n * long page carries thousands of links for a few thousand words.\n * @param result - Page as the reader returned it.\n * @param context - Bound, offset, reader provenance, and the optional fields to keep.\n * @returns {ReadResult} Bounded page with a continuation when more remained.\n */\nfunction pageReadResult(\n  result: ReadResultInput,\n  context: Readonly<\n    PageFields & {\n      url: string;\n      readOptions: Readonly<ReadOptions>;\n      maxChars: number | undefined;\n      offset: number;\n      provider: string;\n      requestedProvider: string;\n    }\n  >,\n): ReadResult {\n  const page = sliceContent(result.content, context.offset, context.maxChars);\n  const {\n    text: _text,\n    html: _html,\n    continuation: _continuation,\n    truncated: _truncated,\n    links,\n    images,\n    metadata,\n    ...rest\n  } = result;\n  const continuation = page.truncated\n    ? encodeContinuation({\n        version: 1,\n        provider: context.provider,\n        requestedProvider: context.requestedProvider,\n        requestFingerprint: requestFingerprint(context.url, context.readOptions),\n        contentFingerprint: contentFingerprint(result.content),\n        offset: page.nextOffset,\n      })\n    : undefined;\n  return {\n    ...rest,\n    content: page.content,\n    truncated: page.truncated,\n    ...(continuation === undefined ? {} : { continuation }),\n    ...(context.links && links !== undefined ? { links: [...links] } : {}),\n    ...(context.images && images !== undefined ? { images: [...images] } : {}),\n    ...(metadata === undefined ? {} : { metadata: { ...metadata } }),\n  };\n}\n\nfunction sliceContent(\n  content: string,\n  offset: number,\n  maxChars: number | undefined,\n): { readonly content: string; readonly truncated: boolean; readonly nextOffset: number } {\n  let characterOffset = 0;\n  let codeUnitOffset = 0;\n  let startCodeUnit = content.length;\n  let endCodeUnit = content.length;\n  const requestedEnd = maxChars === undefined ? Number.POSITIVE_INFINITY : offset + maxChars;\n\n  for (const character of content) {\n    if (characterOffset === offset) startCodeUnit = codeUnitOffset;\n    if (characterOffset === requestedEnd) endCodeUnit = codeUnitOffset;\n    codeUnitOffset += character.length;\n    characterOffset += 1;\n  }\n  if (characterOffset === offset) startCodeUnit = codeUnitOffset;\n  if (characterOffset === requestedEnd) endCodeUnit = codeUnitOffset;\n  if (offset > characterOffset) throw new InvalidReadContinuationError();\n\n  const nextOffset = Math.min(requestedEnd, characterOffset);\n  return {\n    content: content.slice(startCodeUnit, endCodeUnit),\n    truncated: nextOffset < characterOffset,\n    nextOffset,\n  };\n}\n\nfunction requestFingerprint(url: string, options: Readonly<ReadOptions>): string {\n  return fingerprint(\n    JSON.stringify([\n      url,\n      options.format ?? null,\n      options.maxTokens ?? null,\n      options.targetSelector ?? null,\n      options.removeSelector ?? null,\n      options.timeout ?? null,\n      options.noCache === true,\n    ]),\n  );\n}\n\nfunction contentFingerprint(content: string): string {\n  return fingerprint(content);\n}\n\nfunction fingerprint(value: string): string {\n  return createHash(\"sha256\").update(value).digest(\"base64url\");\n}\n\nfunction encodeContinuation(payload: Readonly<ReadContinuationPayload>): string {\n  const serializedPayload = JSON.stringify(payload);\n  const envelope: ReadContinuationEnvelope = {\n    payload: serializedPayload,\n    checksum: continuationChecksum(serializedPayload),\n  };\n  return Buffer.from(JSON.stringify(envelope)).toString(\"base64url\");\n}\n\nfunction decodeContinuation(token: string): ReadContinuationPayload {\n  if (!token || token.length > MAX_CONTINUATION_LENGTH) throw new InvalidReadContinuationError();\n  try {\n    const envelope: unknown = JSON.parse(Buffer.from(token, \"base64url\").toString(\"utf8\"));\n    if (!isReadContinuationEnvelope(envelope)) throw new InvalidReadContinuationError();\n    if (envelope.checksum !== continuationChecksum(envelope.payload)) {\n      throw new InvalidReadContinuationError();\n    }\n    const payload: unknown = JSON.parse(envelope.payload);\n    if (!isReadContinuationPayload(payload)) throw new InvalidReadContinuationError();\n    return payload;\n  } catch (error) {\n    if (error instanceof InvalidReadContinuationError) throw error;\n    throw new InvalidReadContinuationError();\n  }\n}\n\nfunction continuationChecksum(payload: string): string {\n  return fingerprint(`@agntn/web/read-continuation/v1\\0${payload}`);\n}\n\nfunction isReadContinuationEnvelope(value: unknown): value is ReadContinuationEnvelope {\n  if (typeof value !== \"object\" || value === null) return false;\n  const envelope = value as Readonly<Record<string, unknown>>;\n  return typeof envelope.payload === \"string\" && typeof envelope.checksum === \"string\";\n}\n\nfunction isReadContinuationPayload(value: unknown): value is ReadContinuationPayload {\n  if (typeof value !== \"object\" || value === null) return false;\n  const payload = value as Readonly<Record<string, unknown>>;\n  const strings = [\n    payload.provider,\n    payload.requestedProvider,\n    payload.requestFingerprint,\n    payload.contentFingerprint,\n  ];\n  const hasRequiredStrings = strings.every((item) => typeof item === \"string\" && item.length > 0);\n  return (\n    payload.version === 1 &&\n    hasRequiredStrings &&\n    typeof payload.offset === \"number\" &&\n    Number.isSafeInteger(payload.offset) &&\n    payload.offset >= 0\n  );\n}\n"],"mappings":"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"}