scrapex 1.0.0-beta.1 → 1.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/embeddings/index.cjs +52 -0
  2. package/dist/embeddings/index.d.cts +3 -0
  3. package/dist/embeddings/index.d.mts +3 -0
  4. package/dist/embeddings/index.mjs +4 -0
  5. package/dist/embeddings-BjNTQSG9.cjs +1455 -0
  6. package/dist/embeddings-BjNTQSG9.cjs.map +1 -0
  7. package/dist/embeddings-Bsymy_jA.mjs +1215 -0
  8. package/dist/embeddings-Bsymy_jA.mjs.map +1 -0
  9. package/dist/enhancer-Cs_WyWtJ.cjs +219 -0
  10. package/dist/enhancer-Cs_WyWtJ.cjs.map +1 -0
  11. package/dist/enhancer-INx5NlgO.mjs +177 -0
  12. package/dist/enhancer-INx5NlgO.mjs.map +1 -0
  13. package/dist/{enhancer-j0xqKDJm.cjs → http-base-CHLf-Tco.cjs} +36 -199
  14. package/dist/http-base-CHLf-Tco.cjs.map +1 -0
  15. package/dist/{enhancer-ByjRD-t5.mjs → http-base-DM7YNo6X.mjs} +25 -176
  16. package/dist/http-base-DM7YNo6X.mjs.map +1 -0
  17. package/dist/{index-CDgcRnig.d.cts → index-Bvseqli-.d.cts} +1 -1
  18. package/dist/{index-CDgcRnig.d.cts.map → index-Bvseqli-.d.cts.map} +1 -1
  19. package/dist/{index-piS5wtki.d.mts → index-CIFjNySr.d.mts} +1 -1
  20. package/dist/{index-piS5wtki.d.mts.map → index-CIFjNySr.d.mts.map} +1 -1
  21. package/dist/index-D6qfjmZQ.d.mts +401 -0
  22. package/dist/index-D6qfjmZQ.d.mts.map +1 -0
  23. package/dist/index-RFSpP5g8.d.cts +401 -0
  24. package/dist/index-RFSpP5g8.d.cts.map +1 -0
  25. package/dist/index.cjs +39 -1074
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +3 -260
  28. package/dist/index.d.cts.map +1 -1
  29. package/dist/index.d.mts +3 -260
  30. package/dist/index.d.mts.map +1 -1
  31. package/dist/index.mjs +4 -1039
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/llm/index.cjs +7 -6
  34. package/dist/llm/index.cjs.map +1 -1
  35. package/dist/llm/index.d.cts +1 -1
  36. package/dist/llm/index.d.mts +1 -1
  37. package/dist/llm/index.mjs +2 -1
  38. package/dist/llm/index.mjs.map +1 -1
  39. package/dist/parsers/index.d.cts +1 -1
  40. package/dist/parsers/index.d.mts +1 -1
  41. package/dist/parsers/index.mjs +1 -1
  42. package/dist/{parsers-CwkYnyWY.mjs → parsers-DsawHeo0.mjs} +1 -1
  43. package/dist/{parsers-CwkYnyWY.mjs.map → parsers-DsawHeo0.mjs.map} +1 -1
  44. package/dist/{types-CadAXrme.d.mts → types-BOcHQU9s.d.mts} +308 -151
  45. package/dist/types-BOcHQU9s.d.mts.map +1 -0
  46. package/dist/{types-DPEtPihB.d.cts → types-DutdBpqd.d.cts} +308 -151
  47. package/dist/types-DutdBpqd.d.cts.map +1 -0
  48. package/package.json +1 -1
  49. package/dist/enhancer-ByjRD-t5.mjs.map +0 -1
  50. package/dist/enhancer-j0xqKDJm.cjs.map +0 -1
  51. package/dist/types-CadAXrme.d.mts.map +0 -1
  52. package/dist/types-DPEtPihB.d.cts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-base-DM7YNo6X.mjs","names":["message: string","DEFAULT_RETRY: Required<RetryConfig>","lastError: Error | undefined","DEFAULT_CIRCUIT_BREAKER: Required<CircuitBreakerConfig>","parsed: URL","dns","securityOptions: HttpSecurityOptions","result: FetchResult<T>"],"sources":["../src/core/errors.ts","../src/common/errors.ts","../src/common/resilience.ts","../src/common/http-base.ts"],"sourcesContent":["/**\n * Error codes for scraping failures\n */\nexport type ScrapeErrorCode =\n | 'FETCH_FAILED'\n | 'TIMEOUT'\n | 'INVALID_URL'\n | 'BLOCKED'\n | 'NOT_FOUND'\n | 'ROBOTS_BLOCKED'\n | 'PARSE_ERROR'\n | 'LLM_ERROR'\n | 'VALIDATION_ERROR';\n\n/**\n * Custom error class for scraping failures with structured error codes\n */\nexport class ScrapeError extends Error {\n public readonly code: ScrapeErrorCode;\n public readonly statusCode?: number;\n\n constructor(message: string, code: ScrapeErrorCode, statusCode?: number, cause?: Error) {\n super(message, { cause });\n this.name = 'ScrapeError';\n this.code = code;\n this.statusCode = statusCode;\n\n // Maintains proper stack trace in V8 environments\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ScrapeError);\n }\n }\n\n /**\n * Create a ScrapeError from an unknown error\n */\n static from(error: unknown, code: ScrapeErrorCode = 'FETCH_FAILED'): ScrapeError {\n if (error instanceof ScrapeError) {\n return error;\n }\n\n if (error instanceof Error) {\n return new ScrapeError(error.message, code, undefined, error);\n }\n\n return new ScrapeError(String(error), code);\n }\n\n /**\n * Check if error is retryable (network issues, timeouts)\n */\n isRetryable(): boolean {\n return this.code === 'FETCH_FAILED' || this.code === 'TIMEOUT';\n }\n\n /**\n * Convert to a plain object for serialization\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n stack: this.stack,\n };\n }\n}\n","/**\n * Error normalization utilities for HTTP providers.\n * Maps HTTP status codes to consistent ScrapeError codes.\n */\n\nimport { ScrapeError, type ScrapeErrorCode } from '../core/errors.js';\n\n/**\n * HTTP status code to ScrapeError code mapping.\n */\nexport function getErrorCodeFromStatus(status: number): ScrapeErrorCode {\n if (status === 401 || status === 403) {\n return 'BLOCKED';\n }\n if (status === 404) {\n return 'NOT_FOUND';\n }\n if (status === 429) {\n return 'BLOCKED';\n }\n if (status === 408) {\n return 'TIMEOUT';\n }\n if (status >= 500) {\n return 'LLM_ERROR';\n }\n return 'FETCH_FAILED';\n}\n\n/**\n * Retryable HTTP status codes.\n */\nexport const RETRYABLE_STATUS_CODES = [\n 408, // Request Timeout\n 429, // Too Many Requests\n 500, // Internal Server Error\n 502, // Bad Gateway\n 503, // Service Unavailable\n 504, // Gateway Timeout\n] as const;\n\n/**\n * Check if an HTTP status code is retryable.\n */\nexport function isRetryableStatus(status: number): boolean {\n return RETRYABLE_STATUS_CODES.includes(status as (typeof RETRYABLE_STATUS_CODES)[number]);\n}\n\n/**\n * Parse error message from API response body.\n */\nexport async function parseErrorBody(response: Response): Promise<string> {\n try {\n const text = await response.text();\n try {\n const json = JSON.parse(text) as Record<string, unknown>;\n // Common error formats\n if (typeof json.error === 'object' && json.error !== null) {\n const error = json.error as Record<string, unknown>;\n return String(error.message ?? error.msg ?? JSON.stringify(error));\n }\n if (typeof json.error === 'string') {\n return json.error;\n }\n if (typeof json.message === 'string') {\n return json.message;\n }\n if (typeof json.detail === 'string') {\n return json.detail;\n }\n return text;\n } catch {\n return text || `HTTP ${response.status} ${response.statusText}`;\n }\n } catch {\n return `HTTP ${response.status} ${response.statusText}`;\n }\n}\n\n/**\n * Create a ScrapeError from an HTTP response.\n */\nexport async function createHttpError(\n response: Response,\n providerName: string,\n errorMapper?: (body: unknown) => string\n): Promise<ScrapeError> {\n const code = getErrorCodeFromStatus(response.status);\n\n let message: string;\n if (errorMapper) {\n try {\n const body = await response.json();\n message = errorMapper(body);\n } catch {\n message = await parseErrorBody(response);\n }\n } else {\n message = await parseErrorBody(response);\n }\n\n return new ScrapeError(\n `${providerName} API error (${response.status}): ${message}`,\n code,\n response.status\n );\n}\n\n/**\n * Normalize any error to ScrapeError.\n */\nexport function normalizeError(\n error: unknown,\n providerName: string,\n defaultCode: ScrapeErrorCode = 'LLM_ERROR'\n): ScrapeError {\n if (error instanceof ScrapeError) {\n return error;\n }\n\n if (error instanceof Error) {\n // Check for abort/timeout\n if (error.name === 'AbortError' || error.message.includes('timeout')) {\n return new ScrapeError(`${providerName} request timed out`, 'TIMEOUT', undefined, error);\n }\n\n // Check for network errors\n const code = (error as NodeJS.ErrnoException).code;\n if (code === 'ECONNREFUSED' || code === 'ENOTFOUND' || code === 'ENETUNREACH') {\n return new ScrapeError(\n `${providerName} connection failed: ${error.message}`,\n 'FETCH_FAILED',\n undefined,\n error\n );\n }\n\n return new ScrapeError(\n `${providerName} error: ${error.message}`,\n defaultCode,\n undefined,\n error\n );\n }\n\n return new ScrapeError(`${providerName} error: ${String(error)}`, defaultCode);\n}\n","/**\n * Shared resilience utilities for HTTP providers.\n * Provides retry, circuit breaker, rate limiting, timeout, and concurrency control.\n */\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Retry configuration.\n */\nexport interface RetryConfig {\n /** Maximum retry attempts. @default 3 */\n maxAttempts?: number;\n /** Initial backoff delay in ms. @default 1000 */\n backoffMs?: number;\n /** Backoff multiplier. @default 2 */\n backoffMultiplier?: number;\n /** HTTP status codes to retry. @default [408, 429, 500, 502, 503, 504] */\n retryableStatuses?: number[];\n}\n\n/**\n * Circuit breaker configuration.\n */\nexport interface CircuitBreakerConfig {\n /** Failures before opening circuit. @default 5 */\n failureThreshold?: number;\n /** Time before attempting to close circuit. @default 30000 */\n resetTimeoutMs?: number;\n}\n\n/**\n * Rate limit configuration.\n */\nexport interface RateLimitConfig {\n /** Max requests per minute */\n requestsPerMinute?: number;\n /** Max tokens per minute (for LLM providers) */\n tokensPerMinute?: number;\n}\n\n/**\n * Circuit breaker state.\n */\nexport type CircuitState = 'closed' | 'open' | 'half-open';\n\n/**\n * Internal circuit breaker state.\n */\nexport interface CircuitBreakerState {\n state: CircuitState;\n failures: number;\n lastFailureTime?: number;\n nextAttemptTime?: number;\n}\n\n/**\n * Resilience configuration for HTTP providers.\n */\nexport interface ResilienceConfig {\n retry?: RetryConfig;\n circuitBreaker?: CircuitBreakerConfig;\n rateLimit?: RateLimitConfig;\n /** Request timeout in ms. @default 30000 */\n timeoutMs?: number;\n /** Max concurrent requests. @default 1 */\n concurrency?: number;\n /** Optional shared state for circuit breaker / rate limiter / semaphore */\n state?: ResilienceState;\n}\n\n/**\n * Shared resilience state for persistence across calls.\n */\nexport interface ResilienceState {\n circuitBreaker?: {\n isOpen(): boolean;\n recordSuccess(): void;\n recordFailure(): void;\n getState?(): CircuitState;\n };\n rateLimiter?: {\n acquire(): Promise<void>;\n };\n semaphore?: {\n execute<T>(fn: () => Promise<T>): Promise<T>;\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Retry Logic\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Default retry configuration.\n */\nconst DEFAULT_RETRY: Required<RetryConfig> = {\n maxAttempts: 3,\n backoffMs: 1000,\n backoffMultiplier: 2,\n retryableStatuses: [408, 429, 500, 502, 503, 504],\n};\n\n/**\n * Errors that should be retried (transient failures).\n */\nconst RETRYABLE_ERROR_CODES = [\n 'ECONNRESET',\n 'ETIMEDOUT',\n 'ECONNREFUSED',\n 'EPIPE',\n 'ENOTFOUND',\n 'ENETUNREACH',\n 'EAI_AGAIN',\n];\n\n/**\n * Check if an error is retryable.\n */\nexport function isRetryableError(\n error: unknown,\n retryableStatuses: number[] = DEFAULT_RETRY.retryableStatuses\n): boolean {\n if (error instanceof Error) {\n // Check for network errors\n const code = (error as NodeJS.ErrnoException).code;\n if (code && RETRYABLE_ERROR_CODES.includes(code)) {\n return true;\n }\n\n // Check for HTTP status codes on error object\n if ('statusCode' in error && typeof error.statusCode === 'number') {\n return retryableStatuses.includes(error.statusCode);\n }\n if ('status' in error && typeof error.status === 'number') {\n return retryableStatuses.includes(error.status);\n }\n\n // Check for timeout/fetch errors by code\n if ('code' in error) {\n const errCode = error.code as string;\n if (errCode === 'TIMEOUT' || errCode === 'FETCH_FAILED') {\n return true;\n }\n }\n\n // Check message for common retryable patterns\n const message = error.message.toLowerCase();\n if (\n message.includes('timeout') ||\n message.includes('rate limit') ||\n message.includes('too many requests') ||\n message.includes('temporarily unavailable')\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Sleep for specified milliseconds.\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Execute a function with retry logic.\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config?: RetryConfig,\n onRetry?: (attempt: number, error: Error, delayMs: number) => void\n): Promise<{ result: T; attempts: number }> {\n const maxAttempts = config?.maxAttempts ?? DEFAULT_RETRY.maxAttempts;\n const backoffMs = config?.backoffMs ?? DEFAULT_RETRY.backoffMs;\n const multiplier = config?.backoffMultiplier ?? DEFAULT_RETRY.backoffMultiplier;\n const retryableStatuses = config?.retryableStatuses ?? DEFAULT_RETRY.retryableStatuses;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const result = await fn();\n return { result, attempts: attempt };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry on last attempt or non-retryable errors\n if (attempt === maxAttempts || !isRetryableError(error, retryableStatuses)) {\n throw lastError;\n }\n\n // Calculate delay with exponential backoff\n const delay = backoffMs * multiplier ** (attempt - 1);\n\n // Add jitter (±10%)\n const jitter = delay * (0.9 + Math.random() * 0.2);\n\n onRetry?.(attempt, lastError, jitter);\n\n await sleep(jitter);\n }\n }\n\n throw lastError ?? new Error('Retry failed');\n}\n\n// ─────────────────────────────────────────────────────────────\n// Timeout\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Execute a function with timeout.\n */\nexport async function withTimeout<T>(\n fn: (signal: AbortSignal) => Promise<T>,\n timeoutMs: number\n): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n return await fn(controller.signal);\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Create an AbortSignal that times out after specified milliseconds.\n * If parentSignal is provided, this signal will abort when the parent aborts.\n */\nexport function createTimeoutSignal(timeoutMs: number, parentSignal?: AbortSignal): AbortSignal {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n timeoutId.unref?.();\n\n const clear = () => clearTimeout(timeoutId);\n controller.signal.addEventListener('abort', clear, { once: true });\n\n if (parentSignal) {\n if (parentSignal.aborted) {\n clear();\n controller.abort(parentSignal.reason);\n return controller.signal;\n }\n\n parentSignal.addEventListener(\n 'abort',\n () => {\n clear();\n controller.abort(parentSignal.reason);\n },\n { once: true }\n );\n }\n return controller.signal;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Circuit Breaker\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Default circuit breaker configuration.\n */\nconst DEFAULT_CIRCUIT_BREAKER: Required<CircuitBreakerConfig> = {\n failureThreshold: 5,\n resetTimeoutMs: 30000,\n};\n\n/**\n * Error thrown when circuit breaker is open.\n */\nexport class CircuitOpenError extends Error {\n readonly isCircuitOpen = true;\n\n constructor(message: string) {\n super(message);\n this.name = 'CircuitOpenError';\n }\n}\n\n/**\n * Circuit breaker implementation.\n * Prevents cascade failures by stopping requests when failure rate is high.\n */\nexport class CircuitBreaker {\n private state: CircuitBreakerState;\n private readonly failureThreshold: number;\n private readonly resetTimeoutMs: number;\n\n constructor(config?: CircuitBreakerConfig) {\n this.failureThreshold = config?.failureThreshold ?? DEFAULT_CIRCUIT_BREAKER.failureThreshold;\n this.resetTimeoutMs = config?.resetTimeoutMs ?? DEFAULT_CIRCUIT_BREAKER.resetTimeoutMs;\n this.state = {\n state: 'closed',\n failures: 0,\n };\n }\n\n /**\n * Check if requests are blocked.\n */\n isOpen(): boolean {\n this.updateState();\n return this.state.state === 'open';\n }\n\n /**\n * Get current circuit state.\n */\n getState(): CircuitState {\n this.updateState();\n return this.state.state;\n }\n\n /**\n * Record a successful request.\n */\n recordSuccess(): void {\n this.state.failures = 0;\n this.state.state = 'closed';\n this.state.lastFailureTime = undefined;\n this.state.nextAttemptTime = undefined;\n }\n\n /**\n * Record a failed request.\n */\n recordFailure(): void {\n this.state.failures++;\n this.state.lastFailureTime = Date.now();\n\n if (this.state.failures >= this.failureThreshold) {\n this.state.state = 'open';\n this.state.nextAttemptTime = Date.now() + this.resetTimeoutMs;\n }\n }\n\n /**\n * Execute a function with circuit breaker protection.\n */\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n if (this.isOpen()) {\n const nextAttempt = this.state.nextAttemptTime\n ? new Date(this.state.nextAttemptTime).toISOString()\n : 'unknown';\n throw new CircuitOpenError(`Circuit breaker is open. Next attempt at ${nextAttempt}`);\n }\n\n try {\n const result = await fn();\n this.recordSuccess();\n return result;\n } catch (error) {\n this.recordFailure();\n throw error;\n }\n }\n\n /**\n * Reset the circuit breaker.\n */\n reset(): void {\n this.state = {\n state: 'closed',\n failures: 0,\n };\n }\n\n /**\n * Update state based on time (open -> half-open transition).\n */\n private updateState(): void {\n if (\n this.state.state === 'open' &&\n this.state.nextAttemptTime &&\n Date.now() >= this.state.nextAttemptTime\n ) {\n this.state.state = 'half-open';\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Rate Limiting\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Token bucket rate limiter.\n */\nexport class RateLimiter {\n private tokens: number;\n private lastRefill: number;\n private readonly maxTokens: number;\n private readonly refillRate: number; // tokens per second\n\n constructor(config: RateLimitConfig) {\n // Convert requests per minute to tokens per second\n const requestsPerSecond = (config.requestsPerMinute ?? 60) / 60;\n\n this.maxTokens = Math.max(1, Math.ceil(requestsPerSecond * 10)); // 10 second burst\n this.refillRate = requestsPerSecond;\n this.tokens = this.maxTokens;\n this.lastRefill = Date.now();\n }\n\n /**\n * Check if a request is allowed without consuming tokens.\n */\n canProceed(): boolean {\n this.refill();\n return this.tokens >= 1;\n }\n\n /**\n * Attempt to acquire tokens for a request.\n * Returns true if allowed, false if rate limited.\n */\n tryAcquire(tokens = 1): boolean {\n this.refill();\n\n if (this.tokens >= tokens) {\n this.tokens -= tokens;\n return true;\n }\n\n return false;\n }\n\n /**\n * Wait until tokens are available, then acquire.\n */\n async acquire(tokens = 1): Promise<void> {\n if (this.tryAcquire(tokens)) {\n return;\n }\n\n // Calculate precise wait time for required tokens\n this.refill();\n const tokensNeeded = tokens - this.tokens;\n const waitMs = Math.ceil((tokensNeeded / this.refillRate) * 1000);\n\n if (waitMs > 0) {\n await sleep(waitMs);\n }\n\n // After waiting, acquire should succeed (but retry if timing drift)\n while (!this.tryAcquire(tokens)) {\n await sleep(Math.ceil((1 / this.refillRate) * 1000));\n }\n }\n\n /**\n * Get time until next token is available (in milliseconds).\n */\n getWaitTime(): number {\n this.refill();\n\n if (this.tokens >= 1) {\n return 0;\n }\n\n return Math.ceil((1 / this.refillRate) * 1000);\n }\n\n /**\n * Refill tokens based on elapsed time.\n */\n private refill(): void {\n const now = Date.now();\n const elapsed = (now - this.lastRefill) / 1000; // seconds\n const newTokens = elapsed * this.refillRate;\n\n this.tokens = Math.min(this.maxTokens, this.tokens + newTokens);\n this.lastRefill = now;\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Concurrency Control\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Semaphore for limiting concurrent operations.\n */\nexport class Semaphore {\n private permits: number;\n private waiting: Array<() => void> = [];\n\n constructor(permits: number) {\n this.permits = permits;\n }\n\n /**\n * Acquire a permit, waiting if necessary.\n */\n async acquire(): Promise<void> {\n if (this.permits > 0) {\n this.permits--;\n return;\n }\n\n return new Promise<void>((resolve) => {\n this.waiting.push(resolve);\n });\n }\n\n /**\n * Release a permit.\n */\n release(): void {\n const next = this.waiting.shift();\n if (next) {\n next();\n } else {\n this.permits++;\n }\n }\n\n /**\n * Execute function with semaphore protection.\n */\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n await this.acquire();\n try {\n return await fn();\n } finally {\n this.release();\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Combined Resilience Wrapper\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Execute a function with all resilience features.\n *\n * @param fn - The async function to execute with resilience\n * @param config - Configuration for retry and timeout behavior\n * @param state - Pre-instantiated resilience primitives for stateful features.\n * Circuit breaker, rate limiter, and semaphore must be instantiated by the caller\n * and passed via state to enable those features. This allows sharing state across\n * multiple calls for proper circuit breaker tracking and rate limiting.\n * The config parameter is only used for retry and timeout settings.\n * @param callbacks - Optional callbacks for retry events\n */\nexport async function withResilience<T>(\n fn: (signal: AbortSignal) => Promise<T>,\n config?: ResilienceConfig,\n state?: ResilienceState,\n callbacks?: {\n onRetry?: (attempt: number, error: Error, delayMs: number) => void;\n }\n): Promise<{ result: T; attempts: number }> {\n const timeoutMs = config?.timeoutMs ?? 30000;\n\n // Check circuit breaker\n if (state?.circuitBreaker?.isOpen()) {\n throw new CircuitOpenError('Circuit breaker is open');\n }\n\n // Acquire rate limit token\n if (state?.rateLimiter) {\n await state.rateLimiter.acquire();\n }\n\n // Wrap with concurrency control\n const executeWithConcurrency = async (): Promise<{ result: T; attempts: number }> => {\n // Wrap with timeout\n const withTimeoutFn = () => withTimeout(fn, timeoutMs);\n\n // Wrap with retry\n try {\n const retryResult = await withRetry(withTimeoutFn, config?.retry, callbacks?.onRetry);\n state?.circuitBreaker?.recordSuccess();\n return retryResult;\n } catch (error) {\n state?.circuitBreaker?.recordFailure();\n throw error;\n }\n };\n\n // Apply semaphore if available\n if (state?.semaphore) {\n return state.semaphore.execute(executeWithConcurrency);\n }\n\n return executeWithConcurrency();\n}\n","/**\n * Shared HTTP provider infrastructure for LLM and Embedding providers.\n * Provides SSRF protection, resilience, and error normalization.\n */\nimport { promises as dns } from 'node:dns';\nimport { isIP } from 'node:net';\nimport { ScrapeError } from '../core/errors.js';\nimport { createHttpError } from './errors.js';\nimport type { ResilienceConfig, ResilienceState, RetryConfig } from './resilience.js';\nimport {\n CircuitBreaker,\n CircuitOpenError,\n RateLimiter,\n Semaphore,\n withRetry,\n withTimeout,\n} from './resilience.js';\n\nexport type {\n CircuitBreakerConfig,\n CircuitState,\n RateLimitConfig,\n ResilienceConfig,\n ResilienceState,\n RetryConfig,\n} from './resilience.js';\n// Re-export resilience utilities and types for convenience\nexport {\n CircuitBreaker,\n CircuitOpenError,\n isRetryableError,\n RateLimiter,\n Semaphore,\n sleep,\n withResilience,\n withRetry,\n withTimeout,\n} from './resilience.js';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Security options for HTTP providers.\n */\nexport interface HttpSecurityOptions {\n /** Require HTTPS protocol. @default true */\n requireHttps?: boolean;\n /** Allow private/internal IP addresses. @default false */\n allowPrivate?: boolean;\n /** Resolve DNS and validate IPs before request. @default true */\n resolveDns?: boolean;\n /** Allow HTTP redirects. @default false */\n allowRedirects?: boolean;\n}\n\n/**\n * Base configuration for HTTP providers.\n */\nexport interface BaseHttpConfig<TError = unknown> {\n /** Base URL for the API endpoint */\n baseUrl: string;\n /** Model identifier */\n model: string;\n /** Additional headers */\n headers?: Record<string, string>;\n /** Extract error message from failed response */\n errorMapper?: (response: TError) => string;\n /** Security options */\n requireHttps?: boolean;\n allowPrivate?: boolean;\n resolveDns?: boolean;\n allowRedirects?: boolean;\n /** Resilience options */\n resilience?: ResilienceConfig;\n}\n\n// ─────────────────────────────────────────────────────────────\n// SSRF Protection\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Private IP ranges blocked for SSRF protection.\n */\nconst PRIVATE_IP_PATTERNS = [\n /^10\\./, // 10.0.0.0/8\n /^172\\.(1[6-9]|2\\d|3[01])\\./, // 172.16.0.0/12\n /^192\\.168\\./, // 192.168.0.0/16\n /^127\\./, // 127.0.0.0/8\n /^0\\./, // 0.0.0.0/8\n /^169\\.254\\./, // Link-local\n /^100\\.(6[4-9]|[7-9]\\d|1[01]\\d|12[0-7])\\./, // Carrier-grade NAT 100.64.0.0/10 (RFC 6598)\n /^::1$/, // IPv6 loopback\n /^(fc|fd)[0-9a-f]{2}:/i, // IPv6 private (ULA)\n /^fe80:/i, // IPv6 link-local\n /^fec0:/i, // IPv6 site-local (deprecated but may exist)\n /^::ffff:(10\\.|172\\.(1[6-9]|2\\d|3[01])\\.|192\\.168\\.|127\\.|0\\.)/i, // IPv4-mapped IPv6\n /^localhost$/i,\n];\n\n/**\n * Check if a hostname/IP is private.\n */\nexport function isPrivateHost(hostname: string): boolean {\n return PRIVATE_IP_PATTERNS.some((pattern) => pattern.test(hostname));\n}\n\n/**\n * Validate a URL for security.\n */\nexport function validateUrl(url: string, options: HttpSecurityOptions = {}): URL {\n const requireHttps = options.requireHttps ?? true;\n const allowPrivate = options.allowPrivate ?? false;\n\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new ScrapeError(`Invalid URL: ${url}`, 'INVALID_URL');\n }\n\n // HTTPS enforcement\n if (requireHttps && parsed.protocol !== 'https:') {\n throw new ScrapeError(`HTTPS required. Got: ${parsed.protocol}`, 'VALIDATION_ERROR');\n }\n\n // Private IP check (before DNS resolution)\n if (!allowPrivate && isPrivateHost(parsed.hostname)) {\n throw new ScrapeError(\n `Private/internal addresses not allowed: ${parsed.hostname}`,\n 'VALIDATION_ERROR'\n );\n }\n\n return parsed;\n}\n\n/**\n * Validate URL and resolve DNS to check for private IPs.\n */\nexport async function validateUrlWithDns(\n url: string,\n options: HttpSecurityOptions = {}\n): Promise<void> {\n const parsed = validateUrl(url, options);\n const resolveDns = options.resolveDns ?? true;\n const allowPrivate = options.allowPrivate ?? false;\n\n if (!resolveDns || allowPrivate) {\n return;\n }\n\n const host = parsed.hostname;\n\n // Skip if already an IP address\n if (isIP(host)) {\n return;\n }\n\n // Resolve DNS and check all addresses\n try {\n const addresses = await dns.lookup(host, { all: true });\n for (const addr of addresses) {\n if (isPrivateHost(addr.address)) {\n throw new ScrapeError(\n `DNS resolved to private address: ${host} -> ${addr.address}`,\n 'VALIDATION_ERROR'\n );\n }\n }\n } catch (error) {\n if (error instanceof ScrapeError) {\n throw error;\n }\n const message = error instanceof Error ? error.message : String(error);\n throw new ScrapeError(`Failed to resolve hostname: ${host} (${message})`, 'FETCH_FAILED');\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Base HTTP Provider\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Fetch request options for base provider.\n */\nexport interface FetchOptions {\n method?: 'GET' | 'POST';\n body?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n}\n\n/**\n * Result of a fetch request.\n */\nexport interface FetchResult<T> {\n data: T;\n status: number;\n headers: Headers;\n}\n\n/**\n * Base HTTP provider with shared security and resilience.\n */\nexport abstract class BaseHttpProvider<TError = unknown> {\n protected readonly baseUrl: string;\n protected readonly model: string;\n protected readonly headers: Record<string, string>;\n protected readonly errorMapper?: (response: TError) => string;\n\n // Security options\n protected readonly requireHttps: boolean;\n protected readonly allowPrivate: boolean;\n protected readonly resolveDns: boolean;\n protected readonly allowRedirects: boolean;\n\n // Resilience options\n protected readonly timeoutMs: number;\n protected readonly retryConfig?: RetryConfig;\n protected readonly concurrency: number;\n\n // Resilience state (initialized lazily or passed in)\n private circuitBreaker?: ResilienceState['circuitBreaker'];\n private rateLimiter?: ResilienceState['rateLimiter'];\n private semaphore?: ResilienceState['semaphore'];\n\n constructor(config: BaseHttpConfig<TError>) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.model = config.model;\n this.headers = {\n 'Content-Type': 'application/json',\n ...config.headers,\n };\n this.errorMapper = config.errorMapper;\n\n // Security defaults\n this.requireHttps = config.requireHttps ?? true;\n this.allowPrivate = config.allowPrivate ?? false;\n this.resolveDns = config.resolveDns ?? true;\n this.allowRedirects = config.allowRedirects ?? false;\n\n // Resilience defaults\n this.timeoutMs = config.resilience?.timeoutMs ?? 30000;\n this.retryConfig = config.resilience?.retry;\n this.concurrency = config.resilience?.concurrency ?? 1;\n\n const sharedState = config.resilience?.state;\n\n // Initialize resilience components if configured or provided\n this.circuitBreaker =\n sharedState?.circuitBreaker ??\n (config.resilience?.circuitBreaker\n ? new CircuitBreaker(config.resilience.circuitBreaker)\n : undefined);\n this.rateLimiter =\n sharedState?.rateLimiter ??\n (config.resilience?.rateLimit ? new RateLimiter(config.resilience.rateLimit) : undefined);\n this.semaphore = sharedState?.semaphore ?? new Semaphore(this.concurrency);\n\n // Validate URL on construction\n validateUrl(this.baseUrl, {\n requireHttps: this.requireHttps,\n allowPrivate: this.allowPrivate,\n });\n }\n\n /**\n * Get the current resilience state for persistence across calls.\n */\n getResilienceState(): ResilienceState {\n return {\n circuitBreaker: this.circuitBreaker,\n rateLimiter: this.rateLimiter,\n semaphore: this.semaphore,\n };\n }\n\n /**\n * Make an HTTP request with security and resilience.\n */\n protected async fetch<T>(url: string, options: FetchOptions = {}): Promise<FetchResult<T>> {\n const securityOptions: HttpSecurityOptions = {\n requireHttps: this.requireHttps,\n allowPrivate: this.allowPrivate,\n resolveDns: this.resolveDns,\n allowRedirects: this.allowRedirects,\n };\n\n // Validate URL with DNS resolution\n await validateUrlWithDns(url, securityOptions);\n\n // Check circuit breaker before proceeding\n if (this.circuitBreaker?.isOpen()) {\n throw new CircuitOpenError('Circuit breaker is open. Too many recent failures.');\n }\n\n // Acquire rate limit token if configured\n if (this.rateLimiter) {\n await this.rateLimiter.acquire();\n }\n\n // The actual fetch operation\n const doFetch = async (signal: AbortSignal): Promise<FetchResult<T>> => {\n const composedSignal = options.signal ? AbortSignal.any([options.signal, signal]) : signal;\n const response = await fetch(url, {\n method: options.method ?? 'POST',\n headers: { ...this.headers, ...options.headers },\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: composedSignal,\n redirect: this.allowRedirects ? 'follow' : 'error',\n });\n\n // Validate redirect target if followed\n if (this.allowRedirects && response.redirected) {\n await validateUrlWithDns(response.url, securityOptions);\n }\n\n // Handle errors\n if (!response.ok) {\n // Cast is safe: errorMapper receives the parsed JSON body which matches TError at runtime\n throw await createHttpError(\n response,\n this.constructor.name,\n this.errorMapper as ((body: unknown) => string) | undefined\n );\n }\n\n const data = (await response.json()) as T;\n\n return {\n data,\n status: response.status,\n headers: response.headers,\n };\n };\n\n // Wrap with concurrency control (semaphore)\n const executeWithConcurrency = async (): Promise<FetchResult<T>> => {\n if (!this.semaphore) {\n throw new ScrapeError('Semaphore not initialized', 'VALIDATION_ERROR');\n }\n return this.semaphore.execute(async () => {\n // Apply timeout\n const fetchWithTimeout = async (): Promise<FetchResult<T>> => {\n return withTimeout((signal) => doFetch(signal), this.timeoutMs);\n };\n\n // Apply retry if configured\n try {\n let result: FetchResult<T>;\n if (this.retryConfig) {\n const retryResult = await withRetry(fetchWithTimeout, this.retryConfig);\n result = retryResult.result;\n } else {\n result = await fetchWithTimeout();\n }\n\n // Record success for circuit breaker\n this.circuitBreaker?.recordSuccess();\n return result;\n } catch (error) {\n // Record failure for circuit breaker\n this.circuitBreaker?.recordFailure();\n throw error;\n }\n });\n };\n\n return executeWithConcurrency();\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Utility Exports\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Create standard headers for API requests.\n */\nexport function createHeaders(\n apiKey?: string,\n additionalHeaders?: Record<string, string>\n): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n if (additionalHeaders) {\n Object.assign(headers, additionalHeaders);\n }\n\n return headers;\n}\n"],"mappings":"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"}
@@ -265,4 +265,4 @@ declare class RSSParser implements SourceParser<ParsedFeed, FeedMeta> {
265
265
  }
266
266
  //#endregion
267
267
  export { MarkdownSection as _, parseByHeadings as a, ParserResult as b, isGitHubRepo as c, CodeBlock as d, FeedEnclosure as f, MarkdownLink as g, GitHubMeta as h, extractListLinks as i, parseGitHubUrl as l, FeedMeta as m, RSSParserOptions as n, fetchRepoMeta as o, FeedItem as p, MarkdownParser as r, groupByCategory as s, RSSParser as t, toRawUrl as u, ParsedFeed as v, SourceParser as x, ParsedMarkdown as y };
268
- //# sourceMappingURL=index-CDgcRnig.d.cts.map
268
+ //# sourceMappingURL=index-Bvseqli-.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-CDgcRnig.d.cts","names":[],"sources":["../src/parsers/types.ts","../src/parsers/github.ts","../src/parsers/markdown.ts","../src/parsers/rss.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index-Bvseqli-.d.cts","names":[],"sources":["../src/parsers/types.ts","../src/parsers/github.ts","../src/parsers/markdown.ts","../src/parsers/rss.ts"],"sourcesContent":[],"mappings":"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"}
@@ -265,4 +265,4 @@ declare class RSSParser implements SourceParser<ParsedFeed, FeedMeta> {
265
265
  }
266
266
  //#endregion
267
267
  export { MarkdownSection as _, parseByHeadings as a, ParserResult as b, isGitHubRepo as c, CodeBlock as d, FeedEnclosure as f, MarkdownLink as g, GitHubMeta as h, extractListLinks as i, parseGitHubUrl as l, FeedMeta as m, RSSParserOptions as n, fetchRepoMeta as o, FeedItem as p, MarkdownParser as r, groupByCategory as s, RSSParser as t, toRawUrl as u, ParsedFeed as v, SourceParser as x, ParsedMarkdown as y };
268
- //# sourceMappingURL=index-piS5wtki.d.mts.map
268
+ //# sourceMappingURL=index-CIFjNySr.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-piS5wtki.d.mts","names":[],"sources":["../src/parsers/types.ts","../src/parsers/github.ts","../src/parsers/markdown.ts","../src/parsers/rss.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index-CIFjNySr.d.mts","names":[],"sources":["../src/parsers/types.ts","../src/parsers/github.ts","../src/parsers/markdown.ts","../src/parsers/rss.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,401 @@
1
+ import { D as SafetyConfig, O as TextChunk, S as PiiRedactionConfig, c as EmbeddingCache, g as EmbeddingResult, h as EmbeddingProviderConfig, m as EmbeddingProvider, p as EmbeddingOptions, rt as ScrapedData, s as EmbeddingAggregation, t as ChunkingConfig, u as EmbeddingInputConfig } from "./types-BOcHQU9s.mjs";
2
+
3
+ //#region src/embeddings/aggregation.d.ts
4
+
5
+ /**
6
+ * Aggregate multiple embedding vectors into a single vector or return all.
7
+ *
8
+ * @param vectors - Array of embedding vectors (must all have same dimensions)
9
+ * @param strategy - Aggregation strategy
10
+ * @returns Aggregated result based on strategy
11
+ */
12
+ declare function aggregateVectors(vectors: number[][], strategy?: EmbeddingAggregation): AggregationResult;
13
+ /**
14
+ * Result of vector aggregation.
15
+ */
16
+ type AggregationResult = {
17
+ type: 'single';
18
+ vector: number[];
19
+ dimensions: number;
20
+ } | {
21
+ type: 'multiple';
22
+ vectors: number[][];
23
+ dimensions: number;
24
+ };
25
+ /**
26
+ * Normalize a vector to unit length (L2 normalization).
27
+ */
28
+ declare function normalizeVector(vector: number[]): number[];
29
+ /**
30
+ * Compute cosine similarity between two vectors.
31
+ * Both vectors should be normalized for accurate results.
32
+ */
33
+ declare function cosineSimilarity(a: number[], b: number[]): number;
34
+ /**
35
+ * Compute euclidean distance between two vectors.
36
+ */
37
+ declare function euclideanDistance(a: number[], b: number[]): number;
38
+ /**
39
+ * Compute dot product of two vectors.
40
+ */
41
+ declare function dotProduct(a: number[], b: number[]): number;
42
+ /**
43
+ * Get the dimensions of a vector or set of vectors.
44
+ */
45
+ declare function getDimensions(vectors: number[] | number[][]): number;
46
+ //#endregion
47
+ //#region src/embeddings/cache.d.ts
48
+ interface CacheKeyParams {
49
+ providerKey: string;
50
+ /** Model identifier (may be undefined for custom providers) */
51
+ model?: string;
52
+ dimensions?: number;
53
+ aggregation?: EmbeddingAggregation;
54
+ input?: EmbeddingInputConfig;
55
+ chunking?: ChunkingConfig;
56
+ safety?: SafetyConfig;
57
+ cacheKeySalt?: string;
58
+ content: string;
59
+ }
60
+ /**
61
+ * Generate a content-addressable cache key.
62
+ * Key is based on content hash and embedding configuration.
63
+ * Note: custom RegExp patterns are serialized by source+flags; different
64
+ * constructions can yield different cache keys even if equivalent.
65
+ */
66
+ declare function generateCacheKey(params: CacheKeyParams): string;
67
+ /**
68
+ * Generate a checksum for content verification.
69
+ */
70
+ declare function generateChecksum(content: string): string;
71
+ /**
72
+ * In-memory LRU cache with TTL support.
73
+ * Content-addressable: uses content hash as key, not URL.
74
+ */
75
+ declare class InMemoryEmbeddingCache implements EmbeddingCache {
76
+ private cache;
77
+ private readonly maxEntries;
78
+ private readonly defaultTtlMs;
79
+ constructor(options?: {
80
+ maxEntries?: number;
81
+ ttlMs?: number;
82
+ });
83
+ get(key: string): Promise<EmbeddingResult | undefined>;
84
+ set(key: string, value: EmbeddingResult, options?: {
85
+ ttlMs?: number;
86
+ }): Promise<void>;
87
+ delete(key: string): Promise<boolean>;
88
+ clear(): Promise<void>;
89
+ /**
90
+ * Get cache statistics.
91
+ */
92
+ getStats(): CacheStats;
93
+ /**
94
+ * Evict expired entries.
95
+ */
96
+ cleanup(): number;
97
+ /**
98
+ * Evict least recently used entry.
99
+ */
100
+ private evictLRU;
101
+ }
102
+ /**
103
+ * Cache statistics.
104
+ */
105
+ interface CacheStats {
106
+ /** Current number of entries */
107
+ size: number;
108
+ /** Maximum allowed entries */
109
+ maxEntries: number;
110
+ /** Number of expired entries (not yet cleaned up) */
111
+ expired: number;
112
+ /** Cache utilization (0-1) */
113
+ utilization: number;
114
+ }
115
+ /**
116
+ * Validate that a cached result matches expected parameters.
117
+ */
118
+ declare function validateCachedResult(result: EmbeddingResult, expectedDimensions?: number): boolean;
119
+ /**
120
+ * Create a no-op cache that never stores anything.
121
+ * Useful for disabling caching while maintaining interface compatibility.
122
+ */
123
+ declare function createNoOpCache(): EmbeddingCache;
124
+ /**
125
+ * Get or create the default cache instance.
126
+ */
127
+ declare function getDefaultCache(): InMemoryEmbeddingCache;
128
+ /**
129
+ * Reset the default cache (mainly for testing).
130
+ */
131
+ declare function resetDefaultCache(): Promise<void>;
132
+ //#endregion
133
+ //#region src/embeddings/chunking.d.ts
134
+ /**
135
+ * Heuristic token counting: approximately 4 characters per token.
136
+ * This is a reasonable approximation for English text.
137
+ */
138
+ declare function heuristicTokenCount(text: string): number;
139
+ /**
140
+ * Create a tokenizer function based on configuration.
141
+ */
142
+ declare function createTokenizer(config?: ChunkingConfig['tokenizer']): (text: string) => number;
143
+ /**
144
+ * Split text into overlapping chunks optimized for embedding.
145
+ * Respects sentence boundaries when possible.
146
+ */
147
+ declare function chunkText(text: string, config?: ChunkingConfig): TextChunk[];
148
+ /**
149
+ * Estimate total tokens for a text without chunking.
150
+ */
151
+ declare function estimateTokens(text: string, tokenizer?: ChunkingConfig['tokenizer']): number;
152
+ /**
153
+ * Check if text needs chunking based on token count.
154
+ */
155
+ declare function needsChunking(text: string, maxTokens?: number, tokenizer?: ChunkingConfig['tokenizer']): boolean;
156
+ /**
157
+ * Get statistics about potential chunking.
158
+ */
159
+ declare function getChunkingStats(text: string, config?: ChunkingConfig): {
160
+ inputLength: number;
161
+ estimatedTokens: number;
162
+ estimatedChunks: number;
163
+ willTruncate: boolean;
164
+ };
165
+ //#endregion
166
+ //#region src/embeddings/input.d.ts
167
+ /**
168
+ * Select and prepare input text for embedding based on configuration.
169
+ *
170
+ * @param data - Scraped data to extract input from
171
+ * @param config - Input configuration
172
+ * @returns Selected and prepared text, or undefined if no valid input
173
+ */
174
+ declare function selectInput(data: Partial<ScrapedData>, config?: EmbeddingInputConfig): string | undefined;
175
+ /**
176
+ * Check if the selected input meets minimum requirements.
177
+ */
178
+ declare function validateInput(text: string | undefined, minLength?: number): InputValidation;
179
+ /**
180
+ * Result of input validation.
181
+ */
182
+ type InputValidation = {
183
+ valid: false;
184
+ reason: string;
185
+ } | {
186
+ valid: true;
187
+ text: string;
188
+ wordCount: number;
189
+ charCount: number;
190
+ };
191
+ /**
192
+ * Get a preview of what input would be selected.
193
+ * Useful for debugging and testing.
194
+ */
195
+ declare function previewInput(data: Partial<ScrapedData>, config?: EmbeddingInputConfig, maxLength?: number): string;
196
+ //#endregion
197
+ //#region src/embeddings/pipeline.d.ts
198
+ /**
199
+ * Generate embeddings for scraped data.
200
+ * This is the main entry point for the embedding pipeline.
201
+ */
202
+ declare function generateEmbeddings(data: Partial<ScrapedData>, options: EmbeddingOptions): Promise<EmbeddingResult>;
203
+ /**
204
+ * Embed arbitrary text directly.
205
+ * Standalone function for embedding text outside of scrape().
206
+ */
207
+ declare function embed(text: string, options: EmbeddingOptions): Promise<EmbeddingResult>;
208
+ /**
209
+ * Embed from existing ScrapedData.
210
+ * Useful when you've already scraped and want to add embeddings later.
211
+ */
212
+ declare function embedScrapedData(data: ScrapedData, options: EmbeddingOptions): Promise<EmbeddingResult>;
213
+ //#endregion
214
+ //#region src/embeddings/providers/base.d.ts
215
+ /**
216
+ * Get default model for a provider type.
217
+ */
218
+ declare function getDefaultModel(providerType: string): string;
219
+ //#endregion
220
+ //#region src/embeddings/providers/presets.d.ts
221
+ /**
222
+ * Create an OpenAI embedding provider.
223
+ *
224
+ * @example
225
+ * ```ts
226
+ * const provider = createOpenAIEmbedding({ apiKey: 'sk-...' });
227
+ * const { embeddings } = await provider.embed(['Hello'], { model: 'text-embedding-3-small' });
228
+ * ```
229
+ */
230
+ declare function createOpenAIEmbedding(options?: {
231
+ apiKey?: string;
232
+ model?: string;
233
+ baseUrl?: string;
234
+ organization?: string;
235
+ }): EmbeddingProvider;
236
+ /**
237
+ * Create an Azure OpenAI embedding provider.
238
+ *
239
+ * @example
240
+ * ```ts
241
+ * const provider = createAzureEmbedding({
242
+ * endpoint: 'https://my-resource.openai.azure.com',
243
+ * deploymentName: 'text-embedding-ada-002',
244
+ * apiVersion: '2023-05-15',
245
+ * });
246
+ * ```
247
+ */
248
+ declare function createAzureEmbedding(options: {
249
+ endpoint: string;
250
+ deploymentName: string;
251
+ apiVersion: string;
252
+ apiKey?: string;
253
+ }): EmbeddingProvider;
254
+ /**
255
+ * Create an Ollama embedding provider for local models.
256
+ *
257
+ * LIMITATION: Ollama's /api/embeddings endpoint processes one text at a time,
258
+ * not batches. When multiple chunks are embedded, each chunk triggers a
259
+ * separate HTTP request. This is handled transparently by the pipeline's
260
+ * sequential chunk processing, but may be slower than batch-capable providers.
261
+ * For high-throughput scenarios, consider using OpenAI, Cohere, or HuggingFace
262
+ * which support batch embedding in a single request.
263
+ *
264
+ * @example
265
+ * ```ts
266
+ * const provider = createOllamaEmbedding({ model: 'nomic-embed-text' });
267
+ * ```
268
+ */
269
+ declare function createOllamaEmbedding(options?: {
270
+ baseUrl?: string;
271
+ model?: string;
272
+ }): EmbeddingProvider;
273
+ /**
274
+ * Create a HuggingFace Inference API embedding provider.
275
+ *
276
+ * @example
277
+ * ```ts
278
+ * const provider = createHuggingFaceEmbedding({
279
+ * model: 'sentence-transformers/all-MiniLM-L6-v2',
280
+ * });
281
+ * ```
282
+ */
283
+ declare function createHuggingFaceEmbedding(options: {
284
+ model: string;
285
+ apiKey?: string;
286
+ }): EmbeddingProvider;
287
+ /**
288
+ * Create a Cohere embedding provider.
289
+ *
290
+ * @example
291
+ * ```ts
292
+ * const provider = createCohereEmbedding({ model: 'embed-english-v3.0' });
293
+ * ```
294
+ */
295
+ declare function createCohereEmbedding(options?: {
296
+ apiKey?: string;
297
+ model?: string;
298
+ /** Input type for embeddings. Use 'search_query' for queries, 'search_document' for documents */
299
+ inputType?: 'search_document' | 'search_query' | 'classification' | 'clustering';
300
+ }): EmbeddingProvider;
301
+ /**
302
+ * Feature extraction pipeline type for Transformers.js
303
+ */
304
+ type FeatureExtractionPipeline = (text: string, options?: {
305
+ pooling?: 'mean' | 'cls' | 'max';
306
+ normalize?: boolean;
307
+ }) => Promise<{
308
+ data: Float32Array;
309
+ }>;
310
+ /**
311
+ * Transformers.js module interface for dependency injection.
312
+ */
313
+ interface TransformersModule {
314
+ pipeline: (task: 'feature-extraction', model: string, options?: {
315
+ quantized?: boolean;
316
+ }) => Promise<FeatureExtractionPipeline>;
317
+ env?: {
318
+ cacheDir?: string;
319
+ };
320
+ }
321
+ /**
322
+ * Create a local Transformers.js embedding provider.
323
+ * Uses dependency injection - user provides the imported transformers module.
324
+ *
325
+ * @example
326
+ * ```typescript
327
+ * import * as transformers from '@huggingface/transformers';
328
+ * import { createTransformersEmbedding } from 'scrapex/embeddings';
329
+ *
330
+ * const provider = createTransformersEmbedding(transformers, {
331
+ * model: 'Xenova/all-MiniLM-L6-v2',
332
+ * });
333
+ * ```
334
+ *
335
+ * Required Node.js dependencies:
336
+ * ```
337
+ * npm install @huggingface/transformers onnxruntime-node
338
+ * ```
339
+ */
340
+ declare function createTransformersEmbedding(transformers: TransformersModule, options?: {
341
+ model?: string;
342
+ quantized?: boolean;
343
+ pooling?: 'mean' | 'cls' | 'max';
344
+ normalize?: boolean;
345
+ cacheDir?: string;
346
+ }): EmbeddingProvider;
347
+ /** Recommended models for Transformers.js */
348
+ declare const TRANSFORMERS_MODELS: {
349
+ /** Default - Fast, general purpose (384 dimensions, ~23MB) */
350
+ readonly DEFAULT: "Xenova/all-MiniLM-L6-v2";
351
+ /** Higher quality, more resources (768 dimensions, ~110MB) */
352
+ readonly QUALITY: "Xenova/all-mpnet-base-v2";
353
+ /** Optimized for retrieval (384 dimensions, ~33MB) */
354
+ readonly RETRIEVAL: "Xenova/bge-small-en-v1.5";
355
+ /** Multi-language support (384 dimensions, ~118MB) */
356
+ readonly MULTILINGUAL: "Xenova/multilingual-e5-small";
357
+ };
358
+ //#endregion
359
+ //#region src/embeddings/providers/index.d.ts
360
+ /**
361
+ * Create an embedding provider from configuration.
362
+ * This is the main factory function for creating providers.
363
+ */
364
+ declare function createEmbeddingProvider(config: EmbeddingProviderConfig): EmbeddingProvider;
365
+ /**
366
+ * Type guard to check if a value is an EmbeddingProvider.
367
+ */
368
+ declare function isEmbeddingProvider(value: unknown): value is EmbeddingProvider;
369
+ //#endregion
370
+ //#region src/embeddings/safety.d.ts
371
+ /**
372
+ * Create a redaction function based on configuration.
373
+ * Returns a function that applies all configured PII patterns.
374
+ */
375
+ declare function createPiiRedactor(config: PiiRedactionConfig): (text: string) => RedactionResult;
376
+ /**
377
+ * Result of PII redaction operation.
378
+ */
379
+ interface RedactionResult {
380
+ /** Redacted text */
381
+ text: string;
382
+ /** Whether any redactions were made */
383
+ redacted: boolean;
384
+ /** Total number of redactions */
385
+ redactionCount: number;
386
+ /** Count by redaction type */
387
+ redactionsByType: Record<string, number>;
388
+ }
389
+ /**
390
+ * Simple redaction that applies all default patterns.
391
+ * Use createPiiRedactor() for fine-grained control.
392
+ */
393
+ declare function redactPii(text: string): RedactionResult;
394
+ /**
395
+ * Check if text contains any PII.
396
+ * Useful for validation before sending to external APIs.
397
+ */
398
+ declare function containsPii(text: string, config?: Partial<PiiRedactionConfig>): boolean;
399
+ //#endregion
400
+ export { createNoOpCache as A, euclideanDistance as B, createTokenizer as C, needsChunking as D, heuristicTokenCount as E, validateCachedResult as F, normalizeVector as H, AggregationResult as I, aggregateVectors as L, generateChecksum as M, getDefaultCache as N, CacheStats as O, resetDefaultCache as P, cosineSimilarity as R, chunkText as S, getChunkingStats as T, getDimensions as V, generateEmbeddings as _, createEmbeddingProvider as a, selectInput as b, createAzureEmbedding as c, createOllamaEmbedding as d, createOpenAIEmbedding as f, embedScrapedData as g, embed as h, redactPii as i, generateCacheKey as j, InMemoryEmbeddingCache as k, createCohereEmbedding as l, getDefaultModel as m, containsPii as n, isEmbeddingProvider as o, createTransformersEmbedding as p, createPiiRedactor as r, TRANSFORMERS_MODELS as s, RedactionResult as t, createHuggingFaceEmbedding as u, InputValidation as v, estimateTokens as w, validateInput as x, previewInput as y, dotProduct as z };
401
+ //# sourceMappingURL=index-D6qfjmZQ.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-D6qfjmZQ.d.mts","names":[],"sources":["../src/embeddings/aggregation.ts","../src/embeddings/cache.ts","../src/embeddings/chunking.ts","../src/embeddings/input.ts","../src/embeddings/pipeline.ts","../src/embeddings/providers/base.ts","../src/embeddings/providers/presets.ts","../src/embeddings/providers/index.ts","../src/embeddings/safety.ts"],"sourcesContent":[],"mappings":"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"}