/** * The two error types that mean "this interview question was not decided". * Their own module so `responder-probe` (nobody is listening at all) and the * session reaper (a parked question expired) can both throw without importing * each other. * * Callers catch these to distinguish a question that was never decided from one * that was answered — the distinction `module update` conflated when it reported * a breaking update as "operator declined" that no operator had ever seen. The * two are not interchangeable: *unanswered* means no responder could even be * found, *abandoned* means a responder existed, the question stood, and the * deadline passed with nobody deciding. */ export class InterviewUnansweredError extends Error { constructor( /** The interview event type that went unanswered, e.g. `interview.required..`. */ readonly queryType: string, message: string, ) { super(message); this.name = 'InterviewUnansweredError'; } } /** * The question was posted, stood unanswered past its session's TTL, and the * reaper answered it `abandoned` to release what the parked command held. */ export class InterviewAbandonedError extends Error { constructor( readonly queryType: string, message: string, ) { super(message); this.name = 'InterviewAbandonedError'; } }