import type { WorkCalendarEntry } from '@operato/ops-contract'; /** * 창의 종류 — **호스트가 채워야 하는 것**만 이름이 있다. * * 지금은 하나다. 늘리기 전에 「호스트가 그것을 계산할 근거를 갖고 있나」를 먼저 물어야 한다 — * 좌표 없이 `daylight` 를 선언하면 호스트가 채울 것이 없고, 그러면 그 축은 창이 없는 것과 같다. */ export type LiveWindowKind = 'daylight'; /** 한 축의 시간성 — 어느 사실이 언제·얼마나 자주 오나. */ export interface LiveCadence { /** * 어느 축인가 — **`OP_EVENT` 의 값 그대로**(`equipment.status` · `quality.output` …). * * 새 낱말을 만들지 않는다. 만들면 커넥터가 부르는 이름과 장부가 세는 이름이 갈리고, 그때 * 선언이 조용히 아무 축에도 안 붙는다. */ axis: string; /** * 활동 시각 안에서 **이만큼 조용해도 정상**(ms). 없으면 창 하나로 견준다. * * 15분마다 긷는 원천은 이 값을 선언해야 한다 — 안 하면 긷는 사이마다 「유입 없음」으로 보인다. */ expectedSilenceMs?: number; /** * 이 축이 **활동하는 창** — 근무 달력 어휘 그대로(요일·시간대·휴일). * * 계약이 이미 그 셋을 표현한다. 새 모양을 만들지 않는 이유는 판정하는 함수가 이미 하나 * 있기 때문이다(`inWorkCalendar`) — 두 벌이면 화면과 커널이 다른 답을 낸다. */ window?: readonly WorkCalendarEntry[]; /** * 창을 **호스트가 채우는 종류** — 좌표·표준으로 계산해야 하는 것. * * `window` 와 함께 선언하면 호스트가 채운 것이 이긴다(계산이 선언보다 그 날에 맞다). */ windowKind?: LiveWindowKind; /** * **보내면 온다** — 이 축은 침묵으로 판정하지 않는다(훅·구독). * * 「주기가 없다」와 「모른다」를 가르는 값이다. 훅은 보낼 것이 없으면 안 보내고, 그것이 정상이다. */ pushed?: boolean; } /** 그 축의 선언을 찾는다 — 없으면 `undefined`(옛 거동으로 견준다). */ export declare function cadenceOf(cadences: readonly LiveCadence[] | undefined, axis: string): LiveCadence | undefined; /** * 유입 건강이 이 축을 어떻게 견줄 것인가 — **판정에 넘길 두 값으로 옮긴다.** * * `syncVerdictOf` 가 받는 모양(§`ingest-health.ts`)에 맞춘다. 그 함수는 순수하고 달력을 보지 * 않으므로, 창 판정은 여기서 끝내고 참·거짓만 넘긴다 — `capabilityOf` 가 `requiredTests` 를 받는 * 것과 같은 규율이다. * * ── 「보내면 온다」는 침묵으로 판정하지 않는다 ────────────────────────────── * `pushed` 면 `quietNow` 를 늘 참으로 낸다. 그러면 침묵이 「유입 없음」이 되지 않는다. **다른 * 갈래는 그대로 산다** — 버려지는 중·결선 없음은 몇 시든 문제이고 그것들이 이 값보다 앞선다. * * ── 모르면 아무것도 답하지 않는다 ────────────────────────────────────────── * 선언이 없으면 둘 다 비운다. 그때 판정은 지금까지처럼 창 하나로 견준다 — 「모른다」를 「안 와도 * 된다」로 접으면 정말 끊긴 원천이 통째로 조용해진다. */ export declare function ingestExpectation(cadence: LiveCadence | undefined, ctx: { nowMs: number; utcOffsetMinutes?: number; inWindow?: (window: readonly WorkCalendarEntry[]) => boolean; }): { expectedSilenceMs?: number; quietNow?: boolean; };