// T4-b · 本章指令组装(纯逻辑,UX §3)。 // 作者自由文本 + 风格快捷预设 → 单条 directive 串,传入 draft 生成(直通后端 volatile)。 // 组件只渲染 chips/textarea;预设清单与组装规则集中在此,确定性、不可变。 export interface StylePreset { id: string; label: string; text: string; } // 风格快捷预设(点选拼入指令开头,引导本章文风)。 export const STYLE_PRESETS: readonly StylePreset[] = [ { id: "less-ai", label: "减少AI味", text: "减少 AI 腔,去掉套话与排比堆砌" }, { id: "colloquial", label: "口语化", text: "用更口语、贴近人物的表达" }, { id: "fast-pace", label: "快节奏", text: "加快节奏,少铺垫多冲突推进" }, ]; const PRESET_BY_ID: ReadonlyMap = new Map( STYLE_PRESETS.map((preset) => [preset.id, preset]), ); const SEPARATOR = ";"; // 组合选中预设文案(按 STYLE_PRESETS 原序)+ 自由文本为一条指令。空 → ""。 export function composeDirective( freeText: string, presetIds: readonly string[], ): string { const selected = new Set(presetIds); const presetTexts = STYLE_PRESETS.filter((preset) => selected.has(preset.id), ).map((preset) => preset.text); const trimmedFree = freeText.trim(); const parts = trimmedFree ? [...presetTexts, trimmedFree] : presetTexts; return parts.join(SEPARATOR); } // 仅暴露给测试/组件的辅助:id 是否为已知预设。 export function isKnownPreset(id: string): boolean { return PRESET_BY_ID.has(id); }