export const OBSERVER_STATUSES = ["open", "active", "waiting", "blocked", "done", "cancelled", "superseded"] as const;

export type ObserverStatus = (typeof OBSERVER_STATUSES)[number];
export type ThreadStatus = ObserverStatus | "dismissed";

export interface Thread {
	id: string;
	canonicalRequest: string;
	status: ThreadStatus;
	createdAt: number;
	updatedAt: number;
}

export interface ObservedThread {
	id?: string;
	canonicalRequest: string;
	status: ObserverStatus;
}

export interface ObserverOutput {
	existing: ObservedThread[];
	additions: ObservedThread[];
}

export interface UserMessageRecord {
	messageId: string;
	text: string;
	at: number;
}

export interface ObservationFailure {
	kind: "observer_failure";
	messageIds: string[];
	error: string;
	at: number;
}

export type CommitmentEvent =
	| { kind: "user_message"; messageId: string; text: string; at: number }
	| { kind: "observation"; reconciled: string[]; output: ObserverOutput; at: number }
	| { kind: "user_action"; threadId: string; action: "accept" | "dismiss" | "reopen" | "drop"; reason?: string; at: number }
	| { kind: "correction"; threadId: string; canonicalRequest?: string; status?: ThreadStatus; at: number }
	| ObservationFailure;

export interface Registry {
	threads: Thread[];
	unreconciled: UserMessageRecord[];
	created: number;
}

export interface ObserverPacket {
	threads: Thread[];
	userMessages: UserMessageRecord[];
	completedAssistantTurn: string;
}
