import type { ISOTime } from '@operato/ops-contract'; /** 관측 하나 — 오더 상태 보고에서 필요한 것만. */ export interface OrderObservation { orderId: string; status: string; /** 이 보고를 관측한 시각. 없으면 이을 수 없다 — 언제인지 모르는 효과는 적지 않는다. */ at?: ISOTime; } /** 이을 대상 — 저장소가 `dispatchRef` 로 찾아 준 조치. */ export interface DispatchedCommand { id: string; dispatchRef: string; /** 이미 적힌 효과가 있나 — 몇 번 보고됐는지를 이어서 센다. */ effect?: { status: string; at: ISOTime; seen: number; }; } /** 적을 것 하나. */ export interface EffectUpdate { commandId: string; status: string; at: ISOTime; seen: number; } export interface EffectMatch { updates: EffectUpdate[]; /** 이을 수 없던 관측과 그 이유 — 조용히 버리지 않는다. */ skips: { orderId: string; reason: string; }[]; } /** * 한 번에 여러 관측을 잇는다. * * **같은 오더가 한 묶음에 여러 번 올 수 있다.** 그때는 마지막 것이 남고 `seen` 이 그만큼 는다 — * 중간 상태를 덮어쓰는 것이 맞다(화면이 묻는 것은 「지금 저쪽에서 무엇인가」다). 다만 몇 번 바뀌었는지는 * 남긴다. 한 번도 안 바뀐 것과 다섯 번 바뀐 것은 다른 일이다. */ export declare function matchEffects(args: { observations: readonly OrderObservation[]; /** `dispatchRef` → 그 지시를 낸 조치. 저장소가 채운다. */ byRef: ReadonlyMap; }): EffectMatch; /** * 이 묶음에서 **찾아봐야 할 오더 식별자**만 골라낸다 — 저장소에 물을 것을 줄인다. * * 관측 한 묶음이 수백 건일 수 있고 그중 우리가 낸 것은 몇 건이다. 전부를 하나씩 물으면 유입 경로에 * 질의가 그만큼 붙는다 — 유입은 초당 수천 건이 지나는 자리다. */ export declare function refsToLookUp(observations: readonly OrderObservation[]): string[];