/** * The values that tie one actor's rows together across event types. * * Every field is optional by construction, and that is the point. A key is present only when it * carries something usable; anything blank comes back `undefined` and can never reach the * correlation frontier. */ export interface JoinKeys { requestId?: string; clientIp?: string; sessionKey?: string; loginKey?: string; userId?: string; /** * One Salesforce transaction — a save and everything it cascaded into. The strongest causal * link available: rows sharing it did not merely happen near each other, they happened * *because* of each other. */ transactionId?: string; /** A real-time event's own identity, which other events point at. */ eventIdentifier?: string; /** * The event this one was caused by. Points at another row's {@link eventIdentifier}, so * following it walks from an action to its consequences rather than to its neighbours. */ relatedEventIdentifier?: string; } /** * Every key type, in one place. * * The cardinality index and the correlation engine both walk this list. Kept here so adding a * key cannot reach one of them and miss the other — a key the engine expands through but the * index does not measure would bypass the cardinality gate entirely. */ export declare const JOIN_KEY_TYPES: readonly ["requestId", "clientIp", "sessionKey", "loginKey", "userId", "transactionId", "eventIdentifier", "relatedEventIdentifier"]; export type JoinKeyType = (typeof JOIN_KEY_TYPES)[number]; /** * Extract the join keys from a raw ELF or Real-Time Event row. * * This function is the whole of Invariant 1. A blank value never becomes a key, so the * correlation engine cannot expand through one — it has no opportunity to get this wrong, and * no obligation to remember the rule. * * The failure this prevents is specific and was observed: a blank REQUEST_ID admitted to the * join set stops behaving like an identifier and starts behaving like a wildcard, matching every * other row whose REQUEST_ID is also blank. During the 2026-08-02 reconstruction that turned * 2 genuinely related rows into 25, most of them other people's sessions. */ export declare function joinKeysOf(row: Record): JoinKeys; //# sourceMappingURL=JoinKeys.d.ts.map