Forge
csharpdeeb25a2
1using System.Text.Json;
2using CascadeIDE.Models.AgentChat;
3using IntercomWire;
4
5namespace CascadeIDE.Features.Intercom.Transport;
6
7/// <summary>Входящие transport events → локальный NDJSON (ADR 0144 §6).</summary>
8internal static class IntercomTransportIngest
9{
10 public static bool TryMapToLocalEvent(
11 IntercomTransportEventEnvelopeDto envelope,
12 Guid sessionId,
13 out ChatHistoryEvent? localEvent)
14 {
15 localEvent = null;
16 if (!IntercomWireTransportEventKinds.SyncDefault.Contains(envelope.EventKind))
17 return false;
18
19 var kind = ToLocalKind(envelope.EventKind);
20 if (kind is null)
21 return false;
22
23 if (!Guid.TryParse(envelope.ClientEventId, out var eventId))
24 eventId = Guid.NewGuid();
25
26 var at = DateTimeOffset.TryParse(envelope.OccurredAtUtc, out var occurred)
27 ? occurred
28 : DateTimeOffset.UtcNow;
29
30 string? threadId = TryExtractThreadIdFromPayload(envelope);
31
32 var payloadJson = envelope.Payload.GetRawText();
33 if (string.Equals(envelope.EventKind, "message_range_related", StringComparison.Ordinal))
34 payloadJson = IntercomTransportPayloadNormalizer.NormalizeInbound(envelope.EventKind, payloadJson);
35
36 localEvent = new ChatHistoryEvent(
37 eventId,
38 sessionId,
39 at,
40 kind,
41 payloadJson,
42 ThreadId: threadId);
43
44 return true;
45 }
46
47 private static string? ToLocalKind(string wireKind) =>
48 wireKind switch
49 {
50 "message_added" => ChatHistoryEventKind.MessageAdded,
51 "message_completed" => ChatHistoryEventKind.MessageCompleted,
52 "message_edited" => ChatHistoryEventKind.MessageEdited,
53 "thread_forked" => ChatHistoryEventKind.ThreadForked,
54 "message_range_related" => ChatHistoryEventKind.MessageRangeRelated,
55 _ => null,
56 };
57
58 private static string? TryExtractThreadIdFromPayload(IntercomTransportEventEnvelopeDto envelope)
59 {
60 try
61 {
62 if (string.Equals(envelope.EventKind, "thread_forked", StringComparison.Ordinal))
63 {
64 var fork = envelope.Payload.Deserialize<ChatHistoryThreadForkedPayload>(IntercomTransportJson.Web);
65 return fork?.NewThreadId;
66 }
67
68 if (string.Equals(envelope.EventKind, "message_range_related", StringComparison.Ordinal))
69 {
70 var rel = envelope.Payload.Deserialize<ChatHistoryMessageRangeRelatedPayload>(IntercomTransportJson.Web);
71 return rel?.ThreadId;
72 }
73
74 var msg = envelope.Payload.Deserialize<ChatHistoryMessagePayload>(IntercomTransportJson.Web);
75 return msg?.ThreadId;
76 }
77 catch (JsonException)
78 {
79 return null;
80 }
81 }
82}
83
View only · write via MCP/CIDE