Forge
csharpdeeb25a2
1#nullable enable
2
3namespace CascadeIDE.Features.Chat;
4
5public sealed class SessionTopicSlashCompletionProvider : ISessionTopicSlashCompletionProvider
6{
7 private readonly Func<ChatSurfaceSnapshot> _getSnapshot;
8
9 public SessionTopicSlashCompletionProvider(Func<ChatSurfaceSnapshot> getSnapshot) =>
10 _getSnapshot = getSnapshot;
11
12 public IReadOnlyList<SessionTopicSlashMatch> GetMatches(string titleOrIdPrefix, int limit)
13 {
14 if (limit <= 0)
15 return [];
16
17 var prefix = (titleOrIdPrefix ?? "").Trim();
18 var threads = _getSnapshot().State.Threads;
19 if (threads.Count == 0)
20 return [];
21
22 var counts = ChatThreadPresentation.MessageCountsByThread(_getSnapshot());
23 return ChatThreadPresentation.RankThreadsForCompletion(threads, prefix)
24 .Take(limit)
25 .Select(thread =>
26 {
27 var shortId = thread.ThreadId.ToString("N")[..8];
28 counts.TryGetValue(thread.ThreadId, out var messageCount);
29 var flags = ChatThreadPresentation.FormatFlags(thread);
30 var help = string.IsNullOrEmpty(flags)
31 ? $"{messageCount} сообщ."
32 : $"{flags} · {messageCount} сообщ.";
33 return new SessionTopicSlashMatch(
34 shortId,
35 $"{shortId} · {thread.Title}",
36 help);
37 })
38 .ToList();
39 }
40}
41
View only · write via MCP/CIDE