import type { InboundBatch } from './reference-adapter.js'; /** 한 번 채우고 나서 남는 사실. */ export interface FillOutcome { /** 트윈에 넣은 레코드 수. */ applied: number; /** * ingest 가 낸 네 갈래의 합 — **두 갈래로는 셈이 안 닫힌다.** * * ``` * 두 갈래 157 − 46 − 2 = 109 「설명 못 함」 진실은 되풀이 108 + 어휘 1 * 네 갈래 157 − 46 − 2 − 108 − 1 = 0 * ``` * * 이 값이 없으면 원본 쪽에서 「보낸 것 20개 중 event 가 9개인데 나머지는 어디 갔나」를 셀 수 * 없다. 실제로 인티그레이션 레인이 그것을 물었고, 그 수가 트윈에 저장되지 않아 답을 못 했다. */ duplicates: number; rejected: number; /** * 왜 거절됐나 — **사유별 수.** 수만 내면 「26건이 안 들어온다」에서 멈춘다. * * 목록 전체가 아니라 사유별로 센다. 같은 이유로 거절된 26건이 26줄이면 읽는 사람이 그 줄을 * 세어야 하고, 다른 이유 하나가 그 안에 묻힌다. */ rejectedReasons?: Record; vocabulary: number; /** 시각을 못 읽어 ingest 시각으로 떨어진 것 — 종류별. 비어 있으면 전부 자기 시각을 말했다. */ undated?: Record; /** 몇 쪽을 받았나. */ pages: number; /** 커서가 어디까지 갔나 — 아무것도 못 받았으면 없다. */ lastSeq?: number; /** * 이 실행에서 **가장 낮게 받아들인 번호** — 밑에서부터 다시 받았을 때 이것이 곧 「우리가 가진 * 가장 낮은 번호」다. */ lowestSeq?: number; /** 왜 멈췄나 — `done` · `gap` · `no-progress` · `page-limit` · `refused`. */ stopped: 'done' | 'gap' | 'no-progress' | 'page-limit' | 'refused'; /** 멈춘 이유의 사람 말. 알리지 않고 끝내지 않는다. */ detail?: string; /** * 마지막으로 받은 묶음이 말한 **원본의 번호 범위** — 원본이 안 말하면 없다. * * 우리 커서와 견주는 자리가 이 값을 쓴다. 없으면 「맞다」가 아니라 **「모른다」**로 답해야 한다. */ sourceRange?: { first?: number; last?: number; }; } /** * 그 단위의 놓친 구간을 채운다. * * `ingest` 를 부르는 쪽이 넘겨 준다 — 훅과 같은 이유다(이 파일이 엔진을 직접 부르면 시험이 엔진을 * 세워야 한다). */ export declare function fillSince(args: { cfg: Record; site: { siteId: string; }; /** 번호를 매기는 단위 — 커서 열쇠의 절반. 커넥터가 만들지 않는다. */ scope: string; /** 커서에 적힌 열쇠 — `pushCursorKey(instanceId, scope)`. */ cursorKey: string; /** 지금 커서 — 이 함수가 읽고, 나아간 만큼 되돌려 준다. */ cursor: unknown; fetch: (cfg: Record, site: { siteId: string; }, scope: string, since: number) => Promise; ingest: (records: unknown[]) => { applied: number; duplicates: number; rejected: unknown[]; }; /** * 넣기 **직전에** 부른다 — 이 쪽의 레코드를 넘긴다. * * 중복 판정 기억을 저널에서 채우는 자리다(§`fill-dedupe.ts`). 그 기억은 프로세스 안에만 있어서 * 재기동하면 비워지고, 그러면 이미 저널에 있는 사실도 「처음 본 것」이 된다. * * `ingest` 는 동기라 여기서 채울 수 없다. 이 훅은 비동기이므로 저널을 읽을 수 있다. * * 실패해도 넣기를 멈추지 않는다 — 기억을 못 채운 것이 사실을 못 받을 이유는 아니다. */ beforeIngest?: (records: unknown[]) => Promise; saveCursor: (cursor: Record) => Promise; maxPages?: number; }): Promise;