/**
 * Polling ingestor — interval-based HTTP poller.
 *
 * Periodically hits an HTTP endpoint using the connection's resolved
 * secrets and headers, extracts individual items from the response,
 * deduplicates by a configurable field, and pushes new items into
 * the ring buffer.
 *
 * Unlike WebSocket ingestors (which maintain persistent connections)
 * or webhook ingestors (which are passive receivers), poll ingestors
 * are active requesters on a timer.
 *
 * Designed as a single concrete class — all service-specific behavior
 * (response shape, event type, deduplication field) is parameterized
 * via `PollIngestorConfig` rather than requiring subclasses.
 *
 * @see https://developers.notion.com/reference (Notion — first implementor)
 * @see https://developers.linear.app/docs/graphql/working-with-the-graphql-api (Linear — first implementor)
 */
import { BaseIngestor } from '../base-ingestor.js';
import type { PollIngestorConfig } from '../types.js';
export declare class PollIngestor extends BaseIngestor {
    private pollTimer;
    private readonly seenIds;
    private consecutiveErrors;
    private readonly url;
    private readonly intervalMs;
    private readonly method;
    private readonly body;
    private readonly deduplicateBy;
    private readonly responsePath;
    private readonly eventType;
    private readonly pollHeaders;
    private readonly useEtag;
    private lastEtag;
    /** Resolved headers from the parent connection route (injected by manager). */
    private readonly routeHeaders;
    constructor(connectionAlias: string, secrets: Record<string, string>, pollConfig: PollIngestorConfig, 
    /** Pre-resolved headers from the connection's route. */
    routeHeaders: Record<string, string>, bufferSize?: number, instanceId?: string);
    start(): Promise<void>;
    stop(_permanent?: boolean): Promise<void>;
    private poll;
    /**
     * Extract items from the response using the configured responsePath.
     * E.g., "results" extracts response.results,
     * "data.issues.nodes" extracts response.data.issues.nodes.
     * If no responsePath, returns the response itself (expects a top-level array).
     */
    private extractItems;
    /**
     * Resolve a dot-separated path on an object.
     * E.g., "data.name" on { data: { name: "t3_abc" } } → "t3_abc".
     * Single-segment paths (e.g., "id") resolve as a simple property lookup.
     */
    private static resolveNestedPath;
    /**
     * Check if an item should be pushed into the buffer (dedup check).
     * Returns true if the item is new (not previously seen).
     * Supports dot-separated paths in `deduplicateBy` (e.g., "data.name").
     */
    private shouldPush;
    /**
     * Prune the seen IDs set to prevent unbounded memory growth.
     * Removes the oldest half of entries. Since Set preserves insertion order,
     * we can iterate and delete the first N entries.
     */
    private pruneSeenIds;
    /**
     * Extract an idempotency key from a poll item using the `deduplicateBy` field.
     * Supports dot-separated paths (e.g., "data.name").
     * Returns `undefined` if no dedup field is configured or the field is absent.
     */
    private extractItemIdempotencyKey;
    /**
     * Resolve ${VAR} placeholders in a string using a secrets map.
     */
    static resolvePlaceholders(str: string, secrets: Record<string, string>): string;
}
//# sourceMappingURL=poll-ingestor.d.ts.map