export type ReactionLevel = "off" | "ack" | "minimal" | "extensive"; export type ResolvedReactionLevel = { level: ReactionLevel; /** Whether ACK reactions (e.g., 👀 when processing) are enabled. */ ackEnabled: boolean; /** Whether agent-controlled reactions are enabled. */ agentReactionsEnabled: boolean; /** Guidance level for agent reactions (minimal = sparse, extensive = liberal). */ agentReactionGuidance?: "minimal" | "extensive"; }; const LEVELS = new Set(["off", "ack", "minimal", "extensive"]); function parseLevel( value: unknown, ): { kind: "missing" } | { kind: "invalid" } | { kind: "ok"; value: ReactionLevel } { if (value === undefined || value === null) { return { kind: "missing" }; } if (typeof value !== "string") { return { kind: "invalid" }; } const trimmed = value.trim(); if (!trimmed) { return { kind: "missing" }; } if (LEVELS.has(trimmed as ReactionLevel)) { return { kind: "ok", value: trimmed as ReactionLevel }; } return { kind: "invalid" }; } export function resolveReactionLevel(params: { value: unknown; defaultLevel: ReactionLevel; invalidFallback: "ack" | "minimal"; }): ResolvedReactionLevel { const parsed = parseLevel(params.value); const effective = parsed.kind === "ok" ? parsed.value : parsed.kind === "missing" ? params.defaultLevel : params.invalidFallback; switch (effective) { case "off": return { level: "off", ackEnabled: false, agentReactionsEnabled: false }; case "ack": return { level: "ack", ackEnabled: true, agentReactionsEnabled: false }; case "minimal": return { level: "minimal", ackEnabled: false, agentReactionsEnabled: true, agentReactionGuidance: "minimal", }; case "extensive": return { level: "extensive", ackEnabled: false, agentReactionsEnabled: true, agentReactionGuidance: "extensive", }; default: return { level: "minimal", ackEnabled: false, agentReactionsEnabled: true, agentReactionGuidance: "minimal", }; } }