Forge
csharpdeeb25a2
1#nullable enable
2
3using CascadeIDE.Models.Intercom;
4using CascadeIDE.Services.Intercom;
5using CascadeIDE.ViewModels;
6
7namespace CascadeIDE.Features.Chat;
8
9public partial class ChatPanelViewModel
10{
11 /// <summary>
12 /// После открытия решения / перезагрузки сессии: обновить resolveOutcome у вложений с ошибкой или без resolve.
13 /// </summary>
14 public void RefreshAttachmentAnchorsForCurrentScope()
15 {
16 var workspace = ResolveAttachWorkspaceRoot();
17 if (string.IsNullOrWhiteSpace(workspace))
18 return;
19
20 var solution = ResolveAttachSolutionPath();
21 var any = false;
22
23 foreach (var msg in ChatMessages)
24 {
25 if (msg.Attachments.Count == 0)
26 continue;
27
28 if (!IntercomAttachmentAnchorRefresher.TryRefreshList(
29 msg.Attachments,
30 workspace,
31 solution,
32 out var refreshed)
33 || refreshed is null)
34 {
35 continue;
36 }
37
38 msg.SetAttachments(refreshed, msg.SenderWorkspaceContext);
39 any = true;
40 }
41
42 if (_pendingAttachDrafts.Count > 0)
43 {
44 var keys = _pendingAttachDrafts.Keys.ToList();
45 foreach (var key in keys)
46 {
47 var draft = _pendingAttachDrafts[key];
48 var next = IntercomAttachmentAnchorRefresher.Refresh(draft, workspace, solution);
49 if (anchorDraftChanged(draft, next))
50 {
51 _pendingAttachDrafts[key] = next;
52 any = true;
53 }
54 }
55 }
56
57 if (any)
58 {
59 refreshComposerAttachHint();
60 RefreshChatSurfaceSnapshot();
61 }
62 }
63
64 private static bool anchorDraftChanged(AttachmentAnchor before, AttachmentAnchor after) =>
65 !string.Equals(before.ResolveOutcome, after.ResolveOutcome, StringComparison.OrdinalIgnoreCase)
66 || before.LineStart != after.LineStart
67 || before.LineEnd != after.LineEnd;
68}
69
View only · write via MCP/CIDE