| 1 | #nullable enable |
| 2 | |
| 3 | namespace CascadeIDE.Features.Chat; |
| 4 | |
| 5 | /// <summary>Разрешение якоря для slash-preview (например /anchor peek).</summary> |
| 6 | public delegate bool SlashCommandAnchorPreviewResolver(string argsTail, out SlashCommandPreviewResult result); |
| 7 | |
| 8 | /// <summary> |
| 9 | /// Единая точка slash-preview для TCI (CCL и composer). ADR 0138, playbook-tci-v1. |
| 10 | /// </summary> |
| 11 | public sealed class SlashCommandPreviewService |
| 12 | { |
| 13 | private readonly SlashCommandAnchorPreviewResolver? _resolveAnchor; |
| 14 | |
| 15 | public SlashCommandPreviewService(SlashCommandAnchorPreviewResolver? resolveAnchor = null) => |
| 16 | _resolveAnchor = resolveAnchor; |
| 17 | |
| 18 | /// <summary>Валидация одной slash-строки (буфер CCL или извлечённая линия composer).</summary> |
| 19 | public SlashCommandPreviewResult Evaluate(string? slashBuffer) => |
| 20 | SlashCommandPreviewEvaluator.Evaluate(slashBuffer, _resolveAnchor); |
| 21 | |
| 22 | /// <summary>Slash-строка на линии каретки в многострочном composer.</summary> |
| 23 | public SlashCommandPreviewResult EvaluateComposerAtCaret(string? chatInput, int caretIndex) |
| 24 | { |
| 25 | if (!ChatSlashAutocomplete.TryGetSlashLineAtCaret(chatInput, caretIndex, out var slashLine)) |
| 26 | return SlashCommandPreviewResult.Empty; |
| 27 | |
| 28 | return Evaluate(slashLine); |
| 29 | } |
| 30 | |
| 31 | public static SlashCommandPreviewKind MapResolveOutcome(string? resolveOutcome) => |
| 32 | SlashCommandPreviewEvaluator.MapResolveOutcome(resolveOutcome); |
| 33 | } |
| 34 | |